raster pushed a commit to branch enlightenment-0.24.

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

commit d42adad715c7e8dfef425411f6e31052968b3ced
Author: Marcel Hollerbach <mar...@osg.samsung.com>
Date:   Tue Jul 21 14:46:04 2020 +0200

    tiling: prevent potential recursive apply calls
    
    additionally, this ensures that clients that cannot be layouted are
    definitly outside the tree. Without applying the window tree again.
    
    With all this tiling can be used quite normally. If you want to know
    exactly what is going on, set notify level to info, then tiling tells
    you what cannot be tiled.
---
 src/modules/tiling/e_mod_tiling.c | 26 +++++++++++++++++++++++---
 src/modules/tiling/window_tree.c  | 10 +++++++---
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/src/modules/tiling/e_mod_tiling.c 
b/src/modules/tiling/e_mod_tiling.c
index fba3f1a8e..9bbed0ff4 100644
--- a/src/modules/tiling/e_mod_tiling.c
+++ b/src/modules/tiling/e_mod_tiling.c
@@ -115,6 +115,7 @@ static struct tiling_mod_main_g
                        *act_move_right, *act_toggle_split_mode, 
*act_swap_window;
 
    Desk_Split_Type     *current_split_type;
+   Ecore_Job           *apply_tree_job;
 
    struct {
         Evas_Object *comp_obj;
@@ -480,7 +481,7 @@ _reapply_tree(void)
         if (zw > 0 && zh > 0)
           tiling_window_tree_apply(_G.tinfo->tree, zx, zy, zw, zh,
                                    tiling_g.config->window_padding,
-                                   EINA_FALSE);
+                                   EINA_TRUE);
         else
           ERR("The zone desk geometry was not useful at all (%d,%d,%d,%d)", 
zx, zy, zw, zh);
      }
@@ -859,11 +860,22 @@ toggle_floating(E_Client *ec)
      }
 }
 
+static void
+_window_tree_apply_delayed(void *data EINA_UNUSED)
+{
+   _reapply_tree();
+   ecore_job_del(_G.apply_tree_job);
+   _G.apply_tree_job = NULL;
+}
+
 void
 tiling_e_client_does_not_fit(E_Client *ec)
 {
    E_Notification_Notify n;
    Eina_Strbuf *buf;
+   Client_Extra *extra = tiling_entry_no_desk_func(ec);
+
+   EINA_SAFETY_ON_NULL_RETURN(extra);
 
    buf = eina_strbuf_new();
    eina_strbuf_append_printf(buf, _("Window %s cannot be tiled\n"),
@@ -876,9 +888,17 @@ tiling_e_client_does_not_fit(E_Client *ec)
    n.body = eina_strbuf_string_get(buf);
    n.timeout = 8000;
    e_notification_client_send(&n, NULL, NULL);
-   toggle_floating(ec);
-
    eina_strbuf_string_free(buf);
+
+   EINA_SAFETY_ON_TRUE_RETURN(extra->floating);
+
+   //remove the client here without applying the tree again to break maybe 
possible recursions
+   {
+      extra->floating = EINA_TRUE;
+      _restore_client(ec);
+      _client_remove_no_apply(ec);
+      _G.apply_tree_job = ecore_job_add(_window_tree_apply_delayed, NULL);
+   }
 }
 
 static void
diff --git a/src/modules/tiling/window_tree.c b/src/modules/tiling/window_tree.c
index fa3fa8da6..f9800a2c6 100644
--- a/src/modules/tiling/window_tree.c
+++ b/src/modules/tiling/window_tree.c
@@ -306,10 +306,14 @@ _tiling_window_tree_level_apply(Window_Tree *root, 
Evas_Coord x, Evas_Coord y,
         if (!e_object_is_del(E_OBJECT(root->client)))
           {
              if ((root->client->icccm.min_w > (w - padding)) ||
-                 (root->client->icccm.min_h > (h - padding)))
+                 (root->client->icccm.min_h > (h - padding))) {
                *floaters = eina_list_append(*floaters, root->client);
-             tiling_e_client_move_resize_extra(root->client, x, y,
-                                               w - padding, h - padding);
+             } else {
+               tiling_e_client_move_resize_extra(root->client, x, y,
+                                                 w - padding, h - padding);
+             }
+
+
           }
         return;
      }

-- 


Reply via email to