- 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
This commit is contained in:
Hannes Janetzek 2010-05-19 00:03:35 +00:00
parent 19a2d9cbb7
commit 486bf47939
4 changed files with 185 additions and 185 deletions

View File

@ -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);

View 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; \

View 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)

View 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);
{
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);