File xfwm4-4.8.2-careful-layer-manipulation.patch of Package xfwm4

From 9015305a2e4f46a938b88f0029c19db26657c0ad Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <fourdan@xfce.org>
Date: Mon, 10 Oct 2011 08:33:03 +0000
Subject: Some apps that I wouldn't name try to manipulate the win layer by

themselves and cause havoc when doing so on transient dialogs, so
we need to be extra careful before allowing apps to change the
layer.
---
diff --git a/src/client.c b/src/client.c
index 67c5f36..e5e56ca 100644
--- a/src/client.c
+++ b/src/client.c
@@ -983,6 +983,7 @@ clientGetMWMHints (Client * c, gboolean update)
             && !FLAG_TEST(c->flags, CLIENT_FLAG_FULLSCREEN))
         {
             /* legacy app changed its decoration, put it back on regular layer */
+            TRACE ("Legacy app changed its decoration \"%s\" (0x%lx)", c->name, c->window);
             FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN);
             clientSetLayer (c, WIN_LAYER_NORMAL);
         }
@@ -1834,7 +1835,7 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture)
         (c->win_layer == WIN_LAYER_NORMAL) &&
         (c->type == WINDOW_NORMAL))
     {
-        g_print ("Full screen for old apps\n");
+        TRACE ("Fullscreen for old apps \"%s\" (0x%lx)", c->name, c->window);
         FLAG_SET (c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN);
     }
 
@@ -2730,7 +2731,7 @@ clientSetLayer (Client * c, guint l)
     Client *c2 = NULL;
 
     g_return_if_fail (c != NULL);
-    TRACE ("entering clientSetLayer");
+    TRACE ("entering clientSetLayer for \"%s\" (0x%lx) on layer %d", c->name, c->window, l);
 
     screen_info = c->screen_info;
     display_info = screen_info->display_info;
diff --git a/src/events.c b/src/events.c
index f3aadcf..e1f9588 100644
--- a/src/events.c
+++ b/src/events.c
@@ -1982,7 +1982,13 @@ handleClientMessage (DisplayInfo *display_info, XClientMessageEvent * ev)
         else if ((ev->message_type == display_info->atoms[WIN_LAYER]) && (ev->format == 32))
         {
             TRACE ("client \"%s\" (0x%lx) has received a WIN_LAYER event", c->name, c->window);
-            if ((unsigned long) ev->data.l[0] != c->win_layer)
+            /*
+             * Some apps that I wouldn't name try to manipulate the win layer by themselves
+             * and cause havoc when doing so on transient dialogs, so we need to be extra careful
+             * here before allowing apps to change the layer.
+             * Actually, I beleive twe should get rid of support of this old protocol...
+             */
+            if (!clientIsTransientOrModal(c) && ((unsigned long) ev->data.l[0] != c->win_layer))
             {
                 clientSetLayer (c, ev->data.l[0]);
             }
diff --git a/src/stacking.c b/src/stacking.c
index c299d74..180ea61 100644
--- a/src/stacking.c
+++ b/src/stacking.c
@@ -544,6 +544,9 @@ clientAdjustFullscreenLayer (Client *c, gboolean set)
 {
     g_return_val_if_fail (c, FALSE);
 
+    TRACE ("entering clientAdjustFullscreenLayer");
+    TRACE ("Adjusting fullscreen layer for  \"%s\" (0x%lx)", c->name, c->window);
+
     if (set)
     {
         if (FLAG_TEST(c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN)
@@ -555,17 +558,16 @@ clientAdjustFullscreenLayer (Client *c, gboolean set)
     }
     else if (c->win_layer == WIN_LAYER_FULLSCREEN)
     {
-        if (FLAG_TEST(c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN)
-            || FLAG_TEST(c->flags, CLIENT_FLAG_FULLSCREEN))
+        if (FLAG_TEST(c->flags, CLIENT_FLAG_FULLSCREEN))
         {
-            if (FLAG_TEST(c->flags, CLIENT_FLAG_FULLSCREEN))
-            {
-                clientSetLayer (c, c->fullscreen_old_layer);
-            }
-            else
-            {
-                clientSetLayer (c, WIN_LAYER_NORMAL);
-            }
+            TRACE ("Moving \"%s\" (0x%lx) to initial layer %d", c->name, c->window, c->fullscreen_old_layer);
+            clientSetLayer (c, c->fullscreen_old_layer);
+            return TRUE;
+        }
+        if (FLAG_TEST(c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN))
+        {
+            TRACE ("Moving \"%s\" (0x%lx) to layer %d", c->name, c->window, WIN_LAYER_FULLSCREEN);
+            clientSetLayer (c, WIN_LAYER_NORMAL);
             return TRUE;
         }
     }
openSUSE Build Service is sponsored by