diff --git a/gtk/gtknsview.c b/gtk/gtknsview.c
index 1e55865..f1e8613 100644
--- a/gtk/gtknsview.c
+++ b/gtk/gtknsview.c
@@ -24,6 +24,7 @@
 
 #include <gdk/gdk.h>
 #include <gdk/quartz/gdkquartz.h>
+#include <objc/runtime.h>
 
 #include "gtknsview.h"
 #include "gtkprivate.h"
@@ -56,6 +57,8 @@ static void       gtk_ns_view_get_property  (GObject        *object,
                                              guint           prop_id,
                                              GValue         *value,
                                              GParamSpec     *pspec);
+static void       gtk_ns_view_notify        (GObject        *object,
+                                             GParamSpec     *pspec);
 
 static void       gtk_ns_view_map           (GtkWidget      *widget);
 static void       gtk_ns_view_unmap         (GtkWidget      *widget);
@@ -63,6 +66,7 @@ static void       gtk_ns_view_size_request  (GtkWidget      *widget,
                                              GtkRequisition *requisition);
 static void       gtk_ns_view_size_allocate (GtkWidget      *widget,
                                              GtkAllocation  *allocation);
+static void       gtk_ns_view_grab_focus    (GtkWidget      *widget);
 static gboolean   gtk_ns_view_key_press     (GtkWidget      *widget,
                                              GdkEventKey    *event);
 static gboolean   gtk_ns_view_key_release   (GtkWidget      *widget,
@@ -83,11 +87,13 @@ gtk_ns_view_class_init (GtkNSViewClass *klass)
   object_class->dispose = gtk_ns_view_dispose;
   object_class->set_property = gtk_ns_view_set_property;
   object_class->get_property = gtk_ns_view_get_property;
+  object_class->notify = gtk_ns_view_notify;
 
   widget_class->map = gtk_ns_view_map;
   widget_class->unmap = gtk_ns_view_unmap;
   widget_class->size_request = gtk_ns_view_size_request;
   widget_class->size_allocate = gtk_ns_view_size_allocate;
+  widget_class->grab_focus = gtk_ns_view_grab_focus;
   widget_class->key_press_event = gtk_ns_view_key_press;
   widget_class->key_release_event = gtk_ns_view_key_release;
 
@@ -176,6 +182,30 @@ gtk_ns_view_get_property (GObject      *object,
 }
 
 static void
+gtk_ns_view_notify (GObject    *object,
+                    GParamSpec *pspec)
+{
+  GtkNSView *ns_view = GTK_NS_VIEW (object);
+
+  if (G_OBJECT_CLASS (gtk_ns_view_parent_class)->notify)
+    G_OBJECT_CLASS (gtk_ns_view_parent_class)->notify (object, pspec);
+
+  if (!strcmp (pspec->name, "has-focus"))
+    {
+      NSWindow *ns_window = [ns_view->priv->view window];
+
+      g_printerr ("has-focus: %d (%s)\n",
+                  gtk_widget_has_focus (GTK_WIDGET (object)),
+                  class_getName ([ns_view->priv->view class]));
+
+      if (gtk_widget_has_focus (GTK_WIDGET (object)))
+        [ns_window makeFirstResponder:ns_view->priv->view];
+      else
+        [ns_window makeFirstResponder:nil];
+    }
+}
+
+static void
 gtk_ns_view_position_view (GtkNSView     *ns_view,
                            GtkAllocation *allocation)
 {
@@ -253,6 +283,20 @@ gtk_ns_view_size_allocate (GtkWidget     *widget,
     gtk_ns_view_position_view (ns_view, allocation);
 }
 
+static void
+gtk_ns_view_grab_focus (GtkWidget *widget)
+{
+  GtkNSView *ns_view = GTK_NS_VIEW (widget);
+  NSWindow *ns_window;
+
+  GTK_WIDGET_CLASS (gtk_ns_view_parent_class)->grab_focus (widget);
+
+#if 0
+  ns_window = [ns_view->priv->view window];
+  [ns_window makeFirstResponder:ns_view->priv->view];
+#endif
+}
+
 static gboolean
 gtk_ns_view_key_press (GtkWidget   *widget,
                        GdkEventKey *event)
