diff --git a/src/modules/everything/Evry.h b/src/modules/everything/Evry.h index 5f37360aa..1ea5a23b9 100644 --- a/src/modules/everything/Evry.h +++ b/src/modules/everything/Evry.h @@ -50,6 +50,8 @@ struct _Evry_Item /* not to be set by plugin! */ Evas_Object *o_icon; Evas_Object *o_bg; + int ref; + void (*cb_free) (Evry_Item *item); }; struct _Evry_Plugin @@ -146,7 +148,7 @@ void evry_plugin_unregister(Evry_Plugin *p); void evry_action_register(Evry_Action *act); void evry_action_unregister(Evry_Action *act); -Evry_Item *evry_item_new(Evry_Plugin *p, const char *label); +Evry_Item *evry_item_new(Evry_Plugin *p, const char *label, void (*cb_free) (Evry_Item *item)); void evry_item_free(Evry_Item *it); void evry_plugin_async_update(Evry_Plugin *plugin, int state); void evry_clear_input(void); diff --git a/src/modules/everything/evry.c b/src/modules/everything/evry.c index 89254e6ee..a60e38628 100644 --- a/src/modules/everything/evry.c +++ b/src/modules/everything/evry.c @@ -39,6 +39,8 @@ struct _Evry_State candidates, the higher priority plugin is made current */ Eina_Bool plugin_auto_selected; Eina_Bool item_auto_selected; + + Eina_List *items; }; /* */ @@ -78,7 +80,6 @@ struct _Evry_List_Window Evas_Object *o_main; Evas_Object *o_list; Evas_Object *o_tabs; - Eina_List *items; int ev_last_is_mouse; Evry_Item *item_mouseover; @@ -91,19 +92,6 @@ struct _Evry_List_Window Eina_Bool visible; }; -/* struct _Evry_List_Item - * { - * Evry_Item *item; - * - * Evas_Object *o_icon; - * Evas_Object *o_bg; - * - * const char *label; - * }; */ - - -static int _evry_cb_key_down(void *data, int type, void *event); -static int _evry_cb_selection_notify(void *data, int type, void *event); /* static int _evry_cb_mouse_down(void *data, int type, void *event); * static int _evry_cb_mouse_up(void *data, int type, void *event); @@ -173,6 +161,9 @@ static int _evry_plug_aggregator_action(Evry_Plugin *p, const Evry_Item *item, static void _evry_plug_aggregator_cleanup(Evry_Plugin *p); static Evas_Object *_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e); +static int _evry_cb_key_down(void *data, int type, void *event); +static int _evry_cb_selection_notify(void *data, int type, void *event); + /* local subsystem globals */ static Evry_Window *win = NULL; static Evry_List_Window *list = NULL; @@ -299,6 +290,7 @@ evry_hide(void) ecore_timer_del(update_timer); update_timer = NULL; + list->visible = EINA_FALSE; _evry_selector_free(selectors[0]); _evry_selector_free(selectors[1]); _evry_selector_free(selectors[2]); @@ -334,8 +326,11 @@ evry_clear_input(void) } } + +/* static int item_cnt = 0; */ + Evry_Item * -evry_item_new(Evry_Plugin *p, const char *label) +evry_item_new(Evry_Plugin *p, const char *label, void (*cb_free) (Evry_Item *item)) { Evry_Item *it; @@ -345,19 +340,46 @@ evry_item_new(Evry_Plugin *p, const char *label) it->plugin = p; if (label) it->label = eina_stringshare_add(label); + it->ref = 1; + + /* item_cnt++; */ + return it; } void evry_item_free(Evry_Item *it) { + if (!it) return; + + it->ref--; + + if (it->ref > 0) return; + + /* printf("%d, %d\t 0x%x 0x%x 0x%x free: %s\n", + * it->ref, item_cnt - 1, + * it->label, it->uri, it->mime, + * it->label); */ + /* item_cnt--; */ + + if (it->cb_free) it->cb_free(it); + if (it->label) eina_stringshare_del(it->label); + if (it->uri) eina_stringshare_del(it->uri); + if (it->mime) eina_stringshare_del(it->mime); + if (it->o_bg) evas_object_del(it->o_bg); if (it->o_icon) evas_object_del(it->o_icon); E_FREE(it); } +void +_evry_item_ref(Evry_Item *it) +{ + it->ref++; +} + static Evry_List_Window * _evry_list_win_new(E_Zone *zone) { @@ -380,7 +402,6 @@ _evry_list_win_new(E_Zone *zone) e_object_del(E_OBJECT(popup)); return NULL; } - list_win->popup = popup; evas_event_freeze(popup->evas); @@ -411,9 +432,6 @@ _evry_list_win_new(E_Zone *zone) evas_object_show(o); list_win->o_tabs = o; - /* edje_object_signal_callback_add(list_win->o_main, "e,state,list_shown", "e", - * _evry_list_cb_list_shown, NULL); */ - evas_event_thaw(popup->evas); return list_win; @@ -575,21 +593,15 @@ _evry_selector_free(Evry_Selector *sel) evas_object_del(sel->o_main); if (list->visible && (sel == selector)) - { - _evry_list_clear_list(sel->state); - } + _evry_list_clear_list(sel->state); - EINA_LIST_FREE(sel->states, s) + while (sel->states) + _evry_state_pop(sel); + + EINA_LIST_FREE(sel->plugins, p) { - free(s->input); - - EINA_LIST_FREE(s->plugins, p) - { - p->cleanup(p); - if (p->tab) evas_object_del(p->tab); - p->tab = NULL; - } - E_FREE(s); + if (p->tab) evas_object_del(p->tab); + p->tab = NULL; } _evry_plug_aggregator_free(sel->aggregator); @@ -610,8 +622,6 @@ _evry_selector_activate(Evry_Selector *sel) edje_object_signal_emit(selector->o_main, "e,state,unselected", "e"); edje_object_part_text_set(selector->o_main, "e.text.plugin", ""); - _evry_list_clear_list(s); - EINA_LIST_FOREACH(selector->plugins, l, p) { e_box_unpack(p->tab); @@ -689,20 +699,15 @@ _evry_selector_update(Evry_Selector *sel) if (s) { - if (s->cur_plugins) - { - /* get first plugin */ - if ((!s->plugin) || (!eina_list_data_find(s->cur_plugins, s->plugin))) - _evry_select_plugin(s, s->cur_plugins->data); - } - else - { - s->plugin = NULL; - s->sel_item = NULL; - } + it = s->sel_item; + + if (!s->plugin && it) + _evry_list_item_desel(s, NULL); + else if (it && !eina_list_data_find_list(s->plugin->items, it)) + _evry_list_item_desel(s, NULL); it = s->sel_item; - + if (s->plugin && (!it || s->item_auto_selected)) { /* get first item */ @@ -747,10 +752,12 @@ static void _evry_list_update(Evry_State *s) { if (!list->visible) return; - if (!s->plugin) return; _evry_list_clear_list(s); - _evry_list_tabs_update(s); + _evry_list_tabs_update(s); + + if (!s->plugin) return; + _evry_list_show_items(s, s->plugin); _evry_list_scroll_to(s, s->sel_item); } @@ -866,8 +873,6 @@ _evry_state_new(Evry_Selector *sel, Eina_List *plugins) s->input = malloc(INPUTLEN); s->input[0] = 0; s->plugins = plugins; - s->cur_plugins = NULL; - s->sel_item = NULL; s->plugin_auto_selected = 1; sel->states = eina_list_prepend(sel->states, s); @@ -880,12 +885,17 @@ static void _evry_state_pop(Evry_Selector *sel) { Evry_Plugin *p; + Evry_State *s; - free(sel->state->input); - EINA_LIST_FREE(sel->state->plugins, p) + s = sel->state; + + _evry_list_item_desel(s, NULL); + + free(s->input); + EINA_LIST_FREE(s->plugins, p) p->cleanup(p); - E_FREE(sel->state); + E_FREE(s); sel->states = eina_list_remove_list(sel->states, sel->states); @@ -939,8 +949,9 @@ _evry_browse_back(Evry_Selector *sel) _evry_list_clear_list(s); _evry_state_pop(sel); + + sel->aggregator->fetch(sel->aggregator, NULL); _evry_selector_update(sel); - /* sel->aggregator->fetch(sel->aggregator, NULL); */ _evry_list_update(sel->state); _evry_update_text_label(sel->state); } @@ -1121,7 +1132,6 @@ _evry_update_timer(void *data) { Evry_State *s = data; /* XXX pass selector as data? */ - _evry_list_clear_list(s); _evry_matches_update(selector); _evry_selector_update(selector); _evry_list_update(selector->state); @@ -1213,6 +1223,8 @@ _evry_list_show_items(Evry_State *s, Evry_Plugin *p) int mw, mh, h; Evas_Object *o; + if (!p) return; + if (p->realize_items) p->realize_items(p, list->popup->evas); if (list->scroll_timer) @@ -1235,7 +1247,9 @@ _evry_list_show_items(Evry_State *s, Evry_Plugin *p) EINA_LIST_FOREACH(p->items, l, it) { - if (!it->o_bg) + o = it->o_bg; + + if (!o) { o = edje_object_add(list->popup->evas); it->o_bg = o; @@ -1248,24 +1262,18 @@ _evry_list_show_items(Evry_State *s, Evry_Plugin *p) * _evry_cb_item_mouse_in, it); * evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT, * _evry_cb_item_mouse_out, it); */ - evas_object_show(o); - } - else - { - o = it->o_bg; - } - - /* if (!it->o_icon && p->icon_get) p->icon_get(p, it, popup_list->evas); */ - - if (it->o_icon && edje_object_part_exists(o, "e.swallow.icons")) - { - edje_object_part_swallow(o, "e.swallow.icons", it->o_icon); - evas_object_show(it->o_icon); } edje_object_size_min_calc(o, &mw, &mh); e_box_pack_end(list->o_list, o); e_box_pack_options_set(o, 1, 1, 1, 0, 0.5, 0.5, mw, mh, 9999, mh); + evas_object_show(o); + + if (it->o_icon && edje_object_part_exists(o, "e.swallow.icons")) + { + edje_object_part_swallow(o, "e.swallow.icons", it->o_icon); + evas_object_show(it->o_icon); + } if (it == s->sel_item) { @@ -1275,6 +1283,9 @@ _evry_list_show_items(Evry_State *s, Evry_Plugin *p) if (it->browseable) edje_object_signal_emit(it->o_bg, "e,state,arrow_show", "e"); } + + _evry_item_ref(it); + s->items = eina_list_append(s->items, it); } e_box_thaw(list->o_list); @@ -1292,6 +1303,41 @@ _evry_list_show_items(Evry_State *s, Evry_Plugin *p) _evry_list_tab_scroll_to(s, p); } +static void +_evry_list_clear_list(Evry_State *s) +{ + Evry_Item *it; + + if (list->item_idler) + { + ecore_idler_del(list->item_idler); + list->item_idler = NULL; + } + + if (s && s->items) + { + evas_event_freeze(list->popup->evas); + e_box_freeze(list->o_list); + EINA_LIST_FREE(s->items, it) + { + if (it->o_bg) + { + e_box_unpack(it->o_bg); + evas_object_hide(it->o_bg); + } + + if (it->o_icon) + evas_object_hide(it->o_icon); + + evry_item_free(it); + } + s->items = NULL; + } + + e_box_thaw(list->o_list); + evas_event_thaw(list->popup->evas); + /* } */ +} static int _evry_list_item_idler(void *data) @@ -1340,7 +1386,6 @@ _evry_matches_update(Evry_Selector *sel) if (s->cur_plugins) eina_list_free(s->cur_plugins); s->cur_plugins = NULL; - s->sel_item = NULL; if (s->input) { @@ -1377,7 +1422,7 @@ _evry_matches_update(Evry_Selector *sel) has_items = p->fetch(p, s->input); } - if ((has_items && eina_list_count(p->items) > 0) || (sel->states->next)) + if (has_items || sel->states->next) s->cur_plugins = eina_list_append(s->cur_plugins, p); } @@ -1386,36 +1431,16 @@ _evry_matches_update(Evry_Selector *sel) sel->aggregator->fetch(sel->aggregator, NULL); s->cur_plugins = eina_list_prepend(s->cur_plugins, sel->aggregator); } + else + sel->aggregator->cleanup(sel->aggregator); } + + if (s->plugin && !eina_list_data_find_list(s->cur_plugins, s->plugin)) + s->plugin = NULL; + + _evry_select_plugin(s, s->plugin); } -static void -_evry_list_clear_list(Evry_State *s) -{ - Evry_Item *it; - Eina_List *l; - - if (list->item_idler) - { - ecore_idler_del(list->item_idler); - list->item_idler = NULL; - } - - if (s && s->plugin && s->plugin->items) - { - evas_event_freeze(list->popup->evas); - e_box_freeze(list->o_list); - EINA_LIST_FOREACH(s->plugin->items, l, it) - { - if (it->o_bg) evas_object_del(it->o_bg); - it->o_bg = NULL; - if (it->o_icon) evas_object_del(it->o_icon); - it->o_icon = NULL; - } - e_box_thaw(list->o_list); - evas_event_thaw(list->popup->evas); - } -} static void _evry_list_scroll_to(Evry_State *s, Evry_Item *it) @@ -1506,10 +1531,22 @@ _evry_list_tab_scroll_to(Evry_State *s, Evry_Plugin *p) static void _evry_list_item_desel(Evry_State *s, Evry_Item *it) -{ - edje_object_signal_emit(it->o_bg, "e,state,unselected", "e"); - if (it->o_icon) - edje_object_signal_emit(it->o_icon, "e,state,unselected", "e"); +{ + if (s->sel_item) + { + it = s->sel_item; + + if (list->visible) + { + if (it->o_bg) + edje_object_signal_emit(it->o_bg, "e,state,unselected", "e"); + if (it->o_icon) + edje_object_signal_emit(it->o_icon, "e,state,unselected", "e"); + } + + evry_item_free(it); + s->sel_item = NULL; + } } static void @@ -1517,21 +1554,21 @@ _evry_list_item_sel(Evry_State *s, Evry_Item *it) { if (s->sel_item == it) return; - if (list->visible && selector->state == s) - { - if (s->sel_item) - _evry_list_item_desel(s, s->sel_item); + _evry_list_item_desel(s, NULL); - edje_object_signal_emit(it->o_bg, "e,state,selected", "e"); + if (list->visible) + { + if (it->o_bg) + edje_object_signal_emit(it->o_bg, "e,state,selected", "e"); if (it->o_icon) edje_object_signal_emit(it->o_icon, "e,state,selected", "e"); - if (it->browseable) edje_object_signal_emit(it->o_bg, "e,state,arrow_show", "e"); - - _evry_list_scroll_to(s, it); + if (s == selector->state) + _evry_list_scroll_to(s, it); } - + + _evry_item_ref(it); s->sel_item = it; } @@ -1606,24 +1643,24 @@ _evry_list_item_prev(Evry_State *s) static void _evry_select_plugin(Evry_State *s, Evry_Plugin *p) { - if (!p) p = s->plugin; - if (!p) return; - - if (list->visible) + if (!s || !s->cur_plugins) return; + + if (!p && s->cur_plugins) { - if (s->plugin != p) - { - if (s->plugin) - edje_object_signal_emit(s->plugin->tab, "e,state,unselected", "e"); - - /* XXX tab_show ? -> see evry_plugin_async_update*/ - edje_object_signal_emit(p->tab, "e,state,selected", "e"); - } + p = s->cur_plugins->data; } - if (s->plugin != p) + if (p && list->visible) { - s->sel_item = NULL; + if (s->plugin && s->plugin != p) + edje_object_signal_emit(s->plugin->tab, "e,state,unselected", "e"); + + edje_object_signal_emit(p->tab, "e,state,selected", "e"); + } + + if ((p || !s->plugin) && s->plugin != p) + { + _evry_list_item_desel(s, NULL); s->plugin = p; } } @@ -1921,7 +1958,7 @@ _evry_plug_actions_fetch(Evry_Plugin *p, const char *input) if (!input || prio) { - it = evry_item_new(p, act->name); + it = evry_item_new(p, act->name, NULL); it->priority = prio; it->data[0] = act; @@ -1942,6 +1979,7 @@ _evry_plug_actions_cleanup(Evry_Plugin *p) EINA_LIST_FREE(p->items, it) evry_item_free(it); + p->items = NULL; if (sel->actions) eina_list_free(sel->actions); @@ -2007,9 +2045,8 @@ _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input __UNUSED__) Evry_Item *it; int cnt = 0; - if (p->items) - eina_list_free(p->items); - p->items = NULL; + EINA_LIST_FREE(p->items, it) + evry_item_free(it); EINA_LIST_FOREACH(s->cur_plugins, l, plugin) cnt += eina_list_count(plugin->items); @@ -2019,7 +2056,10 @@ _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input __UNUSED__) EINA_LIST_FOREACH(s->cur_plugins, l, plugin) { EINA_LIST_FOREACH(plugin->items, ll, it) - p->items = eina_list_append(p->items, it); + { + _evry_item_ref(it); + p->items = eina_list_append(p->items, it); + } } } else @@ -2029,6 +2069,7 @@ _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input __UNUSED__) for (cnt = 0, ll = plugin->items; ll && cnt < 15; ll = ll->next, cnt++) { it = ll->data; + _evry_item_ref(it); p->items = eina_list_append(p->items, it); } } @@ -2049,7 +2090,11 @@ _evry_plug_aggregator_action(Evry_Plugin *p, const Evry_Item *it, const char *in static void _evry_plug_aggregator_cleanup(Evry_Plugin *p) { - if (p->items) eina_list_free(p->items); + Evry_Item *it; + + EINA_LIST_FREE(p->items, it) + evry_item_free(it); + p->items = NULL; } @@ -2079,7 +2124,6 @@ _evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p) s->cur_plugins = eina_list_prepend_relative_list(s->cur_plugins, p, l); else s->cur_plugins = eina_list_append(s->cur_plugins, p); - } void @@ -2091,70 +2135,56 @@ evry_plugin_async_update(Evry_Plugin *p, int action) if (!win) return; s = selector->state; - + agg = selector->aggregator; + /* received data from a plugin of the current selector ? */ if (!s || !eina_list_data_find(s->plugins, p)) return; - agg = selector->aggregator; - if (action == EVRY_ASYNC_UPDATE_ADD) { - /* remove plugin and update selector. */ if (!p->items) { + /* remove plugin and update selector. */ if (!eina_list_data_find(s->cur_plugins, p)) return; s->cur_plugins = eina_list_remove(s->cur_plugins, p); - if (p == s->plugin) - { - s->plugin = NULL; - _evry_selector_update(selector); - } + if (s->plugin == p) + _evry_select_plugin(s, NULL); } else { /* add plugin to current plugins*/ _evry_plugin_list_insert(s, p); - /* update aggregator */ - if (eina_list_count(s->cur_plugins) > 1) + if (!s->plugin || !eina_list_data_find_list(s->cur_plugins, s->plugin)) + _evry_select_plugin(s, NULL); + } + + /* update aggregator */ + if (eina_list_count(s->cur_plugins) > 1) + { + agg->fetch(agg, NULL); + + /* add aggregator */ + if (!(s->cur_plugins->data == agg)) { - if (s->plugin == agg) - _evry_list_clear_list(s); + s->cur_plugins = eina_list_prepend(s->cur_plugins, agg); - agg->fetch(agg, NULL); - - /* add aggregator */ - if (!(s->cur_plugins->data == agg)) - { - s->cur_plugins = eina_list_prepend(s->cur_plugins, agg); - _evry_list_clear_list(s); - s->plugin = agg; - } + if (s->plugin_auto_selected) + _evry_select_plugin(s, agg); } + } - /* plugin is active */ - if ((!s->plugin) || (s->plugin == p) || (s->plugin == agg)) - { - _evry_selector_update(selector); - p = s->plugin; + /* plugin is visible */ + if ((s->plugin == p) || (s->plugin == agg)) + { + _evry_selector_update(selector); + p = s->plugin; - if (list->visible) - { - Eina_List *l; - Evry_Item *it; - evas_event_freeze(list->popup->evas); - e_box_freeze(list->o_list); - EINA_LIST_FOREACH(p->items, l, it) - if (it->o_bg) e_box_unpack(it->o_bg); - e_box_thaw(list->o_list); - evas_event_thaw(list->popup->evas); - - _evry_list_show_items(s, p); - _evry_list_scroll_to(s, s->sel_item); - } - } + _evry_list_clear_list(s); + _evry_list_show_items(s, p); + _evry_list_scroll_to(s, s->sel_item); } /* plugin box was updated: realign */ @@ -2164,17 +2194,88 @@ evry_plugin_async_update(Evry_Plugin *p, int action) _evry_list_tab_scroll_to(s, s->plugin); } } - else if (action == EVRY_ASYNC_UPDATE_CLEAR) +} + + +/* taken from e_utils. just changed 48 to 72.. we need + evry_icon_theme_set(Evas_Object *obj, const char *icon, + size:small, mid, large) imo */ +static int +_evry_icon_theme_set(Evas_Object *obj, const char *icon) +{ + const char *file; + char buf[4096]; + + if ((!icon) || (!icon[0])) return 0; + snprintf(buf, sizeof(buf), "e/icons/%s", icon); + file = e_theme_edje_file_get("base/theme/icons", buf); + if (file[0]) { - Evry_Plugin *tmp = s->plugin; - - s->plugin = p; - _evry_list_clear_list(s); - s->plugin = tmp; - - /* s->cur_plugins = eina_list_remove(s->cur_plugins, p); - * agg->fetch(agg, NULL); */ + e_icon_file_edje_set(obj, file, buf); + return 1; } + return 0; +} + +static int +_evry_icon_fdo_set(Evas_Object *obj, const char *icon) +{ + char *path = NULL; + unsigned int size; + + if ((!icon) || (!icon[0])) return 0; + size = e_util_icon_size_normalize(72 * e_scale); + path = efreet_icon_path_find(e_config->icon_theme, icon, size); + if (!path) return 0; + e_icon_file_set(obj, path); + E_FREE(path); + return 1; +} + +EAPI int +evry_icon_theme_set(Evas_Object *obj, const char *icon) +{ + if (e_config->icon_theme_overrides) + { + if (_evry_icon_fdo_set(obj, icon)) + return 1; + return _evry_icon_theme_set(obj, icon); + } + else + { + if (_evry_icon_theme_set(obj, icon)) + return 1; + return _evry_icon_fdo_set(obj, icon); + } +} + +static int +_evry_cb_selection_notify(void *data, int type, void *event) +{ + Ecore_X_Event_Selection_Notify *ev; + Evry_State *s = selector->state; + + if (!s || (data != win)) return 1; + if (!win->request_selection) return 1; + + win->request_selection = EINA_FALSE; + + ev = event; + if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || + (ev->selection == ECORE_X_SELECTION_PRIMARY)) + { + if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0) + { + Ecore_X_Selection_Data_Text *text_data; + + text_data = ev->data; + + strncat(s->input, text_data->text, (INPUTLEN - strlen(s->input)) - 1); + _evry_update(s); + } + } + + return 1; } @@ -2316,86 +2417,3 @@ evry_plugin_async_update(Evry_Plugin *p, int action) * * return p1->config->priority - p2->config->priority; * } */ - - -/* taken from e_utils. just changed 48 to 72.. we need - evry_icon_theme_set(Evas_Object *obj, const char *icon, - size:small, mid, large) imo */ -static int -_evry_icon_theme_set(Evas_Object *obj, const char *icon) -{ - const char *file; - char buf[4096]; - - if ((!icon) || (!icon[0])) return 0; - snprintf(buf, sizeof(buf), "e/icons/%s", icon); - file = e_theme_edje_file_get("base/theme/icons", buf); - if (file[0]) - { - e_icon_file_edje_set(obj, file, buf); - return 1; - } - return 0; -} - -static int -_evry_icon_fdo_set(Evas_Object *obj, const char *icon) -{ - char *path = NULL; - unsigned int size; - - if ((!icon) || (!icon[0])) return 0; - size = e_util_icon_size_normalize(72 * e_scale); - path = efreet_icon_path_find(e_config->icon_theme, icon, size); - if (!path) return 0; - e_icon_file_set(obj, path); - E_FREE(path); - return 1; -} - -EAPI int -evry_icon_theme_set(Evas_Object *obj, const char *icon) -{ - if (e_config->icon_theme_overrides) - { - if (_evry_icon_fdo_set(obj, icon)) - return 1; - return _evry_icon_theme_set(obj, icon); - } - else - { - if (_evry_icon_theme_set(obj, icon)) - return 1; - return _evry_icon_fdo_set(obj, icon); - } -} - - -static int -_evry_cb_selection_notify(void *data, int type, void *event) -{ - Ecore_X_Event_Selection_Notify *ev; - Evry_State *s = selector->state; - - if (!s || (data != win)) return 1; - if (!win->request_selection) return 1; - - win->request_selection = EINA_FALSE; - - ev = event; - if ((ev->selection == ECORE_X_SELECTION_CLIPBOARD) || - (ev->selection == ECORE_X_SELECTION_PRIMARY)) - { - if (strcmp(ev->target, ECORE_X_SELECTION_TARGET_UTF8_STRING) == 0) - { - Ecore_X_Selection_Data_Text *text_data; - - text_data = ev->data; - - strncat(s->input, text_data->text, (INPUTLEN - strlen(s->input)) - 1); - _evry_update(s); - } - } - - return 1; -} diff --git a/src/modules/everything/evry_plug_apps.c b/src/modules/everything/evry_plug_apps.c index 4775eef51..8b3c29f9b 100644 --- a/src/modules/everything/evry_plug_apps.c +++ b/src/modules/everything/evry_plug_apps.c @@ -64,16 +64,20 @@ static void _list_free(Evry_Plugin *p) { Evry_Item *it; - Evry_App *app; EINA_LIST_FREE(p->items, it) - { - app = it->data[0]; - if (app->file) eina_stringshare_del(app->file); - if (app->desktop) efreet_desktop_free(app->desktop); - E_FREE(app); - evry_item_free(it); - } + evry_item_free(it); +} + +static void +_item_free(Evry_Item *it) +{ + Evry_App *app; + + app = it->data[0]; + if (app->file) eina_stringshare_del(app->file); + if (app->desktop) efreet_desktop_free(app->desktop); + E_FREE(app); } static void @@ -157,9 +161,9 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int prio) } if (desktop) - it = evry_item_new(p, desktop->name); + it = evry_item_new(p, desktop->name, &_item_free); else - it = evry_item_new(p, file); + it = evry_item_new(p, file, &_item_free); app = E_NEW(Evry_App, 1); app->desktop = desktop; @@ -331,7 +335,7 @@ _fetch(Evry_Plugin *p, const char *input) if (found || p == p2) { - it = evry_item_new(p, _("Run Command")); + it = evry_item_new(p, _("Run Command"), &_item_free); app = E_NEW(Evry_App, 1); if (input) app->file = eina_stringshare_add(input); @@ -342,7 +346,7 @@ _fetch(Evry_Plugin *p, const char *input) p->items = eina_list_append(p->items, it); snprintf(match1, 4096, "xterm -hold -e %s", input); - it = evry_item_new(p, _("Run in Terminal")); + it = evry_item_new(p, _("Run in Terminal"), &_item_free); app = E_NEW(Evry_App, 1); if (input) app->file = eina_stringshare_add(match1); diff --git a/src/modules/everything/evry_plug_aspell.c b/src/modules/everything/evry_plug_aspell.c index cfc5a9ee1..df8b27221 100644 --- a/src/modules/everything/evry_plug_aspell.c +++ b/src/modules/everything/evry_plug_aspell.c @@ -81,7 +81,7 @@ _item_add(Evry_Plugin *p, const char *word, int word_size, int prio) { Evry_Item *it; - it = evry_item_new(p, NULL); + it = evry_item_new(p, NULL, NULL); if (!it) return; it->priority = prio; it->label = eina_stringshare_add_length(word, word_size); diff --git a/src/modules/everything/evry_plug_border.c b/src/modules/everything/evry_plug_border.c index aedc41189..5d57c2336 100644 --- a/src/modules/everything/evry_plug_border.c +++ b/src/modules/everything/evry_plug_border.c @@ -9,7 +9,7 @@ _item_add(Evry_Plugin *p, E_Border *bd, int prio) { Evry_Item *it; - it = evry_item_new(p, e_border_name_get(bd)); + it = evry_item_new(p, e_border_name_get(bd), NULL); /* e_object_ref(E_OBJECT(bd)); */ it->data[0] = bd; diff --git a/src/modules/everything/evry_plug_border_act.c b/src/modules/everything/evry_plug_border_act.c index 8d0cba0a1..d1f7542a8 100644 --- a/src/modules/everything/evry_plug_border_act.c +++ b/src/modules/everything/evry_plug_border_act.c @@ -84,6 +84,12 @@ _cb_sort(const void *data1, const void *data2) return (it1->priority - it2->priority); } +static void +_item_free(Evry_Item *it) +{ + if (it->data[1]) eina_stringshare_del((const char *)it->data[1]); +} + static void _item_add(Evry_Plugin *p, const char *label, void (*action_cb) (E_Border *bd), const char *icon, char *m1, char *m2) { @@ -102,7 +108,7 @@ _item_add(Evry_Plugin *p, const char *label, void (*action_cb) (E_Border *bd), c if (!prio) return; - it = evry_item_new(p, label); + it = evry_item_new(p, label, &_item_free); it->data[0] = action_cb; it->data[1] = (void *) eina_stringshare_add(icon); it->priority = prio; @@ -116,10 +122,7 @@ _cleanup(Evry_Plugin *p) Evry_Item *it; EINA_LIST_FREE(p->items, it) - { - if (it->data[1]) eina_stringshare_del((const char *)it->data[1]); - evry_item_free(it); - } + evry_item_free(it); } static int diff --git a/src/modules/everything/evry_plug_calc.c b/src/modules/everything/evry_plug_calc.c index 5c9a2292a..bc1fd6fa5 100644 --- a/src/modules/everything/evry_plug_calc.c +++ b/src/modules/everything/evry_plug_calc.c @@ -128,7 +128,7 @@ _item_add(Evry_Plugin *p, char *result, int prio) { Evry_Item *it; - it = evry_item_new(p, result); + it = evry_item_new(p, result, NULL); if (!it) return; p->items = eina_list_prepend(p->items, it); @@ -213,7 +213,10 @@ _shutdown(void) { Evry_Item *it; - EINA_LIST_FREE(p->items, it) + /* EINA_LIST_FREE(p->items, it) + * evry_item_free(it); */ + + EINA_LIST_FREE(history, it) evry_item_free(it); evry_plugin_unregister(p); diff --git a/src/modules/everything/evry_plug_config.c b/src/modules/everything/evry_plug_config.c index 38b8ce6b5..210215b0e 100644 --- a/src/modules/everything/evry_plug_config.c +++ b/src/modules/everything/evry_plug_config.c @@ -18,7 +18,7 @@ _item_add(Evry_Plugin *p, E_Configure_It *eci, int prio) { Evry_Item *it; - it = evry_item_new(p, eci->label); + it = evry_item_new(p, eci->label, NULL); it->data[0] = eci; it->priority = prio; diff --git a/src/modules/everything/evry_plug_dir_browse.c b/src/modules/everything/evry_plug_dir_browse.c index 3f750c9a4..664b45941 100644 --- a/src/modules/everything/evry_plug_dir_browse.c +++ b/src/modules/everything/evry_plug_dir_browse.c @@ -26,7 +26,7 @@ _item_add(Evry_Plugin *p, const char *directory, const char *file) Evry_Item *it = NULL; char buf[4096]; - it = evry_item_new(p, file); + it = evry_item_new(p, file, NULL); if (!it) return NULL; snprintf(buf, sizeof(buf), "%s/%s", directory, file); @@ -111,7 +111,7 @@ _dirbrowse_idler(void *data) if (!s->command) { - evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_CLEAR); + /* evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_CLEAR); */ if (eina_list_count(p->items) > 0) { @@ -212,11 +212,7 @@ _cleanup(Evry_Plugin *p) if (s->directory) eina_stringshare_del(s->directory); EINA_LIST_FREE(s->items, it) - { - if (it->uri) eina_stringshare_del(it->uri); - if (it->mime) eina_stringshare_del(it->mime); - evry_item_free(it); - } + evry_item_free(it); if (idler) { @@ -261,7 +257,7 @@ _fetch(Evry_Plugin *p, const char *input) /* XXX free s->items? */ if (!strncmp(input, "/", 1)) { - it = evry_item_new(p, "/"); + it = evry_item_new(p, "/", NULL); if (!it) return 0; it->uri = eina_stringshare_add("/"); p->items = eina_list_append(p->items, it); @@ -286,7 +282,7 @@ _fetch(Evry_Plugin *p, const char *input) { tmp = strdup(dir); snprintf(dir, (end - dir) + 1, "%s", tmp); - it = evry_item_new(p, dir); + it = evry_item_new(p, dir, NULL); if (!it) return 0; /* free stuff !!!*/ it->uri = eina_stringshare_add(dir); it->priority = prio; @@ -296,7 +292,7 @@ _fetch(Evry_Plugin *p, const char *input) prio--; } - it = evry_item_new(p, "/"); + it = evry_item_new(p, "/", NULL); if (!it) return 0; it->uri = eina_stringshare_add("/"); it->priority = prio; @@ -311,11 +307,8 @@ _fetch(Evry_Plugin *p, const char *input) if (s->command) { EINA_LIST_FREE(p->items, it) - { - if (it->uri) eina_stringshare_del(it->uri); - if (it->mime) eina_stringshare_del(it->mime); - evry_item_free(it); - } + evry_item_free(it); + p->items = NULL; s->command = EINA_FALSE; } diff --git a/src/modules/everything/evry_plug_tracker.c b/src/modules/everything/evry_plug_tracker.c index 0c87881f8..9dccbf634 100644 --- a/src/modules/everything/evry_plug_tracker.c +++ b/src/modules/everything/evry_plug_tracker.c @@ -86,7 +86,7 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio) if (!filename) return NULL; - it = evry_item_new(p, filename); + it = evry_item_new(p, filename, NULL); if (!it) return NULL; it->priority = prio; @@ -103,7 +103,6 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio) return it; } - static void _cleanup(Evry_Plugin *p) { @@ -120,14 +119,11 @@ _cleanup(Evry_Plugin *p) eina_stringshare_del(inst->matched); inst->matched = NULL; - EINA_LIST_FREE(p->items, it) - { - if (it->mime) eina_stringshare_del(it->mime); - if (it->uri) eina_stringshare_del(it->uri); - evry_item_free(it); - } - p->items = NULL; + EINA_LIST_FREE(inst->items, it) + evry_item_free(it); + inst->items = NULL; + p->items = NULL; } static int @@ -153,8 +149,6 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) if (inst->active) inst->active--; - p->items = inst->items; - if (dbus_error_is_set(error)) { _cleanup(p); @@ -196,49 +190,56 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) if (items) { - EINA_LIST_FREE(p->items, it) - { - if (it->mime) eina_stringshare_del(it->mime); - if (it->uri) eina_stringshare_del(it->uri); - evry_item_free(it); - } + EINA_LIST_FREE(inst->items, it) + evry_item_free(it); + + items = eina_list_sort(items, eina_list_count(items), _cb_sort); + inst->items = items; p->items = items; if (inst->matched) eina_stringshare_del(inst->matched); - inst->matched = eina_stringshare_add(inst->input); + if (inst->input) + inst->matched = eina_stringshare_add(inst->input); + else + inst->matched = NULL; } - else if (p->items && inst->input) + else if (inst->items && inst->input) { char input[128]; char *pos = input; + int len_matched = strlen(inst->matched); + int len_input = strlen(inst->input); + Eina_List *l; - snprintf(input, 128, "%s", inst->input + (strlen(inst->matched) - 1)); - for (; *pos != '\0'; pos++) - if (isspace(*pos)) *pos = '*'; - - EINA_LIST_FREE(p->items, it) + if (len_input > len_matched) { - if (e_util_glob_case_match(it->label, input)) - items = eina_list_append(items, it); - else - { - if (it->mime) eina_stringshare_del(it->mime); - if (it->uri) eina_stringshare_del(it->uri); - evry_item_free(it); - } - } + p->items = NULL; - p->items = items; + snprintf(input, 128, "*%s*", inst->input + len_matched); + for (; *pos != '\0'; pos++) + if (isspace(*pos)) *pos = '*'; + + EINA_LIST_FOREACH(inst->items, l, it) + if (e_util_glob_case_match(it->label, input)) + p->items = eina_list_append(p->items, it); + + if (inst->matched) + eina_stringshare_del(inst->matched); + if (inst->input) + inst->matched = eina_stringshare_add(inst->input); + else + inst->matched = NULL; + } + else + p->items = inst->items; } else { - EINA_LIST_FREE(p->items, it) - { - if (it->mime) eina_stringshare_del(it->mime); - if (it->uri) eina_stringshare_del(it->uri); - evry_item_free(it); - } + EINA_LIST_FREE(inst->items, it) + evry_item_free(it); + + inst->items = NULL; p->items = NULL; if (inst->input) @@ -250,10 +251,6 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) inst->matched = NULL; } - if (p->items) - p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); - - inst->items = p->items; evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_ADD); } @@ -290,14 +287,12 @@ _fetch(Evry_Plugin *p, const char *input) return 0; } - p->items = NULL; - if (input && (strlen(input) > 2)) { + inst->input = eina_stringshare_add(input); search_text = malloc(sizeof(char) * strlen(input) + 3); sprintf(search_text, "*%s*", input); max_hits = 50; - inst->input = eina_stringshare_add(search_text); } else if (!input && !p->begin && p->type == type_object) { @@ -335,6 +330,8 @@ _fetch(Evry_Plugin *p, const char *input) if (input && (strlen(input) > 2)) free(search_text); + if (p->items) return 1; + return 0; } @@ -407,8 +404,7 @@ _init(void) _plugin_new("Music", type_subject, "Music", 20, 0); _plugin_new("Videos", type_subject, "Videos", 20, 0); _plugin_new("Documents", type_subject, "Documents", 20, 0); - /* _plugin_new("Text", type_subject, "TextFiles", 20, 0); */ - + _plugin_new("Find Files", type_object, "Files", 20, 1); _plugin_new("Folders", type_object, "Folders", 20, 0);