From a9589df2e7e78910a3f1b214586e2c922fc45ecb Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Fri, 21 Aug 2009 22:42:06 +0000 Subject: [PATCH] 'everything' module: - support the inheritance of plugins for plugins with one instances per state (dir_browse) - moved internal plugins action_selector and aggregator to separate files - all type_in/out checks are now done with pointer comparison SVN revision: 41920 --- src/modules/everything/Evry.h | 50 +- src/modules/everything/Makefile.am | 4 +- src/modules/everything/e_mod_main.c | 110 +++- src/modules/everything/e_mod_main.h | 29 + src/modules/everything/evry.c | 523 +++--------------- src/modules/everything/evry_plug_actions.c | 147 +++++ src/modules/everything/evry_plug_aggregator.c | 165 ++++++ src/modules/everything/evry_plug_apps.c | 222 ++++---- src/modules/everything/evry_plug_aspell.c | 35 +- src/modules/everything/evry_plug_border.c | 10 +- src/modules/everything/evry_plug_border_act.c | 10 +- src/modules/everything/evry_plug_calc.c | 10 +- src/modules/everything/evry_plug_clipboard.c | 2 +- src/modules/everything/evry_plug_config.c | 10 +- src/modules/everything/evry_plug_dir_browse.c | 279 +++++----- src/modules/everything/evry_plug_preview.c | 3 + src/modules/everything/evry_plug_tracker.c | 187 ++++--- 17 files changed, 889 insertions(+), 907 deletions(-) create mode 100644 src/modules/everything/evry_plug_actions.c create mode 100644 src/modules/everything/evry_plug_aggregator.c diff --git a/src/modules/everything/Evry.h b/src/modules/everything/Evry.h index d23c70ca8..d65d1478c 100644 --- a/src/modules/everything/Evry.h +++ b/src/modules/everything/Evry.h @@ -76,11 +76,12 @@ struct _Evry_Plugin /* whether the plugin uses evry_async_update to add new items */ int async_fetch; - /* run when plugin is activated. when return true plugin is added - to the list of current plugins and queried for results */ - int (*begin) (Evry_Plugin *p, const Evry_Item *item); + /* list of items visible for everything */ + Eina_List *items; - int (*browse) (Evry_Plugin *p, const Evry_Item *item); + /* run when plugin is activated. when return plugin is added + to the list of current plugins and queried for results */ + Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item); /* get candidates matching string, fills 'candidates' list */ int (*fetch) (Evry_Plugin *p, const char *input); @@ -95,15 +96,9 @@ struct _Evry_Plugin /* optional: default action for this plugins items */ int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input); - - Eina_List *items; - Evas_Object *(*config_page) (Evry_Plugin *p); void (*config_apply) (Evry_Plugin *p); - /* only for internal use by plugin */ - void *private; - /* not to be set by plugin! */ Plugin_Config *config; }; @@ -157,7 +152,8 @@ struct _Evry_Action const char *type_in1; const char *type_in2; - + const char *type_out; + int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input); int (*check_item) (Evry_Action *act, const Evry_Item *it); @@ -207,24 +203,24 @@ EAPI Evas_Object *evry_icon_theme_get(const char *icon, Evas *e); EAPI int evry_fuzzy_match(const char *str, const char *match); -EAPI Evry_Plugin *evry_plugin_new(const char *name, int type, - const char *type_in, const char *type_out, - int async_fetch, const char *icon, const char *trigger, - int (*begin) (Evry_Plugin *p, const Evry_Item *item), - void (*cleanup) (Evry_Plugin *p), - int (*fetch) (Evry_Plugin *p, const char *input), - int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input), - int (*browse) (Evry_Plugin *p, const Evry_Item *item), - Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e), - Evas_Object *(*config_page) (Evry_Plugin *p), - void (*config_apply) (Evry_Plugin *p)); +EAPI Evry_Plugin *evry_plugin_new(Evry_Plugin *base, const char *name, int type, + const char *type_in, const char *type_out, + int async_fetch, const char *icon, const char *trigger, + Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item), + void (*cleanup) (Evry_Plugin *p), + int (*fetch) (Evry_Plugin *p, const char *input), + int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input), + Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e), + Evas_Object *(*config_page) (Evry_Plugin *p), + void (*config_apply) (Evry_Plugin *p)); -EAPI void evry_plugin_free(Evry_Plugin *p); +EAPI void evry_plugin_free(Evry_Plugin *p, int free_pointer); -EAPI Evry_Action *evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *icon, - int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input), - int (*check_item) (Evry_Action *act, const Evry_Item *it), - Evas_Object *(*icon_get) (Evry_Action *act, Evas *e)); +EAPI Evry_Action *evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *type_out, + const char *icon, + int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input), + int (*check_item) (Evry_Action *act, const Evry_Item *it), + Evas_Object *(*icon_get) (Evry_Action *act, Evas *e)); EAPI void evry_action_free(Evry_Action *act); diff --git a/src/modules/everything/Makefile.am b/src/modules/everything/Makefile.am index 278b1bdec..d676606cd 100644 --- a/src/modules/everything/Makefile.am +++ b/src/modules/everything/Makefile.am @@ -27,7 +27,9 @@ module_la_SOURCES = $(EVRYHEADERS) \ e_mod_main.c \ e_mod_main.h \ evry.c \ - evry_config.c + evry_config.c \ + evry_plug_aggregator.c \ + evry_plug_actions.c module_la_LIBADD = @e_libs@ @dlopen_libs@ diff --git a/src/modules/everything/e_mod_main.c b/src/modules/everything/e_mod_main.c index a2d025ca7..f1f77f832 100644 --- a/src/modules/everything/e_mod_main.c +++ b/src/modules/everything/e_mod_main.c @@ -42,8 +42,6 @@ static Eina_Bool list_cb(Eina_Module *m, void *data) return EINA_FALSE; } - - EAPI void * e_modapi_init(E_Module *m) { @@ -168,10 +166,6 @@ e_modapi_shutdown(E_Module *m __UNUSED__) e_action_del("everything"); } - /* conf_module = NULL; */ - if (evry_conf->plugins) eina_list_free(evry_conf->plugins); - if (evry_conf->actions) eina_list_free(evry_conf->actions); - if (plugins) { eina_module_list_unload(plugins); @@ -187,6 +181,8 @@ e_modapi_shutdown(E_Module *m __UNUSED__) e_configure_registry_item_del("extensions/run_everything"); e_configure_registry_category_del("extensions"); + if (evry_conf->plugins) eina_list_free(evry_conf->plugins); + if (evry_conf->actions) eina_list_free(evry_conf->actions); if (evry_conf->conf_subjects) eina_list_free(evry_conf->conf_subjects); if (evry_conf->conf_actions) eina_list_free(evry_conf->conf_actions); if (evry_conf->conf_objects) eina_list_free(evry_conf->conf_objects); @@ -272,19 +268,23 @@ _evry_cb_plugin_sort(const void *data1, const void *data2) } Evry_Plugin * -evry_plugin_new(const char *name, int type, +evry_plugin_new(Evry_Plugin *base, const char *name, int type, const char *type_in, const char *type_out, int async_fetch, const char *icon, const char *trigger, - int (*begin) (Evry_Plugin *p, const Evry_Item *item), + Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item), void (*cleanup) (Evry_Plugin *p), int (*fetch) (Evry_Plugin *p, const char *input), int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input), - int (*browse) (Evry_Plugin *p, const Evry_Item *item), Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e), Evas_Object *(*config_page) (Evry_Plugin *p), void (*config_apply) (Evry_Plugin *p)) { - Evry_Plugin *p = E_NEW(Evry_Plugin, 1); + Evry_Plugin *p; + + if (base) + p = base; + else + p = E_NEW(Evry_Plugin, 1); p->name = eina_stringshare_add(name); p->type = type; @@ -298,7 +298,6 @@ evry_plugin_new(const char *name, int type, p->fetch = fetch; p->icon_get = icon_get; p->action = action; - p->browse = browse; p->config_page = config_page; p->config_apply = config_apply; @@ -306,7 +305,7 @@ evry_plugin_new(const char *name, int type, } void -evry_plugin_free(Evry_Plugin *p) +evry_plugin_free(Evry_Plugin *p, int free_pointer) { evry_plugin_unregister(p); @@ -325,13 +324,14 @@ evry_plugin_free(Evry_Plugin *p) E_FREE(p->config); } - - E_FREE(p); + + if (free_pointer) + E_FREE(p); } Evry_Action * -evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *icon, +evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *type_out, const char *icon, int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input), int (*check_item) (Evry_Action *act, const Evry_Item *it), Evas_Object *(*icon_get) (Evry_Action *act, Evas *e)) @@ -340,6 +340,7 @@ evry_action_new(const char *name, const char *type_in1, const char *type_in2, co act->name = eina_stringshare_add(name); act->type_in1 = (type_in1 ? eina_stringshare_add(type_in1) : NULL); act->type_in2 = (type_in2 ? eina_stringshare_add(type_in2) : NULL); + act->type_out = (type_out ? eina_stringshare_add(type_out) : NULL); act->action = action; act->check_item = check_item; act->icon = (icon ? eina_stringshare_add(icon) : NULL); @@ -356,6 +357,7 @@ evry_action_free(Evry_Action *act) if (act->name) eina_stringshare_del(act->name); if (act->type_in1) eina_stringshare_del(act->type_in1); if (act->type_in2) eina_stringshare_del(act->type_in2); + if (act->type_out) eina_stringshare_del(act->type_out); if (act->icon) eina_stringshare_del(act->icon); E_FREE(act); @@ -479,3 +481,81 @@ evry_view_unregister(Evry_View *view) { evry_conf->views = eina_list_remove(evry_conf->views, view); } + + +/* 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; +} + +Evas_Object * +evry_icon_theme_get(const char *icon, Evas *e) +{ + Evas_Object *o = e_icon_add(e); + + if (e_config->icon_theme_overrides) + { + if (_evry_icon_fdo_set(o, icon) || + _evry_icon_theme_set(o, icon)) + return o; + } + else + { + if (_evry_icon_theme_set(o, icon) || + _evry_icon_fdo_set(o, icon)) + return o; + } + + evas_object_del(o); + + return NULL; +} + +Evas_Object * +evry_icon_mime_get(const char *mime, Evas *e) +{ + char *icon; + + icon = efreet_mime_type_icon_get(mime, e_config->icon_theme, 64); + + if (icon) + return e_util_icon_add(icon, e); + else + return evry_icon_theme_get("none", e); + + free(icon); + + return NULL; +} + diff --git a/src/modules/everything/e_mod_main.h b/src/modules/everything/e_mod_main.h index 7646524bf..30711fe9d 100644 --- a/src/modules/everything/e_mod_main.h +++ b/src/modules/everything/e_mod_main.h @@ -5,6 +5,7 @@ typedef struct _Config Config; +typedef struct _Evry_Selector Evry_Selector; struct _Config { @@ -37,6 +38,27 @@ struct _Config Eina_Hash *history; }; +struct _Evry_Selector +{ + Evas_Object *o_main; + Evas_Object *o_icon; + + /* current state */ + Evry_State *state; + + /* stack of states (for browseable plugins) */ + Eina_List *states; + + /* provides collection of items from other plugins */ + Evry_Plugin *aggregator; + + /* */ + Eina_List *actions; + + /* all plugins that belong to this selector*/ + Eina_List *plugins; +}; + EAPI extern E_Module_Api e_modapi; EAPI void *e_modapi_init (E_Module *m); @@ -49,6 +71,13 @@ int evry_shutdown(void); int evry_show(E_Zone *zone, const char *params); void evry_hide(void); +Evry_Plugin *evry_plug_aggregator_new(Evry_Selector *selector); +void evry_plug_aggregator_free(Evry_Plugin *plugin); + +Evry_Plugin *evry_plug_actions_new(void); +void evry_plug_actions_free(Evry_Plugin *plugin); + extern Config *evry_conf; +extern Evry_Selector **selectors; #endif diff --git a/src/modules/everything/evry.c b/src/modules/everything/evry.c index 9349e0137..ce8ae4712 100644 --- a/src/modules/everything/evry.c +++ b/src/modules/everything/evry.c @@ -17,29 +17,7 @@ typedef struct _Evry_Window Evry_Window; typedef struct _Evry_List_Window Evry_List_Window; -typedef struct _Evry_Selector Evry_Selector; -/* */ -struct _Evry_Selector -{ - Evas_Object *o_main; - Evas_Object *o_icon; - - /* current state */ - Evry_State *state; - - /* stack of states (for browseable plugins) */ - Eina_List *states; - - /* provides collection of items from other plugins */ - Evry_Plugin *aggregator; - - /* */ - Eina_List *actions; - - /* all plugins that belong to this selector*/ - Eina_List *plugins; -}; struct _Evry_Window { @@ -54,45 +32,46 @@ struct _Evry_List_Window { E_Popup *popup; Evas_Object *o_main; - - - Eina_Bool visible; + Eina_Bool visible; }; static void _evry_matches_update(Evry_Selector *sel); static void _evry_plugin_action(Evry_Selector *sel, int finished); -static void _evry_backspace(Evry_State *s); -static void _evry_update(Evry_State *s, int fetch); -static int _evry_clear(Evry_State *s); -static int _evry_update_timer(void *data); -static Evry_State *_evry_state_new(Evry_Selector *sel, Eina_List *plugins); -static void _evry_state_pop(Evry_Selector *sel); -static void _evry_update_text_label(Evry_State *s); -static void _evry_browse_item(Evry_Selector *sel); -static void _evry_browse_back(Evry_Selector *sel); -static void _evry_selectors_switch(void); static void _evry_plugin_select(Evry_State *s, Evry_Plugin *p); static void _evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p); +static void _evry_backspace(Evry_State *s); +static void _evry_update(Evry_State *s, int fetch); +static void _evry_update_text_label(Evry_State *s); +static int _evry_clear(Evry_State *s); +static int _evry_update_timer(void *data); + +static Evry_State *_evry_state_new(Evry_Selector *sel, Eina_List *plugins); +static void _evry_state_pop(Evry_Selector *sel); -static Evry_Window *_evry_window_new(E_Zone *zone); -static void _evry_window_free(Evry_Window *win); static Evry_Selector *_evry_selector_new(int type); static void _evry_selector_free(Evry_Selector *sel); static void _evry_selector_activate(Evry_Selector *sel); +static void _evry_selectors_switch(void); static void _evry_selector_update(Evry_Selector *sel); static void _evry_selector_icon_set(Evry_Selector *sel); static int _evry_selector_subjects_get(const char *plugin_name); static int _evry_selector_actions_get(Evry_Item *it); -static int _evry_selector_objects_get(const char *type); +static int _evry_selector_objects_get(Evry_Action *act); + +static void _evry_browse_item(Evry_Selector *sel); +static void _evry_browse_back(Evry_Selector *sel); + +static Evry_Window *_evry_window_new(E_Zone *zone); +static void _evry_window_free(Evry_Window *win); static Evry_List_Window *_evry_list_win_new(E_Zone *zone); static void _evry_list_win_free(Evry_List_Window *win); static void _evry_list_win_show(void); +static void _evry_list_win_update(Evry_State *s); static void _evry_list_win_clear(int hide); static void _evry_view_clear(Evry_State *s); -static void _evry_list_win_update(Evry_State *s); static void _evry_view_update(Evry_State *s, Evry_Plugin *plugin); static int _evry_view_key_press(Evry_State *s, Ecore_Event_Key *ev); static int _evry_view_toggle(Evry_State *s, const char *trigger); @@ -102,20 +81,6 @@ static void _evry_view_hide(Evry_View *v); static void _evry_item_desel(Evry_State *s, Evry_Item *it); static void _evry_item_sel(Evry_State *s, Evry_Item *it); -static int _evry_plug_actions_init(void); -static void _evry_plug_actions_free(void); -static int _evry_plug_actions_begin(Evry_Plugin *p, const Evry_Item *it); -static int _evry_plug_actions_fetch(Evry_Plugin *p, const char *input); -static void _evry_plug_actions_cleanup(Evry_Plugin *p); -static Evas_Object *_evry_plug_actions_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e); - -static Evry_Plugin *_evry_plug_aggregator_new(void); -static void _evry_plug_aggregator_free(Evry_Plugin *p); -static int _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input); -static int _evry_plug_aggregator_action(Evry_Plugin *p, const Evry_Item *item, const char *input); -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); @@ -125,16 +90,16 @@ static Evry_List_Window *list = NULL; static Ecore_X_Window input_window = 0; static Eina_List *handlers = NULL; static Ecore_Timer *update_timer = NULL; -static Evry_Selector *selectors[3]; -static Evry_Selector *selector = NULL; static Evry_Plugin *action_selector = NULL; +static Evry_Selector *selector = NULL; + +Evry_Selector **selectors; /* externally accessible functions */ int evry_init(void) { - _evry_plug_actions_init(); - + action_selector = evry_plug_actions_new(); return 1; } @@ -142,7 +107,8 @@ int evry_shutdown(void) { evry_hide(); - _evry_plug_actions_free(); + + evry_plug_actions_free(action_selector); return 1; } @@ -170,7 +136,7 @@ evry_show(E_Zone *zone, const char *params) list->visible = EINA_FALSE; - /* TODO check NULL */ + selectors = E_NEW(Evry_Selector*, 3); selectors[0] = _evry_selector_new(type_subject); selectors[1] = _evry_selector_new(type_action); selectors[2] = _evry_selector_new(type_object); @@ -238,10 +204,8 @@ evry_hide(void) _evry_selector_free(selectors[0]); _evry_selector_free(selectors[1]); _evry_selector_free(selectors[2]); - selectors[0] = NULL; - selectors[1] = NULL; - selectors[2] = NULL; selector = NULL; + E_FREE(selectors); _evry_list_win_free(list); list = NULL; @@ -742,8 +706,8 @@ _evry_selector_new(int type) else if (type == type_object) edje_object_part_swallow(win->o_main, "e.swallow.object_selector", o); - p = _evry_plug_aggregator_new(); - p->private = sel; + p = evry_plug_aggregator_new(sel); + sel->plugins = eina_list_append(sel->plugins, p); sel->aggregator = p; @@ -770,7 +734,7 @@ _evry_selector_free(Evry_Selector *sel) while (sel->states) _evry_state_pop(sel); - _evry_plug_aggregator_free(sel->aggregator); + evry_plug_aggregator_free(sel->aggregator); if (sel->plugins) eina_list_free(sel->plugins); E_FREE(sel); @@ -926,27 +890,26 @@ static int _evry_selector_subjects_get(const char *plugin_name) { Eina_List *l, *plugins = NULL; - Evry_Plugin *p; + Evry_Plugin *p, *plugin; Evry_Selector *sel = selectors[0]; - EINA_LIST_FOREACH(sel->plugins, l, p) + EINA_LIST_FOREACH(sel->plugins, l, plugin) { - if (plugin_name && strcmp(plugin_name, p->name)) + if (plugin_name && strcmp(plugin_name, plugin->name)) continue; - if (p->begin) + if (plugin->begin) { - if (p->begin(p, NULL)) + if ((p = plugin->begin(plugin, NULL))) plugins = eina_list_append(plugins, p); } else - plugins = eina_list_append(plugins, p); + plugins = eina_list_append(plugins, plugin); } if (!plugins) return 0; _evry_state_new(sel, plugins); - _evry_matches_update(sel); return 1; @@ -956,7 +919,7 @@ static int _evry_selector_actions_get(Evry_Item *it) { Eina_List *l, *plugins = NULL; - Evry_Plugin *p; + Evry_Plugin *p, *plugin; Evry_Selector *sel = selectors[1]; const char *type_out; @@ -967,61 +930,64 @@ _evry_selector_actions_get(Evry_Item *it) type_out = it->plugin->type_out; - EINA_LIST_FOREACH(sel->plugins, l, p) + EINA_LIST_FOREACH(sel->plugins, l, plugin) { - if ((p == action_selector) || (p == sel->aggregator) || - (p->type_in && type_out && p->type_in == type_out)) + if ((plugin == action_selector) || (plugin == sel->aggregator) || + (plugin->type_in && type_out && plugin->type_in == type_out)) { - if (p->begin) + if (plugin->begin) { - if (p->begin(p, it)) + if ((p = plugin->begin(plugin, it))) plugins = eina_list_append(plugins, p); } else - plugins = eina_list_append(plugins, p); + plugins = eina_list_append(plugins, plugin); } } if (!plugins) return 0; _evry_state_new(sel, plugins); - _evry_matches_update(sel); return 1; } static int -_evry_selector_objects_get(const char *type) +_evry_selector_objects_get(Evry_Action *act) { Eina_List *l, *plugins = NULL; - Evry_Plugin *p; + Evry_Plugin *p, *plugin; Evry_Selector *sel = selectors[2]; Evry_Item *it; + const char *type_in = act->type_in2; while (sel->state) _evry_state_pop(sel); it = selectors[0]->state->sel_item; - EINA_LIST_FOREACH(sel->plugins, l, p) + EINA_LIST_FOREACH(sel->plugins, l, plugin) { - if (strcmp(p->type_out, type) && - (p != sel->aggregator)) continue; + if ((plugin->type_out != type_in) && + (plugin != sel->aggregator)) continue; - if (p->begin) + if (plugin->begin) { - if (p->begin(p, it)) + if ((act->type_out) && + (act->type_out == plugin->type_in) && + (p = plugin->begin(plugin, it))) + plugins = eina_list_append(plugins, p); + else if (p = plugin->begin(plugin, NULL)) plugins = eina_list_append(plugins, p); } else - plugins = eina_list_append(plugins, p); + plugins = eina_list_append(plugins, plugin); } if (!plugins) return 0; _evry_state_new(sel, plugins); - _evry_matches_update(sel); return 1; @@ -1075,7 +1041,7 @@ _evry_browse_item(Evry_Selector *sel) Evry_State *s = sel->state; Evry_Item *it; Eina_List *l, *plugins = NULL; - Evry_Plugin *p; + Evry_Plugin *p, *plugin; const char *type_out; it = s->sel_item; @@ -1088,12 +1054,13 @@ _evry_browse_item(Evry_Selector *sel) if (!type_out) return; - EINA_LIST_FOREACH(sel->plugins, l, p) + EINA_LIST_FOREACH(sel->plugins, l, plugin) { - if (!p->browse || !p->type_in || p->type_in != type_out) + if ((!plugin->begin || !plugin->type_in) || + (plugin->type_in != type_out)) continue; - if (p->browse(p, it)) + if ((p = plugin->begin(plugin, it))) plugins = eina_list_append(plugins, p); } @@ -1122,12 +1089,9 @@ _evry_browse_back(Evry_Selector *sel) sel->aggregator->fetch(sel->aggregator, s->input); _evry_selector_update(sel); - - _evry_view_show(s->view); - - /*** _evry_tabs_update(s); */ - _evry_update_text_label(s); + + _evry_view_show(s->view); } static void @@ -1159,10 +1123,12 @@ _evry_selectors_switch(void) int next_selector = 0; Evry_Action *act; - if (s->sel_item && (s->sel_item->plugin == action_selector) && - (act = s->sel_item->data[0]) && act->type_in2) + if ((s->sel_item) && + (s->sel_item->plugin == action_selector) && + (act = s->sel_item->data[0]) && + (act->type_in2)) { - _evry_selector_objects_get(act->type_in2); + _evry_selector_objects_get(act); _evry_selector_update(selectors[2]); edje_object_signal_emit(win->o_main, "e,state,object_selector_show", "e"); @@ -1519,7 +1485,7 @@ _evry_view_toggle(Evry_State *s, const char *trigger) { if (view->trigger && !strncmp(trigger, view->trigger, 1) && (v = view->create(view, s, list->o_main))) - break; + goto found; } } else @@ -1675,283 +1641,6 @@ evry_plugin_select(const Evry_State *s, Evry_Plugin *p) _evry_selector_update(selector); } -static int -_evry_fuzzy_sort_cb(const void *data1, const void *data2) -{ - const Evry_Item *it1 = data1; - const Evry_Item *it2 = data2; - - if ((it1->plugin == it2->plugin) && - (it1->priority - it2->priority)) - return (it1->priority - it2->priority); - - if (it1->fuzzy_match || it2->fuzzy_match) - { - if (it1->fuzzy_match && !it2->fuzzy_match) - return -1; - - if (!it1->fuzzy_match && it2->fuzzy_match) - return 1; - - if (it1->fuzzy_match - it2->fuzzy_match) - return (it1->fuzzy_match - it2->fuzzy_match); - } - - if (it1->plugin->config->priority - it2->plugin->config->priority) - return (it1->plugin->config->priority - it2->plugin->config->priority); - - if (it1->priority - it2->priority) - return (it1->priority - it2->priority); - - return 0; -} - -/* action selector plugin: provides list of actions registered for - candidate types provided by current plugin */ -static int -_evry_plug_actions_init(void) -{ - Evry_Plugin *p; - - p = evry_plugin_new("Select Action", type_action, "", "", 0, NULL, NULL, - _evry_plug_actions_begin, - _evry_plug_actions_cleanup, - _evry_plug_actions_fetch, - NULL, NULL, - _evry_plug_actions_item_icon_get, - NULL, NULL); - - action_selector = p; - evry_plugin_register(p, 2); - - return 1; -} - -static void -_evry_plug_actions_free(void) -{ - Evry_Plugin *p = action_selector; - - eina_stringshare_del(p->config->name); - E_FREE(p->config); - evry_plugin_free(p); -} - -static int -_evry_plug_actions_begin(Evry_Plugin *p, const Evry_Item *it) -{ - Evry_Action *act; - Eina_List *l; - Evry_Selector *sel = selectors[1]; - - _evry_plug_actions_cleanup(p); - - if (!it) return 0; - - const char *type = it->plugin->type_out; - - if (!type) return 0; - - EINA_LIST_FOREACH(evry_conf->actions, l, act) - { - if (act->type_in1 && (act->type_in1 == type) && - (!act->check_item || act->check_item(act, it))) - { - sel->actions = eina_list_append(sel->actions, act); - } - } - - if (sel->actions) return 1; - - return 0; -} - -static int -_evry_plug_actions_fetch(Evry_Plugin *p, const char *input) -{ - Evry_Action *act; - Eina_List *l; - Evry_Item *it; - Evry_Selector *sel = selectors[1]; - int match = 0; - - EINA_LIST_FREE(p->items, it) - evry_item_free(it); - - EINA_LIST_FOREACH(sel->actions, l, act) - { - if (input) - match = evry_fuzzy_match(act->name, input); - - if (!input || match) - { - it = evry_item_new(p, act->name, NULL); - it->fuzzy_match = match; - it->data[0] = act; - p->items = eina_list_append(p->items, it); - } - } - - if (input) - p->items = eina_list_sort(p->items, eina_list_count(p->items), _evry_fuzzy_sort_cb); - - if (p->items) return 1; - - return 0; -} - -static void -_evry_plug_actions_cleanup(Evry_Plugin *p) -{ - Evry_Item *it; - Evry_Selector *sel = selectors[1]; - - EINA_LIST_FREE(p->items, it) - evry_item_free(it); - - if (sel->actions) eina_list_free(sel->actions); - sel->actions = NULL; -} - -static Evas_Object * -_evry_plug_actions_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) -{ - Evas_Object *o = NULL; - Evry_Action *act = it->data[0]; - - if (!act) return NULL; - - if (act->icon_get) - o = act->icon_get(act, e); - else if (act->icon) - o = evry_icon_theme_get(act->icon, e); - - return o; -} - -static Evry_Plugin * -_evry_plug_aggregator_new(void) -{ - Evry_Plugin *p; - Plugin_Config *pc; - - p = evry_plugin_new("All", 0, "", "", 0, NULL, NULL, - NULL, - _evry_plug_aggregator_cleanup, - _evry_plug_aggregator_fetch, - _evry_plug_aggregator_action, - NULL, - _evry_plug_aggregator_item_icon_get, - NULL, NULL); - - pc = E_NEW(Plugin_Config, 1); - pc->name = eina_stringshare_add(p->name); - pc->enabled = 1; - pc->priority = -1; - p->config = pc; - - return p; -} - -static void -_evry_plug_aggregator_free(Evry_Plugin *p) -{ - if (p->config->name) eina_stringshare_del(p->config->name); - E_FREE(p->config); - evry_plugin_free(p); -} - - -static int -_evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input) -{ - Evry_Selector *selector = p->private; - Evry_State *s = selector->state; - Eina_List *l, *ll; - Evry_Plugin *plugin; - Evry_Item *it; - int cnt = 0; - Eina_List *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); - - - if (input[0]) - { - EINA_LIST_FOREACH(s->cur_plugins, l, plugin) - { - EINA_LIST_FOREACH(plugin->items, ll, it) - { - if (!it->fuzzy_match) - it->fuzzy_match = evry_fuzzy_match(it->label, input); - - if (it->fuzzy_match || selector == selectors[2]) - { - evry_item_ref(it); - items = eina_list_append(items, it); - p->items = eina_list_append(p->items, it); - } - } - } - } - - if (!input[0] || eina_list_count(items) < 20) - { - EINA_LIST_FOREACH(s->cur_plugins, l, plugin) - { - for (cnt = 0, ll = plugin->items; ll && cnt < 15; ll = ll->next, cnt++) - { - if (!items || !eina_list_data_find_list(items, ll->data)) - { - it = ll->data; - - evry_item_ref(it); - it->fuzzy_match = 0; - p->items = eina_list_append(p->items, it); - } - } - } - } - - if (items) eina_list_free(items); - - if (input[0]) - p->items = eina_list_sort(p->items, eina_list_count(p->items), _evry_fuzzy_sort_cb); - - return 1; -} - -static int -_evry_plug_aggregator_action(Evry_Plugin *p, const Evry_Item *it, const char *input) -{ - if (it->plugin && it->plugin->action) - return it->plugin->action(it->plugin, it, input); - - return 0; -} - -static void -_evry_plug_aggregator_cleanup(Evry_Plugin *p) -{ - Evry_Item *it; - - EINA_LIST_FREE(p->items, it) - evry_item_free(it); -} - -static Evas_Object * -_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e) -{ - if (it->plugin && it->plugin->icon_get) - return it->plugin->icon_get(it->plugin, it, e); - - return NULL; -} - static void _evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p) { @@ -2000,79 +1689,3 @@ _evry_cb_selection_notify(void *data, int type, void *event) return 1; } -/* 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; -} - -Evas_Object * -evry_icon_theme_get(const char *icon, Evas *e) -{ - Evas_Object *o = e_icon_add(e); - - if (e_config->icon_theme_overrides) - { - if (_evry_icon_fdo_set(o, icon) || - _evry_icon_theme_set(o, icon)) - return o; - } - else - { - if (_evry_icon_theme_set(o, icon) || - _evry_icon_fdo_set(o, icon)) - return o; - } - - evas_object_del(o); - - return NULL; -} - -Evas_Object * -evry_icon_mime_get(const char *mime, Evas *e) -{ - char *icon; - - icon = efreet_mime_type_icon_get(mime, e_config->icon_theme, 64); - - if (icon) - return e_util_icon_add(icon, e); - else - return evry_icon_theme_get("none", e); - - free(icon); - - return NULL; -} - diff --git a/src/modules/everything/evry_plug_actions.c b/src/modules/everything/evry_plug_actions.c new file mode 100644 index 000000000..eb1817f94 --- /dev/null +++ b/src/modules/everything/evry_plug_actions.c @@ -0,0 +1,147 @@ +#include "e_mod_main.h" + +/* action selector plugin: provides list of actions registered for + candidate types provided by current plugin */ + + +static void +_cleanup(Evry_Plugin *p) +{ + Evry_Item *it; + Evry_Selector *sel = selectors[1]; + + EINA_LIST_FREE(p->items, it) + evry_item_free(it); + + if (sel->actions) eina_list_free(sel->actions); + sel->actions = NULL; +} + +static Evry_Plugin * +_begin(Evry_Plugin *p, const Evry_Item *it) +{ + Evry_Action *act; + Eina_List *l; + Evry_Selector *sel = selectors[1]; + + _cleanup(p); + + if (!it) return NULL; + + const char *type = it->plugin->type_out; + + if (!type) return NULL; + + EINA_LIST_FOREACH(evry_conf->actions, l, act) + { + if (act->type_in1 && (act->type_in1 == type) && + (!act->check_item || act->check_item(act, it))) + { + sel->actions = eina_list_append(sel->actions, act); + } + } + + if (!sel->actions) return NULL; + + return p; +} + +static int +_cb_sort(const void *data1, const void *data2) +{ + const Evry_Item *it1 = data1; + const Evry_Item *it2 = data2; + + if ((it1->plugin == it2->plugin) && + (it1->priority - it2->priority)) + return (it1->priority - it2->priority); + + if (it1->fuzzy_match || it2->fuzzy_match) + { + if (it1->fuzzy_match && !it2->fuzzy_match) + return -1; + + if (!it1->fuzzy_match && it2->fuzzy_match) + return 1; + + if (it1->fuzzy_match - it2->fuzzy_match) + return (it1->fuzzy_match - it2->fuzzy_match); + } + + if (it1->plugin->config->priority - it2->plugin->config->priority) + return (it1->plugin->config->priority - it2->plugin->config->priority); + + if (it1->priority - it2->priority) + return (it1->priority - it2->priority); + + return 0; +} + +static int +_fetch(Evry_Plugin *p, const char *input) +{ + Evry_Action *act; + Eina_List *l; + Evry_Item *it; + Evry_Selector *sel = selectors[1]; + int match = 0; + + EINA_LIST_FREE(p->items, it) + evry_item_free(it); + + EINA_LIST_FOREACH(sel->actions, l, act) + { + if (input) + match = evry_fuzzy_match(act->name, input); + + if (!input || match) + { + it = evry_item_new(p, act->name, NULL); + it->fuzzy_match = match; + it->data[0] = act; + p->items = eina_list_append(p->items, it); + } + } + + if (input) + p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); + + if (p->items) return 1; + + return 0; +} + +static Evas_Object * +_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) +{ + Evas_Object *o = NULL; + Evry_Action *act = it->data[0]; + + if (!act) return NULL; + + if (act->icon_get) + o = act->icon_get(act, e); + else if (act->icon) + o = evry_icon_theme_get(act->icon, e); + + return o; +} + +Evry_Plugin * +evry_plug_actions_new(void) +{ + Evry_Plugin *p; + + p = evry_plugin_new(NULL, "Select Action", type_action, "", "", 0, NULL, NULL, + _begin, _cleanup, _fetch, NULL, _icon_get, NULL, NULL); + + evry_plugin_register(p, 2); + + return p; +} + +void +evry_plug_actions_free(Evry_Plugin *plugin) +{ + evry_plugin_free(plugin, 1); +} diff --git a/src/modules/everything/evry_plug_aggregator.c b/src/modules/everything/evry_plug_aggregator.c new file mode 100644 index 000000000..fab7e972b --- /dev/null +++ b/src/modules/everything/evry_plug_aggregator.c @@ -0,0 +1,165 @@ +#include "e_mod_main.h" + + +typedef struct _Plugin Plugin; + +struct _Plugin +{ + Evry_Plugin base; + Evry_Selector *selector; +}; + + +static int +_cb_sort(const void *data1, const void *data2) +{ + const Evry_Item *it1 = data1; + const Evry_Item *it2 = data2; + + if ((it1->plugin == it2->plugin) && + (it1->priority - it2->priority)) + return (it1->priority - it2->priority); + + if (it1->fuzzy_match || it2->fuzzy_match) + { + if (it1->fuzzy_match && !it2->fuzzy_match) + return -1; + + if (!it1->fuzzy_match && it2->fuzzy_match) + return 1; + + if (it1->fuzzy_match - it2->fuzzy_match) + return (it1->fuzzy_match - it2->fuzzy_match); + } + + if (it1->plugin->config->priority - it2->plugin->config->priority) + return (it1->plugin->config->priority - it2->plugin->config->priority); + + if (it1->priority - it2->priority) + return (it1->priority - it2->priority); + + return 0; +} + +static int +_fetch(Evry_Plugin *plugin, const char *input) +{ + Plugin *p = (Plugin *) plugin; + Evry_Plugin *pp; + Evry_State *s; + Eina_List *l, *ll; + Evry_Item *it; + int cnt = 0; + Eina_List *items = NULL; + + s = p->selector->state; + + EINA_LIST_FREE(p->base.items, it) + evry_item_free(it); + + EINA_LIST_FOREACH(s->cur_plugins, l, pp) + cnt += eina_list_count(pp->items); + + + if (input[0]) + { + EINA_LIST_FOREACH(s->cur_plugins, l, pp) + { + EINA_LIST_FOREACH(pp->items, ll, it) + { + if (!it->fuzzy_match) + 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); + p->base.items = eina_list_append(p->base.items, it); + } + } + } + } + + if (!input[0] || eina_list_count(items) < 20) + { + EINA_LIST_FOREACH(s->cur_plugins, l, pp) + { + for (cnt = 0, ll = pp->items; ll && cnt < 15; ll = ll->next, cnt++) + { + if (!items || !eina_list_data_find_list(items, ll->data)) + { + it = ll->data; + + evry_item_ref(it); + it->fuzzy_match = 0; + p->base.items = eina_list_append(p->base.items, it); + } + } + } + } + + if (items) eina_list_free(items); + + if (input[0]) + p->base.items = eina_list_sort + (p->base.items, eina_list_count(p->base.items), _cb_sort); + + return 1; +} + +static int +_action(Evry_Plugin *plugin, const Evry_Item *it, const char *input) +{ + if (it->plugin && it->plugin->action) + return it->plugin->action(it->plugin, it, input); + + return 0; +} + +static void +_cleanup(Evry_Plugin *plugin) +{ + Evry_Item *it; + + EINA_LIST_FREE(plugin->items, it) + evry_item_free(it); +} + +static Evas_Object * +_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e) +{ + if (it->plugin && it->plugin->icon_get) + return it->plugin->icon_get(it->plugin, it, e); + + return NULL; +} + +Evry_Plugin * +evry_plug_aggregator_new(Evry_Selector *selector) +{ + Plugin *p; + Plugin_Config *pc; + + p = E_NEW(Plugin, 1); + evry_plugin_new(&p->base, "All", 0, "", "", 0, NULL, NULL, + NULL, _cleanup, _fetch, _action, _icon_get, + NULL, NULL); + + pc = E_NEW(Plugin_Config, 1); + pc->enabled = 1; + pc->priority = -1; + p->base.config = pc; + + p->selector = selector; + + return &p->base; +} + +void +evry_plug_aggregator_free(Evry_Plugin *plugin) +{ + Plugin *p = (Plugin *) plugin; + + evry_plugin_free(&p->base, 0); + E_FREE(p); +} diff --git a/src/modules/everything/evry_plug_apps.c b/src/modules/everything/evry_plug_apps.c index f8992fdbc..983b1de41 100644 --- a/src/modules/everything/evry_plug_apps.c +++ b/src/modules/everything/evry_plug_apps.c @@ -1,17 +1,18 @@ #include "Evry.h" -typedef struct _Inst Inst; +typedef struct _Plugin Plugin; -struct _Inst +struct _Plugin { + Evry_Plugin base; Eina_Hash *added; Eina_List *apps_mime; Eina_List *apps_all; const Evry_Item *candidate; }; -static Evry_Plugin *p1; -static Evry_Plugin *p2; +static Plugin *p1; +static Plugin *p2; static Evry_Action *act; static Evry_Action *act1; static Evry_Action *act2; @@ -20,52 +21,44 @@ static Evry_Action *act4; static Eina_List *exe_path = NULL; -static int -_begin(Evry_Plugin *p, const Evry_Item *it) +static Evry_Plugin * +_begin(Evry_Plugin *plugin, const Evry_Item *it) { + Plugin *p = (Plugin*) plugin; const char *mime; - Inst *inst = NULL; if (it) { Efreet_Desktop *desktop; - if (!it->uri) return 0; + if (!it->uri) return NULL; if (!it->mime) mime = efreet_mime_type_get(it->uri); else mime = it->mime; - /* TODO show plugin for items without mimetype ? */ - if (!mime) return 0; + if (!mime) return NULL; - inst = E_NEW(Inst, 1); - inst->candidate = it; - inst->apps_mime = efreet_util_desktop_mime_list(mime); + p->candidate = it; + p->apps_mime = efreet_util_desktop_mime_list(mime); desktop = e_exehist_mime_desktop_get(mime); if (desktop) { efreet_desktop_ref(desktop); - inst->apps_mime = eina_list_prepend(inst->apps_mime, desktop); + p->apps_mime = eina_list_prepend(p->apps_mime, desktop); } } - else - { - inst = E_NEW(Inst, 1); - } - p->private = inst; - - return 1; + return &p->base; } static void -_list_free(Evry_Plugin *p) +_list_free(Evry_Plugin *plugin) { Evry_Item *it; - EINA_LIST_FREE(p->items, it) + EINA_LIST_FREE(plugin->items, it) evry_item_free(it); } @@ -81,33 +74,26 @@ _item_free(Evry_Item *it) } static void -_cleanup(Evry_Plugin *p) +_cleanup(Evry_Plugin *plugin) { - Inst *inst = p->private; + Plugin *p = (Plugin*) plugin; + Efreet_Desktop *desktop; - _list_free(p); + _list_free(plugin); - if (inst) - { - Efreet_Desktop *desktop; - EINA_LIST_FREE(inst->apps_mime, desktop) - efreet_desktop_free(desktop); - EINA_LIST_FREE(inst->apps_all, desktop) - efreet_desktop_free(desktop); + EINA_LIST_FREE(p->apps_mime, desktop) + efreet_desktop_free(desktop); - E_FREE(inst); - } - - p->private = NULL; + EINA_LIST_FREE(p->apps_all, desktop) + efreet_desktop_free(desktop); } static int -_item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match) +_item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match) { Evry_Item *it; Evry_App *app; Efreet_Desktop *d2; - Inst *inst = p->private; int already_refd = 0; if (desktop) @@ -122,7 +108,7 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match) int len; char *tmp; - if (eina_hash_find(inst->added, file)) + if (eina_hash_find(p->added, file)) return 0; len = strlen(file); @@ -144,26 +130,26 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match) free(tmp); if (!desktop) - eina_hash_add(inst->added, file, file); + eina_hash_add(p->added, file, file); } if (desktop) { - if ((d2 = eina_hash_find(inst->added, file)) && + if ((d2 = eina_hash_find(p->added, file)) && ((desktop == d2) || (!strcmp(desktop->exec, d2->exec)))) return 0; if (!already_refd) efreet_desktop_ref(desktop); - eina_hash_add(inst->added, file, desktop); + eina_hash_add(p->added, file, desktop); file = NULL; } if (desktop) - it = evry_item_new(p, desktop->name, _item_free); + it = evry_item_new(&p->base, desktop->name, _item_free); else - it = evry_item_new(p, file, _item_free); + it = evry_item_new(&p->base, file, _item_free); app = E_NEW(Evry_App, 1); app->desktop = desktop; @@ -171,13 +157,13 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match) it->data[0] = app; it->fuzzy_match = match; - p->items = eina_list_append(p->items, it); + p->base.items = eina_list_append(p->base.items, it); return 1; } static void -_add_desktop_list(Evry_Plugin *p, Eina_List *apps, const char *input) +_add_desktop_list(Plugin *p, Eina_List *apps, const char *input) { Efreet_Desktop *desktop; Eina_List *l; @@ -185,7 +171,7 @@ _add_desktop_list(Evry_Plugin *p, Eina_List *apps, const char *input) EINA_LIST_FOREACH(apps, l, desktop) { - if (eina_list_count(p->items) > 199) continue; + if (eina_list_count(p->base.items) > 199) continue; if (!desktop->name || !desktop->exec) continue; char *exec = strrchr(desktop->exec, '/'); @@ -245,29 +231,27 @@ _cb_sort(const void *data1, const void *data2) } static int -_fetch(Evry_Plugin *p, const char *input) +_fetch(Evry_Plugin *plugin, const char *input) { + Plugin *p = (Plugin*) plugin; Eina_List *l; Efreet_Desktop *desktop; char *file; Evry_Item *it; Evry_App *app; - Inst *inst = p->private; - inst->added = eina_hash_string_small_new(NULL); + p->added = eina_hash_string_small_new(NULL); - _list_free(p); + _list_free(plugin); /* add apps for a given mimetype */ - if (p->type == type_action) + if (p->base.type == type_action) { if (input) - { - _add_desktop_list(p, inst->apps_mime, input); - } + _add_desktop_list(p, p->apps_mime, input); else { - EINA_LIST_FOREACH(inst->apps_mime, l, desktop) + EINA_LIST_FOREACH(p->apps_mime, l, desktop) _item_add(p, desktop, NULL, 1); } } @@ -275,16 +259,16 @@ _fetch(Evry_Plugin *p, const char *input) /* add apps matching input */ if (input) { - if (!inst->apps_all) + if (!p->apps_all) { Eina_List *apps = NULL; - Eina_List *stuff; + Eina_List *cats; Eina_List *l, *ll; apps = efreet_util_desktop_name_glob_list("*"); - stuff = efreet_util_desktop_category_list("Screensaver"); + cats = efreet_util_desktop_category_list("Screensaver"); - EINA_LIST_FOREACH(stuff, l, desktop) + EINA_LIST_FOREACH(cats, l, desktop) { ll = eina_list_data_find_list(apps, desktop); if (ll) @@ -292,16 +276,15 @@ _fetch(Evry_Plugin *p, const char *input) efreet_desktop_free(desktop); apps = eina_list_remove_list(apps, ll); } - /* efreet_desktop_free(desktop); */ } - inst->apps_all = apps; + p->apps_all = apps; } - _add_desktop_list(p, inst->apps_all, input); + _add_desktop_list(p, p->apps_all, input); } /* add exe history items */ - else if (!p->items) + else if (!plugin->items) { l = e_exehist_list_get(); EINA_LIST_FREE(l, file) @@ -309,7 +292,7 @@ _fetch(Evry_Plugin *p, const char *input) } /* show 'Run Command' item */ - if (input || p == p2) + if (input) { int found = 0; char *end; @@ -317,60 +300,53 @@ _fetch(Evry_Plugin *p, const char *input) char cmd[1024]; char path[1024]; - if (input) + snprintf(cmd, sizeof(cmd), "%s", input); + + if ((end = strchr(input, ' '))) { - snprintf(cmd, sizeof(cmd), "%s", input); + int len = (end - input) + 1; + if (len >= 0) + snprintf(cmd, len, "%s", input); + } - if ((end = strchr(input, ' '))) + EINA_LIST_FOREACH(exe_path, l, dir) + { + snprintf(path, sizeof(path), "%s/%s", dir, cmd); + if (ecore_file_exists(path)) { - int len = (end - input) + 1; - if (len >= 0) - snprintf(cmd, len, "%s", input); - } - - EINA_LIST_FOREACH(exe_path, l, dir) - { - snprintf(path, sizeof(path), "%s/%s", dir, cmd); - if (ecore_file_exists(path)) - { - found = 1; - break; - } + found = 1; + break; } } - if (found || p == p2) + if (found) { - it = evry_item_new(p, _("Run Command"), _item_free); + it = evry_item_new(plugin, _("Run Command"), _item_free); app = E_NEW(Evry_App, 1); - if (input) - app->file = eina_stringshare_add(input); - else - app->file = eina_stringshare_add(""); + app->file = eina_stringshare_add(input); it->data[0] = app; it->priority = 9999; - p->items = eina_list_append(p->items, it); + plugin->items = eina_list_append(plugin->items, it); snprintf(cmd, sizeof(cmd), "xterm -hold -e %s", input); - it = evry_item_new(p, _("Run in Terminal"), _item_free); + it = evry_item_new(plugin, _("Run in Terminal"), _item_free); app = E_NEW(Evry_App, 1); - if (input) - app->file = eina_stringshare_add(cmd); - else - app->file = eina_stringshare_add(""); + app->file = eina_stringshare_add(cmd); it->data[0] = app; it->priority = 1000; - p->items = eina_list_append(p->items, it); + plugin->items = eina_list_append(plugin->items, it); } } - eina_hash_free(inst->added); + eina_hash_free(p->added); - if (p->items) + if (plugin->items) { int prio = 0; - p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); - EINA_LIST_FOREACH(p->items, l, it) + + l = plugin->items; + plugin->items = eina_list_sort(l, eina_list_count(l), _cb_sort); + EINA_LIST_FOREACH(plugin->items, l, it) it->priority = prio++; return 1; @@ -525,11 +501,12 @@ _exec_border_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2 } static int -_open_with_action(Evry_Plugin *p, const Evry_Item *it, const char *input __UNUSED__) +_open_with_action(Evry_Plugin *plugin, const Evry_Item *it, const char *input __UNUSED__) { - Inst *inst = p->private; - if (inst->candidate) - return _app_action(it, inst->candidate); + Plugin *p = (Plugin*) plugin; + + if (p->candidate) + return _app_action(it, p->candidate); return 0; } @@ -649,30 +626,36 @@ _init(void) { char *path, *p, *last; - p1 = evry_plugin_new("Applications", type_subject, "", "APPLICATION", 0, NULL, NULL, - _begin, _cleanup, _fetch, NULL, NULL, - _icon_get, NULL, NULL); + p1 = E_NEW(Plugin, 1); + evry_plugin_new(&p1->base, "Applications", type_subject, "", "APPLICATION", 0, NULL, NULL, + _begin, _cleanup, _fetch, NULL, _icon_get, NULL, NULL); - p2 = evry_plugin_new("Open With...", type_action, "FILE", "", 0, NULL, NULL, - _begin, _cleanup, _fetch, _open_with_action, NULL, - _icon_get, NULL, NULL); + p2 = E_NEW(Plugin, 1); + evry_plugin_new(&p2->base, "Open With...", type_action, "FILE", "", 0, NULL, NULL, + _begin, _cleanup, _fetch, _open_with_action, + _icon_get, NULL, NULL); - evry_plugin_register(p1, 1); - evry_plugin_register(p2, 3); + evry_plugin_register(&p1->base, 1); + evry_plugin_register(&p2->base, 3); - act = evry_action_new("Launch", "APPLICATION", NULL, "everything-launch", + act = evry_action_new("Launch", "APPLICATION", NULL, NULL, + "everything-launch", _exec_app_action, _exec_app_check_item, NULL); - act1 = evry_action_new("Open File...", "APPLICATION", "FILE", "document-open", + act1 = evry_action_new("Open File...", "APPLICATION", "FILE", "APPLICATION", + "document-open", _exec_app_action, _exec_app_check_item, NULL); - act2 = evry_action_new("Edit Application Entry", "APPLICATION", NULL, "everything-launch", + act2 = evry_action_new("Edit Application Entry", "APPLICATION", NULL, NULL, + "everything-launch", _edit_app_action, _edit_app_check_item, NULL); - act3 = evry_action_new("New Application Entry", "APPLICATION", NULL, "everything-launch", + act3 = evry_action_new("New Application Entry", "APPLICATION", NULL, NULL, + "everything-launch", _new_app_action, _new_app_check_item, NULL); - act4 = evry_action_new("Open File...", "BORDER", "FILE", "everything-launch", + act4 = evry_action_new("Open File...", "BORDER", "FILE", NULL, + "everything-launch", _exec_border_action, _exec_border_check_item, NULL); evry_action_register(act); @@ -709,8 +692,11 @@ _shutdown(void) { char *str; - evry_plugin_free(p1); - evry_plugin_free(p2); + evry_plugin_free(&p1->base, 0); + evry_plugin_free(&p2->base, 0); + E_FREE(p1); + E_FREE(p2); + evry_action_free(act); evry_action_free(act1); evry_action_free(act2); diff --git a/src/modules/everything/evry_plug_aspell.c b/src/modules/everything/evry_plug_aspell.c index aa2fd3cb6..779cb113d 100644 --- a/src/modules/everything/evry_plug_aspell.c +++ b/src/modules/everything/evry_plug_aspell.c @@ -21,7 +21,7 @@ struct _Plugin Eina_Bool is_first; }; -static Plugin *_singleton = NULL; +static Plugin *plugin = NULL; static Eina_Bool _exe_restart(Plugin *p) @@ -187,7 +187,7 @@ _cb_data(void *data, int type __UNUSED__, void *event) } evry_plugin_async_update(plugin, EVRY_ASYNC_UPDATE_ADD); - + return 1; } @@ -229,7 +229,7 @@ _fetch(Evry_Plugin *plugin, const char *input) if (!input) return 0; if (!p->handler.data && !_begin(plugin, NULL)) return 0; - + len = sizeof(LANG_MODIFIER) - 1; if (strncmp(input, LANG_MODIFIER, len) == 0) { @@ -331,42 +331,27 @@ _init(void) { Plugin *p; - if (_singleton) - return EINA_TRUE; - p = E_NEW(Plugin, 1); - p->base.name = "Spell Checker"; - p->base.type = type_subject; - p->base.type_out = eina_stringshare_add("TEXT"); - p->base.icon = "accessories-dictionary"; - p->base.trigger = TRIGGER; - p->base.fetch = _fetch; - p->base.cleanup = _cleanup; + evry_plugin_new(&p->base, "Spell Checker", type_subject, "", "TEXT", 1, + "accessories-dictionary", TRIGGER, + NULL, _cleanup, _fetch, NULL, NULL, NULL, NULL); evry_plugin_register(&p->base, 100); - _singleton = p; + plugin = p; return EINA_TRUE; } static void _shutdown(void) { - Evry_Item *it; Plugin *p; - if (!_singleton) - return; + p = plugin; - p = _singleton; - _singleton = NULL; + _cleanup(&p->base); - EINA_LIST_FREE(p->base.items, it) - evry_item_free(it); - - eina_stringshare_del(p->base.type_out); - - evry_plugin_unregister(&p->base); + evry_plugin_free(&p->base, 0); E_FREE(p); } diff --git a/src/modules/everything/evry_plug_border.c b/src/modules/everything/evry_plug_border.c index 949136b88..fd8b458c0 100644 --- a/src/modules/everything/evry_plug_border.c +++ b/src/modules/everything/evry_plug_border.c @@ -28,14 +28,14 @@ _cb_border_remove(void *data, int type, void *event) return 1; } -static int +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, NULL)); - return 1; + return p; } static void @@ -218,8 +218,8 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) static Eina_Bool _init(void) { - p = evry_plugin_new("Windows", type_subject, NULL, "BORDER", 0, NULL, NULL, - _begin, _cleanup, _fetch, NULL, NULL, _item_icon_get, NULL, NULL); + p = evry_plugin_new(NULL, "Windows", type_subject, NULL, "BORDER", 0, NULL, NULL, + _begin, _cleanup, _fetch, NULL, _item_icon_get, NULL, NULL); evry_plugin_register(p, 2); @@ -229,7 +229,7 @@ _init(void) static void _shutdown(void) { - evry_plugin_free(p); + evry_plugin_free(p, 1); } diff --git a/src/modules/everything/evry_plug_border_act.c b/src/modules/everything/evry_plug_border_act.c index 1820114bc..470adc8a9 100644 --- a/src/modules/everything/evry_plug_border_act.c +++ b/src/modules/everything/evry_plug_border_act.c @@ -83,7 +83,7 @@ _act_cb_border_unminimize(E_Border *bd) if (!bd->lock_user_iconify) e_border_uniconify(bd); } -static int +static Evry_Plugin * _begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item) { E_Border *bd; @@ -92,7 +92,7 @@ _begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item) /* e_object_ref(E_OBJECT(bd)); */ inst->border = bd; - return 1; + return p; } static int @@ -212,8 +212,8 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) static Eina_Bool _init(void) { - p = evry_plugin_new("Window Action", type_action, "BORDER", NULL, 0, NULL, NULL, - _begin, _cleanup, _fetch, _action, NULL, _item_icon_get, NULL, NULL); + p = evry_plugin_new(NULL, "Window Action", type_action, "BORDER", NULL, 0, NULL, NULL, + _begin, _cleanup, _fetch, _action, _item_icon_get, NULL, NULL); evry_plugin_register(p, 1); @@ -225,7 +225,7 @@ _init(void) static void _shutdown(void) { - evry_plugin_free(p); + evry_plugin_free(p, 1); E_FREE(inst); } diff --git a/src/modules/everything/evry_plug_calc.c b/src/modules/everything/evry_plug_calc.c index 158040475..b776b131d 100644 --- a/src/modules/everything/evry_plug_calc.c +++ b/src/modules/everything/evry_plug_calc.c @@ -14,7 +14,7 @@ static int error = 0; -static int +static Evry_Plugin * _begin(Evry_Plugin *p, const Evry_Item *item __UNUSED__) { Evry_Item *it; @@ -34,7 +34,7 @@ _begin(Evry_Plugin *p, const Evry_Item *item __UNUSED__) it = evry_item_new(p, "0", NULL); p->items = eina_list_prepend(p->items, it); - return 1; + return p; } static int @@ -207,8 +207,8 @@ _cb_del(void *data __UNUSED__, int type __UNUSED__, void *event) static Eina_Bool _init(void) { - p1 = evry_plugin_new("Calculator", type_subject, NULL, "TEXT", 1, "accessories-calculator", "=", - _begin, _cleanup, _fetch, _action, NULL, NULL, NULL, NULL); + p1 = evry_plugin_new(NULL, "Calculator", type_subject, NULL, "TEXT", 1, "accessories-calculator", "=", + _begin, _cleanup, _fetch, _action, NULL, NULL, NULL); evry_plugin_register(p1, 0); @@ -223,7 +223,7 @@ _shutdown(void) EINA_LIST_FREE(history, result) eina_stringshare_del(result); - evry_plugin_free(p1); + evry_plugin_free(p1, 1); } diff --git a/src/modules/everything/evry_plug_clipboard.c b/src/modules/everything/evry_plug_clipboard.c index d9ab1c479..97b5459b2 100644 --- a/src/modules/everything/evry_plug_clipboard.c +++ b/src/modules/everything/evry_plug_clipboard.c @@ -25,7 +25,7 @@ _init(void) Ecore_X_Window win = ecore_x_window_new(0, 0, 0, 1, 1); if (!win) return EINA_FALSE; - act = evry_action_new("Copy to Clipboard", "TEXT", NULL, "edit-copy", + act = evry_action_new("Copy to Clipboard", "TEXT", NULL, NULL, "edit-copy", _action, _check_item, NULL); evry_action_register(act); diff --git a/src/modules/everything/evry_plug_config.c b/src/modules/everything/evry_plug_config.c index 8b10f7249..a605def19 100644 --- a/src/modules/everything/evry_plug_config.c +++ b/src/modules/everything/evry_plug_config.c @@ -130,10 +130,10 @@ _action(Evry_Action *act, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, static Eina_Bool _init(void) { - p = evry_plugin_new("Settings", type_subject, NULL, "E_SETTINGS", 0, NULL, NULL, - NULL, _cleanup, _fetch, NULL, NULL, _item_icon_get, NULL, NULL); + p = evry_plugin_new(NULL, "Settings", type_subject, NULL, "E_SETTINGS", 0, NULL, NULL, + NULL, _cleanup, _fetch, NULL, _item_icon_get, NULL, NULL); - act = evry_action_new("Show Dialog", "E_SETTINGS", NULL, "preferences-advanced", + act = evry_action_new("Show Dialog", "E_SETTINGS", NULL, NULL, "preferences-advanced", _action, NULL, NULL); evry_plugin_register(p, 10); @@ -145,7 +145,9 @@ _init(void) static void _shutdown(void) { - evry_plugin_free(p); + evry_plugin_free(p, 1); + + evry_action_free(act); } diff --git a/src/modules/everything/evry_plug_dir_browse.c b/src/modules/everything/evry_plug_dir_browse.c index d43a51f4c..83be4e32e 100644 --- a/src/modules/everything/evry_plug_dir_browse.c +++ b/src/modules/everything/evry_plug_dir_browse.c @@ -3,30 +3,33 @@ #define MAX_ITEMS 100 -typedef struct _State State; +typedef struct _Plugin Plugin; -struct _State +struct _Plugin { + Evry_Plugin base; + const char *directory; /* all files of directory */ Eina_List *items; /* current list of files */ Eina_List *cur; Eina_Bool command; + Ecore_Idler *idler; }; static Evry_Plugin *p1; static Evry_Plugin *p2; static Evry_Action *act; -static Ecore_Idler *idler = NULL; + static Evry_Item * -_item_add(Evry_Plugin *p, const char *directory, const char *file) +_item_add(Plugin *p, const char *directory, const char *file) { Evry_Item *it = NULL; char buf[4096]; - it = evry_item_new(p, file, NULL); + it = evry_item_new(&p->base, file, NULL); if (!it) return NULL; snprintf(buf, sizeof(buf), "%s/%s", directory, file); @@ -94,15 +97,12 @@ _cb_sort(const void *data1, const void *data2) static int _dirbrowse_idler(void *data) { - Evry_Plugin *p = data; - State *s = ((Eina_List *)p->private)->data; - int cnt = 10; + Plugin *p = data; Eina_List *l; Evry_Item *it; + int cnt = 10; - if (!idler) return 0; - - EINA_LIST_FOREACH(s->items, l, it) + EINA_LIST_FOREACH(p->items, l, it) { if (!it->mime) { @@ -112,38 +112,28 @@ _dirbrowse_idler(void *data) if (cnt == 0) break; } - if (!s->command) + l = p->base.items; + + p->base.items = eina_list_sort(l, eina_list_count(l), _cb_sort); + evry_plugin_async_update(&p->base, EVRY_ASYNC_UPDATE_ADD); + + if (cnt > 0) { - if (eina_list_count(p->items) > 0) - { - p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); - s->cur = p->items; - } - - evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_ADD); - - if (cnt > 0) - { - idler = NULL; - return 0; - } + p->idler = NULL; + return 0; } return 1; } static void -_push_directory(Evry_Plugin *p, State *s) +_read_directory(Plugin *p) { char *file; Eina_List *files; Evry_Item *it; - Eina_List *stack = p->private; - /* previous states items are saved in s->items !*/ - p->items = NULL; - - files = ecore_file_ls(s->directory); + files = ecore_file_ls(p->directory); EINA_LIST_FREE(files, file) { @@ -155,164 +145,141 @@ _push_directory(Evry_Plugin *p, State *s) continue; } - it = _item_add(p, s->directory, file); + it = _item_add(p, p->directory, file); if (it) - s->items = eina_list_append(s->items, it); + p->items = eina_list_append(p->items, it); free(file); } - if (idler) - ecore_idler_del(idler); - - idler = ecore_idler_add(_dirbrowse_idler, p); - - stack = eina_list_prepend(stack, s); - p->private = stack; + p->idler = ecore_idler_add(_dirbrowse_idler, p); } -static int -_begin(Evry_Plugin *p, const Evry_Item *item __UNUSED__) +static Evry_Plugin * +_begin(Evry_Plugin *plugin, const Evry_Item *it) { - State *s; + Plugin *p; - s = E_NEW(State, 1); - s->directory = eina_stringshare_add(e_user_homedir_get()); - _push_directory(p, s); + /* is FILE ? */ + if (it && (it->plugin->type_out == plugin->type_in)) + { + if (!it->uri || !ecore_file_is_dir(it->uri)) + return NULL; - return 1; -} + p = E_NEW(Plugin, 1); + p->base = *plugin; -static int -_browse(Evry_Plugin *p, const Evry_Item *it_file) -{ - State *s; + p->directory = eina_stringshare_add(it->uri); + } + else + { + p = E_NEW(Plugin, 1); + p->base = *plugin; - if (!it_file || !it_file->uri || !ecore_file_is_dir(it_file->uri)) - return 0; + p->directory = eina_stringshare_add(e_user_homedir_get()); + } + + _read_directory(p); - s = E_NEW(State, 1); - s->directory = eina_stringshare_add(it_file->uri); - _push_directory(p, s); - - return 1; + return &p->base; } static void -_cleanup(Evry_Plugin *p) +_cleanup(Evry_Plugin *plugin) { - State *s; + Plugin *p = (Plugin*) plugin; Evry_Item *it; - Eina_List *stack = p->private; - if (!stack) return; + if (p->directory) + eina_stringshare_del(p->directory); - s = stack->data; - - if (s->directory) eina_stringshare_del(s->directory); - - EINA_LIST_FREE(s->items, it) + EINA_LIST_FREE(p->items, it) evry_item_free(it); - if (idler) - { - ecore_idler_del(idler); - idler = NULL; - } + if (p->idler) + ecore_idler_del(p->idler); - E_FREE(s); + if (plugin->items) + eina_list_free(plugin->items); - if (p->items) eina_list_free(p->items); - p->items = NULL; - - stack = eina_list_remove_list(stack, stack); - p->private = stack; - - if (stack) - { - s = stack->data; - p->items = s->cur; - } + E_FREE(p); } static int -_fetch(Evry_Plugin *p, const char *input) +_fetch(Evry_Plugin *plugin, const char *input) { + Plugin *p = (Plugin*) plugin; Evry_Item *it; Eina_List *l; int cnt = 0; - State *s = ((Eina_List *)p->private)->data; - if (!s->command) + if (!p->command) { - if (p->items) eina_list_free(p->items); - p->items = NULL; + if (p->base.items) eina_list_free(p->base.items); + plugin->items = NULL; } /* input is command ? */ if (input) { - if (!strncmp(input, "/", 1)) - { - if (s->command) return 1; + if (!strncmp(input, "/", 1)) + { + if (p->command) return 1; - it = evry_item_new(p, "/", NULL); - if (!it) return 0; - it->uri = eina_stringshare_add("/"); - p->items = eina_list_append(p->items, it); - s->cur = p->items; - s->command = EINA_TRUE; - return 1; - } - else if (!strncmp(input, "..", 2)) - { - char *end; - char dir[4096]; - char *tmp; - int prio = 0; + it = evry_item_new(&p->base, "/", NULL); + if (!it) return 0; + it->uri = eina_stringshare_add("/"); + p->base.items = eina_list_append(p->base.items, it); + p->command = EINA_TRUE; + return 1; + } + else if (!strncmp(input, "..", 2)) + { + char *end; + char dir[4096]; + char *tmp; + int prio = 0; - if (s->command) return 1; + if (p->command) return 1; - if (!strcmp(s->directory, "/")) return 0; + if (!strcmp(p->directory, "/")) return 0; - snprintf(dir, 4096, "%s", s->directory); - end = strrchr(dir, '/'); + snprintf(dir, 4096, "%s", p->directory); + end = strrchr(dir, '/'); - while (end != dir) - { - tmp = strdup(dir); - snprintf(dir, (end - dir) + 1, "%s", tmp); - it = evry_item_new(p, dir, NULL); - if (!it) break; - it->uri = eina_stringshare_add(dir); - it->priority = prio; - p->items = eina_list_append(p->items, it); - end = strrchr(dir, '/'); - free(tmp); - prio--; - } + while (end != dir) + { + tmp = strdup(dir); + snprintf(dir, (end - dir) + 1, "%s", tmp); + it = evry_item_new(&p->base, dir, NULL); + if (!it) break; + it->uri = eina_stringshare_add(dir); + it->priority = prio; + p->base.items = eina_list_append(p->base.items, it); + end = strrchr(dir, '/'); + free(tmp); + prio--; + } - it = evry_item_new(p, "/", NULL); - if (!it) return 0; - it->uri = eina_stringshare_add("/"); - it->priority = prio; - p->items = eina_list_append(p->items, it); - s->cur = p->items; - s->command = EINA_TRUE; - return 1; - } + it = evry_item_new(&p->base, "/", NULL); + if (!it) return 0; + it->uri = eina_stringshare_add("/"); + it->priority = prio; + p->base.items = eina_list_append(p->base.items, it); + p->command = EINA_TRUE; + return 1; + } } - if (s->command) + if (p->command) { - EINA_LIST_FREE(p->items, it) - evry_item_free(it); - - s->command = EINA_FALSE; + p->command = EINA_FALSE; + EINA_LIST_FREE(p->base.items, it) + evry_item_free(it); } - EINA_LIST_FOREACH(s->items, l, it) + EINA_LIST_FOREACH(p->items, l, it) { if (input) { @@ -325,17 +292,16 @@ _fetch(Evry_Plugin *p, const char *input) if (it) { - p->items = eina_list_prepend(p->items, it); - cnt++; - if (cnt >= MAX_ITEMS) break; + p->base.items = eina_list_append(p->base.items, it); + if (cnt++ >= MAX_ITEMS) break; } } - s->cur = p->items; - if (p->items) + if (p->base.items) { - p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); - s->cur = p->items; + p->base.items = eina_list_sort + (p->base.items, eina_list_count(p->base.items), _cb_sort); + return 1; } @@ -355,7 +321,7 @@ _icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) if (it->browseable) o = evry_icon_theme_get("folder", e); else - o = evry_icon_mime_get(it->mime, e); + o = evry_icon_mime_get(it->mime, e); return o; } @@ -368,7 +334,8 @@ _open_folder_check(Evry_Action *act __UNUSED__, const Evry_Item *it) } static int -_open_folder_action(Evry_Action *act __UNUSED__, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) +_open_folder_action(Evry_Action *act __UNUSED__, const Evry_Item *it, + const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) { E_Action *action = e_action_find("fileman"); char *path; @@ -393,21 +360,22 @@ _open_folder_action(Evry_Action *act __UNUSED__, const Evry_Item *it, const Evry return 1; } + static Eina_Bool _init(void) { - p1 = evry_plugin_new("Files", type_subject, "FILE", "FILE", 0, NULL, NULL, - _begin, _cleanup, _fetch, NULL, _browse, _icon_get, + p1 = evry_plugin_new(NULL, "Files", type_subject, "FILE", "FILE", 0, NULL, NULL, + _begin, _cleanup, _fetch, NULL, _icon_get, NULL, NULL); - p2 = evry_plugin_new("Files", type_object, "FILE", "FILE", 0, NULL, NULL, - _begin, _cleanup, _fetch, NULL, _browse, _icon_get, + p2 = evry_plugin_new(NULL, "Files", type_object, "FILE", "FILE", 0, NULL, NULL, + _begin, _cleanup, _fetch, NULL, _icon_get, NULL, NULL); evry_plugin_register(p1, 3); evry_plugin_register(p2, 1); - act = evry_action_new("Open Folder (EFM)", "FILE", NULL, "folder-open", + act = evry_action_new("Open Folder (EFM)", "FILE", NULL, NULL, "folder-open", _open_folder_action, _open_folder_check, NULL); evry_action_register(act); @@ -418,8 +386,9 @@ _init(void) static void _shutdown(void) { - evry_plugin_free(p1); - evry_plugin_free(p2); + evry_plugin_free(p1, 1); + evry_plugin_free(p2, 1); + evry_action_free(act); } diff --git a/src/modules/everything/evry_plug_preview.c b/src/modules/everything/evry_plug_preview.c index 4d3f2953c..301507091 100644 --- a/src/modules/everything/evry_plug_preview.c +++ b/src/modules/everything/evry_plug_preview.c @@ -195,6 +195,9 @@ _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow) Image_View *v; int w, h, x, y; + if (!s->plugin) + return NULL; + if (!_get_list(s)) return NULL; diff --git a/src/modules/everything/evry_plug_tracker.c b/src/modules/everything/evry_plug_tracker.c index a6eafd00c..4257927c7 100644 --- a/src/modules/everything/evry_plug_tracker.c +++ b/src/modules/everything/evry_plug_tracker.c @@ -3,10 +3,12 @@ /* TODO check if trackerd is running and version */ -typedef struct _Inst Inst; +typedef struct _Plugin Plugin; -struct _Inst +struct _Plugin { + Evry_Plugin base; + int active; char *condition; char *service; @@ -20,14 +22,15 @@ static E_DBus_Connection *conn = NULL; static Eina_List *plugins = NULL; static int _prio = 5; -static int -_begin(Evry_Plugin *p, const Evry_Item *it) +static Evry_Plugin * +_begin(Evry_Plugin *plugin, const Evry_Item *it) { - Inst *inst = p->private; + Plugin *p = (Plugin*) plugin; - inst->active = 0; + p->active = 0; - if (!strcmp(it->plugin->type_out, "APPLICATION")) + /* is application */ + if (it->plugin->type_out == plugin->type_in) { Eina_List *l; const char *mime; @@ -36,11 +39,11 @@ _begin(Evry_Plugin *p, const Evry_Item *it) char rdf_query[32768]; int len = 0; - if (inst->condition[0]) free (inst->condition); - inst->condition = ""; + if (p->condition[0]) free (p->condition); + p->condition = ""; if (!app->desktop || !app->desktop->mime_types) - return 1; + return NULL; rdf_query[0] = '\0'; strcat(rdf_query, ""); @@ -48,7 +51,7 @@ _begin(Evry_Plugin *p, const Evry_Item *it) EINA_LIST_FOREACH(app->desktop->mime_types, l, mime) { if (!strcmp(mime, "x-directory/normal")) - return 0; + return NULL; snprintf(mime_entry, 256, "" @@ -63,21 +66,21 @@ _begin(Evry_Plugin *p, const Evry_Item *it) } strcat(rdf_query, ""); - inst->condition = strdup(rdf_query); + p->condition = strdup(rdf_query); } - return 1; + return plugin; } static Evry_Item * -_item_add(Evry_Plugin *p, char *file, char *mime, int prio) +_item_add(Plugin *p, char *file, char *mime, int prio) { Evry_Item *it; const char *filename; int folder = (!strcmp(mime, "Folder")); /* folders are specifically searched */ - if (folder && p->begin) + if (folder && p->base.begin) return NULL; filename = ecore_file_file_get(file); @@ -85,7 +88,7 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio) if (!filename) return NULL; - it = evry_item_new(p, filename, NULL); + it = evry_item_new(&p->base, filename, NULL); if (!it) return NULL; it->priority = prio; @@ -104,27 +107,27 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio) } static void -_cleanup(Evry_Plugin *p) +_cleanup(Evry_Plugin *plugin) { + Plugin *p = (Plugin*) plugin; Evry_Item *it; - Inst *inst = p->private; - inst->active = 0; + p->active = 0; - if (inst->input) - eina_stringshare_del(inst->input); - inst->input = NULL; + if (p->input) + eina_stringshare_del(p->input); + p->input = NULL; - if (inst->matched) - eina_stringshare_del(inst->matched); - inst->matched = NULL; + if (p->matched) + eina_stringshare_del(p->matched); + p->matched = NULL; - EINA_LIST_FREE(inst->items, it) + EINA_LIST_FREE(p->items, it) evry_item_free(it); - if (p->items) - eina_list_free(p->items); - p->items = NULL; + if (p->base.items) + eina_list_free(p->base.items); + p->base.items = NULL; } static int @@ -145,19 +148,18 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) char *uri, *mime, *date; Evry_Item *it; Eina_List *items = NULL; - Evry_Plugin *p = data; - Inst *inst = p->private; + Plugin *p = data; - if (inst->active) inst->active--; + if (p->active) p->active--; if (dbus_error_is_set(error)) { - _cleanup(p); + _cleanup(&p->base); printf("Error: %s - %s\n", error->name, error->message); return; } - if (inst->active) return; + if (p->active) return; dbus_message_iter_init(msg, &array); if(dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY) @@ -189,63 +191,63 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) } } - if (p->items) - eina_list_free(p->items); - p->items = NULL; + if (p->base.items) + eina_list_free(p->base.items); + p->base.items = NULL; if (items) { Eina_List *l; - EINA_LIST_FREE(inst->items, it) + EINA_LIST_FREE(p->items, it) evry_item_free(it); items = eina_list_sort(items, eina_list_count(items), _cb_sort); - inst->items = items; + p->items = items; - EINA_LIST_FOREACH(inst->items, l, it) - p->items = eina_list_append(p->items, it); + EINA_LIST_FOREACH(p->items, l, it) + p->base.items = eina_list_append(p->base.items, it); - if (inst->matched) - eina_stringshare_del(inst->matched); - if (inst->input) - inst->matched = eina_stringshare_add(inst->input); + if (p->matched) + eina_stringshare_del(p->matched); + if (p->input) + p->matched = eina_stringshare_add(p->input); else - inst->matched = NULL; + p->matched = NULL; } - else if (inst->items && inst->input && inst->matched && - (strlen(inst->input) > strlen(inst->matched))) + else if (p->items && p->input && p->matched && + (strlen(p->input) > strlen(p->matched))) { Eina_List *l; - EINA_LIST_FOREACH(inst->items, l, it) - if (evry_fuzzy_match(it->label, (inst->input + strlen(inst->matched)))) - p->items = eina_list_append(p->items, it); + EINA_LIST_FOREACH(p->items, l, it) + if (evry_fuzzy_match(it->label, (p->input + strlen(p->matched)))) + p->base.items = eina_list_append(p->base.items, it); } else { - EINA_LIST_FREE(inst->items, it) + EINA_LIST_FREE(p->items, it) evry_item_free(it); - if (inst->input) - eina_stringshare_del(inst->input); - inst->input = NULL; + if (p->input) + eina_stringshare_del(p->input); + p->input = NULL; - if (inst->matched) - eina_stringshare_del(inst->matched); - inst->matched = NULL; + if (p->matched) + eina_stringshare_del(p->matched); + p->matched = NULL; } - evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_ADD); + evry_plugin_async_update(&p->base, EVRY_ASYNC_UPDATE_ADD); } static int -_fetch(Evry_Plugin *p, const char *input) +_fetch(Evry_Plugin *plugin, const char *input) { - Inst *inst = p->private; + Plugin *p = (Plugin*) plugin; DBusMessage *msg; int live_query_id = 0; - int max_hits = inst->max_hits; + int max_hits = p->max_hits; int offset = 0; int sort_descending = 1; int sort_by_service = 0; @@ -262,35 +264,35 @@ _fetch(Evry_Plugin *p, const char *input) char **_keywords = keywords; char **_sort_fields = sort_fields; - if (inst->input) - eina_stringshare_del(inst->input); - inst->input = NULL; + if (p->input) + eina_stringshare_del(p->input); + p->input = NULL; if (!conn) { - _cleanup(p); + _cleanup(plugin); return 0; } if (input && (strlen(input) > 2)) { - inst->input = eina_stringshare_add(input); + p->input = eina_stringshare_add(input); search_text = malloc(sizeof(char) * strlen(input) + 1); sprintf(search_text, "%s", input); max_hits = 100; } - else if (!input && !p->begin && p->type == type_object) + else if (!input && !plugin->begin && plugin->type == type_object) { sort_by_access = 1; search_text = ""; } else { - _cleanup(p); + _cleanup(plugin); return 0; } - inst->active++; + p->active++; msg = dbus_message_new_method_call("org.freedesktop.Tracker", "/org/freedesktop/Tracker/Search", @@ -298,13 +300,13 @@ _fetch(Evry_Plugin *p, const char *input) "Query"); dbus_message_append_args(msg, DBUS_TYPE_INT32, &live_query_id, - DBUS_TYPE_STRING, &inst->service, + DBUS_TYPE_STRING, &p->service, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_fields, 2, DBUS_TYPE_STRING, &search_text, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_keywords, 0, - DBUS_TYPE_STRING, &inst->condition, + DBUS_TYPE_STRING, &p->condition, DBUS_TYPE_BOOLEAN, &sort_by_service, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_sort_fields, sort_by_access, @@ -338,21 +340,26 @@ _icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) static void _plugin_new(const char *name, int type, char *service, int max_hits, int begin) { - Evry_Plugin *p; - Inst *inst; + Plugin *p; - p = evry_plugin_new(name, type, "", "FILE", 0, NULL, NULL, - (begin ? _begin : NULL), _cleanup, _fetch, - NULL, NULL, _icon_get, NULL, NULL); + p = E_NEW(Plugin, 1); + p->condition = ""; + p->service = service; + p->max_hits = max_hits; + p->active = 0; + + if (!begin) + evry_plugin_new(&p->base, name, type, "", "FILE", 0, NULL, NULL, + NULL, _cleanup, _fetch, + NULL, _icon_get, NULL, NULL); + else + evry_plugin_new(&p->base, name, type, "APPLICATION", "FILE", 0, NULL, NULL, + _begin, _cleanup, _fetch, + NULL, _icon_get, NULL, NULL); - inst = E_NEW(Inst, 1); - inst->condition = ""; - inst->service = service; - inst->max_hits = max_hits; - inst->active = 0; - p->private = inst; - evry_plugin_register(p, _prio++); plugins = eina_list_append(plugins, p); + + evry_plugin_register(&p->base, _prio++); } @@ -378,19 +385,17 @@ _init(void) static void _shutdown(void) { - Inst *inst; - Evry_Plugin *p; + Plugin *p; if (conn) e_dbus_connection_close(conn); EINA_LIST_FREE(plugins, p) { + evry_plugin_free(&p->base, 0); - inst = p->private; - if (inst->condition[0]) free(inst->condition); - E_FREE(inst); - - evry_plugin_free(p); + if (p->condition[0]) free(p->condition); + + E_FREE(p); } }