[gtk/issue-1863: 1/3] Allow specifying the layout manager for a widget type



commit c6b2184aa0cce3b1ac65d538495cd725db0f4770
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Mon May 6 11:57:32 2019 +0100

    Allow specifying the layout manager for a widget type
    
    Some widgets have a well-defined layout manager created alongside their
    own instance; if they do, we can handle the layout manager creation at
    the GtkWidget instantiation.

 gtk/gtkwidget.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
 gtk/gtkwidget.h |  4 ++++
 2 files changed, 48 insertions(+)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index af0b48c8c6..f456f19306 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -497,6 +497,7 @@ struct _GtkWidgetClassPrivate
   GType accessible_type;
   AtkRole accessible_role;
   const char *css_name;
+  GType layout_manager_type;
 };
 
 enum {
@@ -706,6 +707,8 @@ static void gtk_widget_update_input_shape (GtkWidget *widget);
 
 static gboolean gtk_widget_class_get_visible_by_default (GtkWidgetClass *widget_class);
 
+static GType gtk_widget_class_get_layout_manager_type (GtkWidgetClass *widget_class);
+
 static void remove_parent_surface_transform_changed_listener (GtkWidget *widget);
 static void add_parent_surface_transform_changed_listener (GtkWidget *widget);
 
@@ -2740,6 +2743,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
 {
   GtkWidget *widget = GTK_WIDGET (instance);
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+  GType layout_manager_type;
 
   widget->priv = priv;
 
@@ -2808,6 +2812,10 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
 
   if (g_type_is_a (G_TYPE_FROM_CLASS (g_class), GTK_TYPE_ROOT))
     priv->root = (GtkRoot *) widget;
+
+  layout_manager_type = gtk_widget_class_get_layout_manager_type (g_class);
+  if (layout_manager_type != G_TYPE_INVALID)
+    gtk_widget_set_layout_manager (widget, g_object_new (layout_manager_type, NULL));
 }
 
 /**
@@ -13575,6 +13583,42 @@ gtk_widget_get_height (GtkWidget *widget)
   return priv->height;
 }
 
+/**
+ * gtk_widget_class_set_layout_manager_type:
+ * @widget_class: class to set the layout manager type for
+ * @type: The object type that implements the #GtkLayoutManager for @widget_class
+ *
+ * Sets the type to be used for creating layout managers for widgets of
+ * @widget_class. The given @type must be a subtype of #GtkLayoutManager.
+ *
+ * This function should only be called from class init functions of widgets.
+ **/
+void
+gtk_widget_class_set_layout_manager_type (GtkWidgetClass *widget_class,
+                                          GType           type)
+{
+  GtkWidgetClassPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
+  g_return_if_fail (g_type_is_a (type, GTK_TYPE_LAYOUT_MANAGER));
+
+  priv = widget_class->priv;
+
+  priv->layout_manager_type = type;
+}
+
+static GType
+gtk_widget_class_get_layout_manager_type (GtkWidgetClass *widget_class)
+{
+  GtkWidgetClassPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_WIDGET_CLASS (widget_class), G_TYPE_INVALID);
+
+  priv = widget_class->priv;
+
+  return priv->layout_manager_type;
+}
+
 /**
  * gtk_widget_set_layout_manager:
  * @widget: a #GtkWidget
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 6961f20794..e93a40c743 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -414,6 +414,10 @@ void                    gtk_widget_set_layout_manager   (GtkWidget        *widge
 GDK_AVAILABLE_IN_ALL
 GtkLayoutManager *      gtk_widget_get_layout_manager   (GtkWidget        *widget);
 
+GDK_AVAILABLE_IN_ALL
+void                    gtk_widget_class_set_layout_manager_type        (GtkWidgetClass *widget_class,
+                                                                         GType           type);
+
 GDK_AVAILABLE_IN_ALL
 void       gtk_widget_add_accelerator     (GtkWidget           *widget,
                                            const gchar         *accel_signal,


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