raster pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=2f52f093b6e89ce9ee3e672419b686723cd47ca8

commit 2f52f093b6e89ce9ee3e672419b686723cd47ca8
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Sun Apr 12 16:50:26 2020 +0100

    simplify stacking rules to be a bit dumber so stacking works better
    
    fixes T8652
---
 src/bin/e_client.c | 64 ++++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 45 insertions(+), 19 deletions(-)

diff --git a/src/bin/e_client.c b/src/bin/e_client.c
index 4c73a52d3..27709adc0 100644
--- a/src/bin/e_client.c
+++ b/src/bin/e_client.c
@@ -2941,6 +2941,7 @@ e_client_desk_set(E_Client *ec, E_Desk *desk)
 
              EINA_LIST_FOREACH(ec->transients, l, child)
                e_client_desk_set(child, ec->desk);
+             e_client_transients_restack(ec);
           }
      }
 
@@ -5705,7 +5706,7 @@ e_client_layout_cb_set(E_Client_Layout_Cb cb)
 E_API void
 e_client_parent_set(E_Client *ec, E_Client *parent)
 {
-   E_Client *prev;
+//   E_Client *prev;
 
    E_OBJECT_CHECK(ec);
    E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
@@ -5738,7 +5739,7 @@ e_client_parent_set(E_Client *ec, E_Client *parent)
      }
    if (parent)
      {
-        prev = eina_list_last_data_get(parent->transients);
+//        prev = eina_list_last_data_get(parent->transients);
         parent->transients = eina_list_append(parent->transients, ec);
         ec->parent = parent;
      }
@@ -5746,10 +5747,15 @@ e_client_parent_set(E_Client *ec, E_Client *parent)
      {
         evas_object_layer_set(ec->frame, ec->parent->layer);
 
+/* complex stacking right above one dialog after the other hurts the
+ * simple assumptions that the window should be on top by clients so
+ * be dumber and disable this
         if (prev)
           evas_object_stack_above(ec->frame, prev->frame);
         else
           evas_object_stack_above(ec->frame, parent->frame);
+ */
+        evas_object_raise(ec->frame);
 
         if (e_client_util_ignored_get(ec)) return;
         if (e_pixmap_usable_get(ec->pixmap) && (!ec->lock_user_location))
@@ -5761,11 +5767,46 @@ e_client_parent_set(E_Client *ec, E_Client *parent)
      }
 }
 
+static void
+_e_client_stack_top(E_Client *ec_base EINA_UNUSED,
+                    E_Client *ec_stack, E_Client *ec_above)
+{
+/* complex stacking right above one dialog after the other hurts the
+ * simple assumptions that the window should be on top by clients so
+ * be dumber and disable this
+   if (!ec_above)
+     {
+        evas_object_raise(ec_stack->frame);
+        evas_object_stack_above(ec_base->frame, ec_stack->frame);
+     }
+   else
+     {
+        if (ec_above->transients)
+          {
+             e_client_transients_restack(ec_above);
+             E_Client *ec_last = eina_list_last_data_get(ec_above->transients);
+             if (ec_last)
+               evas_object_stack_above(ec_stack->frame, ec_last->frame);
+             else
+               evas_object_stack_above(ec_stack->frame, ec_above->frame);
+          }
+        else
+          evas_object_stack_above(ec_stack->frame, ec_above->frame);
+     }
+ */
+   if (!ec_above) evas_object_raise(ec_stack->frame);
+   else
+     {
+        if (ec_above->transients) e_client_transients_restack(ec_above);
+        evas_object_raise(ec_stack->frame);
+     }
+}
+
 E_API void
 e_client_transients_restack(E_Client *ec)
 {
+   E_Client *child, *below = NULL;
    Eina_List *list;
-   E_Client *child, *below = NULL, *last;
 
    E_OBJECT_CHECK(ec);
    E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE);
@@ -5777,22 +5818,7 @@ e_client_transients_restack(E_Client *ec)
         // Don't stack iconic transients. If the user wants these shown,
         // that's another option.
         if (child->iconic) continue;
-        if (below)
-          {
-             if (below->transients)
-               {
-                  e_client_transients_restack(below);
-                  last = eina_list_last_data_get(below->transients);
-                  if (last)
-                    evas_object_stack_above(child->frame, last->frame);
-                  else
-                    evas_object_stack_above(child->frame, below->frame);
-               }
-             else
-               evas_object_stack_above(child->frame, below->frame);
-          }
-        else
-          evas_object_stack_above(child->frame, ec->frame);
+        _e_client_stack_top(ec, child, below);
         below = child;
      }
 }

-- 


Reply via email to