diff options
author | Florian Müllner <fmuellner@gnome.org> | 2019-05-12 09:58:22 +0000 |
---|---|---|
committer | Florian Müllner <fmuellner@gnome.org> | 2019-05-12 20:09:03 +0000 |
commit | 66c8a996f9bbb60e15171650e80e4bb886886490 (patch) | |
tree | b9a3124d6d703c8bd191b33d829b4f219cb6b3c8 | |
parent | 1318d3748afba9ef8c476f05cca0516f885faeb7 (diff) | |
download | gtk+-66c8a996f9bbb60e15171650e80e4bb886886490.tar.gz |
dialog: Use default decoration for non-custom headerbars
There are two ways GTK can add a headerbar to a dialog:
- the dialog is constructed with the :use-header-bar property
- all windows should use client-side decorations
In the first case, the headerbar is added by GtkDialog with no
dedicated style class, and in the latter by GtkWindow with the
"default-decoration" style.
As a result, dialogs with plain titlebars can end up with clearly
distinct and inconsistent styles.
To address this, allow headerbars to track whether they should use
the "default-decoration" style and enable it for dialogs.
https://gitlab.gnome.org/GNOME/gtk/merge_requests/836
-rw-r--r-- | gtk/gtkdialog.c | 3 | ||||
-rw-r--r-- | gtk/gtkheaderbar.c | 31 | ||||
-rw-r--r-- | gtk/gtkheaderbarprivate.h | 1 | ||||
-rw-r--r-- | gtk/ui/gtkdialog.ui | 1 |
4 files changed, 36 insertions, 0 deletions
diff --git a/gtk/gtkdialog.c b/gtk/gtkdialog.c index 41f71a233a..8b0e7faf44 100644 --- a/gtk/gtkdialog.c +++ b/gtk/gtkdialog.c @@ -31,6 +31,7 @@ #include "gtkdialog.h" #include "gtkdialogprivate.h" #include "gtkheaderbar.h" +#include "gtkheaderbarprivate.h" #include "gtklabel.h" #include "gtkmarshalers.h" #include "gtkbox.h" @@ -460,6 +461,7 @@ gtk_dialog_constructed (GObject *object) g_list_free (children); update_suggested_action (dialog); + _gtk_header_bar_track_default_decoration (GTK_HEADER_BAR (priv->headerbar)); g_signal_connect (priv->action_area, "add", G_CALLBACK (add_cb), dialog); } @@ -1549,6 +1551,7 @@ gtk_dialog_buildable_add_child (GtkBuildable *buildable, else if (g_str_equal (type, "titlebar")) { priv->headerbar = GTK_WIDGET (child); + _gtk_header_bar_track_default_decoration (GTK_HEADER_BAR (priv->headerbar)); gtk_window_set_titlebar (GTK_WINDOW (buildable), priv->headerbar); } else if (g_str_equal (type, "action")) diff --git a/gtk/gtkheaderbar.c b/gtk/gtkheaderbar.c index dcdcb4f4fd..aca524df10 100644 --- a/gtk/gtkheaderbar.c +++ b/gtk/gtkheaderbar.c @@ -85,6 +85,7 @@ struct _GtkHeaderBarPrivate gboolean show_title_buttons; gchar *decoration_layout; gboolean decoration_layout_set; + gboolean track_default_decoration; GtkWidget *titlebar_start_box; GtkWidget *titlebar_end_box; @@ -499,6 +500,30 @@ _gtk_header_bar_shows_app_menu (GtkHeaderBar *bar) return priv->show_title_buttons && priv->shows_app_menu; } +static void +update_default_decoration (GtkHeaderBar *bar) +{ + GtkHeaderBarPrivate *priv = gtk_header_bar_get_instance_private (bar); + GtkStyleContext *context; + + context = gtk_widget_get_style_context (GTK_WIDGET (bar)); + + if (priv->children != NULL || priv->custom_title != NULL) + gtk_style_context_remove_class (context, "default-decoration"); + else + gtk_style_context_add_class (context, "default-decoration"); +} + +void +_gtk_header_bar_track_default_decoration (GtkHeaderBar *bar) +{ + GtkHeaderBarPrivate *priv = gtk_header_bar_get_instance_private (bar); + + priv->track_default_decoration = TRUE; + + update_default_decoration (bar); +} + /* As an intended side effect, this function allows @child * to be the title/label box */ static void @@ -1543,6 +1568,9 @@ gtk_header_bar_pack (GtkHeaderBar *bar, g_signal_connect (widget, "notify::visible", G_CALLBACK (notify_child_cb), bar); _gtk_header_bar_update_separator_visibility (bar); + + if (priv->track_default_decoration) + update_default_decoration (bar); } static void @@ -1595,6 +1623,9 @@ gtk_header_bar_remove (GtkContainer *container, g_free (child); gtk_widget_queue_resize (GTK_WIDGET (container)); _gtk_header_bar_update_separator_visibility (bar); + + if (priv->track_default_decoration) + update_default_decoration (bar); } } diff --git a/gtk/gtkheaderbarprivate.h b/gtk/gtkheaderbarprivate.h index 5ace00e37b..bad342d5fd 100644 --- a/gtk/gtkheaderbarprivate.h +++ b/gtk/gtkheaderbarprivate.h @@ -25,6 +25,7 @@ G_BEGIN_DECLS gboolean _gtk_header_bar_shows_app_menu (GtkHeaderBar *bar); +void _gtk_header_bar_track_default_decoration (GtkHeaderBar *bar); void _gtk_header_bar_update_window_buttons (GtkHeaderBar *bar); gboolean _gtk_header_bar_update_window_icon (GtkHeaderBar *bar, GtkWindow *window); diff --git a/gtk/ui/gtkdialog.ui b/gtk/ui/gtkdialog.ui index 9c83c84207..6b427e4f0b 100644 --- a/gtk/ui/gtkdialog.ui +++ b/gtk/ui/gtkdialog.ui @@ -6,6 +6,7 @@ <child type="titlebar"> <object class="GtkHeaderBar" id="headerbar"> <property name="show-title-buttons">1</property> + <property name="has-subtitle">false</property> </object> </child> <child> |