#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;
}
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)
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)
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));
_plugins_init(const Evry_API *_api)
{
Evry_Action *act;
-
+
if (evry_module->active)
return EINA_TRUE;
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);
EVRY_PLUGIN_FREE(_plug);
EINA_LIST_FREE(_actions, act)
- evry->action_free(act);
+ EVRY_ACTION_FREE(act);
evry_module->active = EINA_FALSE;
}
e_modapi_shutdown(E_Module *m)
{
_plugins_shutdown();
-
+
EVRY_MODULE_UNREGISTER(evry_module);
E_FREE(evry_module);