The above mentioned patch did not do it for me, sub-windows/dialogs
were still CSD'd on WindowMaker at least. However, after some work,
I came up with the attached patch.

It's not very clean, but provides an environment variable-togglable
setting to disable CSD and headerbars. There are also some things missed by it at the moment, some dialogs may still get a CSD "close" button.

It's also possible that this patch breaks something, due to my very limited testing (I basically only use Transmission-GTK, Gnumeric and Abiword with Gtk+3) ...

To enable, set environment variable GTK_DISABLE_CSD=1

I'll probably continue work on the remaining inconsistencies at
some point, but maybe this patch will help some other people in
the meanwhile.

--
] ccr/TNSP ^ pWp  ::  ccr tnsp org  ::  http://tnsp.org/~ccr/
] PGP key: 7BED 62DE 898D D1A4 FC4A  F392 B705 E735 307B AAE3
diff -r 8f959a652e16 gtk/gtkdialog.c
--- a/gtk/gtkdialog.c	Tue May 27 08:15:40 2014 +0300
+++ b/gtk/gtkdialog.c	Tue May 27 09:40:36 2014 +0300
@@ -288,10 +288,11 @@
 apply_use_header_bar (GtkDialog *dialog)
 {
   GtkDialogPrivate *priv = dialog->priv;
+  gboolean disable_csd = g_strcmp0 (g_getenv ("GTK_DISABLE_CSD"), "1") == 0;
 
   gtk_widget_set_visible (priv->action_area, !priv->use_header_bar);
   gtk_widget_set_visible (priv->headerbar, priv->use_header_bar);
-  if (!priv->use_header_bar)
+  if (!priv->use_header_bar && !disable_csd)
     {
       GtkWidget *box = NULL;
 
@@ -312,6 +313,7 @@
 
       gtk_window_set_titlebar (GTK_WINDOW (dialog), box);
     }
+
   if (priv->use_header_bar)
     g_signal_connect (priv->action_area, "add", G_CALLBACK (add_cb), dialog);
 }
diff -r 8f959a652e16 gtk/gtkwindow.c
--- a/gtk/gtkwindow.c	Tue May 27 08:15:40 2014 +0300
+++ b/gtk/gtkwindow.c	Tue May 27 09:40:36 2014 +0300
@@ -3607,9 +3607,13 @@
 #ifdef GDK_WINDOWING_X11
   if (GDK_IS_X11_DISPLAY (gtk_widget_get_display (widget)))
     {
+      gboolean disable_csd = g_strcmp0 (g_getenv ("GTK_DISABLE_CSD"), "1") == 0;
       GdkScreen *screen;
       GdkVisual *visual;
 
+      if (disable_csd)
+        return FALSE;
+
       screen = gtk_widget_get_screen (widget);
 
       if (!gdk_screen_is_composited (screen))
@@ -3788,11 +3792,12 @@
   gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
   if (gdk_window)
     {
+      gboolean disable_csd = g_strcmp0 (g_getenv ("GTK_DISABLE_CSD"), "1") == 0;
       if (priv->decorated)
         {
-          if (priv->client_decorated)
+          if (priv->client_decorated && !disable_csd)
             gdk_window_set_decorations (gdk_window, 0);
-          else if (priv->custom_title)
+          else if (priv->custom_title && !disable_csd)
             gdk_window_set_decorations (gdk_window, GDK_DECOR_BORDER);
           else
             gdk_window_set_decorations (gdk_window, GDK_DECOR_ALL);
@@ -5379,6 +5384,10 @@
 {
   GtkWindowPrivate *priv = window->priv;
   const gchar *csd_env;
+  gboolean disable_csd = g_strcmp0 (g_getenv ("GTK_DISABLE_CSD"), "1") == 0;
+
+  if (disable_csd)
+    return FALSE;
 
   if (!priv->decorated)
     return FALSE;
@@ -6008,6 +6017,7 @@
   gint i;
   int old_scale;
   GList *link;
+  gboolean disable_csd = g_strcmp0 (g_getenv ("GTK_DISABLE_CSD"), "1") == 0;
 
   window = GTK_WINDOW (widget);
   priv = window->priv;
@@ -6186,10 +6196,13 @@
   if (priv->wm_role)
     gdk_window_set_role (gdk_window, priv->wm_role);
   
-  if (!priv->decorated || priv->client_decorated)
-    gdk_window_set_decorations (gdk_window, 0);
-  else if (priv->custom_title)
-    gdk_window_set_decorations (gdk_window, GDK_DECOR_BORDER);
+  if (!disable_csd)
+    {
+      if (!priv->decorated || priv->client_decorated)
+        gdk_window_set_decorations (gdk_window, 0);
+      else if (priv->custom_title)
+        gdk_window_set_decorations (gdk_window, GDK_DECOR_BORDER);
+    }
   
   if (!priv->deletable)
     gdk_window_set_functions (gdk_window, GDK_FUNC_ALL | GDK_FUNC_CLOSE);

Reply via email to