raster pushed a commit to branch master.

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

commit fbb514e009c7bfbf7559a230a8fea81fed0953ff
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Mon Dec 19 17:58:23 2016 +0900

    e winlist/at tab - understand stacks and filter accordingly
---
 src/modules/winlist/e_winlist.c | 92 +++++++++++++++++++++++++++++++++++++++--
 1 file changed, 88 insertions(+), 4 deletions(-)

diff --git a/src/modules/winlist/e_winlist.c b/src/modules/winlist/e_winlist.c
index 2706890..9074181 100644
--- a/src/modules/winlist/e_winlist.c
+++ b/src/modules/winlist/e_winlist.c
@@ -92,9 +92,10 @@ e_winlist_show(E_Zone *zone, E_Winlist_Filter filter)
 {
    int x, y, w, h;
    Evas_Object *o;
-   Eina_List *l;
+   Eina_List *l, *ll;
    E_Desk *desk;
    E_Client *ec;
+   E_Winlist_Win *ww;
    Eina_List *wmclasses = NULL;
 
    E_OBJECT_CHECK_RETURN(zone, 0);
@@ -169,6 +170,15 @@ e_winlist_show(E_Zone *zone, E_Winlist_Filter filter)
    EINA_LIST_FOREACH(e_client_focus_stack_get(), l, ec)
      {
         Eina_Bool pick;
+
+        // adjust to toplevel client
+        ec = e_client_stack_active_adjust(ec);
+        // skip if we already have it in winlist
+        EINA_LIST_FOREACH(_wins, ll, ww)
+          {
+             if (ww->client == ec) break;
+          }
+        if (ll) continue;
         switch (filter)
           {
            case E_WINLIST_FILTER_CLASS_WINDOWS:
@@ -713,6 +723,67 @@ _e_winlist_client_del(E_Client *ec)
 }
 
 static void
+_e_winlist_client_replace(E_Client *ec, E_Client *ec_new)
+{
+   E_Winlist_Win *ww;
+   Eina_List *l;
+   E_Desk *desk;
+   Eina_Bool replace_last = EINA_FALSE;
+
+   desk = e_desk_current_get(_winlist_zone);
+   if (ec == _last_client)
+     {
+        _last_client = NULL;
+        replace_last = EINA_TRUE;
+     }
+   EINA_LIST_FOREACH(_wins, l, ww)
+     {
+        if (ww->client == ec)
+          {
+             Evas_Object *o;
+             Evas_Coord mw, mh;
+
+             e_object_unref(E_OBJECT(ww->client));
+             ww->client = ec_new;
+             edje_object_part_text_set(ww->bg_object, "e.text.label",
+                                       e_client_util_name_get(ww->client));
+             if (ww->icon_object)
+               {
+                  e_comp_object_util_del_list_remove(_winlist, 
ww->icon_object);
+                  evas_object_del(ww->icon_object);
+                  ww->icon_object = NULL;
+               }
+             if (edje_object_part_exists(ww->bg_object, "e.swallow.icon"))
+               {
+                  o = e_client_icon_add(ww->client, e_comp->evas);
+                  ww->icon_object = o;
+                  e_comp_object_util_del_list_append(_winlist, o);
+                  edje_object_part_swallow(ww->bg_object, "e.swallow.icon", o);
+                  evas_object_show(o);
+               }
+             if (ww->client->shaded)
+               edje_object_signal_emit(ww->bg_object, "e,state,shaded", "e");
+             else if (ww->client)
+               edje_object_signal_emit(ww->bg_object, "e,state,iconified", 
"e");
+             else if (ww->client->desk != desk)
+               {
+                  if (!((ww->client->sticky) &&
+                        (ww->client->zone == _winlist_zone)))
+                    edje_object_signal_emit(ww->bg_object, 
"e,state,invisible", "e");
+               }
+             edje_object_size_min_calc(ww->bg_object, &mw, &mh);
+             E_WEIGHT(ww->bg_object, 1, 0);
+             E_FILL(ww->bg_object);
+             evas_object_size_hint_min_set(ww->bg_object, mw, mh);
+             evas_object_size_hint_max_set(ww->bg_object, 9999, mh);
+             e_object_ref(E_OBJECT(ww->client));
+             if (replace_last) _last_client = ec_new;
+             return;
+          }
+     }
+}
+
+static void
 _e_winlist_activate_nth(int n)
 {
    Eina_List *l;
@@ -895,10 +966,21 @@ _e_winlist_cb_event_border_add(void *data EINA_UNUSED, 
int type EINA_UNUSED,
                                void *event)
 {
    E_Event_Client *ev = event;
+   E_Client *ec = ev->ec;
+   Eina_List *l;
+   E_Winlist_Win *ww;
 
-   if (_e_winlist_client_add(ev->ec, _winlist_zone,
-                         e_desk_current_get(_winlist_zone)))
+   // adjust to toplevel client
+   ec = e_client_stack_active_adjust(ec);
+   // skip if we already have it in winlist
+   EINA_LIST_FOREACH(_wins, l, ww)
+     {
+        if (ww->client == ec) goto done;
+     }
+   if (_e_winlist_client_add(ec, _winlist_zone,
+                             e_desk_current_get(_winlist_zone)))
      _e_winlist_size_adjust();
+done:
    return ECORE_CALLBACK_PASS_ON;
 }
 
@@ -907,8 +989,10 @@ _e_winlist_cb_event_border_remove(void *data EINA_UNUSED, 
int type EINA_UNUSED,
                                   void *event)
 {
    E_Event_Client *ev = event;
+   E_Client *ec = ev->ec;
 
-   _e_winlist_client_del(ev->ec);
+   if (!ec->stack.prev) _e_winlist_client_del(ec);
+   else _e_winlist_client_replace(ec, e_client_stack_active_adjust(ec));
    _e_winlist_size_adjust();
    return ECORE_CALLBACK_PASS_ON;
 }

-- 


Reply via email to