From 486bf47939baee6c857df25efd51a5fd7ec93781 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Wed, 19 May 2010 00:03:35 +0000 Subject: [PATCH] - rework windows plugin, x:y now matches window from that desk - 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 | 335 +++++++++--------- src/modules/everything/evry_api.h | 2 +- src/modules/everything/evry_plug_view_thumb.c | 7 +- src/modules/everything/evry_util.c | 26 +- 4 files changed, 185 insertions(+), 185 deletions(-) diff --git a/src/modules/everything-windows/e_mod_main.c b/src/modules/everything-windows/e_mod_main.c index 399da6ddb..ad619c14a 100644 --- a/src/modules/everything-windows/e_mod_main.c +++ b/src/modules/everything-windows/e_mod_main.c @@ -12,116 +12,208 @@ #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; -static Evry_Plugin * -_begin(Evry_Plugin *p, const Evry_Item *it) -{ - handlers = eina_list_append - (handlers, ecore_event_handler_add - (E_EVENT_BORDER_REMOVE, _cb_border_remove, p)); - - border_hash = eina_hash_pointer_new(_hash_free); - - return p; -} - -static void -_cleanup(Evry_Plugin *p) -{ - Ecore_Event_Handler *h; - - EINA_LIST_FREE(handlers, h) - ecore_event_handler_del(h); - - if (border_hash) eina_hash_free(border_hash); - border_hash = NULL; + _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 void -_item_free(Evry_Item *it) +_get_borderlist(Plugin *p) { - if (it->data) - e_object_unref(E_OBJECT(it->data)); + E_Border *bd; + Eina_List *l; - E_FREE(it); + p->handlers = eina_list_append + (p->handlers, ecore_event_handler_add + (E_EVENT_BORDER_REMOVE, _cb_border_remove, p)); + + p->handlers = eina_list_append + (p->handlers, ecore_event_handler_add + (E_EVENT_BORDER_ADD, _cb_border_add, p)); + + EINA_LIST_FOREACH(e_border_focus_stack_get(), l, bd) + _border_item_add(p, bd); +} + +static void +_cleanup(Evry_Plugin *plugin) +{ + Ecore_Event_Handler *h; + Border_Item *bi; + + GET_PLUGIN(p, plugin); + + 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 int +_fetch(Evry_Plugin *plugin, const char *input) +{ + int len = (input ? strlen(input) : 0); + + GET_PLUGIN(p, plugin); + + 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) { + GET_BORDER(bi, act->it1.item); + int action = EVRY_ITEM_DATA_INT_GET(act); - - E_Border *bd = act->it1.item->data; + 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); diff --git a/src/modules/everything/evry_api.h b/src/modules/everything/evry_api.h index 206a91089..570e8ac03 100644 --- a/src/modules/everything/evry_api.h +++ b/src/modules/everything/evry_api.h @@ -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; \ diff --git a/src/modules/everything/evry_plug_view_thumb.c b/src/modules/everything/evry_plug_view_thumb.c index b2b22a5b2..670f210de 100644 --- a/src/modules/everything/evry_plug_view_thumb.c +++ b/src/modules/everything/evry_plug_view_thumb.c @@ -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) diff --git a/src/modules/everything/evry_util.c b/src/modules/everything/evry_util.c index dc334a0a5..c57089ed3 100644 --- a/src/modules/everything/evry_util.c +++ b/src/modules/everything/evry_util.c @@ -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); + { + match = evry_fuzzy_match(it->detail, input); - if (match && match < it->fuzzy_match) - it->fuzzy_match = match; + if (!(it->fuzzy_match) || (match && (match < it->fuzzy_match))) + it->fuzzy_match = match; + } if (it->fuzzy_match) - { - if (set_usage) - evry_history_item_usage_set(it, input, NULL); - - p->items = eina_list_append(p->items, it); - } + p->items = eina_list_append(p->items, it); } p->items = eina_list_sort(p->items, -1, evry_items_sort_func);