diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index a1a34359c9..3898487964 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -282,6 +282,7 @@ enum {
PROP_DEFAULT_WIDGET,
PROP_FOCUS_WIDGET,
PROP_CHILD,
+ PROP_TITLEBAR,
PROP_HANDLE_MENUBAR_ACCEL,
/* Readonly properties */
@@ -1036,6 +1037,20 @@ gtk_window_class_init (GtkWindowClass *klass)
GTK_TYPE_WIDGET,
GTK_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|G_PARAM_EXPLICIT_NOTIFY);
+ /**
+ * GtkWindow:titlebar: (attributes org.gtk.Property.get=gtk_window_get_titlebar org.gtk.Property.set=gtk_window_set_titlebar)
+ *
+ * The titlebar widget.
+ *
+ * Since: 4.6
+ */
+ window_props[PROP_TITLEBAR] =
+ g_param_spec_object ("titlebar",
+ P_("Titlebar"),
+ P_("The titlebar widget"),
+ GTK_TYPE_WIDGET,
+ GTK_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|G_PARAM_EXPLICIT_NOTIFY);
+
/**
* GtkWindow:handle-menubar-accel: (attributes org.gtk.Property.get=gtk_window_get_handle_menubar_accel org.gtk.Property.set=gtk_window_set_handle_menubar_accel)
*
@@ -1815,6 +1830,9 @@ gtk_window_set_property (GObject *object,
case PROP_CHILD:
gtk_window_set_child (window, g_value_get_object (value));
break;
+ case PROP_TITLEBAR:
+ gtk_window_set_titlebar (window, g_value_get_object (value));
+ break;
case PROP_HANDLE_MENUBAR_ACCEL:
gtk_window_set_handle_menubar_accel (window, g_value_get_boolean (value));
break;
@@ -1898,6 +1916,9 @@ gtk_window_get_property (GObject *object,
case PROP_CHILD:
g_value_set_object (value, gtk_window_get_child (window));
break;
+ case PROP_TITLEBAR:
+ g_value_set_object (value, gtk_window_get_titlebar (window));
+ break;
case PROP_HANDLE_MENUBAR_ACCEL:
g_value_set_boolean (value, gtk_window_get_handle_menubar_accel (window));
break;
@@ -2974,7 +2995,7 @@ gtk_window_enable_csd (GtkWindow *window)
}
/**
- * gtk_window_set_titlebar:
+ * gtk_window_set_titlebar: (attributes org.gtk.Method.set_property=titlebar)
* @window: a `GtkWindow`
* @titlebar: (nullable): the widget to use as titlebar
*
@@ -3000,6 +3021,9 @@ gtk_window_set_titlebar (GtkWindow *window,
g_return_if_fail (GTK_IS_WINDOW (window));
+ if (priv->titlebar == titlebar)
+ return;
+
if ((!priv->title_box && titlebar) || (priv->title_box && !titlebar))
{
was_mapped = _gtk_widget_get_mapped (widget);
@@ -3020,25 +3044,27 @@ gtk_window_set_titlebar (GtkWindow *window,
priv->client_decorated = FALSE;
gtk_widget_remove_css_class (widget, "csd");
gtk_widget_remove_css_class (widget, "solid-csd");
+ }
+ else
+ {
+ priv->use_client_shadow = gtk_window_supports_client_shadow (window);
- goto out;
+ gtk_window_enable_csd (window);
+ priv->titlebar = titlebar;
+ priv->title_box = titlebar;
+ gtk_widget_insert_before (priv->title_box, widget, NULL);
+
+ gtk_widget_add_css_class (titlebar, "titlebar");
}
- priv->use_client_shadow = gtk_window_supports_client_shadow (window);
-
- gtk_window_enable_csd (window);
- priv->title_box = titlebar;
- gtk_widget_insert_before (priv->title_box, widget, NULL);
-
- gtk_widget_add_css_class (titlebar, "titlebar");
-
-out:
if (was_mapped)
gtk_widget_map (widget);
+
+ g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_TITLEBAR]);
}
/**
- * gtk_window_get_titlebar:
+ * gtk_window_get_titlebar: (attributes org.gtk.Method.get_property=titlebar)
* @window: a `GtkWindow`
*
* Returns the custom titlebar that has been set with
@@ -3053,11 +3079,7 @@ gtk_window_get_titlebar (GtkWindow *window)
g_return_val_if_fail (GTK_IS_WINDOW (window), NULL);
- /* Don't return the internal titlebar */
- if (priv->title_box == priv->titlebar)
- return NULL;
-
- return priv->title_box;
+ return priv->titlebar;
}
/**
@@ -4282,12 +4304,11 @@ gtk_window_realize (GtkWidget *widget)
if (priv->title_box == NULL)
{
- priv->titlebar = gtk_header_bar_new ();
- gtk_widget_add_css_class (priv->titlebar, "titlebar");
- gtk_widget_add_css_class (priv->titlebar, "default-decoration");
+ priv->title_box = gtk_header_bar_new ();
+ gtk_widget_add_css_class (priv->title_box, "titlebar");
+ gtk_widget_add_css_class (priv->title_box, "default-decoration");
- gtk_widget_insert_before (priv->titlebar, widget, NULL);
- priv->title_box = priv->titlebar;
+ gtk_widget_insert_before (priv->title_box, widget, NULL);
}
update_window_actions (window);
diff --git a/testsuite/reftests/default-size-undecorated.ref.ui b/testsuite/reftests/default-size-undecorated.ref.ui
new file mode 100644
index 0000000000..815a17caba
--- /dev/null
+++ b/testsuite/reftests/default-size-undecorated.ref.ui
@@ -0,0 +1,52 @@
+
+
+
+
diff --git a/testsuite/reftests/default-size-undecorated.ui b/testsuite/reftests/default-size-undecorated.ui
new file mode 100644
index 0000000000..92f636a8ca
--- /dev/null
+++ b/testsuite/reftests/default-size-undecorated.ui
@@ -0,0 +1,56 @@
+
+
+
+ 600
+ 400
+ 0
+
+
+ center
+ center
+ 10
+ 10
+
+
+ default width:
+
+ 0
+ 0
+
+
+
+
+
+
+ 600
+
+ 1
+ 0
+
+
+
+
+
+ default height:
+
+ 0
+ 1
+
+
+
+
+
+
+ 400
+
+ 1
+ 1
+
+
+
+
+
+
+
diff --git a/testsuite/reftests/default-size-with-titlebar.ref.ui b/testsuite/reftests/default-size-with-titlebar.ref.ui
new file mode 100644
index 0000000000..37826fb763
--- /dev/null
+++ b/testsuite/reftests/default-size-with-titlebar.ref.ui
@@ -0,0 +1,55 @@
+
+
+
+ 600
+ 400
+ size?
+
+
+
+
+
+ center
+ center
+ 10
+ 10
+
+
+ default width:
+
+ 0
+ 0
+
+
+
+
+
+ 600
+
+ 1
+ 0
+
+
+
+
+
+ default height:
+
+ 0
+ 1
+
+
+
+
+
+ 400
+
+ 1
+ 1
+
+
+
+
+
+
+
diff --git a/testsuite/reftests/default-size-with-titlebar.ui b/testsuite/reftests/default-size-with-titlebar.ui
new file mode 100644
index 0000000000..9e57aa45f4
--- /dev/null
+++ b/testsuite/reftests/default-size-with-titlebar.ui
@@ -0,0 +1,59 @@
+
+
+
+ 600
+ 400
+ size?
+
+
+
+
+
+ center
+ center
+ 10
+ 10
+
+
+ default width:
+
+ 0
+ 0
+
+
+
+
+
+
+ 600
+
+ 1
+ 0
+
+
+
+
+
+ default height:
+
+ 0
+ 1
+
+
+
+
+
+
+ 400
+
+ 1
+ 1
+
+
+
+
+
+
+
diff --git a/testsuite/reftests/default-size-without-titlebar.ref.ui b/testsuite/reftests/default-size-without-titlebar.ref.ui
new file mode 100644
index 0000000000..01064637ca
--- /dev/null
+++ b/testsuite/reftests/default-size-without-titlebar.ref.ui
@@ -0,0 +1,52 @@
+
+
+
+ 600
+ 400
+ size?
+
+
+ center
+ center
+ 10
+ 10
+
+
+ default width:
+
+ 0
+ 0
+
+
+
+
+
+ 600
+
+ 1
+ 0
+
+
+
+
+
+ default height:
+
+ 0
+ 1
+
+
+
+
+
+ 400
+
+ 1
+ 1
+
+
+
+
+
+
+
diff --git a/testsuite/reftests/default-size-without-titlebar.ui b/testsuite/reftests/default-size-without-titlebar.ui
new file mode 100644
index 0000000000..dcc27aebab
--- /dev/null
+++ b/testsuite/reftests/default-size-without-titlebar.ui
@@ -0,0 +1,56 @@
+
+
+
+ 600
+ 400
+ size?
+
+
+ center
+ center
+ 10
+ 10
+
+
+ default width:
+
+ 0
+ 0
+
+
+
+
+
+
+ 600
+
+ 1
+ 0
+
+
+
+
+
+ default height:
+
+ 0
+ 1
+
+
+
+
+
+
+ 400
+
+ 1
+ 1
+
+
+
+
+
+
+
diff --git a/testsuite/reftests/meson.build b/testsuite/reftests/meson.build
index 5e4d5d08d7..ea967f2d0c 100644
--- a/testsuite/reftests/meson.build
+++ b/testsuite/reftests/meson.build
@@ -225,6 +225,12 @@ testdata = [
'data-url.css',
'data-url.ref.ui',
'data-url.ui',
+ 'default-size-undecorated.ui',
+ 'default-size-undecorated.ref.ui',
+ 'default-size-with-titlebar.ui',
+ 'default-size-with-titlebar.ref.ui',
+ 'default-size-without-titlebar.ui',
+ 'default-size-without-titlebar.ref.ui',
'fixed-widget-stacking.ref.ui',
'fixed-widget-stacking.ui',
'flipping-icons.ref.ui',