diff --git a/src/modules/everything/e_mod_main.h b/src/modules/everything/e_mod_main.h index 6fb0239ca..06b6b13c1 100644 --- a/src/modules/everything/e_mod_main.h +++ b/src/modules/everything/e_mod_main.h @@ -110,20 +110,23 @@ struct _Evry_Plugin Eina_Bool browseable; /* run when plugin is activated. */ - int (*begin) (Evry_Plugin *p, Evry_Item *item); + int (*begin) (Evry_Plugin *p, const Evry_Item *item); + + int (*browse) (Evry_Plugin *p, const Evry_Item *item); + /* get candidates matching string, fills 'candidates' list */ int (*fetch) (Evry_Plugin *p, const char *input); /* run before new query and when hiding 'everything' */ void (*cleanup) (Evry_Plugin *p); - Evas_Object *(*icon_get) (Evry_Plugin *p, Evry_Item *it, Evas *e); + Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e); /* provide more information for a candidate */ /* int (*candidate_info) (Evas *evas, Evry_Item *item); */ /* optional: default action for this plugins items */ - int (*action) (Evry_Plugin *p, Evry_Item *item, const char *input); + int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input); Evry_Action *act; /* optional: create list of items when shown (e.g. for sorting) */ @@ -150,9 +153,9 @@ struct _Evry_Action const char *type_in2; const char *type_out; - int (*action) (Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input); + int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input); - int (*check_item) (Evry_Action *act, Evry_Item *it); + int (*check_item) (Evry_Action *act, const Evry_Item *it); Evas_Object *(*icon_get) (Evry_Action *act, Evas *e); diff --git a/src/modules/everything/evry.c b/src/modules/everything/evry.c index f971c7c27..d153aacc0 100644 --- a/src/modules/everything/evry.c +++ b/src/modules/everything/evry.c @@ -109,7 +109,7 @@ static int _evry_cb_key_down(void *data, int type, void *event); * static void _evry_cb_item_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info); * static void _evry_cb_item_mouse_out(void *data, Evas *evas, Evas_Object *obj, void *event_info); */ -static void _evry_matches_update(Evry_Selector *sel, Evry_Plugin *plugin); +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); @@ -157,18 +157,18 @@ static int _evry_list_scroll_timer(void *data); static int _evry_list_item_idler(void *data); static int _evry_plug_actions_init(void); -static int _evry_plug_actions_begin(Evry_Plugin *p, Evry_Item *it); +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, Evry_Item *it, Evas *e); +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_begin(Evry_Plugin *p, Evry_Item *it); +static int _evry_plug_aggregator_begin(Evry_Plugin *p, const Evry_Item *it); static int _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input); -static int _evry_plug_aggregator_action(Evry_Plugin *p, Evry_Item *item, 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, Evry_Item *it, Evas *e); +static Evas_Object *_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e); /* static int _evry_cb_plugin_sort_by_trigger(const void *data1, const void *data2); */ /* local subsystem globals */ @@ -592,7 +592,7 @@ _evry_selector_free(Evry_Selector *sel) _evry_plug_aggregator_free(sel->aggregator); - eina_list_free(sel->plugins); + if (sel->plugins) eina_list_free(sel->plugins); E_FREE(sel); } @@ -613,7 +613,7 @@ _evry_selector_activate(Evry_Selector *sel) if (s && s->plugin && !s->plugin->async_query) { _evry_list_clear_list(s); - _evry_matches_update(selector, s->plugin); + _evry_matches_update(selector); _evry_selector_update(selector); } ecore_timer_del(update_timer); @@ -697,8 +697,11 @@ _evry_selector_update(Evry_Selector *sel) _evry_select_plugin(s, s->cur_plugins->data); } else - s->plugin = NULL; - + { + s->plugin = NULL; + s->sel_item = NULL; + } + it = s->sel_item; if (!it && s->plugin) @@ -775,7 +778,7 @@ _evry_selector_subjects_get(void) _evry_state_new(sel, plugins); - _evry_matches_update(sel, NULL); + _evry_matches_update(sel); return 1; } @@ -815,7 +818,7 @@ _evry_selector_actions_get(Evry_Item *it) _evry_state_new(sel, plugins); - _evry_matches_update(sel, NULL); + _evry_matches_update(sel); return 1; } @@ -831,8 +834,9 @@ _evry_selector_objects_get(const char *type) while (sel->state) _evry_state_pop(sel); - it = NULL; // TODO let 'object' plugins take subject and action - // into account. selectors[0]->state->sel_item; + // TODO let 'object' plugins take subject and action + // into account. selectors[0]->state->sel_item; + it = selectors[0]->state->sel_item; EINA_LIST_FOREACH(sel->plugins, l, p) { @@ -852,7 +856,7 @@ _evry_selector_objects_get(const char *type) _evry_state_new(sel, plugins); - _evry_matches_update(sel, NULL); + _evry_matches_update(sel); return 1; } @@ -883,7 +887,7 @@ _evry_state_pop(Evry_Selector *sel) free(sel->state->input); EINA_LIST_FREE(sel->state->plugins, p) p->cleanup(p); - + E_FREE(sel->state); sel->states = eina_list_remove_list(sel->states, sel->states); @@ -907,23 +911,20 @@ _evry_browse_item(Evry_Selector *sel) if (!it || !it->browseable) return; _evry_list_clear_list(sel->state); - + EINA_LIST_FOREACH(sel->plugins, l, p) { + if (!p->browse) continue; if (!strstr(p->type_in, it->plugin->type_out)) continue; - - if (p->begin) - { - if (p->begin(p, it)) - plugins = eina_list_append(plugins, p); - } - else + + if (p->browse(p, it)) plugins = eina_list_append(plugins, p); } + if (plugins) { _evry_state_new(sel, plugins); - _evry_matches_update(sel, NULL); + _evry_matches_update(sel); _evry_selector_update(sel); } @@ -973,7 +974,7 @@ _evry_selectors_switch(void) if (!s->plugin->async_query) { _evry_list_clear_list(s); - _evry_matches_update(selector, s->plugin); + _evry_matches_update(selector); _evry_selector_update(selector); } ecore_timer_del(update_timer); @@ -1071,6 +1072,7 @@ _evry_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event) ((strlen(s->input) < (INPUTLEN - strlen(ev->compose))))) { strcat(s->input, ev->compose); + /* _evry_update_timer(s); */ _evry_update(s); } return 1; @@ -1089,6 +1091,7 @@ _evry_backspace(Evry_State *s) { s->input[pos] = 0; _evry_update(s); + /* _evry_update_timer(s); */ } } } @@ -1120,12 +1123,12 @@ _evry_update_timer(void *data) { Evry_State *s = data; /* XXX pass selector as data? */ - _evry_list_clear_list(s); - _evry_matches_update(selector, s->plugin); + _evry_list_clear_list(s); + _evry_matches_update(selector); _evry_selector_update(selector); _evry_list_update(selector->state); update_timer = NULL; - + return 0; } @@ -1156,7 +1159,7 @@ _evry_plugin_action(Evry_Selector *sel, int finished) /* XXX what if an async plugin is selected */ if (!selector->state->plugin->async_query) { - _evry_matches_update(selector, selector->state->plugin); + _evry_matches_update(selector); _evry_selector_update(selector); } @@ -1323,14 +1326,14 @@ _evry_list_item_idler(void *data) static void -_evry_matches_update(Evry_Selector *sel, Evry_Plugin *plugin) +_evry_matches_update(Evry_Selector *sel) { Evry_State *s = sel->state; Evry_Plugin *p; Eina_List *l; Eina_Bool has_items = EINA_FALSE; - eina_list_free(s->cur_plugins); + if (s->cur_plugins) eina_list_free(s->cur_plugins); s->cur_plugins = NULL; s->sel_item = NULL; @@ -1850,7 +1853,7 @@ _evry_plug_actions_init(void) } static int -_evry_plug_actions_begin(Evry_Plugin *p, Evry_Item *it) +_evry_plug_actions_begin(Evry_Plugin *p, const Evry_Item *it) { Evry_Action *act; Eina_List *l; @@ -1934,12 +1937,12 @@ _evry_plug_actions_cleanup(Evry_Plugin *p) evry_item_free(it); p->items = NULL; - eina_list_free(sel->actions); + if (sel->actions) eina_list_free(sel->actions); sel->actions = NULL; } static Evas_Object * -_evry_plug_actions_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) +_evry_plug_actions_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) { Evas_Object *o; Evry_Action *act = it->data[0]; @@ -1998,10 +2001,9 @@ _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input __UNUSED__) int cnt; if (p->items) - { - eina_list_free(p->items); - p->items = NULL; - } + eina_list_free(p->items); + p->items = NULL; + EINA_LIST_FOREACH(s->cur_plugins, l, plugin) { @@ -2016,7 +2018,7 @@ _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input __UNUSED__) } static int -_evry_plug_aggregator_action(Evry_Plugin *p, Evry_Item *it, const char *input) +_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); @@ -2027,12 +2029,12 @@ _evry_plug_aggregator_action(Evry_Plugin *p, Evry_Item *it, const char *input) static void _evry_plug_aggregator_cleanup(Evry_Plugin *p) { - eina_list_free(p->items); + if (p->items) eina_list_free(p->items); p->items = NULL; } static Evas_Object * -_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) +_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); @@ -2061,6 +2063,7 @@ evry_plugin_async_update(Evry_Plugin *p, int action) if (p == s->plugin) { + s->plugin = NULL; /* _evry_list_clear_list(s); */ _evry_selector_update(selector); if (list->visible) diff --git a/src/modules/everything/evry_plug_apps.c b/src/modules/everything/evry_plug_apps.c index 8ff038473..f6ce22fe5 100644 --- a/src/modules/everything/evry_plug_apps.c +++ b/src/modules/everything/evry_plug_apps.c @@ -8,7 +8,7 @@ struct _Inst Eina_Hash *added; Eina_List *apps_mime; Eina_List *apps_all; - Evry_Item *candidate; + const Evry_Item *candidate; }; static Evry_Plugin *p1; @@ -21,7 +21,7 @@ static Eina_List *exe_path = NULL; static int -_begin(Evry_Plugin *p, Evry_Item *it) +_begin(Evry_Plugin *p, const Evry_Item *it) { const char *mime; Inst *inst = NULL; @@ -367,7 +367,7 @@ _fetch(Evry_Plugin *p, const char *input) } static Evas_Object * -_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) { Evas_Object *o = NULL; Evry_App *app = it->data[0]; @@ -385,7 +385,7 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) } static int -_exec_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it) +_exec_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) { Evry_App *app = it->data[0]; if (app->desktop) @@ -398,7 +398,7 @@ _exec_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it) } static int -_app_action(Evry_Item *it_app, Evry_Item *it_file) +_app_action(const Evry_Item *it_app, const Evry_Item *it_file) { E_Zone *zone; Evry_App *app = NULL; @@ -447,13 +447,13 @@ _app_action(Evry_Item *it_app, Evry_Item *it_file) } static int -_exec_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input) +_exec_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input) { return _app_action(it1, it2); } static int -_open_with_action(Evry_Plugin *p, Evry_Item *it, const char *input __UNUSED__) +_open_with_action(Evry_Plugin *p, const Evry_Item *it, const char *input __UNUSED__) { Inst *inst = p->private; if (inst->candidate) @@ -461,7 +461,7 @@ _open_with_action(Evry_Plugin *p, Evry_Item *it, const char *input __UNUSED__) } static int -_edit_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it) +_edit_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) { Evry_App *app = it->data[0]; if (app->desktop) @@ -472,7 +472,7 @@ _edit_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it) static int -_edit_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input) +_edit_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input) { Evry_App *app; Efreet_Desktop *desktop; @@ -499,7 +499,7 @@ _edit_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *i static int -_new_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it) +_new_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) { Evry_App *app = it->data[0]; if (app->desktop) @@ -513,7 +513,7 @@ _new_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it) static int -_new_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input) +_new_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input) { Evry_App *app; char *name; diff --git a/src/modules/everything/evry_plug_aspell.c b/src/modules/everything/evry_plug_aspell.c index 4e5d70529..d4ea84a3a 100644 --- a/src/modules/everything/evry_plug_aspell.c +++ b/src/modules/everything/evry_plug_aspell.c @@ -202,7 +202,7 @@ _cb_del(void *data, int type __UNUSED__, void *event) } static int -_begin(Evry_Plugin *plugin, Evry_Item *it __UNUSED__) +_begin(Evry_Plugin *plugin, const Evry_Item *it __UNUSED__) { Plugin *p = (Plugin *)plugin; diff --git a/src/modules/everything/evry_plug_border.c b/src/modules/everything/evry_plug_border.c index 06f35da11..f59f27799 100644 --- a/src/modules/everything/evry_plug_border.c +++ b/src/modules/everything/evry_plug_border.c @@ -1,46 +1,34 @@ #include "e.h" #include "e_mod_main.h" -static int _fetch(Evry_Plugin *p, const char *input); -/* static int _action(Evry_Plugin *p, Evry_Item *item, const char *input); */ -static void _cleanup(Evry_Plugin *p); -static void _item_add(Evry_Plugin *p, E_Border *bd, int prio); -static int _cb_sort(const void *data1, const void *data2); -static Evas_Object *_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e); - -static Eina_Bool _init(void); -static void _shutdown(void); -EINA_MODULE_INIT(_init); -EINA_MODULE_SHUTDOWN(_shutdown); - static Evry_Plugin *p; -static Eina_Bool -_init(void) -{ - p = E_NEW(Evry_Plugin, 1); - p->name = "Windows"; - p->type = type_subject; - p->type_in = "NONE"; - p->type_out = "BORDER"; - p->need_query = 0; - p->fetch = &_fetch; - /* p->action = &_action; */ - p->cleanup = &_cleanup; - p->icon_get = &_item_icon_get; - evry_plugin_register(p); - - return EINA_TRUE; -} - static void -_shutdown(void) +_item_add(Evry_Plugin *p, E_Border *bd, int prio) { - evry_plugin_unregister(p); - E_FREE(p); + Evry_Item *it; + + it = evry_item_new(p, e_border_name_get(bd)); + + /* e_object_ref(E_OBJECT(bd)); */ + it->data[0] = bd; + it->priority = prio; + + p->items = eina_list_append(p->items, it); } +/* TODO sort by focus history and name? */ +static int +_cb_sort(const void *data1, const void *data2) +{ + const Evry_Item *it1, *it2; + + it1 = data1; + it2 = data2; + + return (it1->priority - it2->priority); +} static void _cleanup(Evry_Plugin *p) @@ -118,7 +106,7 @@ _fetch(Evry_Plugin *p, const char *input) } static Evas_Object * -_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) { Evas_Object *o = NULL; E_Border *bd = it->data[0]; @@ -155,29 +143,30 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) return o; } +static Eina_Bool +_init(void) +{ + p = E_NEW(Evry_Plugin, 1); + p->name = "Windows"; + p->type = type_subject; + p->type_in = "NONE"; + p->type_out = "BORDER"; + p->need_query = 0; + p->fetch = &_fetch; + /* p->action = &_action; */ + p->cleanup = &_cleanup; + p->icon_get = &_item_icon_get; + evry_plugin_register(p); + + return EINA_TRUE; +} + static void -_item_add(Evry_Plugin *p, E_Border *bd, int prio) +_shutdown(void) { - Evry_Item *it; - - it = evry_item_new(p, e_border_name_get(bd)); - - /* e_object_ref(E_OBJECT(bd)); */ - it->data[0] = bd; - it->priority = prio; - - p->items = eina_list_append(p->items, it); -} - -/* TODO sort by focus history and name? */ -static int -_cb_sort(const void *data1, const void *data2) -{ - const Evry_Item *it1, *it2; - - it1 = data1; - it2 = data2; - - return (it1->priority - it2->priority); + evry_plugin_unregister(p); + E_FREE(p); } +EINA_MODULE_INIT(_init); +EINA_MODULE_SHUTDOWN(_shutdown); diff --git a/src/modules/everything/evry_plug_border_act.c b/src/modules/everything/evry_plug_border_act.c index 282035a28..65c7b9a42 100644 --- a/src/modules/everything/evry_plug_border_act.c +++ b/src/modules/everything/evry_plug_border_act.c @@ -62,7 +62,7 @@ _act_cb_border_unminimize(E_Border *bd) } static int -_begin(Evry_Plugin *p __UNUSED__, Evry_Item *item) +_begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item) { E_Border *bd; @@ -165,7 +165,7 @@ _fetch(Evry_Plugin *p, const char *input __UNUSED__) } static int -_action(Evry_Plugin *p __UNUSED__, Evry_Item *item, const char *input __UNUSED__) +_action(Evry_Plugin *p __UNUSED__, const Evry_Item *item, const char *input __UNUSED__) { void (*border_action) (E_Border *bd); border_action = item->data[0]; @@ -175,7 +175,7 @@ _action(Evry_Plugin *p __UNUSED__, Evry_Item *item, const char *input __UNUSED__ } static Evas_Object * -_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) { Evas_Object *o; diff --git a/src/modules/everything/evry_plug_calc.c b/src/modules/everything/evry_plug_calc.c index 8d3386a6c..433b8657b 100644 --- a/src/modules/everything/evry_plug_calc.c +++ b/src/modules/everything/evry_plug_calc.c @@ -17,7 +17,7 @@ static int error = 0; static int -_begin(Evry_Plugin *p, Evry_Item *it __UNUSED__) +_begin(Evry_Plugin *p, const Evry_Item *it __UNUSED__) { data_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _cb_data, p); @@ -54,7 +54,7 @@ _cleanup(Evry_Plugin *p) } static int -_action(Evry_Plugin *p, Evry_Item *it, const char *input __UNUSED__) +_action(Evry_Plugin *p, const Evry_Item *it, const char *input __UNUSED__) { if (p->items) { diff --git a/src/modules/everything/evry_plug_clipboard.c b/src/modules/everything/evry_plug_clipboard.c index bffb77052..25688e3a0 100644 --- a/src/modules/everything/evry_plug_clipboard.c +++ b/src/modules/everything/evry_plug_clipboard.c @@ -5,14 +5,14 @@ static Evry_Action *act; static Ecore_X_Window clipboard_win = 0; static int -_action(Evry_Action *act __UNUSED__, Evry_Item *it, Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) +_action(Evry_Action *act __UNUSED__, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) { ecore_x_selection_primary_set(clipboard_win, it->label, strlen(it->label)); ecore_x_selection_clipboard_set(clipboard_win, it->label, strlen(it->label)); } static int -_check_item(Evry_Action *act __UNUSED__, Evry_Item *it) +_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) { return (it && it->label && (strlen(it->label) > 0)); } diff --git a/src/modules/everything/evry_plug_config.c b/src/modules/everything/evry_plug_config.c index bf09eb66d..50ded555a 100644 --- a/src/modules/everything/evry_plug_config.c +++ b/src/modules/everything/evry_plug_config.c @@ -83,7 +83,7 @@ _fetch(Evry_Plugin *p, const char *input) } static Evas_Object * -_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) { Evas_Object *o = NULL; E_Configure_It *eci = it->data[0]; @@ -102,7 +102,7 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) } static int -_action(Evry_Action *act, Evry_Item *it, Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) +_action(Evry_Action *act, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) { E_Configure_It *eci, *eci2; E_Container *con; diff --git a/src/modules/everything/evry_plug_dir_browse.c b/src/modules/everything/evry_plug_dir_browse.c index 66932bd3a..8cf8bb058 100644 --- a/src/modules/everything/evry_plug_dir_browse.c +++ b/src/modules/everything/evry_plug_dir_browse.c @@ -15,13 +15,13 @@ struct _State Eina_Bool command; }; -static Evry_Plugin *p; +static Evry_Plugin *p1; static Evry_Plugin *p2; static Ecore_Idler *idler = NULL; static Evry_Item * -_item_add(const char *directory, const char *file) +_item_add(Evry_Plugin *p, const char *directory, const char *file) { Evry_Item *it = NULL; char buf[4096]; @@ -132,35 +132,17 @@ _dirbrowse_idler(void *data) } static int -_begin(Evry_Plugin *p, Evry_Item *it) +_begin(Evry_Plugin *p, const Evry_Item *it) { State *s; char *file; Eina_List *files; Eina_List *stack = p->private; - if (stack) - { - s = stack->data; - /* if (s->command) evry_clear_input(); */ - } - - if (it) - { - if (!it->uri || !ecore_file_is_dir(it->uri)) - return 0; - - s = E_NEW(State, 1); - s->directory = eina_stringshare_add(it->uri); - p->items = NULL; - } - else - { - s = E_NEW(State, 1); - s->directory = eina_stringshare_add(e_user_homedir_get()); - p->items = NULL; - } - + s = E_NEW(State, 1); + s->directory = eina_stringshare_add(e_user_homedir_get()); + p->items = NULL; + files = ecore_file_ls(s->directory); EINA_LIST_FREE(files, file) @@ -173,7 +155,7 @@ _begin(Evry_Plugin *p, Evry_Item *it) continue; } - it = _item_add(s->directory, file); + it = _item_add(p, s->directory, file); if (it) s->items = eina_list_append(s->items, it); @@ -185,13 +167,59 @@ _begin(Evry_Plugin *p, Evry_Item *it) ecore_idler_del(idler); idler = ecore_idler_add(_dirbrowse_idler, p); - + stack = eina_list_prepend(stack, s); p->private = stack; return 1; } +static int +_browse(Evry_Plugin *p, const Evry_Item *it_file) +{ + State *s; + char *file; + Eina_List *files; + Evry_Item *it; + Eina_List *stack = p->private; + + if (!it_file || !it_file->uri || !ecore_file_is_dir(it_file->uri)) + return 0; + + s = E_NEW(State, 1); + s->directory = eina_stringshare_add(it_file->uri); + /* previous states items are saved in s->items !*/ + p->items = NULL; + + files = ecore_file_ls(s->directory); + + EINA_LIST_FREE(files, file) + { + it = NULL; + + if (file[0] == '.') + { + free(file); + continue; + } + + it = _item_add(p, s->directory, file); + + if (it) + s->items = eina_list_append(s->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; +} + static void _cleanup(Evry_Plugin *p) { @@ -220,15 +248,15 @@ _cleanup(Evry_Plugin *p) E_FREE(s); - eina_list_free(p->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; } } @@ -243,13 +271,13 @@ _fetch(Evry_Plugin *p, const char *input) char match2[4096]; int cnt = 0; State *s = ((Eina_List *)p->private)->data; - + if (!s->command) { if (p->items) eina_list_free(p->items); p->items = NULL; } - + /* input is command ? */ if (input) { @@ -343,6 +371,7 @@ _fetch(Evry_Plugin *p, const char *input) } } + s->cur = p->items; if (p->items) { p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); @@ -354,13 +383,13 @@ _fetch(Evry_Plugin *p, const char *input) } static Evas_Object * -_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) { Evas_Object *o = NULL; char *icon_path; if (!it->mime) - _item_fill(it); + _item_fill((Evry_Item *)it); if (!it->mime) return NULL; @@ -390,17 +419,18 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) static Eina_Bool _init(void) { - p = E_NEW(Evry_Plugin, 1); - p->name = "Files"; - p->type = type_subject; - p->type_in = "NONE|FILE"; - p->type_out = "FILE"; - p->browseable = EINA_TRUE; - p->begin = &_begin; - p->fetch = &_fetch; - p->cleanup = &_cleanup; - p->icon_get = &_item_icon_get; - evry_plugin_register(p); + p1 = E_NEW(Evry_Plugin, 1); + p1->name = "Files"; + p1->type = type_subject; + p1->type_in = "NONE|FILE"; + p1->type_out = "FILE"; + p1->browseable = EINA_TRUE; + p1->begin = &_begin; + p1->browse = &_browse; + p1->fetch = &_fetch; + p1->cleanup = &_cleanup; + p1->icon_get = &_item_icon_get; + evry_plugin_register(p1); p2 = E_NEW(Evry_Plugin, 1); p2->name = "Files"; @@ -409,6 +439,7 @@ _init(void) p2->type_out = "FILE"; p2->browseable = EINA_TRUE; p2->begin = &_begin; + p2->browse = &_browse; p2->fetch = &_fetch; p2->cleanup = &_cleanup; p2->icon_get = &_item_icon_get; @@ -420,9 +451,9 @@ _init(void) static void _shutdown(void) { - evry_plugin_unregister(p); + evry_plugin_unregister(p1); evry_plugin_unregister(p2); - E_FREE(p); + E_FREE(p1); E_FREE(p2); } diff --git a/src/modules/everything/evry_plug_tracker.c b/src/modules/everything/evry_plug_tracker.c index 92ddcae94..bbed4384e 100644 --- a/src/modules/everything/evry_plug_tracker.c +++ b/src/modules/everything/evry_plug_tracker.c @@ -7,19 +7,80 @@ typedef struct _Inst Inst; struct _Inst { - E_DBus_Connection *conn; + int active; + char *condition; + char *service; + Eina_List *items; }; -static Evry_Plugin *p1; -static Evry_Plugin *p2; -static Inst *inst; -static Eina_Bool active = EINA_FALSE; +static E_DBus_Connection *conn = NULL; + +static Evry_Plugin *p1 = NULL; +static Evry_Plugin *p2 = NULL; +static Evry_Plugin *p3 = NULL; +static Evry_Plugin *p4 = NULL; + + +static int +_begin(Evry_Plugin *p, const Evry_Item *it) +{ + Inst *inst = p->private; + + inst->active = 0; + + if (!strcmp(it->plugin->type_out, "APPLICATION")) + { + Efreet_Desktop *desktop; + Eina_List *l; + const char *mime; + Evry_App *app = it->data[0]; + char mime_entry[256]; + char rdf_query[32768]; + int len = 0; + + inst->service = "Files"; + if (inst->condition[0]) free (inst->condition); + inst->condition = ""; + + if (!app->desktop || !app->desktop->mime_types) + return 1; + + rdf_query[0] = '\0'; + strcat(rdf_query, ""); + + EINA_LIST_FOREACH(app->desktop->mime_types, l, mime) + { + if (!strcmp(mime, "x-directory/normal")) + return 0; + + snprintf(mime_entry, 256, + "" + "" + "%s " + "", + mime); + + strcat(rdf_query, mime_entry); + len += 256; + if (len > 32000) break; + } + strcat(rdf_query, ""); + + inst->condition = strdup(rdf_query); + } + + return 1; +} static void _item_add(Evry_Plugin *p, char *file, char *mime, int prio) { Evry_Item *it; const char *filename; + int folder = (!strcmp(mime, "Folder")); + + /* folders are specifically searched by p2 and p4 ;) */ + if (folder && ((p == p1) || (p == p3))) return; filename = ecore_file_file_get(file); @@ -29,7 +90,7 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio) it->priority = prio; it->uri = eina_stringshare_add(file); - if (!strcmp(mime, "Folder")) + if (folder) { it->browseable = EINA_TRUE; it->mime = eina_stringshare_add("x-directory/normal"); @@ -40,15 +101,32 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio) p->items = eina_list_append(p->items, it); } + +static void +_cleanup(Evry_Plugin *p) +{ + Evry_Item *it; + Inst *inst = p->private; + + 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; +} + static void _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) { DBusMessageIter array, iter, item; - Evry_Plugin *p; + char *uri, *mime, *date; + Evry_Plugin *p = data; + Inst *inst = p->private; - if (!active) return; - - p = data; + if (inst->active) inst->active--; + if (inst->active) return; if (dbus_error_is_set(error)) { @@ -56,14 +134,16 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) return; } + /* evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_CLEAR); + * _cleanup(p); + * */ + dbus_message_iter_init(msg, &array); if(dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY) { dbus_message_iter_recurse(&array, &item); while(dbus_message_iter_get_arg_type(&item) == DBUS_TYPE_ARRAY) - { - char *uri, *mime; - + { dbus_message_iter_recurse(&item, &iter); if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) @@ -73,11 +153,11 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) /* dbus_message_iter_get_basic(&iter, &service); */ dbus_message_iter_next(&iter); dbus_message_iter_get_basic(&iter, &mime); - - if (uri && mime) - { - _item_add(p, uri, mime, 1); - } + /* dbus_message_iter_next(&iter); + * dbus_message_iter_get_basic(&iter, &date); */ + /* printf("date: %s\n",date); */ + + if (uri && mime) _item_add(p, uri, mime, 1); } dbus_message_iter_next(&item); } @@ -86,62 +166,77 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_ADD); } -static void -_cleanup(Evry_Plugin *p) -{ - Evry_Item *it; - - 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; - active = EINA_FALSE; -} - static int _fetch(Evry_Plugin *p, const char *input) { + Inst *inst = p->private; DBusMessage *msg; DBusMessageIter iter; int live_query_id = 0; int offset = 0; - int max_hits = 50; - char *service = "Files"; - char *match; + int max_hits = 100; + int sort_descending = 1; + int sort_by_service = 0; + char *search_text; + char *fields[2]; + char *keywords[1]; + char *sort_fields[1]; + fields[0] = "File:Mime"; + fields[1] = "File:Accessed"; + keywords[0] = ""; + sort_fields[0] = ""; - _cleanup(p); + char **_fields = fields; + char **_keywords = keywords; + char **_sort_fields = sort_fields; - if (!input || (strlen(input) < 3)) return 0; - - active = EINA_TRUE; - - match = malloc(sizeof(char) * strlen(input) + 2); - sprintf(match, "%s*", input); + _cleanup(p); + if (!conn) return 0; + /* if (!input || (strlen(input) < 3)) return 0; */ + + if (input && (strlen(input) > 2)) + { + search_text = malloc(sizeof(char) * strlen(input) + 3); + sprintf(search_text, "*%s*", input); + } + else if (p == p2 || p == p4) + { + search_text = ""; + } + else return 0; + + inst->active++; + msg = dbus_message_new_method_call("org.freedesktop.Tracker", "/org/freedesktop/Tracker/Search", "org.freedesktop.Tracker.Search", - "TextDetailed"); + "Query"); + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &live_query_id, + DBUS_TYPE_STRING, &inst->service, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_fields, 1, + DBUS_TYPE_STRING, &search_text, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_keywords, 0, + DBUS_TYPE_STRING, &inst->condition, + DBUS_TYPE_BOOLEAN, &sort_by_service, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_sort_fields, 0, + DBUS_TYPE_BOOLEAN, &sort_descending, + DBUS_TYPE_INT32, &offset, + DBUS_TYPE_INT32, &max_hits, + DBUS_TYPE_INVALID); - dbus_message_iter_init_append(msg, &iter); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &live_query_id); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &service); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &match); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &offset); - dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &max_hits); - e_dbus_message_send(inst->conn, msg, _dbus_cb_reply, -1, p); + e_dbus_message_send(conn, msg, _dbus_cb_reply, -1, p); dbus_message_unref(msg); - free(match); + if (input && (strlen(input) > 2)) + free(search_text); return 0; } static Evas_Object * -_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) { char *icon_path; Evas_Object *o = NULL; @@ -172,9 +267,10 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e) static Eina_Bool _init(void) { - E_DBus_Connection *conn = e_dbus_bus_get(DBUS_BUS_SESSION); - - if (!conn) return 0; + Inst *inst; + conn = e_dbus_bus_get(DBUS_BUS_SESSION); + + if (!conn) return EINA_FALSE; p1 = E_NEW(Evry_Plugin, 1); p1->name = "Find Files"; @@ -185,21 +281,57 @@ _init(void) p1->fetch = &_fetch; p1->cleanup = &_cleanup; p1->icon_get = &_item_icon_get; + inst = E_NEW(Inst, 1); + inst->condition = ""; + inst->service = "Files"; + p1->private = inst; evry_plugin_register(p1); - + p2 = E_NEW(Evry_Plugin, 1); - p2->name = "Find Files"; - p2->type = type_object; + p2->name = "Folders"; + p2->type = type_subject; p2->type_in = "NONE"; p2->type_out = "FILE"; p2->async_query = 1; p2->fetch = &_fetch; p2->cleanup = &_cleanup; p2->icon_get = &_item_icon_get; - evry_plugin_register(p2); - inst = E_NEW(Inst, 1); - inst->conn = conn; + inst->condition = ""; + inst->service = "Folders"; + p2->private = inst; + evry_plugin_register(p2); + + p3 = E_NEW(Evry_Plugin, 1); + p3->name = "Find Files"; + p3->type = type_object; + p3->type_in = "NONE"; + p3->type_out = "FILE"; + p3->async_query = 1; + p3->begin = &_begin; + p3->fetch = &_fetch; + p3->cleanup = &_cleanup; + p3->icon_get = &_item_icon_get; + inst = E_NEW(Inst, 1); + inst->condition = ""; + inst->service = "Files"; + p3->private = inst; + evry_plugin_register(p3); + + p4 = E_NEW(Evry_Plugin, 1); + p4->name = "Folders"; + p4->type = type_object; + p4->type_in = "NONE"; + p4->type_out = "FILE"; + p4->async_query = 1; + p4->fetch = &_fetch; + p4->cleanup = &_cleanup; + p4->icon_get = &_item_icon_get; + inst = E_NEW(Inst, 1); + inst->condition = ""; + inst->service = "Folders"; + p4->private = inst; + evry_plugin_register(p4); return EINA_TRUE; } @@ -207,17 +339,41 @@ _init(void) static void _shutdown(void) { - evry_plugin_unregister(p1); - evry_plugin_unregister(p2); + Inst *inst; + + if (conn) e_dbus_connection_close(conn); - if (p1) E_FREE(p1); - if (p2) E_FREE(p2); - - if (inst) - { - if (inst->conn) - e_dbus_connection_close(inst->conn); + if (p1) + { + evry_plugin_unregister(p1); + inst = p1->private; E_FREE(inst); + E_FREE(p1); + } + + if (p2) + { + evry_plugin_unregister(p2); + inst = p2->private; + E_FREE(inst); + E_FREE(p2); + } + + if (p3) + { + evry_plugin_unregister(p3); + inst = p3->private; + if (inst->condition[0]) free(inst->condition); + E_FREE(inst); + E_FREE(p3); + } + + if (p4) + { + evry_plugin_unregister(p4); + inst = p4->private; + E_FREE(inst); + E_FREE(p4); } }