- rework windows plugin, x:y now matches window from that desk
authorHannes Janetzek <hannes.janetzek@gmail.com>
Wed, 19 May 2010 00:03:35 +0000 (00:03 +0000)
committerHannes Janetzek <hannes.janetzek@gmail.com>
Wed, 19 May 2010 00:03:35 +0000 (00:03 +0000)
- fix evry_util_plugin_items_add to match item->detail properly
- fix evry_item_select with item-changed event

SVN revision: 48991

src/modules/everything-windows/e_mod_main.c
src/modules/everything/evry_api.h
src/modules/everything/evry_plug_view_thumb.c
src/modules/everything/evry_util.c

index 399da6d..ad619c1 100644 (file)
 #define BORDER_TODESK          4
 #define BORDER_CLOSE           5
 
+typedef struct _Plugin Plugin;
+typedef struct _Border_Item Border_Item;
+
+struct _Plugin
+{
+  Evry_Plugin base;
+  Eina_List *borders;
+  Eina_List *handlers;
+  const char *input;
+};
+
+struct _Border_Item
+{
+  Evry_Item base;
+  E_Border *border;
+};
+
+#define GET_BORDER(_bd, _it) Border_Item *_bd = (Border_Item *)_it;
+
 static const Evry_API *evry = NULL;
 static Evry_Module *evry_module = NULL;
-
 static Evry_Plugin *_plug;
-static Eina_List *handlers = NULL;
-static Eina_Hash *border_hash = NULL;
 static Eina_List *_actions = NULL;
 
-/* static char _module_icon[] = "preferences-winlist"; */
+static Evas_Object *_icon_get(Evry_Item *it, Evas *e);
+
+/***************************************************************************/
+
+static void
+_border_item_free(Evry_Item *it)
+{
+   GET_BORDER(bi, it);
+
+   e_object_unref(E_OBJECT(bi->border));
+
+   E_FREE(bi);
+}
+
+static void
+_border_item_add(Plugin *p, E_Border *bd)
+{
+   Border_Item *bi;
+   char buf[1024];
+
+   bi = EVRY_ITEM_NEW(Border_Item, p, e_border_name_get(bd), _icon_get, _border_item_free);
+   snprintf(buf, sizeof(buf), "%d:%d %s",
+           bd->desk->x, bd->desk->y,
+           (bd->desktop ? bd->desktop->name : ""));
+   EVRY_ITEM_DETAIL_SET(bi, buf);
+
+   bi->border = bd;
+   e_object_ref(E_OBJECT(bd));
+
+   p->borders = eina_list_append(p->borders, bi);
+}
 
 static int
 _cb_border_remove(void *data, int type,  void *event)
 {
    E_Event_Border_Remove *ev = event;
-   Evry_Item *it;
-   Evry_Plugin *p = data;
+   Border_Item *bi;
+   Eina_List *l;
+   Plugin *p = data;
 
-   it = eina_hash_find(border_hash, &(ev->border));
+   EINA_LIST_FOREACH(p->borders, l, bi)
+     if (bi->border == ev->border)
+       break;
 
-   if (!it) return 1;
+   if (!bi) return 1;
 
-   p->items = eina_list_remove(p->items, it);
-   eina_hash_del_by_key(border_hash, &(ev->border));
+   p->borders = eina_list_remove(p->borders, bi);
+   p->base.items = eina_list_remove(p->base.items, bi);
+   EVRY_ITEM_FREE(bi);
 
    EVRY_PLUGIN_UPDATE(p, EVRY_UPDATE_ADD);
 
    return 1;
 }
-
-static void _hash_free(void *data)
+static int
+_cb_border_add(void *data, int type,  void *event)
 {
-   Evry_Item *it = data;
-   evry->item_free(it);
+   E_Event_Border_Add *ev = event;
+   Plugin *p = data;
+
+   _border_item_add(p, ev->border);
+
+   EVRY_PLUGIN_ITEMS_CLEAR(p);
+
+   int min = EVRY_PLUGIN(p)->config->min_query;
+
+   if ((!p->input && min == 0) ||
+       (p->input && (strlen(p->input) >= min)))
+     {
+       EVRY_PLUGIN_ITEMS_ADD(p, p->borders, p->input, 1, 0);
+
+       EVRY_PLUGIN_UPDATE(p, EVRY_UPDATE_ADD);
+     }
+
+   return 1;
 }
 
