diff --git a/src/modules/everything/evry.c b/src/modules/everything/evry.c index 4501c2cc2..0c63a0e88 100644 --- a/src/modules/everything/evry.c +++ b/src/modules/everything/evry.c @@ -88,7 +88,7 @@ static Eina_List *handlers = NULL; static Evry_Selector *selector = NULL; static const char *thumb_types = NULL; -Evry_Selector **selectors; +Evry_Selector **selectors = NULL; const char *action_selector; /* externally accessible functions */ @@ -144,13 +144,13 @@ evry_show(E_Zone *zone, const char *params) zone->w, zone->h); ecore_x_window_show(input_window); if (!e_grabinput_get(input_window, 1, input_window)) - goto error; + goto error1; win = _evry_window_new(zone); - if (!win) goto error; + if (!win) goto error2; list = _evry_list_win_new(zone); - if (!list) goto error; + if (!list) goto error2; list->visible = EINA_FALSE; @@ -166,9 +166,6 @@ evry_show(E_Zone *zone, const char *params) _evry_selector_subjects_get(params); _evry_selector_activate(selectors[0]); - - selectors[0]->update_timer = - ecore_timer_add(INITIAL_MATCH_LAG, _evry_cb_update_timer, selectors[0]); if (evry_conf->views && selector->state) { @@ -179,7 +176,10 @@ evry_show(E_Zone *zone, const char *params) _evry_view_show(s->view); } - else goto error; + else goto error3; + + /* selectors[0]->update_timer = + * ecore_timer_add(INITIAL_MATCH_LAG, _evry_cb_update_timer, selectors[0]); */ if (!evry_conf->hide_input) edje_object_signal_emit(list->o_main, "e,state,entry_show", "e"); @@ -212,20 +212,25 @@ evry_show(E_Zone *zone, const char *params) return 1; - error: - if (win && selectors[0]) + error3: + if (selectors && selectors[0]) _evry_selector_free(selectors[0]); - if (win && selectors[1]) + if (selectors && selectors[1]) _evry_selector_free(selectors[1]); - if (win && selectors[2]) + if (selectors && selectors[2]) _evry_selector_free(selectors[2]); + evry_history_unload(); + + error2: if (win) _evry_window_free(win); if (list) _evry_list_win_free(list); win = NULL; list = NULL; + + error1: ecore_x_window_free(input_window); input_window = 0; @@ -239,15 +244,17 @@ evry_hide(void) if (!win) return; - _evry_view_clear(selector->state); + /* _evry_view_clear(selector->state); */ list->visible = EINA_FALSE; _evry_selector_free(selectors[0]); _evry_selector_free(selectors[1]); _evry_selector_free(selectors[2]); - selector = NULL; E_FREE(selectors); + selectors = NULL; + selector = NULL; + _evry_list_win_free(list); list = NULL; @@ -1144,6 +1151,9 @@ _evry_state_pop(Evry_Selector *sel) EINA_LIST_FREE(s->plugins, p) p->cleanup(p); + if (sel->aggregator) + sel->aggregator->cleanup(sel->aggregator); + E_FREE(s); sel->states = eina_list_remove_list(sel->states, sel->states); @@ -1795,14 +1805,20 @@ _evry_matches_update(Evry_Selector *sel, int async) _evry_plugin_select(s, s->plugin); } +static int ref = 0; static void _evry_item_desel(Evry_State *s, Evry_Item *it) { + if (!it) + it = s->cur_item; + if (s->cur_item) { - s->cur_item->selected = EINA_FALSE; - evry_item_free(s->cur_item); + it->selected = EINA_FALSE; + evry_item_free(it); + /* printf("desel: %d, %s\n", --ref, it->label); */ + } s->cur_item = NULL; @@ -1816,7 +1832,7 @@ _evry_item_sel(Evry_State *s, Evry_Item *it) _evry_item_desel(s, NULL); evry_item_ref(it); - + /* printf("desel: %d, %s\n", ref++, it->label); */ it->selected = EINA_TRUE; s->cur_item = it; diff --git a/src/modules/everything/evry_history.c b/src/modules/everything/evry_history.c index a673c076c..45a26dc7f 100644 --- a/src/modules/everything/evry_history.c +++ b/src/modules/everything/evry_history.c @@ -275,27 +275,27 @@ evry_history_item_usage_set(Eina_Hash *hist, Evry_Item *it, const char *input, c if (evry_conf->history_sort_mode == 0) { - if (!input || !hi->input) - { - it->usage += hi->usage * hi->count; - } - else - { - /* higher priority for exact matches */ - if (!strncmp(input, hi->input, strlen(input))) + if (!input || !hi->input) { it->usage += hi->usage * hi->count; } - if (!strncmp(input, hi->input, strlen(hi->input))) + else { - it->usage += hi->usage * hi->count; + /* higher priority for exact matches */ + if (!strncmp(input, hi->input, strlen(input))) + { + it->usage += hi->usage * hi->count; + } + if (!strncmp(input, hi->input, strlen(hi->input))) + { + it->usage += hi->usage * hi->count; + } + } + if (hi->context && ctxt) + { + if (hi->context == ctxt) + it->usage += hi->usage * hi->count * 2; } - } - if (hi->context && ctxt) - { - if (hi->context == ctxt) - it->usage += hi->usage * hi->count * 2; - } } else if (evry_conf->history_sort_mode == 1) { diff --git a/src/modules/everything/evry_plug_aggregator.c b/src/modules/everything/evry_plug_aggregator.c index 28fe4d41e..ab2db2dcb 100644 --- a/src/modules/everything/evry_plug_aggregator.c +++ b/src/modules/everything/evry_plug_aggregator.c @@ -93,6 +93,18 @@ _cb_sort(const void *data1, const void *data2) return strcasecmp(it1->label, it2->label); } +static int refs = 0; + +static inline Eina_List * +_add_item(Plugin *p, Eina_List *items, Evry_Item *it) +{ + evry_item_ref(it); + items = eina_list_append(items, it); + EVRY_PLUGIN_ITEM_APPEND(p, it); + + return items; +} + static int _fetch(Evry_Plugin *plugin, const char *input) { @@ -104,9 +116,9 @@ _fetch(Evry_Plugin *plugin, const char *input) int i, cnt = 0; Eina_List *items = NULL; const char *context = NULL; - - EVRY_PLUGIN_ITEMS_FREE(p); + EVRY_PLUGIN_ITEMS_FREE(p); + s = p->selector->state; if (!s || !s->cur_plugins || !s->cur_plugins->next) @@ -137,11 +149,7 @@ _fetch(Evry_Plugin *plugin, const char *input) it->fuzzy_match = evry_fuzzy_match(it->label, input); if (it->fuzzy_match || p->selector == selectors[2]) - { - evry_item_ref(it); - items = eina_list_append(items, it); - EVRY_PLUGIN_ITEM_APPEND(p, it); - } + items = _add_item(p, items, it); } } } @@ -160,10 +168,8 @@ _fetch(Evry_Plugin *plugin, const char *input) if (!eina_list_data_find_list(items, ll->data)) { it = ll->data; - evry_item_ref(it); it->fuzzy_match = 0; - items = eina_list_append(items, it); - EVRY_PLUGIN_ITEM_APPEND(p, it); + items = _add_item(p, items, it); } } } @@ -178,9 +184,7 @@ _fetch(Evry_Plugin *plugin, const char *input) if (evry_history_item_usage_set(p->selector->history, it, input, context) && (!eina_list_data_find_list(items, it))) { - evry_item_ref(it); - items = eina_list_append(items, it); - EVRY_PLUGIN_ITEM_APPEND(p, it); + items = _add_item(p, items, it); continue; } } @@ -196,9 +200,8 @@ _fetch(Evry_Plugin *plugin, const char *input) { if (!eina_list_data_find_list(items, it)) { - evry_item_ref(it); it->fuzzy_match = 0; - EVRY_PLUGIN_ITEM_APPEND(p, it); + items = _add_item(p, items, it); } } } diff --git a/src/modules/everything/sources/evry_plug_apps.c b/src/modules/everything/sources/evry_plug_apps.c index 49581cab4..218eb0f5a 100644 --- a/src/modules/everything/sources/evry_plug_apps.c +++ b/src/modules/everything/sources/evry_plug_apps.c @@ -8,6 +8,7 @@ struct _Plugin Evry_Plugin base; Eina_List *apps_mime; Eina_List *apps_all; + Eina_List *apps_hist; const Evry_Item *candidate; Eina_Hash *added; }; @@ -42,14 +43,13 @@ static E_Config_DD *exelist_edd = NULL; static DIR *exe_dir = NULL; static Eina_List *exe_list = NULL; static Eina_List *exe_list2 = NULL; -static Eina_Hash *added = NULL; static int _scan_idler(void *data); - static void _hash_free(void *data) { ITEM_APP(app, data); + evry_item_free(EVRY_ITEM(app)); } @@ -76,18 +76,13 @@ _begin_open_with(Evry_Plugin *plugin, const Evry_Item *item) if (!mime) return NULL; p->candidate = item; + p->apps_mime = efreet_util_desktop_mime_list(mime); desktop = e_exehist_mime_desktop_get(mime); if (desktop) - { - efreet_desktop_ref(desktop); - p->apps_mime = eina_list_prepend(p->apps_mime, desktop); - } + p->apps_mime = eina_list_prepend(p->apps_mime, desktop); - p->added = added; - if (!p->added) - p->added = eina_hash_string_small_new(_hash_free); - added = p->added; + p->added = eina_hash_string_small_new(_hash_free); return plugin; } @@ -158,13 +153,6 @@ _cleanup(Evry_Plugin *plugin) { PLUGIN(p, plugin); Efreet_Desktop *desktop; - char *str; - - /* TODO popup end func !!! - - cleanup hash for open-with plugin */ - if (added) - eina_hash_free(added); - added = NULL; if (p->added) eina_hash_free(p->added); @@ -174,38 +162,36 @@ _cleanup(Evry_Plugin *plugin) EINA_LIST_FREE(p->apps_all, desktop) efreet_desktop_free(desktop); - if (exe_dir) - { - closedir(exe_dir); - exe_dir = NULL; - } - EINA_LIST_FREE(exe_path, str) - free(str); - - if (exe_scan_idler) - { - ecore_idler_del(exe_scan_idler); - exe_scan_idler = NULL; - } - EINA_LIST_FREE(exe_list, str) - free(str); - EINA_LIST_FREE(exe_list2, str) - free(str); -} - -static void -_cleanup_open_with(Evry_Plugin *plugin) -{ - PLUGIN(p, plugin); - Efreet_Desktop *desktop; - - EVRY_PLUGIN_ITEMS_CLEAR(p); - - EINA_LIST_FREE(p->apps_mime, desktop) + EINA_LIST_FREE(p->apps_hist, desktop) efreet_desktop_free(desktop); + + if (plugin->type == type_action) + { + EINA_LIST_FREE(p->apps_mime, desktop) + efreet_desktop_free(desktop); + } + else + { + char *str; + + if (exe_dir) + { + closedir(exe_dir); + exe_dir = NULL; + } + EINA_LIST_FREE(exe_path, str) + free(str); - EINA_LIST_FREE(p->apps_all, desktop) - efreet_desktop_free(desktop); + if (exe_scan_idler) + { + ecore_idler_del(exe_scan_idler); + exe_scan_idler = NULL; + } + EINA_LIST_FREE(exe_list, str) + free(str); + EINA_LIST_FREE(exe_list2, str) + free(str); + } } static Evry_Item_App * @@ -278,7 +264,7 @@ _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match) efreet_desktop_ref(desktop); app = E_NEW(Evry_Item_App, 1); - + if (desktop) { evry_item_new(EVRY_ITEM(app), EVRY_PLUGIN(p), desktop->name, _item_free); @@ -292,10 +278,6 @@ _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match) app->desktop = desktop; - /* XXX check required ? */ - if (file) - app->file = eina_stringshare_add(file); - eina_hash_add(p->added, exe, app); if (desktop) @@ -308,12 +290,18 @@ _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match) eina_hash_add(p->added, tmp, app); } } - if (file && strcmp(exe, file)) - { - evry_item_ref(EVRY_ITEM(app)); - eina_hash_add(p->added, file, app); - } + if (file) + { + app->file = eina_stringshare_add(file); + + if (strcmp(exe, file)) + { + evry_item_ref(EVRY_ITEM(app)); + eina_hash_add(p->added, file, app); + } + } + EVRY_ITEM(app)->fuzzy_match = match; EVRY_PLUGIN_ITEM_APPEND(p, app); @@ -329,19 +317,22 @@ _add_desktop_list(Plugin *p, Eina_List *apps, const char *input) EINA_LIST_FOREACH(apps, l, desktop) { - if (eina_list_count(EVRY_PLUGIN(p)->items) > 199) continue; + if (eina_list_count(EVRY_PLUGIN(p)->items) > 199) break; if (!desktop->name || !desktop->exec) continue; - char *exec = strrchr(desktop->exec, '/'); - if (!exec++ || !exec) exec = desktop->exec; + if (input) + { + char *exec = strrchr(desktop->exec, '/'); + if (!exec++ || !exec) exec = desktop->exec; - m1 = evry_fuzzy_match(exec, input); - m2 = evry_fuzzy_match(desktop->name, input); + m1 = evry_fuzzy_match(exec, input); + m2 = evry_fuzzy_match(desktop->name, input); - if (!m1 || (m2 && m2 < m1)) - m1 = m2; - - if (m1) _item_add(p, desktop, NULL, m1); + if (!m1 || (m2 && m2 < m1)) + m1 = m2; + } + + if (!input || m1) _item_add(p, desktop, NULL, m1); } } @@ -395,16 +386,26 @@ _hist_items_add_cb(const Eina_Hash *hash, const void *key, void *data, void *fda Plugin *p = fdata; Efreet_Desktop *d; Eina_List *l; - + Evry_Item_App *app; + EINA_LIST_FOREACH(he->items, l, hi) { if (hi->plugin != p->base.name) continue; if ((d = efreet_util_desktop_exec_find(key))) - _item_add(p, d, NULL, 1); + { + app = _item_add(p, d, NULL, 1); + } else - _item_add(p, NULL, (char *) key, 1); + { + app = _item_add(p, NULL, (char *) key, 1); + if (app && app->desktop) + efreet_desktop_ref(app->desktop); + } + + if (app && app->desktop) + p->apps_hist = eina_list_append(p->apps_hist, app->desktop); } return EINA_TRUE; } @@ -424,15 +425,7 @@ _fetch(Evry_Plugin *plugin, const char *input) /* add apps for a given mimetype */ if (plugin->type == type_action) - { - if (input) - _add_desktop_list(p, p->apps_mime, input); - else - { - EINA_LIST_FOREACH(p->apps_mime, l, desktop) - _item_add(p, desktop, NULL, 1); - } - } + _add_desktop_list(p, p->apps_mime, input); /* add apps matching input */ if (input) @@ -454,6 +447,7 @@ _fetch(Evry_Plugin *plugin, const char *input) efreet_desktop_free(desktop); apps = eina_list_remove_list(apps, ll); } + efreet_desktop_free(desktop); } p->apps_all = apps; @@ -464,11 +458,10 @@ _fetch(Evry_Plugin *plugin, const char *input) /* add exe history items */ else if (!plugin->items) { - /* l = e_exehist_list_get(); - * EINA_LIST_FREE(l, file) - * _item_add(p, NULL, file, 1); */ - - eina_hash_foreach(evry_hist->subjects, _hist_items_add_cb, p); + if (!p->apps_hist) + eina_hash_foreach(evry_hist->subjects, _hist_items_add_cb, p); + else + _add_desktop_list(p, p->apps_hist, NULL); } /* add executables */ @@ -728,7 +721,7 @@ _init(void) p2 = E_NEW(Plugin, 1); evry_plugin_new(EVRY_PLUGIN(p2), "Open With...", type_action, "FILE", "", 0, NULL, NULL, - _begin_open_with, _cleanup_open_with, _fetch, _open_with_action, + _begin_open_with, _cleanup, _fetch, _open_with_action, _icon_get, NULL, NULL); evry_plugin_register(EVRY_PLUGIN(p1), 1); diff --git a/src/modules/everything/sources/evry_plug_dir_browse.c b/src/modules/everything/sources/evry_plug_dir_browse.c index 1de1bd035..3507f9140 100644 --- a/src/modules/everything/sources/evry_plug_dir_browse.c +++ b/src/modules/everything/sources/evry_plug_dir_browse.c @@ -18,6 +18,8 @@ struct _Plugin Eina_Bool command; const char *input; + + Ecore_Thread *thread; }; struct _Data @@ -34,8 +36,8 @@ static Evry_Plugin *p2 = NULL; static Evry_Action *act1 = NULL; static Evry_Action *act2 = NULL; -static long thread_cnt = 0; -static long thread_last = 0; +/* static long thread_cnt = 0; + * static long thread_last = 0; */ static const char *mime_folder; @@ -166,6 +168,34 @@ _item_id(const char *path) return s3; } +static void +_scan_cancel_func(void *data) +{ + Data *d = data; + Plugin *p = d->plugin; + int cnt = 0; + Evry_Item *item; + char *filename, *path; + Evry_Item_File *file; + + EINA_LIST_FREE(d->files, item) + { + filename = item->data; + free(filename); + evry_item_free(item); + } + E_FREE(d); + + if (p->directory) + eina_stringshare_del(p->directory); + + EINA_LIST_FREE(p->files, file) + evry_item_free(EVRY_ITEM(file)); + + EVRY_PLUGIN_ITEMS_CLEAR(p); + + E_FREE(p); +} static void _scan_end_func(void *data) @@ -176,18 +206,8 @@ _scan_end_func(void *data) Evry_Item *item; char *filename, *path; - if (d->id != thread_last) - { - EINA_LIST_FREE(d->files, item) - { - filename = item->data; - free(filename); - evry_item_free(item); - } - E_FREE(d); - return; - } - + p->thread = NULL; + EINA_LIST_FREE(d->files, item) { ITEM_FILE(file, item); @@ -217,19 +237,19 @@ _scan_end_func(void *data) EVRY_PLUGIN_ITEMS_SORT(p, _cb_sort); evry_plugin_async_update(EVRY_PLUGIN(p), EVRY_ASYNC_UPDATE_ADD); } - + E_FREE(d); } static void _read_directory(Plugin *p) { - thread_last = ++thread_cnt; + /* thread_last = ++thread_cnt; */ Data *d = E_NEW(Data, 1); d->plugin = p; - d->id = thread_cnt; - ecore_thread_run(_scan_func, _scan_end_func, NULL, d); + /* d->id = thread_cnt; */ + p->thread = ecore_thread_run(_scan_func, _scan_end_func, _scan_cancel_func, d); } static Evry_Plugin * @@ -274,17 +294,25 @@ _cleanup(Evry_Plugin *plugin) /* if a thread for this plugin returns it will free its data if its id is smaller than thread_last */ - thread_last = ++thread_cnt; + /* thread_last = ++thread_cnt; */ - if (p->directory) - eina_stringshare_del(p->directory); + if (p->thread) + { + + ecore_thread_cancel(p->thread); + } + else + { + if (p->directory) + eina_stringshare_del(p->directory); - EINA_LIST_FREE(p->files, file) - evry_item_free(EVRY_ITEM(file)); + EINA_LIST_FREE(p->files, file) + evry_item_free(EVRY_ITEM(file)); - EVRY_PLUGIN_ITEMS_CLEAR(p); + EVRY_PLUGIN_ITEMS_CLEAR(p); - E_FREE(p); + E_FREE(p); + } } static void diff --git a/src/modules/everything/views/evry_plug_view_thumb.c b/src/modules/everything/views/evry_plug_view_thumb.c index 475765f37..ded585457 100644 --- a/src/modules/everything/views/evry_plug_view_thumb.c +++ b/src/modules/everything/views/evry_plug_view_thumb.c @@ -640,8 +640,12 @@ _view_clear(Evry_View *view) Item *it; _clear_items(v->span); - if (sd->items) eina_list_free(sd->items); - sd->items = NULL; + + EINA_LIST_FREE(sd->items, it) + { + evry_item_free(it->item); + E_FREE(it); + } if (sd->idle_enter) ecore_idle_enterer_del(sd->idle_enter); sd->idle_enter = ecore_idle_enterer_before_add(_e_smart_reconfigure_do, v->span);