From da200e6664615a5ef9e89d0a295aa435f60522c9 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Fri, 26 Jul 2013 14:48:57 +0200 Subject: [PATCH 68/68] nsview: implement a few text view command accelerators manually so cut, copy, paste and select all work. --- gtk/gtknsview.c | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c index 3b30d3b..d5eb307 100644 --- a/gtk/gtknsview.c +++ b/gtk/gtknsview.c @@ -664,14 +664,52 @@ gtk_ns_view_key_press (GtkWidget *widget, { GtkNSView *ns_view = GTK_NS_VIEW (widget); NSEvent *nsevent = gdk_quartz_event_get_nsevent ((GdkEvent *) event); - NSWindow *ns_window; if (gtk_ns_view_forward_event (widget, event)) { - ns_window = [ns_view->priv->view window]; - [ns_window sendEvent:nsevent]; + NSWindow *ns_window = [ns_view->priv->view window]; + NSResponder *responder = [ns_window firstResponder]; - return TRUE; + if ([responder isKindOfClass: [NSTextView class]] && + (event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | + GDK_MOD1_MASK | GDK_MOD2_MASK)) == GDK_MOD2_MASK) + { + NSTextView *text_view = (NSTextView *) responder; + NSRange range = [text_view selectedRange]; + gboolean has_selection = range.length > 0; + + switch (event->keyval) + { + case GDK_KEY_c: /* copy */ + if (has_selection) + [text_view copy: text_view]; + return TRUE; + + case GDK_KEY_x: /* cut */ + if (has_selection) + [text_view cut: text_view]; + return TRUE; + + case GDK_KEY_v: /* paste */ + [text_view paste: text_view]; + return TRUE; + + case GDK_KEY_a: /* all */ + range.location = 0; + range.length = [[text_view string] length]; + [text_view setSelectedRange: range]; + return TRUE; + + default: + break; + } + } + else + { + [ns_window sendEvent:nsevent]; + + return TRUE; + } } return GTK_WIDGET_CLASS (gtk_ns_view_parent_class)->key_press_event (widget, event); @@ -683,11 +721,11 @@ gtk_ns_view_key_release (GtkWidget *widget, { GtkNSView *ns_view = GTK_NS_VIEW (widget); NSEvent *nsevent = gdk_quartz_event_get_nsevent ((GdkEvent *) event); - NSWindow *ns_window; if (gtk_ns_view_forward_event (widget, event)) { - ns_window = [ns_view->priv->view window]; + NSWindow *ns_window = [ns_view->priv->view window]; + [ns_window sendEvent:nsevent]; return TRUE; -- 1.7.10.2 (Apple Git-33)