| window: Check if we can use CSD before enabling them |
| |
| Upstream-Status: Backport |
| Signed-off-by: Jussi Kukkonen <jussi.kukkonen@intel.com> |
| |
| |
| From c5e5ee67490e7e7af56052d8f8beb75db002c2f1 Mon Sep 17 00:00:00 2001 |
| From: Emmanuele Bassi <ebassi@gnome.org> |
| Date: Wed, 3 Jun 2015 14:07:29 +0100 |
| Subject: window: Check if we can use CSD before enabling them |
| |
| The change in 03213b9509fc1df16c66194ea168aed6c15110e9 changed the rules |
| as to when CSD can be enabled, but it also unconditionally enables CSD |
| with the implicit assumption that client-side shadows were the real |
| issue, and that we could work around that by drawing our own borders. |
| This also means that setting a titlebar for a GtkWindow will enable CSD |
| unconditionally. |
| |
| In reality, some window managers (like Matchbox) *only* support |
| server-side decorations, and will ignore all hints to the contrary, to |
| the point of drawing decorations at random locations on top of the |
| window. |
| |
| Since CSD are enabled unconditionally, the GTK_CSD environment variable |
| is also not a suitable escape hatch. |
| |
| In the grand tradition of asking ourselves if we should do something |
| just because we can, we should split the environment checks from the |
| checks on what the user requested; by doing that, we can also check |
| when enabling client-side decorations, and ideally bail out if needed. |
| |
| https://bugzilla.gnome.org/show_bug.cgi?id=750343 |
| |
| diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c |
| index 423c6bd..9fe882f 100644 |
| --- a/gtk/gtkwindow.c |
| +++ b/gtk/gtkwindow.c |
| @@ -4056,6 +4056,32 @@ gtk_window_supports_client_shadow (GtkWindow *window) |
| return TRUE; |
| } |
| |
| +static gboolean |
| +gtk_window_can_use_csd (GtkWindow *window) |
| +{ |
| + const gchar *csd_env; |
| + |
| +#ifdef GDK_WINDOWING_BROADWAY |
| + if (GDK_IS_BROADWAY_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window)))) |
| + return TRUE; |
| +#endif |
| + |
| +#ifdef GDK_WINDOWING_WAYLAND |
| + if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window)))) |
| + return TRUE; |
| +#endif |
| + |
| +#ifdef GDK_WINDOWING_MIR |
| + if (GDK_IS_MIR_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window)))) |
| + return TRUE; |
| +#endif |
| + |
| + csd_env = g_getenv ("GTK_CSD"); |
| + |
| + /* If GTK_CSD is unset we default to CSD support */ |
| + return csd_env == NULL || (strcmp (csd_env, "1") == 0); |
| +} |
| + |
| static void |
| gtk_window_enable_csd (GtkWindow *window) |
| { |
| @@ -4063,6 +4089,10 @@ gtk_window_enable_csd (GtkWindow *window) |
| GtkWidget *widget = GTK_WIDGET (window); |
| GdkVisual *visual; |
| |
| + /* If the environment does not support CSD, then there's no point in enabling them */ |
| + if (!gtk_window_can_use_csd (window)) |
| + return; |
| + |
| /* We need a visual with alpha for client shadows */ |
| if (priv->use_client_shadow) |
| { |
| @@ -5839,7 +5869,6 @@ static gboolean |
| gtk_window_should_use_csd (GtkWindow *window) |
| { |
| GtkWindowPrivate *priv = window->priv; |
| - const gchar *csd_env; |
| |
| if (priv->csd_requested) |
| return TRUE; |
| @@ -5850,24 +5879,7 @@ gtk_window_should_use_csd (GtkWindow *window) |
| if (priv->type == GTK_WINDOW_POPUP) |
| return FALSE; |
| |
| -#ifdef GDK_WINDOWING_BROADWAY |
| - if (GDK_IS_BROADWAY_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window)))) |
| - return TRUE; |
| -#endif |
| - |
| -#ifdef GDK_WINDOWING_WAYLAND |
| - if (GDK_IS_WAYLAND_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window)))) |
| - return TRUE; |
| -#endif |
| - |
| -#ifdef GDK_WINDOWING_MIR |
| - if (GDK_IS_MIR_DISPLAY (gtk_widget_get_display (GTK_WIDGET (window)))) |
| - return TRUE; |
| -#endif |
| - |
| - csd_env = g_getenv ("GTK_CSD"); |
| - |
| - return (g_strcmp0 (csd_env, "1") == 0); |
| + return gtk_window_can_use_csd (window); |
| } |
| |
| static void |
| -- |
| cgit v0.10.2 |
| |