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-togglablesetting 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);