summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2017-08-08 19:01:18 +0200
committertrustable-code <krauter.simon@arcor.de>2017-08-08 19:01:18 +0200
commitd7666326125cc7c2c3867f744c47d7021b8e7e85 (patch)
tree7a8fc83b428fb26f7ef72aa9ad1cb73b743cdefe /src
parent77f5e8b4e5f9a1e52e798f7a3e5841c8cfbea5e9 (diff)
downloadNiGui-d7666326125cc7c2c3867f744c47d7021b8e7e85.tar.gz
NiGui-d7666326125cc7c2c3867f744c47d7021b8e7e85.zip
Add clipboard functions
Diffstat (limited to 'src')
-rwxr-xr-xsrc/nigui.nim3
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim8
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim20
-rwxr-xr-xsrc/nigui/private/windows/platform_impl.nim30
-rwxr-xr-xsrc/nigui/private/windows/windows.nim17
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: