diff --git a/gtk/gtkbox.c b/gtk/gtkbox.c index 1491d8d007..616b7d6e44 100644 --- a/gtk/gtkbox.c +++ b/gtk/gtkbox.c @@ -161,6 +161,7 @@ gtk_box_class_init (GtkBoxClass *class) g_object_class_install_properties (object_class, LAST_PROP, props); + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT); gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_FILLER); gtk_widget_class_set_css_name (widget_class, I_("box")); } @@ -344,12 +345,9 @@ static void gtk_box_init (GtkBox *box) { GtkBoxPrivate *priv = gtk_box_get_instance_private (box); - GtkLayoutManager *box_layout = gtk_box_layout_new (GTK_ORIENTATION_HORIZONTAL); gtk_widget_set_has_surface (GTK_WIDGET (box), FALSE); - gtk_widget_set_layout_manager (GTK_WIDGET (box), box_layout); - priv->orientation = GTK_ORIENTATION_HORIZONTAL; _gtk_orientable_set_style_classes (GTK_ORIENTABLE (box)); } diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c index eb4d883955..8b87409f84 100644 --- a/gtk/gtkfilechooserbutton.c +++ b/gtk/gtkfilechooserbutton.c @@ -422,6 +422,8 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class) _gtk_file_chooser_install_properties (gobject_class); gtk_widget_class_set_css_name (widget_class, I_("filechooserbutton")); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); } static void @@ -497,8 +499,6 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) target_list, GDK_ACTION_COPY); gdk_content_formats_unref (target_list); - - gtk_widget_set_layout_manager (GTK_WIDGET (button), gtk_bin_layout_new ()); } diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 915c615b78..a5915769e9 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -8326,6 +8326,8 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) gtk_widget_class_bind_template_callback (widget_class, widget_key_press_cb); gtk_widget_class_set_css_name (widget_class, I_("filechooser")); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); } static void @@ -8467,8 +8469,6 @@ gtk_file_chooser_widget_init (GtkFileChooserWidget *impl) */ post_process_ui (impl); - gtk_widget_set_layout_manager (GTK_WIDGET (impl), gtk_bin_layout_new ()); - profile_end ("end", NULL); } diff --git a/gtk/gtkfixed.c b/gtk/gtkfixed.c index 4f0ae14241..24af3fd513 100644 --- a/gtk/gtkfixed.c +++ b/gtk/gtkfixed.c @@ -96,11 +96,14 @@ static void gtk_fixed_class_init (GtkFixedClass *klass) { GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); container_class->add = gtk_fixed_add; container_class->remove = gtk_fixed_remove; container_class->forall = gtk_fixed_forall; container_class->child_type = gtk_fixed_child_type; + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_FIXED_LAYOUT); } static GType @@ -117,8 +120,7 @@ gtk_fixed_init (GtkFixed *self) gtk_widget_set_has_surface (GTK_WIDGET (self), FALSE); gtk_widget_set_overflow (GTK_WIDGET (self), GTK_OVERFLOW_HIDDEN); - priv->layout = gtk_fixed_layout_new (); - gtk_widget_set_layout_manager (GTK_WIDGET (self), priv->layout); + priv->layout = gtk_widget_get_layout_manager (GTK_WIDGET (self)); } /** diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c index f68468d769..18d005280b 100644 --- a/gtk/gtkgrid.c +++ b/gtk/gtkgrid.c @@ -380,6 +380,8 @@ gtk_grid_class_init (GtkGridClass *class) g_object_class_install_properties (object_class, N_PROPERTIES, obj_properties); gtk_widget_class_set_css_name (widget_class, I_("grid")); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_GRID_LAYOUT); } static void @@ -389,8 +391,7 @@ gtk_grid_init (GtkGrid *grid) gtk_widget_set_has_surface (GTK_WIDGET (grid), FALSE); - priv->layout_manager = gtk_grid_layout_new (); - gtk_widget_set_layout_manager (GTK_WIDGET (grid), priv->layout_manager); + priv->layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (grid)); priv->orientation = GTK_ORIENTATION_HORIZONTAL; _gtk_orientable_set_style_classes (GTK_ORIENTABLE (grid)); diff --git a/gtk/gtkoverlay.c b/gtk/gtkoverlay.c index 5195f9ac0a..13af196f40 100644 --- a/gtk/gtkoverlay.c +++ b/gtk/gtkoverlay.c @@ -302,6 +302,8 @@ gtk_overlay_class_init (GtkOverlayClass *klass) GDK_TYPE_RECTANGLE | G_SIGNAL_TYPE_STATIC_SCOPE); gtk_widget_class_set_css_name (widget_class, I_("overlay")); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_OVERLAY_LAYOUT); } static void @@ -311,8 +313,7 @@ gtk_overlay_init (GtkOverlay *overlay) gtk_widget_set_has_surface (GTK_WIDGET (overlay), FALSE); - priv->layout = gtk_overlay_layout_new (); - gtk_widget_set_layout_manager (GTK_WIDGET (overlay), priv->layout); + priv->layout = gtk_widget_get_layout_manager (GTK_WIDGET (overlay)); } static GtkBuildableIface *parent_buildable_iface; diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index af0b48c8c6..4eedd5a96c 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 { @@ -2740,6 +2741,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 +2810,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 +13581,52 @@ 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; +} + +/** + * gtk_widget_class_get_layout_manager_type: + * @widget_class: a #GtkWidgetClass + * + * Retrieves the type of the #GtkLayoutManager used by the #GtkWidget class. + * + * See also: gtk_widget_class_set_layout_manager_type() + * + * Returns: a #GtkLayoutManager subclass, or %G_TYPE_INVALID + */ +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..42a8021e8f 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -414,6 +414,12 @@ 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 +GType gtk_widget_class_get_layout_manager_type (GtkWidgetClass *widget_class); + GDK_AVAILABLE_IN_ALL void gtk_widget_add_accelerator (GtkWidget *widget, const gchar *accel_signal,