forked from enlightenment/enlightenment
- 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:
parent
19a2d9cbb7
commit
486bf47939
|
@ -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);
|
||||
|
||||
|
|
|
@ -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; \
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue