]> Pileus Git - ~andy/gtk/commitdiff
geez, don't call g_list funcs on GSList
authorHavoc Pennington <hp@redhat.com>
Fri, 8 Jun 2001 18:09:34 +0000 (18:09 +0000)
committerHavoc Pennington <hp@src.gnome.org>
Fri, 8 Jun 2001 18:09:34 +0000 (18:09 +0000)
2001-06-08  Havoc Pennington  <hp@redhat.com>

* gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
don't call g_list funcs on GSList

* gtk/gtkwidget.c (gtk_widget_child_focus): replaces
gtk_container_focus(), since some widgets have focusable locations
which are not other widgets. These widgets should not have to be
containers just to manage the focus. For example, GtkHSV is
currently a container for no good reason. Also, this cleans
up the "if (is_container && is_sensitive && is_drawable)
container_focus ()" mess in widget implementations.

* gtk/gtkcontainer.c (gtk_container_focus): deprecate this
function, and have it just call gtk_widget_child_focus().

* gtk/gtkhsv.c: derive from widget not container

Throughout: fix to reflect GtkContainer::focus change

28 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/Changes-2.0.txt
docs/reference/gtk/tmpl/gtk-unused.sgml
docs/reference/gtk/tmpl/gtkcontainer.sgml
docs/reference/gtk/tmpl/gtkwidget.sgml
gtk/gtkclist.c
gtk/gtkcontainer.c
gtk/gtkcontainer.h
gtk/gtkhsv.c
gtk/gtkhsv.h
gtk/gtklist.c
gtk/gtkmarshal.list
gtk/gtkmarshalers.list
gtk/gtknotebook.c
gtk/gtkplug.c
gtk/gtksocket.c
gtk/gtktextbuffer.c
gtk/gtktoolbar.c
gtk/gtktreeview.c
gtk/gtkwidget.c
gtk/gtkwidget.h
gtk/gtkwindow.c

index b1581cf34e87902459aafe04b4c2277f17bb6c21..84930924a158c659cd1520d88e7a0b169ab1650e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2001-06-08  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
+       don't call g_list funcs on GSList
+
+       * gtk/gtkwidget.c (gtk_widget_child_focus): replaces
+       gtk_container_focus(), since some widgets have focusable locations
+       which are not other widgets. These widgets should not have to be 
+       containers just to manage the focus. For example, GtkHSV is
+       currently a container for no good reason. Also, this cleans
+       up the "if (is_container && is_sensitive && is_drawable)
+       container_focus ()" mess in widget implementations.
+
+       * gtk/gtkcontainer.c (gtk_container_focus): deprecate this
+       function, and have it just call gtk_widget_child_focus().
+
+       * gtk/gtkhsv.c: derive from widget not container
+       
+       Throughout: fix to reflect GtkContainer::focus change
+       
 Fri Jun  8 12:38:49 2001  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtktable.c (gtk_table_resize): warn if row/cols are out of
index b1581cf34e87902459aafe04b4c2277f17bb6c21..84930924a158c659cd1520d88e7a0b169ab1650e 100644 (file)
@@ -1,3 +1,23 @@
+2001-06-08  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
+       don't call g_list funcs on GSList
+
+       * gtk/gtkwidget.c (gtk_widget_child_focus): replaces
+       gtk_container_focus(), since some widgets have focusable locations
+       which are not other widgets. These widgets should not have to be 
+       containers just to manage the focus. For example, GtkHSV is
+       currently a container for no good reason. Also, this cleans
+       up the "if (is_container && is_sensitive && is_drawable)
+       container_focus ()" mess in widget implementations.
+
+       * gtk/gtkcontainer.c (gtk_container_focus): deprecate this
+       function, and have it just call gtk_widget_child_focus().
+
+       * gtk/gtkhsv.c: derive from widget not container
+       
+       Throughout: fix to reflect GtkContainer::focus change
+       
 Fri Jun  8 12:38:49 2001  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtktable.c (gtk_table_resize): warn if row/cols are out of
index b1581cf34e87902459aafe04b4c2277f17bb6c21..84930924a158c659cd1520d88e7a0b169ab1650e 100644 (file)
@@ -1,3 +1,23 @@
+2001-06-08  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
+       don't call g_list funcs on GSList
+
+       * gtk/gtkwidget.c (gtk_widget_child_focus): replaces
+       gtk_container_focus(), since some widgets have focusable locations
+       which are not other widgets. These widgets should not have to be 
+       containers just to manage the focus. For example, GtkHSV is
+       currently a container for no good reason. Also, this cleans
+       up the "if (is_container && is_sensitive && is_drawable)
+       container_focus ()" mess in widget implementations.
+
+       * gtk/gtkcontainer.c (gtk_container_focus): deprecate this
+       function, and have it just call gtk_widget_child_focus().
+
+       * gtk/gtkhsv.c: derive from widget not container
+       
+       Throughout: fix to reflect GtkContainer::focus change
+       
 Fri Jun  8 12:38:49 2001  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtktable.c (gtk_table_resize): warn if row/cols are out of
index b1581cf34e87902459aafe04b4c2277f17bb6c21..84930924a158c659cd1520d88e7a0b169ab1650e 100644 (file)
@@ -1,3 +1,23 @@
+2001-06-08  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
+       don't call g_list funcs on GSList
+
+       * gtk/gtkwidget.c (gtk_widget_child_focus): replaces
+       gtk_container_focus(), since some widgets have focusable locations
+       which are not other widgets. These widgets should not have to be 
+       containers just to manage the focus. For example, GtkHSV is
+       currently a container for no good reason. Also, this cleans
+       up the "if (is_container && is_sensitive && is_drawable)
+       container_focus ()" mess in widget implementations.
+
+       * gtk/gtkcontainer.c (gtk_container_focus): deprecate this
+       function, and have it just call gtk_widget_child_focus().
+
+       * gtk/gtkhsv.c: derive from widget not container
+       
+       Throughout: fix to reflect GtkContainer::focus change
+       
 Fri Jun  8 12:38:49 2001  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtktable.c (gtk_table_resize): warn if row/cols are out of
index b1581cf34e87902459aafe04b4c2277f17bb6c21..84930924a158c659cd1520d88e7a0b169ab1650e 100644 (file)
@@ -1,3 +1,23 @@
+2001-06-08  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
+       don't call g_list funcs on GSList
+
+       * gtk/gtkwidget.c (gtk_widget_child_focus): replaces
+       gtk_container_focus(), since some widgets have focusable locations
+       which are not other widgets. These widgets should not have to be 
+       containers just to manage the focus. For example, GtkHSV is
+       currently a container for no good reason. Also, this cleans
+       up the "if (is_container && is_sensitive && is_drawable)
+       container_focus ()" mess in widget implementations.
+
+       * gtk/gtkcontainer.c (gtk_container_focus): deprecate this
+       function, and have it just call gtk_widget_child_focus().
+
+       * gtk/gtkhsv.c: derive from widget not container
+       
+       Throughout: fix to reflect GtkContainer::focus change
+       
 Fri Jun  8 12:38:49 2001  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtktable.c (gtk_table_resize): warn if row/cols are out of
index b1581cf34e87902459aafe04b4c2277f17bb6c21..84930924a158c659cd1520d88e7a0b169ab1650e 100644 (file)
@@ -1,3 +1,23 @@
+2001-06-08  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
+       don't call g_list funcs on GSList
+
+       * gtk/gtkwidget.c (gtk_widget_child_focus): replaces
+       gtk_container_focus(), since some widgets have focusable locations
+       which are not other widgets. These widgets should not have to be 
+       containers just to manage the focus. For example, GtkHSV is
+       currently a container for no good reason. Also, this cleans
+       up the "if (is_container && is_sensitive && is_drawable)
+       container_focus ()" mess in widget implementations.
+
+       * gtk/gtkcontainer.c (gtk_container_focus): deprecate this
+       function, and have it just call gtk_widget_child_focus().
+
+       * gtk/gtkhsv.c: derive from widget not container
+       
+       Throughout: fix to reflect GtkContainer::focus change
+       
 Fri Jun  8 12:38:49 2001  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtktable.c (gtk_table_resize): warn if row/cols are out of
index b1581cf34e87902459aafe04b4c2277f17bb6c21..84930924a158c659cd1520d88e7a0b169ab1650e 100644 (file)
@@ -1,3 +1,23 @@
+2001-06-08  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextbuffer.c (gtk_text_buffer_remove_all_tags): geez,
+       don't call g_list funcs on GSList
+
+       * gtk/gtkwidget.c (gtk_widget_child_focus): replaces
+       gtk_container_focus(), since some widgets have focusable locations
+       which are not other widgets. These widgets should not have to be 
+       containers just to manage the focus. For example, GtkHSV is
+       currently a container for no good reason. Also, this cleans
+       up the "if (is_container && is_sensitive && is_drawable)
+       container_focus ()" mess in widget implementations.
+
+       * gtk/gtkcontainer.c (gtk_container_focus): deprecate this
+       function, and have it just call gtk_widget_child_focus().
+
+       * gtk/gtkhsv.c: derive from widget not container
+       
+       Throughout: fix to reflect GtkContainer::focus change
+       
 Fri Jun  8 12:38:49 2001  Jonathan Blandford  <jrb@redhat.com>
 
        * gtk/gtktable.c (gtk_table_resize): warn if row/cols are out of
index 6175d38a7bc5a31786c9c675a58db9ae6a175143..69e791761578d27bd1adbb7783a4cd3d674b577a 100644 (file)
@@ -352,3 +352,16 @@ Incompatible Changes from GTK+-1.2 to GTK+-2.0:
   these widgets will need a rewrite (though if you could figure out
   how to subclass the old version of GtkRange, you have our
   respect). Also, GtkTroughType is gone.
+
+* The GtkContainer::focus signal/virtualfunction and
+  gtk_container_focus() call were replaced by 
+  GtkWidget::focus and gtk_widget_child_focus(). 
+  The semantics are the same, so you should be able to just 
+  replace "container_class->focus = mywidget_focus" with 
+  "widget_class->focus = mywidget_focus" and replace 
+  gtk_container_focus() calls with gtk_widget_child_focus() calls.
+
+  The purpose of this change was to allow non-containers to have 
+  focusable elements.
\ No newline at end of file
index 6eb4e0cae8523281ddd7878e20519616f988d307..85536fc79b56f74bbee24865b772403cfe9adaf8 100644 (file)
@@ -361,6 +361,15 @@ Define a function pointer.  Deprecated.
 @arg: 
 @arg_id: 
 
+<!-- ##### SIGNAL GtkContainer::focus ##### -->
+<para>
+
+</para>
+
+@container: the object which received the signal.
+@direction: 
+@Returns: 
+
 <!-- ##### ARG GtkContainer:reallocate-redraws ##### -->
 <para>
 
index 81b031484b39a2f3c4a6378a8a54131455393aa1..c3e926c6ed00839b80cf714d753abd5f50b14146 100644 (file)
@@ -382,15 +382,6 @@ GtkContainer
 
 @container: the object which received the signal.
 
-<!-- ##### SIGNAL GtkContainer::focus ##### -->
-<para>
-
-</para>
-
-@container: the object which received the signal.
-@direction: 
-@Returns: 
-
 <!-- ##### SIGNAL GtkContainer::remove ##### -->
 <para>
 
index e8e7457313b8cb343540fe15df42742511fa4ec1..8d5161e3328dbd2a2959524bc7ba99d26e9b502c 100644 (file)
@@ -1530,6 +1530,15 @@ GtkWidget
 @event: 
 @Returns: 
 
+<!-- ##### SIGNAL GtkWidget::focus ##### -->
+<para>
+
+</para>
+
+@widget: the object which received the signal.
+@arg1: 
+@Returns: 
+
 <!-- ##### SIGNAL GtkWidget::focus-in-event ##### -->
 <para>
 
index c483647181829e5ffa509f39373388521d4e47f4..a6352ae21681acf2f369b7aa9f73d74e92ab897a 100644 (file)
@@ -216,7 +216,7 @@ static gint gtk_clist_focus_in        (GtkWidget        *widget,
                                       GdkEventFocus    *event);
 static gint gtk_clist_focus_out       (GtkWidget        *widget,
                                       GdkEventFocus    *event);
-static gint gtk_clist_focus           (GtkContainer     *container,
+static gint gtk_clist_focus           (GtkWidget        *widget,
                                       GtkDirectionType  direction);
 static void gtk_clist_set_focus_child (GtkContainer     *container,
                                       GtkWidget        *child);
@@ -530,12 +530,12 @@ gtk_clist_class_init (GtkCListClass *klass)
   widget_class->drag_drop = gtk_clist_drag_drop;
   widget_class->drag_data_get = gtk_clist_drag_data_get;
   widget_class->drag_data_received = gtk_clist_drag_data_received;
-
+  widget_class->focus = gtk_clist_focus;
+  
   /* container_class->add = NULL; use the default GtkContainerClass warning */
   /* container_class->remove=NULL; use the default GtkContainerClass warning */
 
   container_class->forall = gtk_clist_forall;
-  container_class->focus = gtk_clist_focus;
   container_class->set_focus_child = gtk_clist_set_focus_child;
 
   klass->set_scroll_adjustments = gtk_clist_set_scroll_adjustments;
@@ -6402,23 +6402,22 @@ gtk_clist_focus_content_area (GtkCList *clist)
 }
 
 static gboolean
