diff --git a/src/modules/everything/Evry.h b/src/modules/everything/Evry.h index d65d1478c..504e9c9a8 100644 --- a/src/modules/everything/Evry.h +++ b/src/modules/everything/Evry.h @@ -58,7 +58,7 @@ struct _Evry_Item Evas_Object *o_icon; Evas_Object *o_bg; int ref; - void (*cb_free) (Evry_Item *item); + void (*free) (Evry_Item *item); }; struct _Evry_Plugin @@ -94,7 +94,7 @@ struct _Evry_Plugin /* int (*candidate_info) (Evas *evas, Evry_Item *item); */ /* optional: default action for this plugins items */ - int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input); + int (*action) (Evry_Plugin *p, const Evry_Item *item); Evas_Object *(*config_page) (Evry_Plugin *p); void (*config_apply) (Evry_Plugin *p); @@ -138,10 +138,10 @@ struct _Evry_View Evas_Object *o_bar; Evry_View *(*create) (Evry_View *view, const Evry_State *s, const Evas_Object *swallow); - void (*destroy) (Evry_View *view); - int (*cb_key_down) (Evry_View *view, const Ecore_Event_Key *ev); - int (*update) (Evry_View *view); - void (*clear) (Evry_View *view); + void (*destroy) (Evry_View *view); + int (*cb_key_down) (Evry_View *view, const Ecore_Event_Key *ev); + int (*update) (Evry_View *view); + void (*clear) (Evry_View *view); int priority; }; @@ -153,21 +153,19 @@ struct _Evry_Action const char *type_in1; const char *type_in2; const char *type_out; + + const Evry_Item *item1; + const Evry_Item *item2; - 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); - + int (*action) (Evry_Action *act); + int (*check_item) (Evry_Action *act, const Evry_Item *it); + int (*intercept) (Evry_Action *act); + void (*cleanup) (Evry_Action *act); Evas_Object *(*icon_get) (Evry_Action *act, Evas *e); /* use icon name from theme */ const char *icon; - Eina_Bool is_default; - - /* only for internal use by plugin */ - void *private; - /* not to be set by plugin! */ Evas_Object *o_icon; }; @@ -209,7 +207,7 @@ EAPI Evry_Plugin *evry_plugin_new(Evry_Plugin *base, const char *name, int type, 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 (*action) (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)); @@ -217,10 +215,13 @@ EAPI Evry_Plugin *evry_plugin_new(Evry_Plugin *base, const char *name, int type, 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 *type_out, +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), + int (*action) (Evry_Action *act), + int (*check_item) (Evry_Action *act, const Evry_Item *it), + void (*cleanup) (Evry_Action *act), + int (*intercept) (Evry_Action *act), Evas_Object *(*icon_get) (Evry_Action *act, Evas *e)); EAPI void evry_action_free(Evry_Action *act); diff --git a/src/modules/everything/e_mod_main.c b/src/modules/everything/e_mod_main.c index f1f77f832..32e7c2032 100644 --- a/src/modules/everything/e_mod_main.c +++ b/src/modules/everything/e_mod_main.c @@ -274,7 +274,7 @@ evry_plugin_new(Evry_Plugin *base, const char *name, int type, 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 (*action) (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)) @@ -331,9 +331,12 @@ evry_plugin_free(Evry_Plugin *p, int free_pointer) 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), +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), int (*check_item) (Evry_Action *act, const Evry_Item *it), + void (*cleanup) (Evry_Action *act), + int (*intercept) (Evry_Action *act), Evas_Object *(*icon_get) (Evry_Action *act, Evas *e)) { Evry_Action *act = E_NEW(Evry_Action, 1); @@ -343,6 +346,8 @@ evry_action_new(const char *name, const char *type_in1, const char *type_in2, co act->type_out = (type_out ? eina_stringshare_add(type_out) : NULL); act->action = action; act->check_item = check_item; + act->intercept = intercept; + act->cleanup = cleanup; act->icon = (icon ? eina_stringshare_add(icon) : NULL); return act; diff --git a/src/modules/everything/evry.c b/src/modules/everything/evry.c index ce8ae4712..4638c5b96 100644 --- a/src/modules/everything/evry.c +++ b/src/modules/everything/evry.c @@ -246,7 +246,7 @@ evry_item_new(Evry_Plugin *p, const char *label, void (*cb_free) (Evry_Item *ite it->plugin = p; if (label) it->label = eina_stringshare_add(label); - if (cb_free) it->cb_free = cb_free; + if (free) it->free = cb_free; it->ref = 1; @@ -269,7 +269,7 @@ evry_item_free(Evry_Item *it) * it->label); * item_cnt--; */ - if (it->cb_free) it->cb_free(it); + if (it->free) it->free(it); if (it->label) eina_stringshare_del(it->label); if (it->uri) eina_stringshare_del(it->uri); @@ -569,7 +569,8 @@ _evry_list_win_new(E_Zone *zone) evas_event_freeze(popup->evas); evas_event_feed_mouse_in(popup->evas, ecore_x_current_time_get(), NULL); - evas_event_feed_mouse_move(popup->evas, -1000000, -1000000, ecore_x_current_time_get(), NULL); + evas_event_feed_mouse_move(popup->evas, -1000000, -1000000, + ecore_x_current_time_get(), NULL); o = edje_object_add(popup->evas); list_win->o_main = o; e_theme_edje_object_set(o, "base/theme/everything", @@ -1380,25 +1381,24 @@ _evry_plugin_action(Evry_Selector *sel, int finished) it_object = selector->state->sel_item; if (act->type_in2 && !it_object) return; - - act->action(act, s_subject->sel_item, it_object, NULL); + + act->item2 = it_object; + + act->action(act); } else { Evry_Item *it = s_action->sel_item; - s_action->plugin->action(s_action->plugin, it, - selector->state->input); + s_action->plugin->action(s_action->plugin, it); } + /* let subject and object plugin know that an action was performed */ if (s_subject->plugin->action) - s_subject->plugin->action(s_subject->plugin, - s_subject->sel_item, - s_subject->input); + s_subject->plugin->action(s_subject->plugin, s_subject->sel_item); if (s_object && s_object->plugin->action) - s_object->plugin->action(s_object->plugin, - s_object->sel_item, - s_object->input); + s_object->plugin->action(s_object->plugin, s_object->sel_item); + if (finished) evry_hide(); } diff --git a/src/modules/everything/evry_plug_actions.c b/src/modules/everything/evry_plug_actions.c index eb1817f94..6cf9e65ff 100644 --- a/src/modules/everything/evry_plug_actions.c +++ b/src/modules/everything/evry_plug_actions.c @@ -37,6 +37,7 @@ _begin(Evry_Plugin *p, const Evry_Item *it) if (act->type_in1 && (act->type_in1 == type) && (!act->check_item || act->check_item(act, it))) { + act->item1 = it; sel->actions = eina_list_append(sel->actions, act); } } diff --git a/src/modules/everything/evry_plug_aggregator.c b/src/modules/everything/evry_plug_aggregator.c index fab7e972b..1be7d8bf5 100644 --- a/src/modules/everything/evry_plug_aggregator.c +++ b/src/modules/everything/evry_plug_aggregator.c @@ -108,10 +108,10 @@ _fetch(Evry_Plugin *plugin, const char *input) } static int -_action(Evry_Plugin *plugin, const Evry_Item *it, const char *input) +_action(Evry_Plugin *plugin, const Evry_Item *it) { if (it->plugin && it->plugin->action) - return it->plugin->action(it->plugin, it, input); + return it->plugin->action(it->plugin, it); return 0; } diff --git a/src/modules/everything/evry_plug_apps.c b/src/modules/everything/evry_plug_apps.c index 983b1de41..86044b858 100644 --- a/src/modules/everything/evry_plug_apps.c +++ b/src/modules/everything/evry_plug_apps.c @@ -383,23 +383,6 @@ _exec_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) return 0; } -static int -_exec_border_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) -{ - E_Border *bd = it->data[0]; - E_OBJECT_CHECK_RETURN(bd, 0); - E_OBJECT_TYPE_CHECK_RETURN(bd, E_BORDER_TYPE, 0); - - if ((bd->desktop && bd->desktop->exec) && - ((strstr(bd->desktop->exec, "%u")) || - (strstr(bd->desktop->exec, "%U")) || - (strstr(bd->desktop->exec, "%f")) || - (strstr(bd->desktop->exec, "%F")))) - return 1; - - return 0; -} - static int _app_action(const Evry_Item *it_app, const Evry_Item *it_file) { @@ -482,26 +465,13 @@ _app_action(const Evry_Item *it_app, const Evry_Item *it_file) } static int -_exec_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input) +_exec_app_action(Evry_Action *act) { - return _app_action(it1, it2); + return _app_action(act->item1, act->item2); } static int -_exec_border_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input) -{ - Evry_Item *it = E_NEW(Evry_Item, 1); - Evry_App *app = E_NEW(Evry_App, 1); - E_Border *bd = it1->data[0]; - - app->desktop = bd->desktop; - it->data[0] = app; - - return _app_action(it, it2); -} - -static int -_open_with_action(Evry_Plugin *plugin, const Evry_Item *it, const char *input __UNUSED__) +_open_with_action(Evry_Plugin *plugin, const Evry_Item *it) { Plugin *p = (Plugin*) plugin; @@ -521,16 +491,13 @@ _edit_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) return 0; } - static int -_edit_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input) +_edit_app_action(Evry_Action *act) { Evry_App *app; Efreet_Desktop *desktop; - if (!it1) return 0; - - app = it1->data[0]; + app = act->item1->data[0]; if (app->desktop) desktop = app->desktop; else @@ -548,7 +515,6 @@ _edit_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, c return 1; } - static int _new_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) { @@ -562,9 +528,8 @@ _new_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) return 0; } - static int -_new_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input) +_new_app_action(Evry_Action *act) { Evry_App *app; char *name; @@ -573,9 +538,7 @@ _new_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, co Efreet_Desktop *desktop; int i; - if (!it1) return 0; - - app = it1->data[0]; + app = act->item1->data[0]; if (app->desktop) name = strdup(app->desktop->name); @@ -621,6 +584,54 @@ _new_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, co return 1; } +static int +_exec_border_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it) +{ + E_Border *bd = it->data[0]; + E_OBJECT_CHECK_RETURN(bd, 0); + E_OBJECT_TYPE_CHECK_RETURN(bd, E_BORDER_TYPE, 0); + + if ((bd->desktop && bd->desktop->exec) && + ((strstr(bd->desktop->exec, "%u")) || + (strstr(bd->desktop->exec, "%U")) || + (strstr(bd->desktop->exec, "%f")) || + (strstr(bd->desktop->exec, "%F")))) + return 1; + + return 0; +} + +static int +_exec_border_action(Evry_Action *act) +{ + return _app_action(act->item1, act->item2); +} + +static int +_exec_border_intercept(Evry_Action *act) +{ + Evry_Item *it = E_NEW(Evry_Item, 1); + Evry_App *app = E_NEW(Evry_App, 1); + E_Border *bd = act->item1->data[0]; + + app->desktop = bd->desktop; + it->data[0] = app; + + act->item1 = it; +} + + +static void +_exec_border_cleanup(Evry_Action *act) +{ + Evry_Item *it = (Evry_Item*) act->item1; + Evry_App *app = it->data[0]; + + E_FREE(app); + E_FREE(it); +} + + static Eina_Bool _init(void) { @@ -640,23 +651,28 @@ _init(void) act = evry_action_new("Launch", "APPLICATION", NULL, NULL, "everything-launch", - _exec_app_action, _exec_app_check_item, NULL); + _exec_app_action, _exec_app_check_item, + NULL, NULL,NULL); act1 = evry_action_new("Open File...", "APPLICATION", "FILE", "APPLICATION", "document-open", - _exec_app_action, _exec_app_check_item, NULL); + _exec_app_action, _exec_app_check_item, + NULL, NULL, NULL); act2 = evry_action_new("Edit Application Entry", "APPLICATION", NULL, NULL, "everything-launch", - _edit_app_action, _edit_app_check_item, NULL); + _edit_app_action, _edit_app_check_item, + NULL, NULL, NULL); act3 = evry_action_new("New Application Entry", "APPLICATION", NULL, NULL, "everything-launch", - _new_app_action, _new_app_check_item, NULL); + _new_app_action, _new_app_check_item, + NULL, NULL, NULL); - act4 = evry_action_new("Open File...", "BORDER", "FILE", NULL, + act4 = evry_action_new("Open File...", "BORDER", "FILE", "APPLICATION", "everything-launch", - _exec_border_action, _exec_border_check_item, NULL); + _exec_border_action, _exec_border_check_item, + _exec_border_cleanup, _exec_border_intercept, NULL); evry_action_register(act); evry_action_register(act1); diff --git a/src/modules/everything/evry_plug_border_act.c b/src/modules/everything/evry_plug_border_act.c index 470adc8a9..3df3cbdba 100644 --- a/src/modules/everything/evry_plug_border_act.c +++ b/src/modules/everything/evry_plug_border_act.c @@ -190,7 +190,7 @@ _fetch(Evry_Plugin *p, const char *input) } static int -_action(Evry_Plugin *p __UNUSED__, const Evry_Item *item, const char *input __UNUSED__) +_action(Evry_Plugin *p __UNUSED__, const Evry_Item *item) { void (*border_action) (E_Border *bd); border_action = item->data[0]; diff --git a/src/modules/everything/evry_plug_calc.c b/src/modules/everything/evry_plug_calc.c index b776b131d..6727d5be4 100644 --- a/src/modules/everything/evry_plug_calc.c +++ b/src/modules/everything/evry_plug_calc.c @@ -94,7 +94,7 @@ _cleanup(Evry_Plugin *p) } static int -_action(Evry_Plugin *p, const Evry_Item *it, const char *input __UNUSED__) +_action(Evry_Plugin *p, const Evry_Item *it) { Eina_List *l; Evry_Item *it2; diff --git a/src/modules/everything/evry_plug_clipboard.c b/src/modules/everything/evry_plug_clipboard.c index 97b5459b2..656e28368 100644 --- a/src/modules/everything/evry_plug_clipboard.c +++ b/src/modules/everything/evry_plug_clipboard.c @@ -5,8 +5,10 @@ static Evry_Action *act; static Ecore_X_Window clipboard_win = 0; static int -_action(Evry_Action *act __UNUSED__, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) +_action(Evry_Action *act) { + const Evry_Item *it = act->item1; + ecore_x_selection_primary_set(clipboard_win, it->label, strlen(it->label)); ecore_x_selection_clipboard_set(clipboard_win, it->label, strlen(it->label)); @@ -26,7 +28,7 @@ _init(void) if (!win) return EINA_FALSE; act = evry_action_new("Copy to Clipboard", "TEXT", NULL, NULL, "edit-copy", - _action, _check_item, NULL); + _action, _check_item, NULL, NULL, NULL); evry_action_register(act); diff --git a/src/modules/everything/evry_plug_config.c b/src/modules/everything/evry_plug_config.c index a605def19..0db855414 100644 --- a/src/modules/everything/evry_plug_config.c +++ b/src/modules/everything/evry_plug_config.c @@ -92,7 +92,7 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e) } static int -_action(Evry_Action *act, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__) +_action(Evry_Action *act) { E_Configure_It *eci, *eci2; E_Container *con; @@ -101,7 +101,7 @@ _action(Evry_Action *act, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, char buf[1024]; int found = 0; - eci = it->data[0]; + eci = act->item1->data[0]; con = e_container_current_get(e_manager_current_get()); EINA_LIST_FOREACH(e_configure_registry, l, ecat) @@ -134,7 +134,7 @@ _init(void) NULL, _cleanup, _fetch, NULL, _item_icon_get, NULL, NULL); act = evry_action_new("Show Dialog", "E_SETTINGS", NULL, NULL, "preferences-advanced", - _action, NULL, NULL); + _action, NULL, NULL, NULL, NULL); evry_plugin_register(p, 10); evry_action_register(act); diff --git a/src/modules/everything/evry_plug_dir_browse.c b/src/modules/everything/evry_plug_dir_browse.c index 83be4e32e..86d2cb54f 100644 --- a/src/modules/everything/evry_plug_dir_browse.c +++ b/src/modules/everything/evry_plug_dir_browse.c @@ -334,8 +334,7 @@ _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) { E_Action *action = e_action_find("fileman"); char *path; @@ -345,16 +344,16 @@ _open_folder_action(Evry_Action *act __UNUSED__, const Evry_Item *it, m = e_manager_list(); - if (!it->browseable) + if (!act->item1->browseable) { - path = ecore_file_dir_get(it->uri); + path = ecore_file_dir_get(act->item1->uri); if (!path) return 0; action->func.go(E_OBJECT(m->data), path); free(path); } else { - action->func.go(E_OBJECT(m->data), it->uri); + action->func.go(E_OBJECT(m->data), act->item1->uri); } return 1; @@ -376,7 +375,7 @@ _init(void) evry_plugin_register(p2, 1); act = evry_action_new("Open Folder (EFM)", "FILE", NULL, NULL, "folder-open", - _open_folder_action, _open_folder_check, NULL); + _open_folder_action, _open_folder_check, NULL, NULL, NULL); evry_action_register(act); diff --git a/src/modules/everything/evry_plug_tracker.c b/src/modules/everything/evry_plug_tracker.c index 4257927c7..223ecd134 100644 --- a/src/modules/everything/evry_plug_tracker.c +++ b/src/modules/everything/evry_plug_tracker.c @@ -29,8 +29,8 @@ _begin(Evry_Plugin *plugin, const Evry_Item *it) p->active = 0; - /* is application */ - if (it->plugin->type_out == plugin->type_in) + /* is APPLICATION ? */ + if (it && it->plugin->type_out == plugin->type_in) { Eina_List *l; const char *mime;