summaryrefslogtreecommitdiff
path: root/src/nigui/private
diff options
context:
space:
mode:
authortrustable-code <krauter.simon@arcor.de>2017-08-08 19:54:41 +0200
committertrustable-code <krauter.simon@arcor.de>2017-08-08 19:54:41 +0200
commitd2ae5d5001cb65c0d81898cdba1eec9af01808ff (patch)
treeb56fb9bbfcc7c860daf5f22e1ff505a781846d78 /src/nigui/private
parentd7666326125cc7c2c3867f744c47d7021b8e7e85 (diff)
downloadNiGui-d2ae5d5001cb65c0d81898cdba1eec9af01808ff.tar.gz
NiGui-d2ae5d5001cb65c0d81898cdba1eec9af01808ff.zip
Gtk: Implement own "copy to clipboard", because by default the clipboard is non-persistent
Diffstat (limited to 'src/nigui/private')
-rwxr-xr-xsrc/nigui/private/gtk3/gtk3.nim11
-rwxr-xr-xsrc/nigui/private/gtk3/platform_impl.nim36
2 files changed, 44 insertions, 3 deletions
diff --git a/src/nigui/private/gtk3/gtk3.nim b/src/nigui/private/gtk3/gtk3.nim
index 0deceff..eff2a94 100755
--- a/src/nigui/private/gtk3/gtk3.nim
+++ b/src/nigui/private/gtk3/gtk3.nim
@@ -183,6 +183,9 @@ const
# Selection:
GDK_SELECTION_CLIPBOARD* = cast[pointer](69)
+ # Key modifier masks:
+ GDK_CONTROL_MASK* = 1 shl 2
+
# ----------------------------------------------------------------------------------------
# General Gtk Procs
@@ -298,6 +301,8 @@ proc gtk_entry_new*(): pointer {.importc: "gtk_entry_new", libgtk3.}
proc gtk_entry_set_text*(entry: pointer, text: cstring) {.importc: "gtk_entry_set_text", libgtk3.}
proc gtk_entry_get_text*(entry: pointer): cstring {.importc: "gtk_entry_get_text", libgtk3.}
proc gtk_entry_set_width_chars*(entry: pointer, n_chars: cint) {.importc: "gtk_entry_set_width_chars", libgtk3.}
+proc gtk_editable_get_selection_bounds*(editable: pointer, start_pos, end_pos: var cint): bool {.importc: "gtk_editable_get_selection_bounds", libgtk3.}
+proc gtk_editable_get_chars*(editable: pointer, start_pos, end_pos: cint): cstring {.importc: "gtk_editable_get_chars", libgtk3.}
proc gtk_text_view_new*(): pointer {.importc: "gtk_text_view_new", libgtk3.}
proc gtk_text_view_set_buffer*(text_view, buffer: pointer) {.importc: "gtk_text_view_set_buffer", libgtk3.}
@@ -315,13 +320,14 @@ proc gtk_text_view_scroll_to_iter*(text_view: pointer, iter: var GtkTextIter, wi
# proc gtk_text_buffer_new*(table: pointer): pointer {.importc: "gtk_text_buffer_new", libgtk3.}
proc gtk_text_buffer_set_text*(text_buffer: pointer, text: cstring, len: cint) {.importc: "gtk_text_buffer_set_text", libgtk3.}
-proc gtk_text_buffer_get_text*(text_buffer: pointer, start, `end`: var GtkTextIter, include_hidden_chars: cint): cstring {.importc: "gtk_text_buffer_get_text", libgtk3.}
+proc gtk_text_buffer_get_text*(text_buffer: pointer, start, `end`: var GtkTextIter, include_hidden_chars: bool): cstring {.importc: "gtk_text_buffer_get_text", libgtk3.}
proc gtk_text_buffer_get_start_iter*(text_buffer: pointer, iter: var GtkTextIter) {.importc: "gtk_text_buffer_get_start_iter", libgtk3.}
proc gtk_text_buffer_get_end_iter*(text_buffer: pointer, iter: var GtkTextIter) {.importc: "gtk_text_buffer_get_end_iter", libgtk3.}
# proc gtk_text_buffer_add_mark*(buffer, mark: pointer, where: var GtkTextIter) {.importc: "gtk_text_buffer_add_mark", libgtk3.}
# proc gtk_text_buffer_get_insert*(buffer: pointer): pointer {.importc: "gtk_text_buffer_get_insert", libgtk3.}
# proc gtk_text_buffer_get_iter_at_line*(buffer: pointer, iter: var GtkTextIter, line_number: cint) {.importc: "gtk_text_buffer_get_iter_at_line", libgtk3.}
proc gtk_text_buffer_insert*(buffer: pointer, iter: var GtkTextIter, text: cstring, len: cint) {.importc: "gtk_text_buffer_insert", libgtk3.}
+proc gtk_text_buffer_get_selection_bounds*(buffer: pointer, start, `end`: var GtkTextIter): bool {.importc: "gtk_text_buffer_get_selection_bounds", libgtk3.}
proc gtk_scrolled_window_new*(hadjustment, vadjustment: pointer): pointer {.importc: "gtk_scrolled_window_new", libgtk3.}
proc gtk_scrolled_window_set_policy*(scrolled_window: pointer, hscrollbar_policy, vscrollbar_policy: cint) {.importc: "gtk_scrolled_window_set_policy", libgtk3.}
@@ -379,6 +385,9 @@ proc g_filename_from_uri*(uri: pointer): cstring {.importc: "g_filename_from_uri
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.}
+proc gtk_clipboard_store*(clipboard: pointer) {.importc: "gtk_clipboard_store", libgtk3.}
+
+proc gtk_accelerator_get_default_mod_mask*(): cint {.importc: "gtk_accelerator_get_default_mod_mask", libgtk3.}
# ----------------------------------------------------------------------------------------
diff --git a/src/nigui/private/gtk3/platform_impl.nim b/src/nigui/private/gtk3/platform_impl.nim
index 00fd9d8..8b128a3 100755
--- a/src/nigui/private/gtk3/platform_impl.nim
+++ b/src/nigui/private/gtk3/platform_impl.nim
@@ -174,6 +174,7 @@ proc pControlKeyPressSignal(widget: pointer, event: var GdkEventKey, data: point
# echo $gdk_keyval_to_unicode(event.keyval)
var unicode = gdk_keyval_to_unicode(event.keyval)
+
# if unicode == 0:
# unicode = event.keyval
@@ -313,6 +314,7 @@ proc clipboardText(app: App): string =
proc `clipboardText=`(app: App, text: string) =
gtk_clipboard_set_text(pClipboardPtr, text, text.len.cint)
+ gtk_clipboard_store(pClipboardPtr)
# ----------------------------------------------------------------------------------------
@@ -1120,8 +1122,24 @@ method pAddButtonPressEvent(control: NativeLabel) =
# TextBox
# ----------------------------------------------------------------------------------------
+proc pTextBoxKeyPressSignal(widget: pointer, event: var GdkEventKey, data: pointer): bool {.cdecl.} =
+ result = pControlKeyPressSignal(widget, event, data)
+
+ # Implement own "copy to clipboard", because by default the clipboard is non-persistent
+ if not result:
+ let modifiers = gtk_accelerator_get_default_mod_mask()
+ if event.keyval == 'c'.ord and (event.state and modifiers) == GDK_CONTROL_MASK:
+ let textBox = cast[NativeTextBox](data)
+ var startPos: cint
+ var endPos: cint
+ discard gtk_editable_get_selection_bounds(textBox.fHandle, startPos, endPos)
+ if startPos != endPos:
+ app.clipboardText = $gtk_editable_get_chars(textBox.fHandle, startPos, endPos)
+ return true # prevent default "copy to clipboard"
+
proc init(textBox: NativeTextBox) =
textBox.fHandle = gtk_entry_new()
+ discard g_signal_connect_data(textBox.fHandle, "key-press-event", pTextBoxKeyPressSignal, cast[pointer](textBox))
discard g_signal_connect_data(textBox.fHandle, "changed", pControlChangedSignal, cast[pointer](textBox))
textBox.TextBox.init()
@@ -1146,6 +1164,20 @@ method pAddButtonPressEvent(control: NativeTextBox) =
# TextArea
# ----------------------------------------------------------------------------------------
+proc pTextAreaKeyPressSignal(widget: pointer, event: var GdkEventKey, data: pointer): bool {.cdecl.} =
+ result = pControlKeyPressSignal(widget, event, data)
+
+ # Implement own "copy to clipboard", because by default the clipboard is non-persistent
+ if not result:
+ let modifiers = gtk_accelerator_get_default_mod_mask()
+ if event.keyval == 'c'.ord and (event.state and modifiers) == GDK_CONTROL_MASK:
+ let textArea = cast[NativeTextArea](data)
+ var startIter: GtkTextIter
+ var endIter: GtkTextIter
+ discard gtk_text_buffer_get_selection_bounds(textArea.fBufferHandle, startIter, endIter)
+ app.clipboardText = $gtk_text_buffer_get_text(textArea.fBufferHandle, startIter, endIter, true)
+ return true # prevent default "copy to clipboard"
+
proc init(textArea: NativeTextArea) =
textArea.fHandle = gtk_scrolled_window_new(nil, nil)
# gtk_scrolled_window_set_policy(textArea.fHandle, GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC)
@@ -1157,7 +1189,7 @@ proc init(textArea: NativeTextArea) =
gtk_text_view_set_bottom_margin(textArea.fTextViewHandle, 5)
gtk_container_add(textArea.fHandle, textArea.fTextViewHandle)
gtk_widget_show(textArea.fTextViewHandle)
- discard g_signal_connect_data(textArea.fTextViewHandle, "key-press-event", pControlKeyPressSignal, cast[pointer](textArea))
+ discard g_signal_connect_data(textArea.fTextViewHandle, "key-press-event", pTextAreaKeyPressSignal, cast[pointer](textArea))
textArea.fBufferHandle = gtk_text_view_get_buffer(textArea.fTextViewHandle)
discard g_signal_connect_data(textArea.fBufferHandle, "changed", pControlChangedSignal, cast[pointer](textArea))
textArea.TextArea.init()
@@ -1166,7 +1198,7 @@ method text(textArea: NativeTextArea): string =
var startIter, endIter: GtkTextIter
gtk_text_buffer_get_start_iter(textArea.fBufferHandle, startIter)
gtk_text_buffer_get_end_iter(textArea.fBufferHandle, endIter)
- result = $gtk_text_buffer_get_text(textArea.fBufferHandle, startIter, endIter, 1)
+ result = $gtk_text_buffer_get_text(textArea.fBufferHandle, startIter, endIter, true)
method `text=`(textArea: NativeTextArea, text: string) =
gtk_text_buffer_set_text(textArea.fBufferHandle, text, text.len.cint)