raster pushed a commit to branch master.

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

commit 6bdcf9256395905d893e2b1594b047620e0a99cb
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Mon Jan 28 17:41:02 2019 +0000

    pager - fix vanishing windows when dnd from desk to desk in pager
    
    windows would vanish at times (eg dnd into an empty desktop in the
    pager). this was pretty disconcerting and a problem, so this fixes it
    with a bit of a sledgehammer, but it fixes it.
    
    @fix
---
 src/bin/e_deskmirror.c           | 37 ++++++++++++++++++++++++++++++-------
 src/bin/e_deskmirror.h           |  1 +
 src/modules/pager/e_mod_main.c   |  5 +++++
 src/modules/pager/gadget/pager.c |  5 +++++
 4 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/src/bin/e_deskmirror.c b/src/bin/e_deskmirror.c
index 43f0c95d1..71e77fc2e 100644
--- a/src/bin/e_deskmirror.c
+++ b/src/bin/e_deskmirror.c
@@ -31,6 +31,7 @@ typedef struct E_Smart_Data
    Eina_Bool taskbar E_BITFIELD;
 
    Eina_Bool resize E_BITFIELD;
+   Eina_Bool force E_BITFIELD;
 } E_Smart_Data;
 
 typedef struct Mirror
@@ -95,9 +96,13 @@ static void
 _mirror_visible_apply(Mirror *m)
 {
    if (_e_deskmirror_visible_get(m->sd, m))
-     evas_object_show(m->mirror);
+     {
+        evas_object_show(m->mirror);
+     }
    else
-     evas_object_hide(m->mirror);
+     {
+        evas_object_hide(m->mirror);
+     }
 }
 
 static void
@@ -509,11 +514,14 @@ static void
 _e_deskmirror_mirror_reconfigure(Mirror *m)
 {
    _e_deskmirror_mirror_geometry_get(m);
-   e_layout_child_move(m->mirror, m->x, m->y);
-   e_layout_child_resize(m->mirror, m->w, m->h);
-   /* assume that anything happening here is the result of a drag */
-   if (!e_drag_current_get())
-     _mirror_visible_apply(m);
+   if (m->mirror)
+     {
+        e_layout_child_move(m->mirror, m->x, m->y);
+        e_layout_child_resize(m->mirror, m->w, m->h);
+        /* assume that anything happening here is the result of a drag */
+        if (((!m->sd->force) && (!e_drag_current_get())) || (m->sd->force))
+          _mirror_visible_apply(m);
+     }
 }
 
 static void
@@ -771,6 +779,7 @@ _client_desk_set(E_Smart_Data *sd, int type EINA_UNUSED, 
E_Event_Client_Desk_Set
         /* ev->desk is previous desk */
         if (!e_client_util_desk_visible(ev->ec, sd->desk))
           eina_hash_del_by_key(sd->mirror_hash, &ev->ec->frame);
+        _mirror_visible_apply(m);
      }
    if ((!m) && (sd->desk == ev->ec->desk))
      _e_deskmirror_mirror_add(sd, ev->ec->frame);
@@ -976,3 +985,17 @@ e_deskmirror_util_wins_print(Evas_Object *obj)
           fprintf(stderr, "MIRROR OBJ: %p\n", m->comp_object);
      }
 }
+
+E_API void
+e_deskmirror_update_force(Evas_Object *obj)
+{
+   API_ENTRY(obj);
+
+   e_layout_freeze(sd->layout);
+   sd->force = EINA_TRUE;
+   _e_deskmirror_smart_hide(obj);
+   _e_deskmirror_smart_reconfigure(sd);
+   _e_deskmirror_smart_show(obj);
+   sd->force = EINA_FALSE;
+   e_layout_thaw(sd->layout);
+}
diff --git a/src/bin/e_deskmirror.h b/src/bin/e_deskmirror.h
index a9a137b45..919d68edf 100644
--- a/src/bin/e_deskmirror.h
+++ b/src/bin/e_deskmirror.h
@@ -9,6 +9,7 @@ E_API void e_deskmirror_coord_canvas_to_virtual(Evas_Object 
*obj, Evas_Coord cx,
 E_API void e_deskmirror_coord_virtual_to_canvas(Evas_Object *obj, Evas_Coord 
vx, Evas_Coord vy, Evas_Coord *cx, Evas_Coord *cy);
 E_API E_Desk *e_deskmirror_desk_get(Evas_Object *obj);
 E_API void e_deskmirror_util_wins_print(Evas_Object *obj);
+E_API void e_deskmirror_update_force(Evas_Object *obj);
 //#define DESKMIRROR_TEST
 
 #endif
diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c
index 0478b1fce..a3f00d28b 100644
--- a/src/modules/pager/e_mod_main.c
+++ b/src/modules/pager/e_mod_main.c
@@ -603,6 +603,8 @@ _pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2)
         pw->client->hidden = 0;
         e_client_desk_set(pw->client, desk1);
      }
+   e_deskmirror_update_force(pd1->o_layout);
+   e_deskmirror_update_force(pd2->o_layout);
 
    /* Modify desktop names in the config */
    for (l = e_config->desktop_names, c = 0; l && c < 2; l = l->next)
@@ -1230,6 +1232,7 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
         /* be helpful */
         if (pw->client->desk->visible && (!e_client_focused_get()))
           evas_object_focus_set(pw->client->frame, 1);
+        e_deskmirror_update_force(pw->desk->o_layout);
      }
    else
      {
@@ -1265,6 +1268,7 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
 
         if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame);
         evas_object_focus_set(ec->frame, 1);
+        e_deskmirror_update_force(pw->desk->o_layout);
      }
    if (p->active_drop_pd)
      {
@@ -1500,6 +1504,7 @@ _pager_drop_cb_drop(void *data, const char *type, void 
*event_info)
                }
              if (max) e_client_maximize(ec, max);
              if (fullscreen) e_client_fullscreen(ec, fs);
+             e_deskmirror_update_force(pd->o_layout);
           }
      }
 
diff --git a/src/modules/pager/gadget/pager.c b/src/modules/pager/gadget/pager.c
index da4cdd008..70aeccaa2 100644
--- a/src/modules/pager/gadget/pager.c
+++ b/src/modules/pager/gadget/pager.c
@@ -782,6 +782,8 @@ _pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2)
         pw->client->hidden = 0;
         e_client_desk_set(pw->client, desk1);
      }
+   e_deskmirror_update_force(pd1->o_layout);
+   e_deskmirror_update_force(pd2->o_layout);
 
    /* Modify desktop names in the config */
    for (l = e_config->desktop_names, c = 0; l && c < 2; l = l->next)
@@ -2136,6 +2138,7 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
         /* be helpful */
         if (pw->client->desk->visible && (!e_client_focused_get()))
           evas_object_focus_set(pw->client->frame, 1);
+        e_deskmirror_update_force(pw->desk->o_layout);
      }
    else
      {
@@ -2171,6 +2174,7 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
 
         if (!(ec->lock_user_stacking)) evas_object_raise(ec->frame);
         evas_object_focus_set(ec->frame, 1);
+        e_deskmirror_update_force(pw->desk->o_layout);
      }
    edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e");
    if (!pw->drag.from_pager)
@@ -2388,6 +2392,7 @@ _pager_drop_cb_drop(void *data, const char *type, void 
*event_info)
                }
              if (max) e_client_maximize(ec, max);
              if (fullscreen) e_client_fullscreen(ec, fs);
+             e_deskmirror_update_force(pd->o_layout);
           }
         EINA_LIST_FOREACH(pd->pager->desks, l, pdd)
           {

-- 


Reply via email to