[gtk/issue-1863: 1/3] Allow specifying the layout manager for a widget type
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/issue-1863: 1/3] Allow specifying the layout manager for a widget type
- Date: Mon, 6 May 2019 11:17:33 +0000 (UTC)
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]