-static Evry_Plugin *
-_begin(Evry_Plugin *p, const Evry_Item *it)
+static void
+_get_borderlist(Plugin *p)
 {
-   handlers = eina_list_append
-     (handlers, ecore_event_handler_add
+   E_Border *bd;
+   Eina_List *l;
+
+   p->handlers = eina_list_append
+     (p->handlers, ecore_event_handler_add
       (E_EVENT_BORDER_REMOVE, _cb_border_remove, p));
 
-   border_hash = eina_hash_pointer_new(_hash_free);
+   p->handlers = eina_list_append
+     (p->handlers, ecore_event_handler_add
+      (E_EVENT_BORDER_ADD, _cb_border_add, p));
 
-   return p;
+   EINA_LIST_FOREACH(e_border_focus_stack_get(), l, bd)
+     _border_item_add(p, bd);
 }
 
 static void
-_cleanup(Evry_Plugin *p)
+_cleanup(Evry_Plugin *plugin)
 {
    Ecore_Event_Handler *h;
+   Border_Item *bi;
 
-   EINA_LIST_FREE(handlers, h)
-     ecore_event_handler_del(h);
+   GET_PLUGIN(p, plugin);
 
-   if (border_hash) eina_hash_free(border_hash);
-   border_hash = NULL;
+   IF_RELEASE(p->input);
 
    EVRY_PLUGIN_ITEMS_CLEAR(p);
+
+   EINA_LIST_FREE(p->borders, bi)
+     EVRY_ITEM_FREE(bi);
+
+   EINA_LIST_FREE(p->handlers, h)
+     ecore_event_handler_del(h);
 }
 
-static void
-_item_free(Evry_Item *it)
+static int
+_fetch(Evry_Plugin *plugin, const char *input)
 {
-   if (it->data)
-     e_object_unref(E_OBJECT(it->data));
+   int len = (input ? strlen(input) : 0);
+
+   GET_PLUGIN(p, plugin);
 
-   E_FREE(it);
+   EVRY_PLUGIN_ITEMS_CLEAR(p);
+
+   if (len >= plugin->config->min_query)
+     {
+       IF_RELEASE(p->input);
+
+       if (input)
+         p->input = eina_stringshare_add(input);
+
+       if (!p->handlers)
+         _get_borderlist(p);
+
+       EVRY_PLUGIN_ITEMS_ADD(p, p->borders, input, 1, 0);
+     }
+
+   return !!(p->base.items);
 }
 
 static Evas_Object *
 _icon_get(Evry_Item *it, Evas *e)
 {
+   GET_BORDER(bi, it);
+
    Evas_Object *o = NULL;
-   E_Border *bd = it->data;
+   E_Border *bd = bi->border;
 
    if (bd->internal)
      {
        o = edje_object_add(e);
        if (!bd->internal_icon)
          e_util_edje_icon_set(o, "enlightenment/e");
-       else
+       else if (!bd->internal_icon_key)
          {
-            if (!bd->internal_icon_key)
+            char *ext;
+            ext = strrchr(bd->internal_icon, '.');
+            if ((ext) && ((!strcmp(ext, ".edj"))))
               {
-                 char *ext;
-                 ext = strrchr(bd->internal_icon, '.');
-                 if ((ext) && ((!strcmp(ext, ".edj"))))
-                   {
-                      if (!edje_object_file_set(o, bd->internal_icon, "icon"))
-                        e_util_edje_icon_set(o, "enlightenment/e");
-                   }
-                 else if (ext)
-                   {
-                      evas_object_del(o);
-                      o = e_icon_add(e);
-                      e_icon_file_set(o, bd->internal_icon);
-                   }
-                 else
-                   {
-                      if (!e_util_edje_icon_set(o, bd->internal_icon))
-                        e_util_edje_icon_set(o, "enlightenment/e");
-                   }
+                 if (!edje_object_file_set(o, bd->internal_icon, "icon"))
+                   e_util_edje_icon_set(o, "enlightenment/e");
+              }
+            else if (ext)
+              {
+                 evas_object_del(o);
+                 o = e_icon_add(e);
+                 e_icon_file_set(o, bd->internal_icon);
               }
             else
               {
-                 edje_object_file_set(o, bd->internal_icon,
-                                      bd->internal_icon_key);
+                 if (!e_util_edje_icon_set(o, bd->internal_icon))
+                   e_util_edje_icon_set(o, "enlightenment/e");
               }
          }
+       else
+         {
+            edje_object_file_set(o, bd->internal_icon,
+                                 bd->internal_icon_key);
+         }
        return o;
      }
 
@@ -157,103 +249,16 @@ _icon_get(Evry_Item *it, Evas *e)
    return o;
 }
 
-static void
-_item_add(Evry_Plugin *p, E_Border *bd, int match, int *prio)
-{
-   Evry_Item *it = NULL;
-
-   if ((it = eina_hash_find(border_hash, &bd)))
-     {
-       it->priority = *prio;
-       EVRY_PLUGIN_ITEM_APPEND(p, it);
-       it->fuzzy_match = match;
-       *prio += 1;
-       return;
-     }
-
-   it = EVRY_ITEM_NEW(Evry_Item, p, e_border_name_get(bd), _icon_get, _item_free);
-
-   e_object_ref(E_OBJECT(bd));
-   it->data = bd;
-   it->fuzzy_match = match;
-   it->priority = *prio;
-   it->id = eina_stringshare_add(e_util_winid_str_get(bd->win));
-
-   *prio += 1;
-
-   eina_hash_add(border_hash, &bd, it);
-
-   EVRY_PLUGIN_ITEM_APPEND(p, it);
-}
-
-static int
-_cb_sort(const void *data1, const void *data2)
-{
-   const Evry_Item *it1 = data1;
-   const Evry_Item *it2 = data2;
-
-   if (it1->fuzzy_match - it2->fuzzy_match)
-     return (it1->fuzzy_match - it2->fuzzy_match);
-
-   return (it1->priority - it2->priority);
-}
-
-static int
-_fetch(Evry_Plugin *p, const char *input)
-{
-   E_Zone *zone;
-   E_Border *bd;
-   Eina_List *l;
-   int prio = 0;
-   int m1, m2;
-
-   EVRY_PLUGIN_ITEMS_CLEAR(p);
-
-   zone = e_util_zone_current_get(e_manager_current_get());
-
-   EINA_LIST_FOREACH(e_border_focus_stack_get(), l, bd)
-     {
-       if (zone == bd->zone)
-         {
-            if (!input)
-              _item_add(p, bd, 0, &prio);
-            else
-              {
-                 m1 = evry->fuzzy_match(e_border_name_get(bd), input);
-
-                 if (bd->client.icccm.name)
-                   {
-                      m2 = evry->fuzzy_match(bd->client.icccm.name, input);
-                      if (!m1 || (m2 && m2 < m1))
-                        m1 = m2;
-                   }
-
-                 if (bd->desktop)
-                   {
-                      m2 = evry->fuzzy_match(bd->desktop->name, input);
-                      if (!m1 || (m2 && m2 < m1))
-                        m1 = m2;
-                   }
-
-                 if (m1)
-                   _item_add(p, bd, m1, &prio);
-              }
-         }
-     }
-
-   if (!p->items) return 0;
 
-   EVRY_PLUGIN_ITEMS_SORT(p, _cb_sort);
-
-   return 1;
-}
+/***************************************************************************/
 
 static int
 _check_border(Evry_Action *act, const Evry_Item *it)
 {
+   GET_BORDER(bi, it);
+
    int action = EVRY_ITEM_DATA_INT_GET(act);
-   
-   E_Border *bd = it->data;
+   E_Border *bd = bi->border;
    E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
 
    switch (action)
@@ -290,11 +295,11 @@ _check_border(Evry_Action *act, const Evry_Item *it)
 static int
 _act_border(Evry_Action *act)
 {
-   int action = EVRY_ITEM_DATA_INT_GET(act);
+   GET_BORDER(bi, act->it1.item);
 
-   E_Border *bd = act->it1.item->data;
+   int action = EVRY_ITEM_DATA_INT_GET(act);
+   E_Border *bd = bi->border;
    E_Zone *zone = e_util_zone_current_get(e_manager_current_get());
-
    int focus = 0;
 
    switch (action)
@@ -312,14 +317,14 @@ _act_border(Evry_Action *act)
       case BORDER_HIDE:
         e_border_iconify(bd);
         break;
-        
+
       case BORDER_FULLSCREEN:
         if (!bd->fullscreen)
           e_border_fullscreen(bd, E_FULLSCREEN_RESIZE);
         else
           e_border_unfullscreen(bd);
         break;
-        
+
       case BORDER_TODESK:
         if (bd->desk != (e_desk_current_get(zone)))
           e_border_desk_set(bd, e_desk_current_get(zone));
@@ -349,7 +354,7 @@ static int
 _plugins_init(const Evry_API *_api)
 {
    Evry_Action *act;
-   
+
    if (evry_module->active)
      return EINA_TRUE;
 
@@ -358,10 +363,10 @@ _plugins_init(const Evry_API *_api)
    if (!evry->api_version_check(EVRY_API_VERSION))
      return EINA_FALSE;
 
-   _plug = EVRY_PLUGIN_NEW(Evry_Plugin, N_("Windows"),
+   _plug = EVRY_PLUGIN_NEW(Plugin, N_("Windows"),
                           "preferences-system-windows",
                           EVRY_TYPE_BORDER,
-                          _begin, _cleanup, _fetch, NULL);
+                          NULL, _cleanup, _fetch, NULL);
    _plug->transient = EINA_TRUE;
    evry->plugin_register(_plug, EVRY_PLUGIN_SUBJECT, 2);
 
@@ -414,7 +419,7 @@ _plugins_shutdown(void)
    EVRY_PLUGIN_FREE(_plug);
 
    EINA_LIST_FREE(_actions, act)
-     evry->action_free(act);
+     EVRY_ACTION_FREE(act);
 
    evry_module->active = EINA_FALSE;
 }
@@ -448,7 +453,7 @@ EAPI int
 e_modapi_shutdown(E_Module *m)
 {
    _plugins_shutdown();
-   
+
    EVRY_MODULE_UNREGISTER(evry_module);
    E_FREE(evry_module);
 
index 206a910..570e8ac 100644 (file)
@@ -227,7 +227,7 @@ struct _Evry_Event_Action_Performed
 #define EVRY_PLUGIN_ITEMS_CLEAR(_p) {          \
      Evry_Item *it;                            \
      EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \
-       it->fuzzy_match = 0; }
+       if (it) it->fuzzy_match = 0; }
 
 #define EVRY_PLUGIN_ITEMS_FREE(_p) {           \
      Evry_Item *it;                            \
index b2b22a5..670f210 100644 (file)
@@ -1485,11 +1485,8 @@ _cb_item_changed(void *data, int type, void *event)
 
    if (ev->changed_selection)
      {
-       if (it->item->selected)
-         {
-            evry_item_select(v->state, ev->item);
-            _pan_item_select(v->span, it, 1);
-         }
+       _pan_item_select(v->span, it, 1);
+       evry_item_select(v->state, ev->item);
      }
 
    if (!it->visible)
index dc334a0..c57089e 100644 (file)
@@ -365,31 +365,29 @@ evry_util_plugin_items_add(Evry_Plugin *p, Eina_List *items, const char *input,
 
    EINA_LIST_FOREACH(items, l, it)
      {
+       it->fuzzy_match = 0;
+
+       if (set_usage)
+         evry_history_item_usage_set(it, input, NULL);
+
        if (!input)
          {
             p->items = eina_list_append(p->items, it);
-
-            if (set_usage)
-              evry_history_item_usage_set(it, NULL, NULL);
-
             continue;
          }
-       
+
        it->fuzzy_match = evry_fuzzy_match(it->label, input);
 
        if (match_detail)
-         match = evry_fuzzy_match(it->detail, input);
-
-       if (match && match < it->fuzzy_match)
-         it->fuzzy_match = match;
-
-       if (it->fuzzy_match)
          {
-            if (set_usage)
-              evry_history_item_usage_set(it, input, NULL);
+            match = evry_fuzzy_match(it->detail, input);
 
-            p->items = eina_list_append(p->items, it);
+            if (!(it->fuzzy_match) || (match && (match < it->fuzzy_match)))
+              it->fuzzy_match = match;
          }
+
+       if (it->fuzzy_match)
+         p->items = eina_list_append(p->items, it);
      }
 
    p->items = eina_list_sort(p->items, -1, evry_items_sort_func);