  
  #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));
+                 }
+             }

diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c
index a4b4dd4dbe..0fc5055ed0 100644
--- a/gtk/gtknsview.c
+++ b/gtk/gtknsview.c
@@ -442,15 +442,30 @@ gtk_ns_view_replace_draw_insertion_point (void)
     }
 }
 

+does_accept_first_responder_recursively (NSView *view)
+{
+  if ([view acceptsFirstResponder]) {
+    return TRUE;
+  }
+
