diff options
| author | trustable-code <krauter.simon@arcor.de> | 2017-08-08 19:01:18 +0200 |
|---|---|---|
| committer | trustable-code <krauter.simon@arcor.de> | 2017-08-08 19:01:18 +0200 |
| commit | d7666326125cc7c2c3867f744c47d7021b8e7e85 (patch) | |
| tree | 7a8fc83b428fb26f7ef72aa9ad1cb73b743cdefe /src | |
| parent | 77f5e8b4e5f9a1e52e798f7a3e5841c8cfbea5e9 (diff) | |
| download | NiGui-d7666326125cc7c2c3867f744c47d7021b8e7e85.tar.gz NiGui-d7666326125cc7c2c3867f744c47d7021b8e7e85.zip | |
Add clipboard functions
Diffstat (limited to 'src')
| -rwxr-xr-x | src/nigui.nim | 3 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/gtk3.nim | 8 | ||||
| -rwxr-xr-x | src/nigui/private/gtk3/platform_impl.nim | 20 | ||||
| -rwxr-xr-x | src/nigui/private/windows/platform_impl.nim | 30 | ||||
| -rwxr-xr-x | src/nigui/private/windows/windows.nim | 17 |
5 files changed, 77 insertions, 1 deletions
diff --git a/src/nigui.nim b/src/nigui.nim index 4ecdebd..6065cba 100755 --- a/src/nigui.nim +++ b/src/nigui.nim @@ -350,6 +350,9 @@ proc `defaultFontFamily=`*(app: App, fontFamily: string) proc defaultFontSize*(app: App): int proc `defaultFontSize=`*(app: App, fontSize: int) +proc clipboardText*(app: App): string +proc `clipboardText=`*(app: App, text: string) + proc rgb*(red, green, blue: byte, alpha: byte = 255): Color diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim index f2c7eba..0deceff 100755 --- a/src/nigui/private/gtk3/gtk3.nim +++ b/src/nigui/private/gtk3/gtk3.nim @@ -180,6 +180,10 @@ const GTK_RESPONSE_APPLY* = -10 GTK_RESPONSE_HELP* = -11 + # Selection: + GDK_SELECTION_CLIPBOARD* = cast[pointer](69) + + # ---------------------------------------------------------------------------------------- # General Gtk Procs # ---------------------------------------------------------------------------------------- @@ -372,6 +376,10 @@ proc gtk_adjustment_new*(value, lower, upper, step_increment, page_increment, pa proc gtk_selection_data_get_uris*(selection_data: pointer): ptr cstring {.importc: "gtk_selection_data_get_uris", libgtk3.} proc g_filename_from_uri*(uri: pointer): cstring {.importc: "g_filename_from_uri", libgtk3.} +proc gtk_clipboard_get*(selection: pointer): pointer {.importc: "gtk_clipboard_get", libgtk3.} +proc gtk_clipboard_set_text*(clipboard: pointer, text: cstring, len: cint) {.importc: "gtk_clipboard_set_text", libgtk3.} +proc gtk_clipboard_request_text*(clipboard, callback, user_data: pointer) {.importc: "gtk_clipboard_request_text", libgtk3.} + # ---------------------------------------------------------------------------------------- # Drawing Related Procs diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim index 32473bf..00fd9d8 100755 --- a/src/nigui/private/gtk3/platform_impl.nim +++ b/src/nigui/private/gtk3/platform_impl.nim @@ -20,6 +20,9 @@ var pLastMouseButtonDownControl: ControlImpl var pLastMouseButtonDownControlX: int var pLastMouseButtonDownControlY: int +var pClipboardPtr: pointer +var pClipboardText: string + proc pRaiseGError(error: ptr GError) = if error == nil: raiseError("Unkown error") @@ -278,6 +281,8 @@ proc pSetDragDest(widget: pointer) = proc init(app: App) = gtk_init(nil, nil) + pClipboardPtr = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD) + # Determine default styles: var window = gtk_window_new(GTK_WINDOW_TOPLEVEL) var context = gtk_widget_get_style_context(window) @@ -294,6 +299,21 @@ proc processEvents(app: App) = while gtk_events_pending() == 1: discard gtk_main_iteration() +proc pClipboardTextReceivedFunc(clipboard: pointer, text: cstring, data: pointer): bool {.cdecl.} = + pClipboardText = $text + if pClipboardText == nil: + pClipboardText = "" + +proc clipboardText(app: App): string = + pClipboardText = nil + gtk_clipboard_request_text(pClipboardPtr, pClipboardTextReceivedFunc, nil) + while pClipboardText == nil: + discard gtk_main_iteration() + result = pClipboardText + +proc `clipboardText=`(app: App, text: string) = + gtk_clipboard_set_text(pClipboardPtr, text, text.len.cint) + # ---------------------------------------------------------------------------------------- # Dialogs diff --git a/src/nigui/private/windows/platform_impl.nim b/src/nigui/private/windows/platform_impl.nim index 536a21b..8013706 100755 --- a/src/nigui/private/windows/platform_impl.nim +++ b/src/nigui/private/windows/platform_impl.nim @@ -414,6 +414,36 @@ proc processEvents(app: App) = discard TranslateMessage(msg.addr) discard DispatchMessageA(msg.addr) +proc clipboardText(app: App): string = + result = "" + if not OpenClipboard(nil): + return + let data = GetClipboardData(CF_TEXT) + if data == nil: + return + let text = cast[cstring](GlobalLock(data)) + if text == nil: + return + result = $text + discard GlobalUnlock(data) + discard CloseClipboard() + +proc `clipboardText=`(app: App, text: string) = + if not OpenClipboard(nil): + return + let size = text.len + 1 + let data = GlobalAlloc(GMEM_MOVEABLE, size.int32) + if data == nil: + return + let mem = GlobalLock(data) + if mem == nil: + return + copyMem(mem, text.cstring, size) + discard GlobalUnlock(data) + discard EmptyClipboard() + discard SetClipboardData(CF_TEXT, data) + discard CloseClipboard() + # ---------------------------------------------------------------------------------------- # Dialogs diff --git a/src/nigui/private/windows/windows.nim b/src/nigui/private/windows/windows.nim index 4eb2ffa..7e3f959 100755 --- a/src/nigui/private/windows/windows.nim +++ b/src/nigui/private/windows/windows.nim @@ -37,6 +37,7 @@ const BN_CLICKED* = 0 BM_SETIMAGE* = 247 BS_GROUPBOX* = 0x00000007 + CF_TEXT* = 1 COLOR_BTNFACE* = 15 COLOR_WINDOWTEXT* = 8 CP_UTF8* = 65001 @@ -153,6 +154,8 @@ const # UnitInch* = 4 # UnitDocument* = 5 # UnitMillimeter* = 6 + GMEM_MOVEABLE* = 2 + # ---------------------------------------------------------------------------------------- # Types @@ -307,10 +310,17 @@ proc ActivateActCtx*(pActCtx, lpCookie: pointer): bool {.importc: "ActivateActCt proc GetSystemDirectoryA*(lpBuffer: pointer, uSize: int32): int32 {.importc: "GetSystemDirectoryA", libKernel32.} proc MultiByteToWideChar*(CodePage, dwFlags: int32, lpMultiByteStr: cstring, cbMultiByte: int32, lpWideCharStr: cstring, cchWideChar: int32): int32 {.importc: "MultiByteToWideChar", libKernel32.} proc WideCharToMultiByte*(CodePage, dwFlags: int32, lpWideCharStr: cstring, cchWideChar: int32, lpMultiByteStr: cstring, cbMultiByte: int32, lpDefaultChar: cstring, lpUsedDefaultChar: pointer): int32 {.importc: "WideCharToMultiByte", libKernel32.} +proc GlobalLock*(hMem: pointer): pointer {.importc: "GlobalLock", libKernel32.} +proc GlobalUnlock*(hMem: pointer): bool {.importc: "GlobalUnlock", libKernel32.} +proc GlobalAlloc*(uFlags, dwBytes: int32): pointer {.importc: "GlobalAlloc", libKernel32.} + + +# ---------------------------------------------------------------------------------------- +# User32 Procs +# ---------------------------------------------------------------------------------------- proc MessageBoxA*(hWnd: pointer, lpText, lpCaption: cstring, uType: int) {.importc: "MessageBoxA", libUser32.} proc MessageBoxW*(hWnd: pointer, lpText, lpCaption: cstring, uType: int) {.importc: "MessageBoxW", libUser32.} - proc RegisterClassExA*(lpwcx: var WndClassEx): int16 {.importc: "RegisterClassExA", libUser32.} proc CreateWindowExA*(dwExStyle: int32, lpClassName, lpWindowName: cstring, dwStyle: int32, x, y, nWidth, nHeight: int, hWndParent, hMenu, hInstance, lpParam: pointer): pointer {.importc: "CreateWindowExA", libUser32.} proc DestroyWindow*(hWnd: pointer): bool {.importc: "DestroyWindow", libUser32.} @@ -368,6 +378,11 @@ proc KillTimer*(hWnd, nIDEvent: pointer): bool {.importc: "KillTimer", libUser32 proc FillRect*(hDC: pointer, lprc: var Rect, hbr: pointer): int32 {.importc: "FillRect", libUser32.} proc FrameRect*(hDC: pointer, lprc: var Rect, hbr: pointer): int32 {.importc: "FrameRect", libUser32.} proc GetKeyState*(nVirtKey: int32): int16 {.importc: "GetKeyState", libUser32.} +proc OpenClipboard*(hWndNewOwner: pointer): bool {.importc: "OpenClipboard", libUser32.} +proc CloseClipboard*(): bool {.importc: "CloseClipboard", libUser32.} +proc GetClipboardData*(uFormat: int32): pointer {.importc: "GetClipboardData", libUser32.} +proc SetClipboardData*(uFormat: int32, hMem: pointer): pointer {.importc: "SetClipboardData", libUser32.} +proc EmptyClipboard*(): bool {.importc: "EmptyClipboard", libUser32.} when defined(cpu64): # Only available on 64-bit Windows: |
