[gtk/wip/matthiasc/focus2: 88/91] Add a ::set_focus_child vfunc back



commit 42c73a3495fa6b7021de949f8dcb4c9389905349
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Mar 8 13:16:13 2019 -0500

    Add a ::set_focus_child vfunc back
    
    This will allow widgets to update state when a child
    is focused. An example for where this is needed is
    updating the selection in listbox or flowbox.

 gtk/gtkwidget.c | 16 +++++++++++++---
 gtk/gtkwidget.h |  6 +++++-
 2 files changed, 18 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index d6e4154c22..5bd58fb450 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -588,7 +588,9 @@ static void gtk_widget_real_size_allocate    (GtkWidget         *widget,
 static void    gtk_widget_real_direction_changed(GtkWidget         *widget,
                                                   GtkTextDirection   previous_direction);
 
-static void    gtk_widget_real_grab_focus       (GtkWidget         *focus_widget);
+static void    gtk_widget_real_grab_focus       (GtkWidget         *focus_widget);
+static void    gtk_widget_real_set_focus_child  (GtkWidget         *widget,
+                                                  GtkWidget         *child);
 static gboolean gtk_widget_real_query_tooltip    (GtkWidget         *widget,
                                                  gint               x,
                                                  gint               y,
@@ -946,6 +948,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->snapshot = gtk_widget_real_snapshot;
   klass->mnemonic_activate = gtk_widget_real_mnemonic_activate;
   klass->grab_focus = gtk_widget_real_grab_focus;
+  klass->set_focus_child = gtk_widget_real_set_focus_child;
   klass->next_focus_child = gtk_widget_next_focus_child;
   klass->move_focus = gtk_widget_real_move_focus;
   klass->keynav_failed = gtk_widget_real_keynav_failed;
@@ -13286,8 +13289,6 @@ void
 gtk_widget_set_focus_child (GtkWidget *widget,
                             GtkWidget *child)
 {
-  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
-
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
   if (child != NULL)
@@ -13296,6 +13297,15 @@ gtk_widget_set_focus_child (GtkWidget *widget,
       g_return_if_fail (gtk_widget_get_parent (child) == widget);
     }
 
+  GTK_WIDGET_GET_CLASS (widget)->set_focus_child (widget, child);
+}
+
+static void
+gtk_widget_real_set_focus_child (GtkWidget *widget,
+                                 GtkWidget *child)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
   g_set_object (&priv->focus_child, child);
 }
 
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index df93e95f1e..438ef53011 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -185,6 +185,8 @@ struct _GtkWidget
  *   %FALSE, and just grabs the focus if @group_cycling is %TRUE.
  * @grab_focus: Causes @widget to have the keyboard focus for the
  *   #GtkWindow it’s inside.
+ * @set_focus_child: Allows widget implementations to do extra actions when
+ *   the child containing the focus is changed. Must chain up
  * @next_focus_child: Returns the next child that is a candidate for receiving focus.
  *   Note that the returned child does not have to be focusable itself, it might just
  *   contain focusable children. The default implementation returns all children, in
@@ -280,7 +282,9 @@ struct _GtkWidgetClass
                                          gboolean             group_cycling);
 
   /* explicit focus */
-  void     (* grab_focus)               (GtkWidget           *widget);
+  void        (* grab_focus)            (GtkWidget           *widget);
+  void        (* set_focus_child)       (GtkWidget           *widget,
+                                         GtkWidget           *child);
   GtkWidget * (* next_focus_child)      (GtkWidget           *widget,
                                          GtkWidget           *child,
                                          GtkDirectionType     direction);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]