diff options
author | Cody Russell <cody@jhu.edu> | 2018-12-13 18:39:38 +0300 |
---|---|---|
committer | Cody Russell <cody@jhu.edu> | 2018-12-13 18:39:38 +0300 |
commit | 6b59ec9b75a5864c0cabd68670ac6910babba8f1 (patch) | |
tree | 62563f9df92fb40a7e933adeb4e6b6fbd2484e0b | |
parent | e0002d950396f943c31cc1a95c9cd3222f6f08d1 (diff) |
[GTK] Update to the focus handling patch.
-rw-r--r-- | packages/patches/gtk/gtk-nsview-subview-focus-fixes.patch | 58 |
1 files changed, 52 insertions, 6 deletions
diff --git a/packages/patches/gtk/gtk-nsview-subview-focus-fixes.patch b/packages/patches/gtk/gtk-nsview-subview-focus-fixes.patch index 50ed1dd..74dc49a 100644 --- a/packages/patches/gtk/gtk-nsview-subview-focus-fixes.patch +++ b/packages/patches/gtk/gtk-nsview-subview-focus-fixes.patch @@ -1,8 +1,16 @@ diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c -index a4b4dd4dbe..0fc5055ed0 100644 +index a4b4dd4dbe..5b9961eb14 100644 --- a/gtk/gtknsview.c +++ b/gtk/gtknsview.c -@@ -442,15 +442,30 @@ gtk_ns_view_replace_draw_insertion_point (void) +@@ -49,6 +49,7 @@ enum + struct _GtkNSViewPrivate + { + NSView *view; ++ NSResponder *responder; + guint map_timeout; + gboolean enable_swizzle; + }; +@@ -442,15 +443,29 @@ gtk_ns_view_replace_draw_insertion_point (void) } } @@ -10,7 +18,6 @@ index a4b4dd4dbe..0fc5055ed0 100644 +does_accept_first_responder_recursively (NSView *view) +{ + if ([view acceptsFirstResponder]) { -+ g_print ("%s accepts? %d\n", object_getClassName (view), [view acceptsFirstResponder]); + return TRUE; + } + @@ -35,13 +42,52 @@ index a4b4dd4dbe..0fc5055ed0 100644 #if DEBUG_FOCUS g_printerr ("%s can focus: %d\n", -@@ -819,8 +834,7 @@ gtk_ns_view_native_child_event (GdkWindow *window, +@@ -549,10 +564,12 @@ gtk_ns_view_notify (GObject *object, + gtk_widget_has_focus (GTK_WIDGET (object))); + #endif + +- if (gtk_widget_has_focus (GTK_WIDGET (object))) +- [ns_window makeFirstResponder:ns_view->priv->view]; +- else if ([ns_window firstResponder] == ns_view->priv->view || (GTK_IS_WINDOW (toplevel) && !gtk_window_is_active (GTK_WINDOW (toplevel)))) ++ if (gtk_widget_has_focus (GTK_WIDGET (object))) { ++ [ns_window makeFirstResponder:(ns_view->priv->responder ? ns_view->priv->responder : ns_view->priv->view)]; ++ // ns_view->priv->responder = NULL; ++ } else if ([ns_window firstResponder] == ns_view->priv->view || (GTK_IS_WINDOW (toplevel) && !gtk_window_is_active (GTK_WINDOW (toplevel)))) { + [ns_window makeFirstResponder:nil]; ++ } + } + } + +@@ -712,7 +729,7 @@ gtk_ns_view_grab_focus (GtkWidget *widget) + GTK_WIDGET_CLASS (gtk_ns_view_parent_class)->grab_focus (widget); + + ns_window = [ns_view->priv->view window]; +- [ns_window makeFirstResponder:ns_view->priv->view]; ++ [ns_window makeFirstResponder:(ns_view->priv->responder != NULL ? ns_view->priv->responder : ns_view->priv->view)]; + } + + static gboolean +@@ -818,15 +835,20 @@ gtk_ns_view_native_child_event (GdkWindow *window, + if (hit && (hit == view || - [hit ancestorSharedWithView: view] == view) && +- [hit ancestorSharedWithView: view] == view) && - ([hit acceptsFirstResponder] || - [view acceptsFirstResponder])) -+ does_accept_first_responder_recursively (view)) ++ [hit ancestorSharedWithView: view] == view)) { ++ NSResponder *responder = (NSResponder *)hit; ++ while (responder) { ++ if ([responder acceptsFirstResponder]) ++ break; ++ responder = [responder nextResponder]; ++ } #if DEBUG_FOCUS g_printerr ("grabbing focus on %s\n", + class_getName ([ns_view->priv->view class])); + #endif + ++ ns_view->priv->responder = responder; + gtk_widget_grab_focus (GTK_WIDGET (ns_view)); + } + } |