-gtk_clist_focus (GtkContainer     *container,
+gtk_clist_focus (GtkWidget        *widget,
                 GtkDirectionType  direction)
 {
-  GtkCList *clist = GTK_CLIST (container);
-  GtkWidget *focus_child = container->focus_child;
+  GtkCList *clist = GTK_CLIST (widget);
+  GtkWidget *focus_child;
   gboolean is_current_focus;
 
-  if (!GTK_WIDGET_IS_SENSITIVE (container))
+  if (!GTK_WIDGET_IS_SENSITIVE (widget))
     return FALSE;
 
+  focus_child = GTK_CONTAINER (widget)->focus_child;
+  
   is_current_focus = gtk_widget_is_focus (GTK_WIDGET (clist));
                          
   if (focus_child &&
-      GTK_IS_CONTAINER (focus_child) &&
-      GTK_WIDGET_DRAWABLE (focus_child) &&
-      GTK_WIDGET_IS_SENSITIVE (focus_child) &&
-      gtk_container_focus (GTK_CONTAINER (focus_child), direction))
+      gtk_widget_child_focus (focus_child, direction))
     return TRUE;
       
   switch (direction)
@@ -6562,8 +6561,7 @@ focus_column (GtkCList *clist, gint column, gint dir)
 {
   GtkWidget *child = clist->column[column].button;
   
-  if (GTK_IS_CONTAINER (child) &&
-      gtk_container_focus (GTK_CONTAINER (child), dir))
+  if (gtk_widget_child_focus (child, dir))
     {
       return TRUE;
     }
index 2029e7f1653e954689bb4c824d96414f46ed84cb..c69d1c79e32b036723ca07740a02f3ef84644767 100644 (file)
@@ -39,7 +39,6 @@ enum {
   ADD,
   REMOVE,
   CHECK_RESIZE,
-  FOCUS,
   SET_FOCUS_CHILD,
   LAST_SIGNAL
 };
@@ -79,7 +78,7 @@ static void     gtk_container_add_unimplemented    (GtkContainer      *container
 static void     gtk_container_remove_unimplemented (GtkContainer      *container,
                                                    GtkWidget         *widget);
 static void     gtk_container_real_check_resize    (GtkContainer      *container);
-static gboolean gtk_container_real_focus           (GtkContainer      *container,
+static gboolean gtk_container_focus                (GtkWidget         *widget,
                                                    GtkDirectionType   direction);
 static void     gtk_container_real_set_focus_child (GtkContainer      *container,
                                                    GtkWidget         *widget);
@@ -205,12 +204,12 @@ gtk_container_class_init (GtkContainerClass *class)
   widget_class->show_all = gtk_container_show_all;
   widget_class->hide_all = gtk_container_hide_all;
   widget_class->expose_event = gtk_container_expose;
+  widget_class->focus = gtk_container_focus;
   
   class->add = gtk_container_add_unimplemented;
   class->remove = gtk_container_remove_unimplemented;
   class->check_resize = gtk_container_real_check_resize;
   class->forall = NULL;
-  class->focus = gtk_container_real_focus;
   class->set_focus_child = gtk_container_real_set_focus_child;
   class->child_type = NULL;
   class->composite_name = gtk_container_child_default_composite_name;
@@ -238,14 +237,6 @@ gtk_container_class_init (GtkContainerClass *class)
                     GTK_SIGNAL_OFFSET (GtkContainerClass, check_resize),
                    gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
-  container_signals[FOCUS] =
-    gtk_signal_new ("focus",
-                    GTK_RUN_LAST,
-                    GTK_CLASS_TYPE (object_class),
-                    GTK_SIGNAL_OFFSET (GtkContainerClass, focus),
-                    gtk_marshal_ENUM__ENUM,
-                   GTK_TYPE_DIRECTION_TYPE, 1,
-                    GTK_TYPE_DIRECTION_TYPE);
   container_signals[SET_FOCUS_CHILD] =
     gtk_signal_new ("set-focus-child",
                     GTK_RUN_FIRST,
@@ -1282,22 +1273,6 @@ gtk_container_foreach_full (GtkContainer       *container,
     notify (callback_data);
 }
 
-gboolean
-gtk_container_focus (GtkContainer     *container,
-                    GtkDirectionType  direction)
-{
-  gint return_val;
-
-  g_return_val_if_fail (container != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_CONTAINER (container), FALSE);
-  
-  gtk_signal_emit (GTK_OBJECT (container),
-                   container_signals[FOCUS],
-                   direction, &return_val);
-
-  return return_val;
-}
-
 void
 gtk_container_set_focus_child (GtkContainer *container,
                               GtkWidget    *widget)
@@ -1480,20 +1455,16 @@ filter_unfocusable (GtkContainer *container,
 }
 
 static gboolean
-gtk_container_real_focus (GtkContainer     *container,
-                         GtkDirectionType  direction)
+gtk_container_focus (GtkWidget        *widget,
+                     GtkDirectionType  direction)
 {
   GList *children;
   gint return_val;
+  GtkContainer *container;
 
-  g_return_val_if_fail (container != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_CONTAINER (container), FALSE);
+  g_return_val_if_fail (GTK_IS_CONTAINER (widget), FALSE);
 
-  /* Fail if the container is inappropriate for focus movement
-   */
-  if (!GTK_WIDGET_DRAWABLE (container) ||
-      !GTK_WIDGET_IS_SENSITIVE (container))
-    return FALSE;
+  container = GTK_CONTAINER (widget);
 
   return_val = FALSE;
 
@@ -1936,25 +1907,15 @@ gtk_container_focus_move (GtkContainer     *container,
             {
               focus_child = NULL;
 
-              if (GTK_WIDGET_DRAWABLE (child) &&
-                 GTK_IS_CONTAINER (child))
-               if (gtk_container_focus (GTK_CONTAINER (child), direction))
+               if (gtk_widget_child_focus (child, direction))
                  return TRUE;
             }
         }
       else if (GTK_WIDGET_DRAWABLE (child) &&
                gtk_widget_is_ancestor (child, GTK_WIDGET (container)))
         {
-         if (GTK_IS_CONTAINER (child))
-            {
-              if (gtk_container_focus (GTK_CONTAINER (child), direction))
-                return TRUE;
-            }
-          else if (GTK_WIDGET_CAN_FOCUS (child))
-            {
-              gtk_widget_grab_focus (child);
-              return TRUE;
-            }
+          if (gtk_widget_child_focus (child, direction))
+            return TRUE;
         }
     }
 
index fa1c03add5b8f5b26e0d9bade702fa1371e7fb49..0512769651f280c86cfb97dd5d7fb9131167ad29 100644 (file)
@@ -83,9 +83,7 @@ struct _GtkContainerClass
   void (* forall)              (GtkContainer    *container,
                                 gboolean         include_internals,
                                 GtkCallback      callback,
-                                gpointer         callbabck_data);
-  gboolean (* focus)                   (GtkContainer    *container,
-                                GtkDirectionType  direction);
+                                gpointer         callback_data);
   void (* set_focus_child)     (GtkContainer    *container,
                                 GtkWidget       *widget);
   GtkType (*child_type)                (GtkContainer   *container);
@@ -129,8 +127,6 @@ void     gtk_container_foreach_full (GtkContainer       *container,
                                     gpointer            callback_data,
                                     GtkDestroyNotify    notify);
 GList*   gtk_container_children     (GtkContainer       *container);
-gboolean gtk_container_focus        (GtkContainer       *container,
-                                    GtkDirectionType    direction);
 void     gtk_container_propagate_expose (GtkContainer   *container,
                                         GtkWidget      *child,
                                         GdkEventExpose *event);
@@ -203,8 +199,7 @@ void    gtk_container_addv             (GtkContainer      *container,
 void   gtk_container_child_set            (GtkContainer      *container,
                                            GtkWidget         *child,
                                            const gchar       *first_arg_name,
-                                           ...);
-     
+                                           ...);     
 
 /* Non-public methods */
 
index 6eecde7c3fa6fde61fce093592ff4d96cff49ef0..d710debce87f74d11ac19ff3c51914bd68c60066 100644 (file)
@@ -103,7 +103,7 @@ static gint gtk_hsv_motion         (GtkWidget      *widget,
                                    GdkEventMotion *event);
 static gint gtk_hsv_expose         (GtkWidget      *widget,
                                    GdkEventExpose *event);
-static gboolean gtk_hsv_focus      (GtkContainer    *container,
+static gboolean gtk_hsv_focus      (GtkWidget       *widget,
                                     GtkDirectionType direction);
 
 static void gtk_hsv_move           (GtkHSV          *hsv,
@@ -139,7 +139,7 @@ gtk_hsv_get_type (void)
       (GtkClassInitFunc) NULL
     };
     
-    hsv_type = gtk_type_unique (GTK_TYPE_CONTAINER, &hsv_info);
+    hsv_type = gtk_type_unique (GTK_TYPE_WIDGET, &hsv_info);
   }
   
   return hsv_type;
@@ -151,13 +151,11 @@ gtk_hsv_class_init (GtkHSVClass *class)
 {
   GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
-  GtkContainerClass *container_class;
   GtkHSVClass    *hsv_class;
   GtkBindingSet *binding_set;
   
   object_class = (GtkObjectClass *) class;
   widget_class = (GtkWidgetClass *) class;
-  container_class = GTK_CONTAINER_CLASS (class);
   hsv_class = GTK_HSV_CLASS (class);
   
   parent_class = gtk_type_class (GTK_TYPE_WIDGET);  
@@ -174,8 +172,7 @@ gtk_hsv_class_init (GtkHSVClass *class)
   widget_class->button_release_event = gtk_hsv_button_release;
   widget_class->motion_notify_event = gtk_hsv_motion;
   widget_class->expose_event = gtk_hsv_expose;
-
-  container_class->focus = gtk_hsv_focus;
+  widget_class->focus = gtk_hsv_focus;
   
   hsv_class->move = gtk_hsv_move;
   
@@ -1357,18 +1354,14 @@ gtk_hsv_expose (GtkWidget      *widget,
 }
 
 static gboolean
-gtk_hsv_focus (GtkContainer    *container,
+gtk_hsv_focus (GtkWidget       *widget,
                GtkDirectionType dir)
 {
   GtkHSV *hsv;
   HSVPrivate *priv;
 
-  hsv = GTK_HSV (container);
+  hsv = GTK_HSV (widget);
   priv = hsv->priv;
-  
-  if (!GTK_WIDGET_DRAWABLE (container) ||
-      !GTK_WIDGET_IS_SENSITIVE (container))
-    return FALSE;
 
   if (!GTK_WIDGET_HAS_FOCUS (hsv))
     {
index 6a980859359aa19d06af927fed8be9bd082dd967..3fa6c8b08361e56b2ec33f876cb8d72f23c08c72 100644 (file)
@@ -50,8 +50,7 @@ typedef struct _GtkHSVClass GtkHSVClass;
 
 struct _GtkHSV
 {
-  /* we derive from container purely so we can have a _focus method */
-  GtkContainer parent_instance;
+  GtkWidget parent_instance;
   
   /* Private data */
   gpointer priv;
index 30dd3aeaff168e2a375e4e44213862b5a74a4a60..189dd633ff17d2976943c764f579eb146151ee6b 100644 (file)
@@ -75,6 +75,9 @@ static gint gtk_list_button_press    (GtkWidget      *widget,
 static gint gtk_list_button_release  (GtkWidget             *widget,
                                      GdkEventButton *event);
 
+static gboolean gtk_list_focus       (GtkWidget        *widget,
+                                      GtkDirectionType  direction);
+
 /*** GtkContainer Methods ***/
 static void gtk_list_add            (GtkContainer     *container,
                                      GtkWidget        *widget);
@@ -87,8 +90,6 @@ static void gtk_list_forall        (GtkContainer     *container,
 static GtkType gtk_list_child_type   (GtkContainer     *container);
 static void gtk_list_set_focus_child (GtkContainer     *container,
                                      GtkWidget        *widget);
-static gint gtk_list_focus           (GtkContainer     *container,
-                                     GtkDirectionType  direction);
 
 /*** GtkList Private Functions ***/
 static void gtk_list_move_focus_child      (GtkList       *list,
@@ -228,13 +229,13 @@ gtk_list_class_init (GtkListClass *class)
   widget_class->size_request = gtk_list_size_request;
   widget_class->size_allocate = gtk_list_size_allocate;
   widget_class->drag_begin = gtk_list_drag_begin;
-
+  widget_class->focus = gtk_list_focus;
+  
   container_class->add = gtk_list_add;
   container_class->remove = gtk_list_remove;
   container_class->forall = gtk_list_forall;
   container_class->child_type = gtk_list_child_type;
   container_class->set_focus_child = gtk_list_set_focus_child;
-  container_class->focus = gtk_list_focus;
 
   class->selection_changed = NULL;
   class->select_child = gtk_real_list_select_child;
@@ -973,15 +974,15 @@ gtk_list_set_focus_child (GtkContainer *container,
     }
 }
 
-static gint
-gtk_list_focus (GtkContainer     *container,
+static gboolean
+gtk_list_focus (GtkWidget        *widget,
                GtkDirectionType  direction)
 {
   gint return_val = FALSE;
+  GtkContainer *container;
 
-  g_return_val_if_fail (container != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_LIST (container), FALSE);
-
+  container = GTK_CONTAINER (widget);
+  
   if (container->focus_child == NULL ||
       !GTK_WIDGET_HAS_FOCUS (container->focus_child))
     {
@@ -989,9 +990,9 @@ gtk_list_focus (GtkContainer     *container,
        gtk_container_set_focus_child
          (container, GTK_LIST (container)->last_focus_child);
 
-      if (GTK_CONTAINER_CLASS (parent_class)->focus)
-       return_val = GTK_CONTAINER_CLASS (parent_class)->focus (container,
-                                                               direction);
+      if (GTK_WIDGET_CLASS (parent_class)->focus)
+       return_val = GTK_WIDGET_CLASS (parent_class)->focus (widget,
+                                                             direction);
     }
 
   if (!return_val)
index fe6148542a7445ce9bf2c0dd6d2cfa6a7847cdde..0de93619d25e5c941c36b9a2336834c8f0471100 100644 (file)
@@ -23,6 +23,7 @@
 
 BOOLEAN:BOXED
 BOOLEAN:BOXED,BOXED
+BOOLEAN:ENUM
 BOOLEAN:OBJECT,INT,INT,UINT
 BOOLEAN:OBJECT,STRING,STRING,BOXED
 BOOLEAN:OBJECT,BOXED,BOXED
index fe6148542a7445ce9bf2c0dd6d2cfa6a7847cdde..0de93619d25e5c941c36b9a2336834c8f0471100 100644 (file)
@@ -23,6 +23,7 @@
 
 BOOLEAN:BOXED
 BOOLEAN:BOXED,BOXED
+BOOLEAN:ENUM
 BOOLEAN:OBJECT,INT,INT,UINT
 BOOLEAN:OBJECT,STRING,STRING,BOXED
 BOOLEAN:OBJECT,BOXED,BOXED
index c18b22833091622ce7f84f7bf8aeb0e759e5b29b..5775fb3ff2a3636daab8d56c6d113dfc499eb98f 100644 (file)
@@ -156,6 +156,8 @@ static gint gtk_notebook_focus_in            (GtkWidget        *widget,
 static void gtk_notebook_draw_focus          (GtkWidget        *widget);
 static void gtk_notebook_style_set           (GtkWidget        *widget,
                                              GtkStyle         *previous_style);
+static gint gtk_notebook_focus               (GtkWidget        *widget,
+                                             GtkDirectionType  direction);
 
 /*** GtkContainer Methods ***/
 static void gtk_notebook_set_child_arg      (GtkContainer     *container,
@@ -170,8 +172,6 @@ static void gtk_notebook_add                 (GtkContainer     *container,
                                              GtkWidget        *widget);
 static void gtk_notebook_remove              (GtkContainer     *container,
                                              GtkWidget        *widget);
-static gint gtk_notebook_focus               (GtkContainer     *container,
-                                             GtkDirectionType  direction);
 static void gtk_notebook_set_focus_child     (GtkContainer     *container,
                                              GtkWidget        *child);
 static GtkType gtk_notebook_child_type       (GtkContainer     *container);
@@ -310,11 +310,11 @@ gtk_notebook_class_init (GtkNotebookClass *class)
   widget_class->motion_notify_event = gtk_notebook_motion_notify;
   widget_class->focus_in_event = gtk_notebook_focus_in;
   widget_class->style_set = gtk_notebook_style_set;
-   
+  widget_class->focus = gtk_notebook_focus;
+  
   container_class->add = gtk_notebook_add;
   container_class->remove = gtk_notebook_remove;
   container_class->forall = gtk_notebook_forall;
-  container_class->focus = gtk_notebook_focus;
   container_class->set_focus_child = gtk_notebook_set_focus_child;
   container_class->get_child_arg = gtk_notebook_get_child_arg;
   container_class->set_child_arg = gtk_notebook_set_child_arg;
@@ -1190,7 +1190,7 @@ gtk_notebook_arrow_button_press (GtkNotebook    *notebook,
            dir = (arrow == GTK_ARROW_LEFT) ? GTK_DIR_UP : GTK_DIR_DOWN;
          else
            dir = (arrow == GTK_ARROW_LEFT) ? GTK_DIR_LEFT : GTK_DIR_RIGHT;
-         gtk_container_focus (GTK_CONTAINER (notebook), dir);
+         gtk_widget_child_focus (widget, dir);
        }
       
       if (!notebook->timer)
@@ -1677,28 +1677,14 @@ static gboolean
 focus_child_in (GtkNotebook     *notebook,
                GtkDirectionType direction)
 {
-  if (GTK_WIDGET_DRAWABLE (notebook->cur_page->child) &&
-      GTK_WIDGET_IS_SENSITIVE (notebook->cur_page->child))
-    {
-      if (GTK_IS_CONTAINER (notebook->cur_page->child))
-       {
-         if (gtk_container_focus (GTK_CONTAINER (notebook->cur_page->child), direction))
-           return TRUE;
-       }
-      else if (GTK_WIDGET_CAN_FOCUS (notebook->cur_page->child))
-       {
-         gtk_widget_grab_focus (notebook->cur_page->child);
-         return TRUE;
-       }
-    }
-  return FALSE;
+  return gtk_widget_child_focus (notebook->cur_page->child, direction);
 }
 
 /* Focus in the notebook can either be on the pages, or on
  * the tabs.
  */
 static gint
-gtk_notebook_focus (GtkContainer     *container,
+gtk_notebook_focus (GtkWidget        *widget,
                    GtkDirectionType  direction)
 {
   GtkWidget *old_focus_child;
@@ -1720,26 +1706,23 @@ gtk_notebook_focus (GtkContainer     *container,
 #undef D  
 
   gboolean widget_is_focus;
+  GtkContainer *container;
 
-  g_return_val_if_fail (container != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_NOTEBOOK (container), FALSE);
+  g_return_val_if_fail (GTK_IS_NOTEBOOK (widget), FALSE);
 
+  container = GTK_CONTAINER (widget);
   notebook = GTK_NOTEBOOK (container);
 
-  widget_is_focus = gtk_widget_is_focus (GTK_WIDGET (container));
+  widget_is_focus = gtk_widget_is_focus (widget);
   old_focus_child = container->focus_child; 
 
   effective_direction = translate_direction[notebook->tab_pos][direction];
 
-  if (old_focus_child &&
-      GTK_IS_CONTAINER (old_focus_child) &&
-      GTK_WIDGET_DRAWABLE (old_focus_child) &&
-      GTK_WIDGET_IS_SENSITIVE (old_focus_child) &&
-      gtk_container_focus (GTK_CONTAINER (old_focus_child), direction))
-    return TRUE;
-
   if (old_focus_child)         /* Focus on page child */
     {
+      if (gtk_widget_child_focus (old_focus_child, direction))
+        return TRUE;
+      
       switch (effective_direction)
        {
        case GTK_DIR_TAB_BACKWARD:
@@ -2041,14 +2024,14 @@ gtk_notebook_timer (GtkNotebook *notebook)
          if (!notebook->focus_tab ||
              gtk_notebook_search_page (notebook, notebook->focus_tab,
                                        STEP_PREV, TRUE))
-           gtk_container_focus (GTK_CONTAINER (notebook), GTK_DIR_LEFT);
+           gtk_widget_child_focus (GTK_WIDGET (notebook), GTK_DIR_LEFT);
        }
       else if (notebook->click_child == GTK_ARROW_RIGHT)
        {
          if (!notebook->focus_tab ||
              gtk_notebook_search_page (notebook, notebook->focus_tab,
                                        STEP_NEXT, TRUE))
-           gtk_container_focus (GTK_CONTAINER (notebook), GTK_DIR_RIGHT);
+           gtk_widget_child_focus (GTK_WIDGET (notebook), GTK_DIR_RIGHT);
        }
       if (notebook->need_timer) 
        {
@@ -3491,21 +3474,9 @@ gtk_notebook_page_select (GtkNotebook *notebook,
          dir = GTK_DIR_LEFT;
          break;
        }
-      
-      if (GTK_WIDGET_VISIBLE (page->child))
-       {
-         if (GTK_IS_CONTAINER (page->child))
-           {
-             if (gtk_container_focus (GTK_CONTAINER (page->child), 
-                                      dir))
-               return TRUE;
-           }
-         else if (GTK_WIDGET_CAN_FOCUS (page->child))
-           {
-             gtk_widget_grab_focus (page->child);
-             return TRUE;
-           }
-       }
+
+      if (gtk_widget_child_focus (page->child, dir))
+        return TRUE;
     }
   return FALSE;
 }
index 78d9d5128fe1e3009e224149df6d7e7079dd5c1c..1f7319b390c21e9a8dc8d0db05c16a24e6adc1da 100644 (file)
@@ -43,7 +43,7 @@ static void            gtk_plug_forward_key_press     (GtkPlug          *plug,
                                                       GdkEventKey      *event);
 static void            gtk_plug_set_focus             (GtkWindow        *window,
                                                       GtkWidget        *focus);
-static gboolean        gtk_plug_focus                 (GtkContainer     *container,
+static gboolean        gtk_plug_focus                 (GtkWidget        *widget,
                                                       GtkDirectionType  direction);
 static void            gtk_plug_accel_entries_changed (GtkWindow        *window);
 static GdkFilterReturn gtk_plug_filter_func           (GdkXEvent        *gdk_xevent,
@@ -94,7 +94,6 @@ static void
 gtk_plug_class_init (GtkPlugClass *class)
 {
   GtkWidgetClass *widget_class = (GtkWidgetClass *)class;
-  GtkContainerClass *container_class = (GtkContainerClass *)class;
   GtkWindowClass *window_class = (GtkWindowClass *)class;
 
   parent_class = gtk_type_class (GTK_TYPE_WINDOW);
@@ -103,7 +102,7 @@ gtk_plug_class_init (GtkPlugClass *class)
   widget_class->unrealize = gtk_plug_unrealize;
   widget_class->key_press_event = gtk_plug_key_press_event;
 
 container_class->focus = gtk_plug_focus;
widget_class->focus = gtk_plug_focus;
 
   window_class->set_focus = gtk_plug_set_focus;
 #if 0  
@@ -441,12 +440,13 @@ gtk_plug_accel_entries_changed (GtkWindow *window)
 #endif
 
 static gboolean
-gtk_plug_focus (GtkContainer     *container,
+gtk_plug_focus (GtkWidget        *widget,
                GtkDirectionType  direction)
 {
-  GtkBin *bin = GTK_BIN (container);
-  GtkPlug *plug = GTK_PLUG (container);
-  GtkWindow *window = GTK_WINDOW (container);
+  GtkBin *bin = GTK_BIN (widget);
+  GtkPlug *plug = GTK_PLUG (widget);
+  GtkWindow *window = GTK_WINDOW (widget);
+  GtkContainer *container = GTK_CONTAINER (widget);
   GtkWidget *old_focus_child = container->focus_child;
   GtkWidget *parent;
   
@@ -454,10 +454,7 @@ gtk_plug_focus (GtkContainer     *container,
    */
   if (old_focus_child)
     {
-      if (GTK_IS_CONTAINER (old_focus_child) &&
-         GTK_WIDGET_DRAWABLE (old_focus_child) &&
-         GTK_WIDGET_IS_SENSITIVE (old_focus_child) &&
-         gtk_container_focus (GTK_CONTAINER (old_focus_child), direction))
+      if (gtk_widget_child_focus (old_focus_child, direction))
        return TRUE;
 
       if (window->focus_widget)
@@ -513,20 +510,9 @@ gtk_plug_focus (GtkContainer     *container,
   else
     {
       /* Try to focus the first widget in the window */
-      if (GTK_WIDGET_DRAWABLE (bin->child) &&
-         GTK_WIDGET_IS_SENSITIVE (bin->child))
-       {
-         if (GTK_IS_CONTAINER (bin->child))
-           {
-             if (gtk_container_focus (GTK_CONTAINER (bin->child), direction))
-               return TRUE;
-           }
-         else if (GTK_WIDGET_CAN_FOCUS (bin->child))
-           {
-             gtk_widget_grab_focus (bin->child);
-             return TRUE;
-           }
-       }
+      
+      if (gtk_widget_child_focus (bin->child, direction))
+        return TRUE;
     }
 
   return FALSE;
@@ -582,7 +568,7 @@ focus_first_last (GtkPlug          *plug,
       gtk_window_set_focus (GTK_WINDOW (plug), NULL);
     }
 
-  gtk_container_focus (GTK_CONTAINER (plug), direction);
+  gtk_widget_child_focus (GTK_WIDGET (plug), direction);
 }
 
 static void
index 42eb0e67ad9bd3ec9f1ab97462506da5e79237a4..754ca0e0f9cd4c89a5a5fb47339f95f181a43adc 100644 (file)
@@ -57,7 +57,7 @@ static void            gtk_socket_claim_focus          (GtkSocket        *socket
 static gboolean        gtk_socket_focus_out_event      (GtkWidget        *widget,
                                                        GdkEventFocus    *event);
 static void            gtk_socket_send_configure_event (GtkSocket        *socket);
-static gboolean        gtk_socket_focus                (GtkContainer     *container,
+static gboolean        gtk_socket_focus                (GtkWidget        *widget,
                                                        GtkDirectionType  direction);
 static GdkFilterReturn gtk_socket_filter_func          (GdkXEvent        *gdk_xevent,
                                                        GdkEvent         *event,
@@ -126,7 +126,7 @@ gtk_socket_class_init (GtkSocketClass *class)
   widget_class->focus_in_event = gtk_socket_focus_in_event;
   widget_class->focus_out_event = gtk_socket_focus_out_event;
 
-  container_class->focus = gtk_socket_focus;
+  widget_class->focus = gtk_socket_focus;
 }
 
 static void
@@ -702,16 +702,16 @@ gtk_socket_claim_focus (GtkSocket *socket)
 }
 
 static gboolean
-gtk_socket_focus (GtkContainer *container, GtkDirectionType direction)
+gtk_socket_focus (GtkWidget *widget, GtkDirectionType direction)
 {
   GtkSocket *socket;
   gint detail = -1;
 
-  g_return_val_if_fail (GTK_IS_SOCKET (container), FALSE);
+  g_return_val_if_fail (GTK_IS_SOCKET (widget), FALSE);
   
-  socket = GTK_SOCKET (container);
+  socket = GTK_SOCKET (widget);
 
-  if (!GTK_WIDGET_HAS_FOCUS (container))
+  if (!GTK_WIDGET_HAS_FOCUS (widget))
     {
       switch (direction)
        {
@@ -730,8 +730,8 @@ gtk_socket_focus (GtkContainer *container, GtkDirectionType direction)
       send_xembed_message (socket, XEMBED_FOCUS_IN, detail, 0, 0,
                           gtk_get_current_event_time ());
 
-      GTK_WIDGET_SET_FLAGS (container, GTK_HAS_FOCUS);
-      gtk_widget_grab_focus (GTK_WIDGET (container));
+      GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
+      gtk_widget_grab_focus (widget);
  
       return TRUE;
     }
@@ -935,11 +935,11 @@ handle_xembed_message (GtkSocket *socket,
     case XEMBED_FOCUS_PREV:
       {
        GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (socket));
-       if (toplevel && GTK_IS_CONTAINER (toplevel))
+       if (toplevel)
          {
-           gtk_container_focus (GTK_CONTAINER (toplevel),
-                                (message == XEMBED_FOCUS_NEXT ?
-                                 GTK_DIR_TAB_FORWARD : GTK_DIR_TAB_BACKWARD));
+           gtk_widget_child_focus (toplevel,
+                                    (message == XEMBED_FOCUS_NEXT ?
+                                     GTK_DIR_TAB_FORWARD : GTK_DIR_TAB_BACKWARD));
          }
        break;
       }
index c014ba4b258aefda65c2d1e8f8d82dd2d4f83c15..4de2827fcca4273900f04c88c0e978119a3d577b 100644 (file)
@@ -2210,7 +2210,7 @@ gtk_text_buffer_remove_all_tags (GtkTextBuffer     *buffer,
         }
     }
 
-  g_list_foreach (tags, (GFunc) g_object_ref, NULL);
+  g_slist_foreach (tags, (GFunc) g_object_ref, NULL);
   
   tmp_list = tags;
   while (tmp_list != NULL)
@@ -2222,7 +2222,7 @@ gtk_text_buffer_remove_all_tags (GtkTextBuffer     *buffer,
       tmp_list = tmp_list->next;
     }
 
-  g_list_foreach (tags, (GFunc) g_object_unref, NULL);
+  g_slist_foreach (tags, (GFunc) g_object_unref, NULL);
   
   g_slist_free (tags);
 }
index 93dbadc394352deead127d187a1ed41e6cb5b24d..9b5836410ea8386e65283e4475abd7a9d37433cf 100644 (file)
@@ -91,6 +91,8 @@ static void gtk_toolbar_size_allocate            (GtkWidget       *widget,
                                                  GtkAllocation   *allocation);
 static void gtk_toolbar_style_set                (GtkWidget       *widget,
                                                   GtkStyle        *prev_style);
+static gboolean gtk_toolbar_focus                (GtkWidget       *widget,
+                                                  GtkDirectionType dir);
 static void gtk_toolbar_show_all                 (GtkWidget       *widget);
 static void gtk_toolbar_add                      (GtkContainer    *container,
                                                  GtkWidget       *widget);
@@ -100,6 +102,7 @@ static void gtk_toolbar_forall                   (GtkContainer    *container,
                                                  gboolean         include_internals,
                                                  GtkCallback      callback,
                                                  gpointer         callback_data);
+
 static void gtk_real_toolbar_orientation_changed (GtkToolbar      *toolbar,
                                                  GtkOrientation   orientation);
 static void gtk_real_toolbar_style_changed       (GtkToolbar      *toolbar,
@@ -192,11 +195,11 @@ gtk_toolbar_class_init (GtkToolbarClass *class)
   widget_class->size_allocate = gtk_toolbar_size_allocate;
   widget_class->style_set = gtk_toolbar_style_set;
   widget_class->show_all = gtk_toolbar_show_all;
+  widget_class->focus = gtk_toolbar_focus;
   
   container_class->add = gtk_toolbar_add;
   container_class->remove = gtk_toolbar_remove;
   container_class->forall = gtk_toolbar_forall;
-  container_class->focus = NULL;
   
   class->orientation_changed = gtk_real_toolbar_orientation_changed;
   class->style_changed = gtk_real_toolbar_style_changed;
@@ -834,6 +837,15 @@ gtk_toolbar_style_set (GtkWidget  *widget,
     gtk_toolbar_update_button_relief (GTK_TOOLBAR (widget));
 }
 
+static gboolean
+gtk_toolbar_focus (GtkWidget       *widget,
+                   GtkDirectionType dir)
+{
+  /* Focus can't go in toolbars */
+  
+  return FALSE;
+}
+
 static void
 child_show_all (GtkWidget *widget)
 {
index c17b6f93b027b71827218c269611eadc757ad43e..87abccca726f8430ddb47b86c507c4828174486f 100644 (file)
@@ -164,7 +164,7 @@ static gint     gtk_tree_view_focus_in             (GtkWidget        *widget,
                                                    GdkEventFocus    *event);
 static gint     gtk_tree_view_focus_out            (GtkWidget        *widget,
                                                    GdkEventFocus    *event);
-static gint     gtk_tree_view_focus                (GtkContainer     *container,
+static gint     gtk_tree_view_focus                (GtkWidget        *widget,
                                                    GtkDirectionType  direction);
 
 /* container signals */
@@ -418,11 +418,11 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
   widget_class->drag_motion = gtk_tree_view_drag_motion;
   widget_class->drag_drop = gtk_tree_view_drag_drop;
   widget_class->drag_data_received = gtk_tree_view_drag_data_received;
-
+  widget_class->focus = gtk_tree_view_focus;
+  
   /* GtkContainer signals */
   container_class->remove = gtk_tree_view_remove;
   container_class->forall = gtk_tree_view_forall;
-  container_class->focus = gtk_tree_view_focus;
   container_class->set_focus_child = gtk_tree_view_set_focus_child;
 
   class->set_scroll_adjustments = gtk_tree_view_set_adjustments;
@@ -3784,7 +3784,7 @@ gtk_tree_view_header_focus (GtkTreeView      *tree_view,
          break;
        }
 
-      if (gtk_container_focus (GTK_CONTAINER (focus_child), dir))
+      if (gtk_widget_child_focus (focus_child, dir))
        {
          /* The focus moves inside the button. */
          /* This is probably a great example of bad UI */
@@ -3880,7 +3880,7 @@ gtk_tree_view_header_focus (GtkTreeView      *tree_view,
  * handling scrolling by keyboard, such that in cases.
  */
 static gint
-gtk_tree_view_focus (GtkContainer     *container,
+gtk_tree_view_focus (GtkWidget        *widget,
                     GtkDirectionType  direction)
 {
   GtkTreeView *tree_view;
@@ -3889,11 +3889,13 @@ gtk_tree_view_focus (GtkContainer     *container,
   GtkRBTree *cursor_tree;
   GtkRBNode *cursor_node;
   GtkTreePath *cursor_path;
+  GtkContainer *container;
 
-  g_return_val_if_fail (GTK_IS_TREE_VIEW (container), FALSE);
-  g_return_val_if_fail (GTK_WIDGET_VISIBLE (container), FALSE);
+  g_return_val_if_fail (GTK_IS_TREE_VIEW (widget), FALSE);
+  g_return_val_if_fail (GTK_WIDGET_VISIBLE (widget), FALSE);
 
-  tree_view = GTK_TREE_VIEW (container);
+  container = GTK_CONTAINER (widget);
+  tree_view = GTK_TREE_VIEW (widget);
 
   if (!GTK_WIDGET_IS_SENSITIVE (container))
     return FALSE;
index f8c4a58c17fe40a6e266bd9d22da5c06db80d7e7..790476875e6331be380f2f41a4d0c10a8bb2ac63 100644 (file)
@@ -69,6 +69,7 @@ enum {
   REMOVE_ACCELERATOR,
   ACTIVATE_MNEMONIC,
   GRAB_FOCUS,
+  FOCUS,
   EVENT,
   BUTTON_PRESS_EVENT,
   BUTTON_RELEASE_EVENT,
@@ -179,6 +180,8 @@ static void gtk_widget_style_set             (GtkWidget         *widget,
 static void gtk_widget_direction_changed        (GtkWidget         *widget,
                                                  GtkTextDirection   previous_direction);
 static void gtk_widget_real_grab_focus           (GtkWidget         *focus_widget);
+static gboolean gtk_widget_real_focus            (GtkWidget         *widget,
+                                                  GtkDirectionType   direction);
 
 static GdkColormap*  gtk_widget_peek_colormap      (void);
 static GtkStyle*     gtk_widget_peek_style         (void);
@@ -323,6 +326,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
   klass->mnemonic_activate = gtk_widget_real_mnemonic_activate;
   klass->grab_focus = gtk_widget_real_grab_focus;
+  klass->focus = gtk_widget_real_focus;
   klass->event = NULL;
   klass->button_press_event = NULL;
   klass->button_release_event = NULL;
@@ -650,6 +654,15 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                    GTK_SIGNAL_OFFSET (GtkWidgetClass, grab_focus),
                    gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
+  widget_signals[FOCUS] =
+    g_signal_newc ("focus",
+                   G_TYPE_FROM_CLASS (object_class),
+                   G_SIGNAL_RUN_LAST,
+                   G_STRUCT_OFFSET (GtkWidgetClass, focus),
+                   _gtk_boolean_handled_accumulator, NULL,
+                   gtk_marshal_BOOLEAN__ENUM,
+                   G_TYPE_BOOLEAN, 1,
+                   GTK_TYPE_DIRECTION_TYPE);
   widget_signals[EVENT] =
     g_signal_newc ("event",
                   G_TYPE_FROM_CLASS(object_class),
@@ -3021,6 +3034,23 @@ gtk_widget_real_grab_focus (GtkWidget *focus_widget)
     }
 }
 
+static gboolean
+gtk_widget_real_focus (GtkWidget         *widget,
+                       GtkDirectionType   direction)
+{
+  if (!GTK_WIDGET_CAN_FOCUS (widget))
+    return FALSE;
+  
+  if (!GTK_WIDGET_HAS_FOCUS (widget))
+    {
+      gtk_widget_grab_focus (widget);
+      return TRUE;
+    }
+  else
+    return FALSE;
+}
+
+
 /**
  * gtk_widget_is_focus:
  * @widget: a #GtkWidget
@@ -4120,6 +4150,66 @@ gtk_widget_get_parent_window   (GtkWidget           *widget)
   return (parent_window != NULL) ? parent_window : widget->parent->window;
 }
 
+/**
+ * gtk_widget_child_focus:
+ * @widget: a #GtkWidget
+ * @direction: direction of focus movement
+ *
+ * This function is used by custom widget implementations; if you're
+ * writing an app, you'd use gtk_widget_grab_focus() to move the focus
+ * to a particular widget, and gtk_container_set_focus_chain() to
+ * change the focus tab order. So you may want to investigate those
+ * functions instead.
+ * 
+ * gtk_widget_child_focus() is called by containers as the user moves
+ * around the window using keyboard shortcuts. @direction indicates
+ * what kind of motion is taking place (up, down, left, right, tab
+ * forward, tab backward).  gtk_widget_child_focus() invokes the
+ * "focus" signal on #GtkWidget; widgets override the default handler
+ * for this signal in order to implement appropriate focus behavior.
+ *
+ * The "focus" default handler for a widget should return %TRUE if
+ * moving in @direction left the focus on a focusable location inside
+ * that widget, and %FALSE if moving in @direction moved the focus
+ * outside the widget. If returning %TRUE, widgets normally
+ * call gtk_widget_grab_focus() to place the focus accordingly;
+ * if returning %FALSE, they don't modify the current focus location.
+ * 
+ * This function replaces gtk_container_focus() from GTK+ 1.2.  It was
+ * necessary to check that the child was visible, sensitive, and
+ * focusable before calling
+ * gtk_container_focus(). gtk_widget_child_focus() returns %FALSE if
+ * the widget is not currently in a focusable state, so there's no
+ * need for those checks.
+ * 
+ * Return value: %TRUE if focus ended up inside @widget
+ **/
+gboolean
+gtk_widget_child_focus (GtkWidget       *widget,
+                        GtkDirectionType direction)
+{
+  gboolean return_val;
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+
+  if (!GTK_WIDGET_VISIBLE (widget) ||
+      !GTK_WIDGET_IS_SENSITIVE (widget))
+    return FALSE;
+
+  /* child widgets must set CAN_FOCUS, containers
+   * don't have to though.
+   */
+  if (!GTK_IS_CONTAINER (widget) &&
+      !GTK_WIDGET_CAN_FOCUS (widget))
+    return FALSE;
+  
+  gtk_signal_emit (GTK_OBJECT (widget),
+                   widget_signals[FOCUS],
+                   direction, &return_val);
+
+  return return_val;
+}
+
 /* Update the position from aux_info. Used from gtk_widget_set_uposition
  * and gtk_widget_set_property().
  */
index 2fa125fa5067fa97720a8370834eadab9b744a4d..a1107e95580b7cf52306b820fc4e428af1324b58 100644 (file)
@@ -276,7 +276,9 @@ struct _GtkWidgetClass
                                  gboolean      group_cycling);
   
   /* explicit focus */
-  void (* grab_focus)          (GtkWidget      *widget);
+  void (* grab_focus)          (GtkWidget        *widget);
+  gboolean (* focus)           (GtkWidget        *widget,
+                                GtkDirectionType  direction);
   
   /* events */
   gboolean (* event)                   (GtkWidget           *widget,
@@ -523,6 +525,8 @@ void           gtk_widget_set_parent          (GtkWidget           *widget,
 void      gtk_widget_set_parent_window   (GtkWidget           *widget,
                                           GdkWindow           *parent_window);
 GdkWindow *gtk_widget_get_parent_window          (GtkWidget           *widget);
+gboolean   gtk_widget_child_focus         (GtkWidget           *widget,
+                                           GtkDirectionType     direction);
 void      gtk_widget_set_uposition       (GtkWidget           *widget,
                                           gint                 x,
                                           gint                 y);
index 99c7e2f091085a668318c4975203650dcd1bf1b0..0880b3a89fca0bf8de1610e5798780d6b7ddb686 100644 (file)
@@ -143,7 +143,7 @@ static gint gtk_window_focus_out_event    (GtkWidget         *widget,
 static gint gtk_window_client_event      (GtkWidget         *widget,
                                           GdkEventClient    *event);
 static void gtk_window_check_resize       (GtkContainer      *container);
-static gint gtk_window_focus              (GtkContainer     *container,
+static gint gtk_window_focus              (GtkWidget        *widget,
                                           GtkDirectionType  direction);
 static void gtk_window_real_set_focus     (GtkWindow         *window,
                                           GtkWidget         *focus);
@@ -301,11 +301,11 @@ gtk_window_class_init (GtkWindowClass *klass)
   widget_class->focus_in_event = gtk_window_focus_in_event;
   widget_class->focus_out_event = gtk_window_focus_out_event;
   widget_class->client_event = gtk_window_client_event;
+  widget_class->focus = gtk_window_focus;
   
   widget_class->expose_event = gtk_window_expose;
    
   container_class->check_resize = gtk_window_check_resize;
-  container_class->focus = gtk_window_focus;
 
   klass->set_focus = gtk_window_real_set_focus;
   klass->frame_event = gtk_window_frame_event;
@@ -2190,7 +2190,7 @@ static void
 gtk_window_move_focus (GtkWindow       *window,
                        GtkDirectionType dir)
 {
-  gtk_container_focus (GTK_CONTAINER (window), dir);
+  gtk_widget_child_focus (GTK_WIDGET (window), dir);
   
   if (!GTK_CONTAINER (window)->focus_child)
     gtk_window_set_focus (window, NULL);
@@ -2382,13 +2382,20 @@ gtk_window_check_resize (GtkContainer *container)
 }
 
 static gboolean
-gtk_window_focus (GtkContainer     *container,
+gtk_window_focus (GtkWidget        *widget,
                  GtkDirectionType  direction)
 {
-  GtkBin *bin = GTK_BIN (container);
-  GtkWindow *window = GTK_WINDOW (container);
-  GtkWidget *old_focus_child = container->focus_child;
+  GtkBin *bin;
+  GtkWindow *window;
+  GtkContainer *container;
+  GtkWidget *old_focus_child;
   GtkWidget *parent;
+
+  container = GTK_CONTAINER (widget);
+  window = GTK_WINDOW (widget);
+  bin = GTK_BIN (widget);
+
+  old_focus_child = container->focus_child;
   
   /* We need a special implementation here to deal properly with wrapping
    * around in the tab chain without the danger of going into an
@@ -2396,10 +2403,7 @@ gtk_window_focus (GtkContainer     *container,
    */
   if (old_focus_child)
     {
-      if (GTK_IS_CONTAINER (old_focus_child) &&
-         GTK_WIDGET_DRAWABLE (old_focus_child) &&
-         GTK_WIDGET_IS_SENSITIVE (old_focus_child) &&
-         gtk_container_focus (GTK_CONTAINER (old_focus_child), direction))
+      if (gtk_widget_child_focus (old_focus_child, direction))
        return TRUE;
     }
 
@@ -2417,20 +2421,10 @@ gtk_window_focus (GtkContainer     *container,
     }
 
   /* Now try to focus the first widget in the window */
-  if (bin->child &&
-      GTK_WIDGET_DRAWABLE (bin->child) &&
-      GTK_WIDGET_IS_SENSITIVE (bin->child))
+  if (bin->child)
     {
-      if (GTK_IS_CONTAINER (bin->child))
-       {
-         if (gtk_container_focus (GTK_CONTAINER (bin->child), direction))
-           return TRUE;
-       }
-      else if (GTK_WIDGET_CAN_FOCUS (bin->child))
-       {
-         gtk_widget_grab_focus (bin->child);
-         return TRUE;
-       }
+      if (gtk_widget_child_focus (bin->child, direction))
+        return TRUE;
     }
 
   return FALSE;