diff --git a/src/modules/everything/Makefile.am b/src/modules/everything/Makefile.am index 568d5c5c0..2e1b4c1e3 100644 --- a/src/modules/everything/Makefile.am +++ b/src/modules/everything/Makefile.am @@ -23,10 +23,12 @@ module_la_SOURCES = e_mod_main.c \ evry.c \ evry.h \ evry_plug_config.c \ + evry_plug_dir_browse.c \ evry_plug_apps.c \ evry_plug_tracker.c \ evry_plug_border.c \ - evry_plug_dir_browse.c + evry_plug_border_act.c + module_la_LIBADD = @e_libs@ @dlopen_libs@ module_la_LDFLAGS = -module -avoid-version diff --git a/src/modules/everything/e_mod_main.c b/src/modules/everything/e_mod_main.c index b9fd42a9a..81a76e711 100644 --- a/src/modules/everything/e_mod_main.c +++ b/src/modules/everything/e_mod_main.c @@ -70,11 +70,12 @@ e_modapi_init(E_Module *m) conf_module = m; evry_init(); - evry_plug_border_init(); - evry_plug_apps_init(); evry_plug_config_init(); evry_plug_dir_browse_init(); + evry_plug_apps_init(); evry_plug_tracker_init(); + evry_plug_border_init(); + evry_plug_border_act_init(); /* add module supplied action */ act = e_action_add("everything"); @@ -109,11 +110,12 @@ e_modapi_shutdown(E_Module *m) act = NULL; } - evry_plug_border_shutdown(); - evry_plug_apps_shutdown(); evry_plug_config_shutdown(); evry_plug_dir_browse_shutdown(); + evry_plug_apps_shutdown(); evry_plug_tracker_shutdown(); + evry_plug_border_shutdown(); + evry_plug_border_act_shutdown(); evry_shutdown(); conf_module = NULL; diff --git a/src/modules/everything/e_mod_main.h b/src/modules/everything/e_mod_main.h index 0fde9ce92..cf1d60bf0 100644 --- a/src/modules/everything/e_mod_main.h +++ b/src/modules/everything/e_mod_main.h @@ -51,6 +51,9 @@ EAPI int evry_plug_apps_shutdown(void); EAPI int evry_plug_border_init(void); EAPI int evry_plug_border_shutdown(void); +EAPI int evry_plug_border_act_init(void); +EAPI int evry_plug_border_act_shutdown(void); + EAPI int evry_plug_config_init(void); EAPI int evry_plug_config_shutdown(void); diff --git a/src/modules/everything/evry.c b/src/modules/everything/evry.c index 58d55d8cb..986b1a488 100644 --- a/src/modules/everything/evry.c +++ b/src/modules/everything/evry.c @@ -10,15 +10,20 @@ typedef struct _Evry_State Evry_State; struct _Evry_State { + Eina_List *cur_items; Eina_List *cur_plugins; Eina_List *plugins; Evry_Plugin *cur_plugin; Evry_Item *sel_item; + + Eina_List *cur_actions; + Evry_Action *cur_action; + /* Eina_List *sel_items; */ char *input; - + const char *request_type; + Eina_Bool initial; - Eina_Bool get_parameter; /* TODO better name !*/ }; static int _evry_cb_key_down(void *data, int type, void *event); @@ -53,34 +58,42 @@ static int _evry_pop_state(void); static void _evry_plugin_selector_append(Evry_Plugin *p); static int _evry_cb_plugin_sort(const void *data1, const void *data2); +static int _evry_plug_act_select_init(void); +static int _evry_plug_act_select_actions_set(void); +static int _evry_plug_act_select_fetch(const char *input); +static int _evry_plug_act_select_action(Evry_Item *item, const char *input); +static void _evry_plug_act_select_cleanup(void); +static void _evry_plug_act_select_item_icon_get(Evry_Item *it, Evas *e); + + /* local subsystem globals */ static E_Popup *popup = NULL; static Ecore_X_Window input_window = 0; +static Eina_List *handlers = NULL; +static Ecore_Timer *update_timer = NULL; static Evas_Object *o_list = NULL; static Evas_Object *o_main = NULL; static Evas_Object *o_selector = NULL; static Evas_Object *o_selector_frame = NULL; -static Eina_List *handlers = NULL; -static Ecore_Timer *update_timer = NULL; - -static Eina_List *plugins = NULL; -static Evry_State *cur_state = NULL; -static Eina_List *stack = NULL; - -static int ev_last_is_mouse; +static int ev_last_is_mouse; static Evry_Item *item_mouseover = NULL; - static Ecore_Animator *scroll_animator = NULL; static Ecore_Timer *scroll_timer = NULL; static double scroll_align_to; static double scroll_align; - +static Eina_List *plugins = NULL; +static Eina_List *actions = NULL; +static Evry_State *cur_state = NULL; +static Eina_List *stack = NULL; +static Evry_Plugin *action_selector = NULL; /* externally accessible functions */ EAPI int evry_init(void) { + _evry_plug_act_select_init(); + return 1; } @@ -92,19 +105,33 @@ evry_shutdown(void) } EAPI void -evry_plugin_register(Evry_Plugin_Class *plugin) +evry_plugin_register(Evry_Plugin *plugin) { plugins = eina_list_append(plugins, plugin); /* TODO sorting, initialization, etc */ } EAPI void -evry_plugin_unregister(Evry_Plugin_Class *plugin) +evry_plugin_unregister(Evry_Plugin *plugin) { plugins = eina_list_remove(plugins, plugin); /* cleanup */ } +EAPI void +evry_action_register(Evry_Action *action) +{ + actions = eina_list_append(actions, action); + /* TODO sorting, initialization, etc */ +} + +EAPI void +evry_action_unregister(Evry_Action *action) +{ + actions = eina_list_remove(actions, action); + /* cleanup */ +} + EAPI int evry_show(E_Zone *zone) { @@ -209,7 +236,7 @@ evry_hide(void) free(s->input); EINA_LIST_FREE(s->plugins, p) - p->class->free(p); + p->cleanup(); } stack = NULL; cur_state = NULL; @@ -255,7 +282,7 @@ evry_hide(void) EAPI void -evry_plugin_async_update(Evry_Plugin *plugin, int state) +evry_plugin_async_update(Evry_Plugin *p, int state) { Evry_State *s; @@ -263,18 +290,23 @@ evry_plugin_async_update(Evry_Plugin *plugin, int state) s = cur_state; - if (!eina_list_data_find(s->cur_plugins, plugin)) + if (!eina_list_data_find(s->cur_plugins, p)) { - s->cur_plugins = eina_list_append(s->cur_plugins, plugin); - _evry_plugin_selector_append(plugin); + s->cur_plugins = eina_list_append(s->cur_plugins, p); + _evry_plugin_selector_append(p); + } + else + { + char buf[64]; + snprintf(buf, 64, "%s (%d)", p->name, eina_list_count(p->items)); + edje_object_part_text_set(p->tab, "e.text.label", buf); + } + + if (!s->cur_plugin && s->cur_plugins) + { + _evry_list_clear(); + _evry_show_items(s->cur_plugins->data); } - - if (s->cur_plugin && eina_list_data_find(s->cur_plugins, s->cur_plugin)) - _evry_show_items(s->cur_plugin); - else if (!s->cur_plugin && s->cur_plugins) - _evry_show_items(s->cur_plugins->data); - else if (s->cur_plugins && !eina_list_data_find(s->cur_plugins, s->cur_plugin)) - _evry_show_items(s->cur_plugins->data); } /* local subsystem functions */ @@ -283,7 +315,7 @@ _evry_cb_plugin_sort(const void *data1, const void *data2) { const Evry_Plugin *p1 = data1; const Evry_Plugin *p2 = data2; - return p1->class->prio - p2->class->prio; + return p1->prio - p2->prio; } @@ -292,43 +324,67 @@ _evry_push_state(void) { Evry_State *s; Eina_List *l, *list = NULL; - Evry_Plugin_Class *pc; - const char *expect_type = "NONE"; + const char *cur_type = "NONE"; Evry_Plugin *p; s = cur_state; if (s) { - expect_type = s->cur_plugin->class->type_out; - if (!strcmp(expect_type, "NONE") || !s->sel_item) + if (!s->cur_plugin || !s->sel_item) return 0; + + cur_type = s->cur_plugin->type_out; + /* current plugin provides no candidates to act on by others */ + if (!s->cur_action && !strcmp(cur_type, "NONE")) + return 0; + + EINA_LIST_FOREACH(s->plugins, l, p) + if (p != s->cur_plugin) + p->cleanup(); } - - EINA_LIST_FOREACH(plugins, l, pc) + + EINA_LIST_FOREACH(plugins, l, p) { - if (strstr(pc->type_in, expect_type)) + if (strstr(p->type_in, cur_type)) { - p = pc->new(); - - if (!p) continue; - - if (cur_state && p->begin) + /* printf("%s- in:%s out:%s\n", p->name, p->type_in, p->type_out); */ + + if (s && s->cur_action) { - if (p->begin(p, cur_state->sel_item)) + /* filter out plugins that dont provide the type + requested by current action */ + if (strcmp(p->type_out, s->request_type)) + continue; + } + + if (p->begin) + { + Evry_Item *sel_item = NULL; + + if (s && (s->cur_plugin != action_selector)) + sel_item = s->sel_item; + + if (p->begin(sel_item)) list = eina_list_append(list, p); - else - p->class->free(p); } else list = eina_list_append(list, p); } } + if (s && !s->cur_action) + { + if (_evry_plug_act_select_actions_set()) + { + list = eina_list_append(list, action_selector); + } + } + if (!list) return 0; list = eina_list_sort(list, eina_list_count(list), _evry_cb_plugin_sort); - + _evry_list_clear(); if (s) @@ -346,7 +402,17 @@ _evry_push_state(void) s->plugins = list; s->cur_plugins = NULL; s->sel_item = NULL; - s->initial = (cur_state ? 0 : 1); + if (cur_state) + { + s->request_type = cur_state->request_type; + s->cur_action = cur_state->cur_action; + s->initial = 0; + } + else + { + s->initial = 1; + } + cur_state = s; stack = eina_list_prepend(stack, s); @@ -366,7 +432,9 @@ _evry_pop_state(void) Evry_State *s = cur_state; Evry_Plugin *p; Eina_List *l; - + + if (!stack || !stack->next) return 0; + _evry_list_clear(); EINA_LIST_FREE(s->cur_plugins, p) @@ -378,7 +446,7 @@ _evry_pop_state(void) free(s->input); EINA_LIST_FOREACH(s->plugins, l, p) - p->class->free(p); + p->cleanup(); E_FREE(s); @@ -386,42 +454,65 @@ _evry_pop_state(void) if (stack) { + Evry_Item *it = NULL; + int i = 0; + s = stack->data; cur_state = s; + if (s->cur_plugin && s->cur_plugin == action_selector) + { + _evry_pop_state(); + return 0; + } + edje_object_part_text_set(o_main, "e.text.label", s->input); - EINA_LIST_FOREACH(s->cur_plugins, l, p) - _evry_plugin_selector_append(p); - - _evry_show_items(s->cur_plugin); - if (s->sel_item) { Evry_Item *it; - int i = 0; - - _evry_item_sel(s->sel_item); - EINA_LIST_FOREACH(s->cur_plugin->items, l, it) if (it == s->sel_item) break; else i++; - + } + + if (stack->next) + { + Evry_State *prev = stack->next->data; + it = prev->sel_item; + } + + EINA_LIST_FOREACH(s->plugins, l, p) + if (p != s->cur_plugin && p->begin) + p->begin(it); + + _evry_matches_update(); + + it = eina_list_nth(s->cur_plugin->items, i); + + if (it) + { + _evry_item_desel(s->sel_item); + s->sel_item = it; + _evry_item_sel(s->sel_item); _evry_scroll_to(i); } } - else - { - cur_state = NULL; - evry_hide(); - } + + /* else + * { + * cur_state = NULL; + * evry_hide(); + * } */ ev_last_is_mouse = 0; item_mouseover = NULL; + + return 1; } - +/* TODO config options for users preferred keys */ static int _evry_cb_key_down(void *data, int type, void *event) { @@ -437,27 +528,63 @@ _evry_cb_key_down(void *data, int type, void *event) _evry_item_prev(); else if (!strcmp(ev->key, "Down")) _evry_item_next(); + else if (!strcmp(ev->key, "Right") && + ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) || + (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT))) + { + if (s->sel_item) + { + if (!_evry_push_state()) + _evry_action(0); + } + } + /* _evry_plugin_next(); */ + else if (!strcmp(ev->key, "Left") && + ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) || + (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT))) + _evry_pop_state(); + /* _evry_plugin_prev(); */ else if (!strcmp(ev->key, "Right")) _evry_plugin_next(); + /* { + * if (s->sel_item) + * { + * if (!_evry_push_state()) + * _evry_action(0); + * } + * } */ else if (!strcmp(ev->key, "Left")) _evry_plugin_prev(); + /* _evry_pop_state(); */ else if (!strcmp(ev->key, "Return") && (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)) _evry_action(0); else if (!strcmp(ev->key, "Return")) _evry_action(1); + else if (!strcmp(ev->key, "Tab") && + ((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) || + (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT))) + _evry_plugin_prev(); else if (!strcmp(ev->key, "Tab")) { - if (s->sel_item) - _evry_push_state(); + if (s->sel_item) + { + if (!_evry_push_state()) + _evry_action(0); + } } + /* _evry_plugin_next(); */ else if (!strcmp(ev->key, "u") && (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL)) _evry_clear(); else if ((!strcmp(ev->key, "Escape")) || (!strcmp(ev->key, "g") && (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL))) - _evry_pop_state(); + { + if (!_evry_pop_state()) + evry_hide(); + } + else if (!strcmp(ev->key, "BackSpace")) _evry_backspace(); else if (!strcmp(ev->key, "Delete")) @@ -640,18 +767,43 @@ _evry_update_timer(void *data) return 0; } +static void +_evry_clear(void) +{ + if (cur_state->input[0] != 0) + { + cur_state->input[0] = 0; + _evry_update(); + } +} + static void _evry_action(int finished) { Evry_State *s = cur_state; - if (s->cur_plugin && (s->sel_item || s->input)) + if (s->cur_plugin == action_selector) + { + /* set cur_action and start plugins for second parameter (if required)*/ + if (s->sel_item) _evry_plug_act_select_action(s->sel_item, s->input); + + finished = 0; + } + else if (s->cur_action) + { + if (s->sel_item && (!strcmp(s->cur_plugin->type_out, s->request_type))) + { + s->cur_action->thing2 = s->sel_item; + s->cur_action->action(); + } + } + else if (s->cur_plugin && (s->sel_item || s->input)) { if (!s->cur_plugin->action || - !s->cur_plugin->action(s->cur_plugin, s->sel_item, s->input)) + !s->cur_plugin->action(s->sel_item, s->input)) { _evry_push_state(); - finished = 0; + finished = 0; } } else if (s->initial) @@ -661,18 +813,6 @@ _evry_action(int finished) evry_hide(); } -static void -_evry_clear(void) -{ - if (cur_state->input[0] != 0) - { - cur_state->input[0] = 0; - _evry_update(); - if (!update_timer) - update_timer = ecore_timer_add(MATCH_LAG, _evry_update_timer, NULL); - } -} - static void _evry_show_items(Evry_Plugin *p) { @@ -682,8 +822,6 @@ _evry_show_items(Evry_Plugin *p) Evas_Object *o; Evry_State *s = cur_state; - _evry_list_clear(); - if (s->cur_plugin) edje_object_signal_emit(s->cur_plugin->tab, "e,state,unselected", "e"); @@ -691,10 +829,8 @@ _evry_show_items(Evry_Plugin *p) s->sel_item = NULL; s->cur_plugin = p; + s->cur_items = p->items; - /* XXX remove this */ - if (!s->cur_plugin) return; - edje_object_signal_emit(p->tab, "e,state,selected", "e"); evas_event_freeze(popup->evas); @@ -715,7 +851,7 @@ _evry_show_items(Evry_Plugin *p) _evry_cb_item_mouse_out, it); evas_object_show(o); - p->icon_get(p, it, popup->evas); + p->icon_get(it, popup->evas); if (edje_object_part_exists(o, "e.swallow.icons") && it->o_icon) { edje_object_part_swallow(o, "e.swallow.icons", it->o_icon); @@ -768,9 +904,9 @@ _evry_matches_update(void) EINA_LIST_FOREACH(s->plugins, l, p) { if (strlen(s->input) == 0) - items = !p->class->need_query ? p->fetch(p, NULL) : 0; + items = !p->need_query ? p->fetch(NULL) : 0; else - items = p->fetch(p, s->input); + items = p->fetch(s->input); if (!s->initial || (items && eina_list_count(p->items) > 0)) { @@ -782,30 +918,29 @@ _evry_matches_update(void) if (s->cur_plugins) { if (s->cur_plugin && eina_list_data_find(s->cur_plugins, s->cur_plugin)) - { - _evry_show_items(s->cur_plugin); - } + _evry_show_items(s->cur_plugin); else - { - _evry_show_items(s->cur_plugins->data); - } + _evry_show_items(s->cur_plugins->data); + } + else + { + s->cur_plugin = NULL; + s->cur_items = NULL; } - else s->cur_plugin = NULL; } static void _evry_list_clear(void) { Evry_State *s = cur_state; - - if (s && s->cur_plugin) + Evry_Item *it; + Eina_List *l; + + if (s && s->cur_items) { - Evry_Item *it; - Eina_List *l; - evas_event_freeze(popup->evas); e_box_freeze(o_list); - EINA_LIST_FOREACH(s->cur_plugin->items, l, it) + EINA_LIST_FOREACH(s->cur_items, l, it) { evas_object_del(it->o_bg); if (it->o_icon) evas_object_del(it->o_icon); @@ -945,10 +1080,12 @@ _evry_plugin_next(void) if (l && l->next) { + _evry_list_clear(); _evry_show_items(l->next->data); } else if (s->cur_plugin != s->cur_plugins->data) { + _evry_list_clear(); _evry_show_items(s->cur_plugins->data); } } @@ -967,6 +1104,7 @@ _evry_plugin_prev(void) if (l && l->prev) { + _evry_list_clear(); _evry_show_items(l->prev->data); } else @@ -975,6 +1113,7 @@ _evry_plugin_prev(void) if (s->cur_plugin != l->data) { + _evry_list_clear(); _evry_show_items(l->data); } } @@ -1026,23 +1165,123 @@ _evry_plugin_selector_append(Evry_Plugin *p) e_theme_edje_object_set(o, "base/theme/widgets", "e/widgets/toolbar/item"); - snprintf(buf, 64, "%s (%d)", p->class->name, eina_list_count(p->items)); + snprintf(buf, 64, "%s (%d)", p->name, eina_list_count(p->items)); edje_object_part_text_set(o, "e.text.label", buf); edje_object_size_min_calc(o, &mw, &mh); + e_box_freeze(o_selector); e_box_pack_end(o_selector, o); evas_object_show(o); - e_box_pack_options_set(o, - 1, 1, /* fill */ - 0, 0, /* expand */ - 0.5, 0.5, /* align */ - mw, mh, /* min */ - 9999, 9999 /* max */ - ); - + e_box_pack_options_set(o, 1, 1, 0, 0, 0.5, 0.5, mw, mh, 9999, 9999); + e_box_thaw(o_selector); p->tab = o; } + +static int +_evry_plug_act_select_init(void) +{ + Evry_Plugin *p = E_NEW(Evry_Plugin, 1); + p->name = "Select Action"; + p->type_in = "ANY"; + p->type_out = "NONE"; + p->cleanup = &_evry_plug_act_select_cleanup; + p->fetch = &_evry_plug_act_select_fetch; + p->action = &_evry_plug_act_select_action; + p->icon_get = &_evry_plug_act_select_item_icon_get; + action_selector = p; +} + +static int +_evry_plug_act_select_actions_set(void) +{ + Evry_Action *act; + Eina_List *l; + Evry_State *s = cur_state; + Evry_Plugin *p = action_selector; + + _evry_plug_act_select_cleanup(); + + const char *type = s->cur_plugin->type_out; + + EINA_LIST_FOREACH(actions, l, act) + { + if (strstr(act->type_in1, type)) + { + act->thing1 = s->sel_item; + s->cur_actions = eina_list_append(s->cur_actions, act); + } + } + + if (s->cur_actions) return 1; + + return 0; +} + +static int +_evry_plug_act_select_fetch(const char *input) +{ + Evry_Plugin *p = action_selector; + Evry_Action *act; + Eina_List *l; + + EINA_LIST_FOREACH(actions, l, act) + { + Evry_Item *it; + + it = E_NEW(Evry_Item, 1); + it->label = eina_stringshare_add(act->name); + it->data[0] = act; + + p->items = eina_list_append(p->items, it); + } + + if (p->items) return 1; + + return 0; +} + +static int +_evry_plug_act_select_action(Evry_Item *it, const char *input) +{ + Evry_Action *act = it->data[0]; + cur_state->cur_action = act; + + cur_state->request_type = act->type_in2; + + return _evry_push_state(); +} + +static void +_evry_plug_act_select_cleanup(void) +{ + + Evry_Item *it; + Evry_Plugin *p = action_selector; + + EINA_LIST_FREE(p->items, it) + { + eina_stringshare_del(it->label); + E_FREE(it); + } + + eina_list_free(cur_state->cur_actions); + cur_state->cur_actions = NULL; + + p->items = NULL; +} + +static void +_evry_plug_act_select_item_icon_get(Evry_Item *it, Evas *e) +{ + Evry_Action *act = it->data[0]; + + /* if (act->icon_get) + * it->o_icon = act->icon_get(act, e); */ + + +} + diff --git a/src/modules/everything/evry.h b/src/modules/everything/evry.h index c710d83ab..79edbd985 100644 --- a/src/modules/everything/evry.h +++ b/src/modules/everything/evry.h @@ -4,8 +4,6 @@ #ifdef E_TYPEDEFS typedef struct _Evry_Plugin Evry_Plugin; -/* TODO find a better name - Registry ? */ -typedef struct _Evry_Plugin_Class Evry_Plugin_Class; typedef struct _Evry_Item Evry_Item; typedef struct _Evry_Action Evry_Action; typedef struct _Evry_Config Evry_Config; @@ -34,21 +32,19 @@ struct _Evry_Item const char *uri; const char *mime; - - /* set by icon_get plugin method */ - Evas_Object *o_icon; - - /* used by 'everything' for display */ - Evas_Object *o_bg; /* these are only for internally use by plugins */ /* used e.g. as pointer for item data (Efreet_Desktop) or */ /* for internal stuff, like priority hints for sorting, etc */ void *data[4]; int priority; -}; -struct _Evry_Plugin_Class + /* not to be set by plugin! */ + Evas_Object *o_icon; + Evas_Object *o_bg; +}; + +struct _Evry_Plugin { const char *name; @@ -61,46 +57,59 @@ struct _Evry_Plugin_Class /* sync/async ?*/ unsigned char async_query : 1; - /* whether candidates can be shown without input: e.g. borders, history */ - /* if 0 fetch MUST provide all candidates when string is NULL */ + /* whether candidates can be shown without input + * e.g. borders, app history */ unsigned char need_query : 1; - - Evry_Plugin *(*new) (void); - void (*free) (Evry_Plugin *p); - - Evas_Object *(*config_page) (void); - void (*config_apply) (void); - - Eina_List *instances; -}; - - -struct _Evry_Plugin -{ - Evry_Plugin_Class *class; - + /* run when plugin is activated. */ - int (*begin) (Evry_Plugin *p, Evry_Item *item); + int (*begin) (Evry_Item *item); /* get candidates matching string, fills 'candidates' list */ - int (*fetch) (Evry_Plugin *p, const char *input); + int (*fetch) (const char *input); - /* run action with a given candidate - TODO register actions per - candidate type */ - int (*action) (Evry_Plugin *p, Evry_Item *item, const char *input); + /* default action for this plugins items */ + int (*action) (Evry_Item *item, const char *input); /* run before new query and when hiding 'everything' */ - void (*cleanup) (Evry_Plugin *p); + void (*cleanup) (void); - void (*icon_get) (Evry_Plugin *p, Evry_Item *it, Evas *e); + /* TODO return icon */ + void (*icon_get) (Evry_Item *it, Evas *e); /* provide more information for a candidate */ /* int (*candidate_info) (Evas *evas, Evry_Item *item); */ Eina_List *items; + + Evas_Object *(*config_page) (void); + void (*config_apply) (void); + /* for internal use by plugin */ + Eina_List *states; + void *priv; + + /* not to be set by plugin! */ Evas_Object *tab; +}; + +struct _Evry_Action +{ + const char *name; + + const char *type_in1; + const char *type_in2; + const char *type_out; + + Evry_Item *thing1; + Evry_Item *thing2; + + int (*action) (void); + + void (*icon_get) (Evry_Plugin *p, Evry_Item *it, Evas *e); void *priv; + + /* not to be set by plugin! */ + Evas_Object *o_icon; }; struct _Evry_Config @@ -123,8 +132,10 @@ EAPI int evry_shutdown(void); EAPI int evry_show(E_Zone *zone); EAPI void evry_hide(void); -EAPI void evry_plugin_register(Evry_Plugin_Class *pc); -EAPI void evry_plugin_unregister(Evry_Plugin_Class *pc); +EAPI void evry_plugin_register(Evry_Plugin *p); +EAPI void evry_plugin_unregister(Evry_Plugin *p); +EAPI void evry_action_register(Evry_Action *act); +EAPI void evry_action_unregister(Evry_Action *act); EAPI void evry_plugin_async_update(Evry_Plugin *plugin, int state); diff --git a/src/modules/everything/evry_plug_apps.c b/src/modules/everything/evry_plug_apps.c index 78223e971..8b296e147 100644 --- a/src/modules/everything/evry_plug_apps.c +++ b/src/modules/everything/evry_plug_apps.c @@ -6,153 +6,110 @@ typedef struct _Inst Inst; struct _Inst { Eina_Hash *added; - Eina_List *apps; Evry_Item *candidate; }; -static Evry_Plugin *_plug_new(); -static Evry_Plugin *_plug_new2(); -static void _plug_free(Evry_Plugin *p); -static int _begin(Evry_Plugin *p, Evry_Item *item); -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, Efreet_Desktop *desktop, char *file, int prio); +static int _begin(Evry_Item *item); +static int _fetch(const char *input); +static int _action(Evry_Item *item, const char *input); +static void _cleanup(void); +static void _item_add(Efreet_Desktop *desktop, char *file, int prio); static int _cb_sort(const void *data1, const void *data2); -static void _item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e); +static void _item_icon_get(Evry_Item *it, Evas *e); +static int _exec_action(void); + +static Evry_Plugin *p; +static Evry_Action *act; +static Inst *inst; + -static Evry_Plugin_Class class; -static Evry_Plugin_Class class2; EAPI int evry_plug_apps_init(void) { - class.name = "Applications"; - class.type_in = "NONE"; - class.type_out = "APPLICATION"; - class.need_query = 0; - class.new = &_plug_new; - class.free = &_plug_free; - class.prio = 1; - evry_plugin_register(&class); + p = E_NEW(Evry_Plugin, 1); + p->type_in = "NONE|FILE"; + p->type_out = "NONE"; + p->need_query = 0; + p->begin = &_begin; + p->fetch = &_fetch; + p->action = &_action; + p->cleanup = &_cleanup; + p->icon_get = &_item_icon_get; + evry_plugin_register(p); - class2.name = "Open With.."; - class2.type_in = "FILE"; - class2.type_out = "APPLICATION"; - class2.need_query = 0; - class2.new = &_plug_new2; - class2.free = &_plug_free; - class2.prio = 3; - evry_plugin_register(&class2); + act = E_NEW(Evry_Action, 1); + act->name = "Open File..."; + act->type_in1 = "APPLICATION"; + act->type_in2 = "FILE"; + act->type_out = "NONE"; + act->action =_exec_action; + evry_action_register(act); + inst = NULL; + return 1; } EAPI int evry_plug_apps_shutdown(void) { - evry_plugin_unregister(&class); - evry_plugin_unregister(&class2); - + evry_plugin_unregister(p); + evry_action_unregister(act); + return 1; } -static Evry_Plugin * -_plug_new() -{ - Evry_Plugin *p = E_NEW(Evry_Plugin, 1); - p->class = &class; - p->fetch = &_fetch; - p->action = &_action; - p->cleanup = &_cleanup; - p->icon_get = &_item_icon_get; - p->items = NULL; - - Inst *inst = E_NEW(Inst, 1); - inst->added = NULL; - p->priv = inst; - - return p; -} - -static Evry_Plugin * -_plug_new2() -{ - Evry_Plugin *p = E_NEW(Evry_Plugin, 1); - p->class = &class2; - p->begin = &_begin; - p->fetch = &_fetch; - p->action = &_action; - p->cleanup = &_cleanup; - p->icon_get = &_item_icon_get; - p->items = NULL; - - Inst *inst = E_NEW(Inst, 1); - inst->added = NULL; - p->priv = inst; - - return p; -} - -static void -_plug_free(Evry_Plugin *p) -{ - Inst *inst = p->priv; - - _cleanup(p); - if (inst->apps) eina_list_free(inst->apps); - - E_FREE(inst); - E_FREE(p); -} - static int -_begin(Evry_Plugin *p, Evry_Item *it) +_begin(Evry_Item *it) { - Inst *inst; const char *mime; - _cleanup(p); + if (inst) return 0; - if (!it || !it->uri) return 0; - inst = p->priv; - inst->candidate = it; + if (it) + { + p->name = "Open With..."; + p->type_out = "NONE"; + p->prio = 3; + + if (!it->uri) return 0; - if (!it->mime) - mime = efreet_mime_type_get(it->uri); + if (!it->mime) + mime = efreet_mime_type_get(it->uri); + else + mime = it->mime; + + if (!mime) return 0; + + inst = E_NEW(Inst, 1); + inst->candidate = it; + inst->apps = efreet_util_desktop_mime_list(mime); + } else - mime = it->mime; - - if (!mime) return 0; - - /* if (!strcmp(mime, "Folder")) - * { - * apps = - * } - * else */ - - inst->apps = efreet_util_desktop_mime_list(mime); + { + p->name = "Applications"; + p->type_out = "APPLICATION"; + p->prio = 1; + + inst = E_NEW(Inst, 1); + } return 1; } static int -_action(Evry_Plugin *p, Evry_Item *it, const char *input) +_action(Evry_Item *it, const char *input) { E_Zone *zone; Evry_App *app = NULL; Efreet_Desktop *desktop = NULL; Eina_List *files = NULL; - Inst *inst = p->priv; - int ret = 0; if (it) app = it->data[0]; - - if (inst->candidate) - files = eina_list_append(files, inst->candidate->uri); - + if (app && app->desktop) { desktop = app->desktop; @@ -178,22 +135,26 @@ _action(Evry_Plugin *p, Evry_Item *it, const char *input) if (desktop) { + if (inst->candidate) + files = eina_list_append(files, inst->candidate->uri); + zone = e_util_zone_current_get(e_manager_current_get()); e_exec(zone, desktop, NULL, files, NULL /*"everything"*/); if (!it) efreet_desktop_free(desktop); - - ret = 1; + + eina_list_free(files); + + return 1; } - eina_list_free(files); - - return ret; + return 0; } + static void -_cleanup(Evry_Plugin *p) +_list_free(void) { Evry_Item *it; Evry_App *app; @@ -201,15 +162,29 @@ _cleanup(Evry_Plugin *p) EINA_LIST_FREE(p->items, it) { if (it->label) eina_stringshare_del(it->label); - if (it->o_icon) evas_object_del(it->o_icon); app = it->data[0]; free(app); free(it); } } +static void +_cleanup(void) +{ + _list_free(); + + if (inst) + { + eina_list_free(inst->apps); + E_FREE(inst); + } + + inst = NULL; +} + + static int -_fetch(Evry_Plugin *p, const char *input) +_fetch(const char *input) { Eina_List *l; Efreet_Desktop *desktop; @@ -217,16 +192,14 @@ _fetch(Evry_Plugin *p, const char *input) char match1[4096]; char match2[4096]; - Inst *inst = p->priv; - - _cleanup(p); + _list_free(); if (inst->apps) { if (!input) { EINA_LIST_FOREACH(inst->apps, l, desktop) - _item_add(p, desktop, NULL, 1); + _item_add(desktop, NULL, 1); } else { @@ -235,19 +208,20 @@ _fetch(Evry_Plugin *p, const char *input) EINA_LIST_FOREACH(inst->apps, l, desktop) { - if (desktop->name) - { - if (e_util_glob_case_match(desktop->name, match1)) - _item_add(p, desktop, NULL, 1); - else if (e_util_glob_case_match(desktop->name, match2)) - _item_add(p, desktop, NULL, 2); - else if (desktop->comment) - { - if (e_util_glob_case_match(desktop->comment, match1)) - _item_add(p, desktop, NULL, 3); - else if (e_util_glob_case_match(desktop->comment, match2)) - _item_add(p, desktop, NULL, 4); - } + if (e_util_glob_case_match(desktop->exec, match1)) + _item_add(desktop, NULL, 1); + else if (e_util_glob_case_match(desktop->exec, match2)) + _item_add(desktop, NULL, 2); + else if (e_util_glob_case_match(desktop->name, match1)) + _item_add(desktop, NULL, 1); + else if (e_util_glob_case_match(desktop->name, match2)) + _item_add(desktop, NULL, 2); + else if (desktop->comment) + { + if (e_util_glob_case_match(desktop->comment, match1)) + _item_add(desktop, NULL, 3); + else if (e_util_glob_case_match(desktop->comment, match2)) + _item_add(desktop, NULL, 4); } } } @@ -259,28 +233,28 @@ _fetch(Evry_Plugin *p, const char *input) snprintf(match1, sizeof(match1), "%s*", input); l = efreet_util_desktop_exec_glob_list(match1); EINA_LIST_FREE(l, desktop) - _item_add(p, desktop, NULL, 1); + _item_add(desktop, NULL, 1); snprintf(match1, sizeof(match1), "*%s*", input); l = efreet_util_desktop_name_glob_list(match1); EINA_LIST_FREE(l, desktop) - _item_add(p, desktop, NULL, 2); + _item_add(desktop, NULL, 2); // TODO make these optional/configurable l = efreet_util_desktop_generic_name_glob_list(match1); EINA_LIST_FREE(l, desktop) - _item_add(p, desktop, NULL, 3); + _item_add(desktop, NULL, 3); l = efreet_util_desktop_comment_glob_list(match1); EINA_LIST_FREE(l, desktop) - _item_add(p, desktop, NULL, 3); + _item_add(desktop, NULL, 3); } else if (!p->items) { // TODO option for popular/recent l = e_exehist_list_get(); EINA_LIST_FREE(l, file) - _item_add(p, NULL, file, 1); + _item_add(NULL, file, 1); } if (inst->added) @@ -292,9 +266,7 @@ _fetch(Evry_Plugin *p, const char *input) if (p->items) { if (input) - p->items = eina_list_sort(p->items, - eina_list_count(p->items), - _cb_sort); + p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); return 1; } @@ -302,16 +274,27 @@ _fetch(Evry_Plugin *p, const char *input) } static void -_item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int prio) +_item_add(Efreet_Desktop *desktop, char *file, int prio) { Evry_Item *it; Evry_App *app; - Inst *inst = p->priv; Efreet_Desktop *desktop2; if (desktop) - file = desktop->exec; + { + Eina_List *l; + char *cat; + /* ignore screensaver.. */ + EINA_LIST_FOREACH(desktop->categories, l, cat) + { + if (cat && !strcmp(cat, "Screensaver")) + return; + } + + file = desktop->exec; + } + if (!file) return; if (!inst->added) @@ -376,7 +359,7 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int prio) } static void -_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Item *it, Evas *e) { Evry_App *app = it->data[0]; @@ -416,3 +399,22 @@ _cb_sort(const void *data1, const void *data2) else return 0; } + +static int +_exec_action(void) +{ + if (act->thing1 && act->thing2) + { + inst = E_NEW(Inst, 1); + inst->candidate = act->thing2; + + _action(act->thing1, NULL); + + E_FREE(inst); + inst = NULL; + + return 1; + } + + return 0; +} diff --git a/src/modules/everything/evry_plug_border.c b/src/modules/everything/evry_plug_border.c index 070773f6c..da2c95453 100644 --- a/src/modules/everything/evry_plug_border.c +++ b/src/modules/everything/evry_plug_border.c @@ -8,48 +8,29 @@ struct _Inst E_Border *border; }; -static Evry_Plugin * _src_border_new(void); -static void _src_border_free(Evry_Plugin *p); -static int _src_border_fetch(Evry_Plugin *p, const char *input); -static int _src_border_action(Evry_Plugin *p, Evry_Item *item, const char *input); -static void _src_border_cleanup(Evry_Plugin *p); -static void _src_border_item_add(Evry_Plugin *p, E_Border *bd, int prio); -static int _src_border_cb_sort(const void *data1, const void *data2); -static void _src_border_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e); - -static Evry_Plugin * _act_border_new(void); -static void _act_border_free(Evry_Plugin *p); -static int _act_border_begin(Evry_Plugin *p, Evry_Item *item); -static int _act_border_fetch(Evry_Plugin *p, const char *input); -static int _act_border_action(Evry_Plugin *p, Evry_Item *item, const char *input); -static void _act_border_cleanup(Evry_Plugin *p); -static void _act_border_item_add(Evry_Plugin *p, const char *label, void (*action_cb) (E_Border *bd), const char *icon); -static void _act_border_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e); - -static Evry_Plugin_Class source; -static Evry_Plugin_Class action; +static int _fetch(const char *input); +static int _action(Evry_Item *item, const char *input); +static void _cleanup(void); +static void _item_add(E_Border *bd, int prio); +static int _cb_sort(const void *data1, const void *data2); +static void _item_icon_get(Evry_Item *it, Evas *e); +static Evry_Plugin *p; EAPI int evry_plug_border_init(void) { - source.name = "Windows"; - source.type_in = "NONE"; - source.type_out = "BORDER"; - source.need_query = 0; - source.prio = 0; - source.new = &_src_border_new; - source.free = &_src_border_free; - evry_plugin_register(&source); - - action.name = "Window Action"; - action.type_in = "BORDER"; - action.type_out = "NONE"; - action.need_query = 0; - action.prio = 0; - action.new = &_act_border_new; - action.free = &_act_border_free; - evry_plugin_register(&action); + p = E_NEW(Evry_Plugin, 1); + p->name = "Windows"; + p->type_in = "NONE"; + p->type_out = "BORDER"; + p->need_query = 0; + p->prio = 0; + p->fetch = &_fetch; + p->action = &_action; + p->cleanup = &_cleanup; + p->icon_get = &_item_icon_get; + evry_plugin_register(p); return 1; } @@ -57,38 +38,14 @@ evry_plug_border_init(void) EAPI int evry_plug_border_shutdown(void) { - evry_plugin_unregister(&source); - evry_plugin_unregister(&action); - + evry_plugin_unregister(p); + E_FREE(p); + return 1; } -static Evry_Plugin * -_src_border_new() -{ - Evry_Plugin *p; - - p = E_NEW(Evry_Plugin, 1); - p->class = &source; - p->fetch = &_src_border_fetch; - p->action = &_src_border_action; - p->cleanup = &_src_border_cleanup; - p->icon_get = &_src_border_item_icon_get; - p->items = NULL; - - return p; -} - -static void -_src_border_free(Evry_Plugin *p) -{ - _src_border_cleanup(p); - E_FREE(p); -} - - static int -_src_border_action(Evry_Plugin *p, Evry_Item *it, const char *input) +_action(Evry_Item *it, const char *input) { E_Border *bd; E_Zone *zone; @@ -116,7 +73,7 @@ _src_border_action(Evry_Plugin *p, Evry_Item *it, const char *input) } static void -_src_border_cleanup(Evry_Plugin *p) +_cleanup() { Evry_Item *it; @@ -124,13 +81,12 @@ _src_border_cleanup(Evry_Plugin *p) { /* if (it->data[0]) e_object_unref(E_OBJECT(it->data[0])); */ if (it->label) eina_stringshare_del(it->label); - if (it->o_icon) evas_object_del(it->o_icon); free(it); } } static int -_src_border_fetch(Evry_Plugin *p, const char *input) +_fetch(const char *input) { E_Manager *man; E_Zone *zone; @@ -141,7 +97,7 @@ _src_border_fetch(Evry_Plugin *p, const char *input) E_Border *bd; E_Border_List *bl; - _src_border_cleanup(p); + _cleanup(); man = e_manager_current_get(); zone = e_util_zone_current_get(man); @@ -158,25 +114,24 @@ _src_border_fetch(Evry_Plugin *p, const char *input) if (zone == bd->zone) { if (!input) - _src_border_item_add(p, bd, 1); + _item_add(bd, 1); else if (bd->client.icccm.name && e_util_glob_case_match(bd->client.icccm.name, match1)) - _src_border_item_add(p, bd, 1); + _item_add(bd, 1); else if (e_util_glob_case_match(e_border_name_get(bd), match1)) - _src_border_item_add(p, bd, 1); + _item_add(bd, 1); else if (bd->client.icccm.name && e_util_glob_case_match(bd->client.icccm.name, match2)) - _src_border_item_add(p, bd, 2); + _item_add(bd, 2); else if (e_util_glob_case_match(e_border_name_get(bd), match2)) - _src_border_item_add(p, bd, 2); + _item_add(bd, 2); } } e_container_border_list_free(bl); if (eina_list_count(p->items) > 0) { - p->items = eina_list_sort(p->items, eina_list_count(p->items), - _src_border_cb_sort); + p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); return 1; } @@ -184,13 +139,13 @@ _src_border_fetch(Evry_Plugin *p, const char *input) } static void -_src_border_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Item *it, Evas *e) { it->o_icon = e_border_icon_add(((E_Border *)it->data[0]), e); } static void -_src_border_item_add(Evry_Plugin *p, E_Border *bd, int prio) +_item_add(E_Border *bd, int prio) { Evry_Item *it; @@ -205,7 +160,7 @@ _src_border_item_add(Evry_Plugin *p, E_Border *bd, int prio) /* TODO sort by focus history and name? */ static int -_src_border_cb_sort(const void *data1, const void *data2) +_cb_sort(const void *data1, const void *data2) { const Evry_Item *it1, *it2; @@ -215,121 +170,3 @@ _src_border_cb_sort(const void *data1, const void *data2) return (it1->priority - it2->priority); } - - -static Evry_Plugin * -_act_border_new() -{ - Evry_Plugin *p; - Inst *inst; - - p = E_NEW(Evry_Plugin, 1); - p->class = &source; - p->begin = &_act_border_begin; - p->fetch = &_act_border_fetch; - p->action = &_act_border_action; - p->cleanup = &_act_border_cleanup; - p->icon_get = &_act_border_item_icon_get; - p->items = NULL; - - inst = E_NEW(Inst, 1); - p->priv = inst; - - return p; -} - -static void -_act_border_free(Evry_Plugin *p) -{ - Inst *inst = p->priv; - - /* if (inst->border) e_object_unref(E_OBJECT(inst->border)); */ - - _act_border_cleanup(p); - - E_FREE(p); - E_FREE(inst); -} - -static void -_act_cb_border_close(E_Border *bd) -{ - if (!bd->lock_close) e_border_act_close_begin(bd); -} - -static void -_act_cb_border_minimize(E_Border *bd) -{ - if (!bd->lock_user_iconify) e_border_iconify(bd); -} - -static int -_act_border_begin(Evry_Plugin *p, Evry_Item *item) -{ - Inst *inst = p->priv; - E_Border *bd; - - bd = item->data[0]; - /* e_object_ref(E_OBJECT(bd)); */ - inst->border = bd; - - return 1; -} - -static int -_act_border_fetch(Evry_Plugin *p, const char *input) -{ - _act_border_cleanup(p); - - _act_border_item_add(p, _("Iconify"), _act_cb_border_minimize, - "e/widgets/border/default/minimize"); - - _act_border_item_add(p, _("Close"), _act_cb_border_close, - "e/widgets/border/default/close"); - return 1; -} - -static int -_act_border_action(Evry_Plugin *p, Evry_Item *item, const char *input) -{ - Inst *inst = p->priv; - - void (*border_action) (E_Border *bd); - border_action = item->data[0]; - border_action(inst->border); - return 1; -} - -static void -_act_border_cleanup(Evry_Plugin *p) -{ - Evry_Item *it; - - EINA_LIST_FREE(p->items, it) - { - if (it->data[1]) eina_stringshare_del(it->data[1]); - if (it->label) eina_stringshare_del(it->label); - if (it->o_icon) evas_object_del(it->o_icon); - free(it); - } -} - -static void -_act_border_item_add(Evry_Plugin *p, const char *label, void (*action_cb) (E_Border *bd), const char *icon) -{ - Evry_Item *it; - - it = calloc(1, sizeof(Evry_Item)); - it->data[0] = action_cb; - it->data[1] = (void *) eina_stringshare_add(icon); - it->label = eina_stringshare_add(label); - p->items = eina_list_append(p->items, it); -} - -static void -_act_border_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) -{ - it->o_icon = edje_object_add(e); - e_theme_edje_object_set(it->o_icon, "base/theme/borders", (const char *)it->data[1]); -} - diff --git a/src/modules/everything/evry_plug_border_act.c b/src/modules/everything/evry_plug_border_act.c new file mode 100644 index 000000000..b28e2b2d5 --- /dev/null +++ b/src/modules/everything/evry_plug_border_act.c @@ -0,0 +1,131 @@ +#include "e.h" +#include "e_mod_main.h" + +typedef struct _Inst Inst; + +struct _Inst +{ + E_Border *border; +}; + +static int _begin(Evry_Item *item); +static int _fetch(const char *input); +static int _action(Evry_Item *item, const char *input); +static void _cleanup(void); +static void _item_icon_get(Evry_Item *it, Evas *e); +static void _item_add(const char *label, void (*action_cb) (E_Border *bd), const char *icon); + + +static Evry_Plugin *p; +static Inst *inst; + +EAPI int +evry_plug_border_act_init(void) +{ + p = E_NEW(Evry_Plugin, 1); + p->name = "Window Action"; + p->type_in = "BORDER"; + p->type_out = "NONE"; + p->need_query = 0; + p->prio = 0; + p->begin = &_begin; + p->fetch = &_fetch; + p->action = &_action; + p->cleanup = &_cleanup; + p->icon_get = &_item_icon_get; + + evry_plugin_register(p); + + inst = E_NEW(Inst, 1); + + return 1; +} + +EAPI int +evry_plug_border_act_shutdown(void) +{ + evry_plugin_unregister(p); + E_FREE(p); + E_FREE(inst); + + return 1; +} + +static void +_act_cb_border_close(E_Border *bd) +{ + if (!bd->lock_close) e_border_act_close_begin(bd); +} + +static void +_act_cb_border_minimize(E_Border *bd) +{ + if (!bd->lock_user_iconify) e_border_iconify(bd); +} + +static int +_begin(Evry_Item *item) +{ + E_Border *bd; + + bd = item->data[0]; + /* e_object_ref(E_OBJECT(bd)); */ + inst->border = bd; + + return 1; +} + +static int +_fetch(const char *input) +{ + _cleanup(); + + _item_add(_("Iconify"), _act_cb_border_minimize, + "e/widgets/border/default/minimize"); + + _item_add(_("Close"), _act_cb_border_close, + "e/widgets/border/default/close"); + return 1; +} + +static int +_action(Evry_Item *item, const char *input) +{ + void (*border_action) (E_Border *bd); + border_action = item->data[0]; + border_action(inst->border); + return 1; +} + +static void +_cleanup(void) +{ + Evry_Item *it; + + EINA_LIST_FREE(p->items, it) + { + if (it->data[1]) eina_stringshare_del(it->data[1]); + if (it->label) eina_stringshare_del(it->label); + free(it); + } +} + +static void +_item_add(const char *label, void (*action_cb) (E_Border *bd), const char *icon) +{ + Evry_Item *it; + + it = calloc(1, sizeof(Evry_Item)); + it->data[0] = action_cb; + it->data[1] = (void *) eina_stringshare_add(icon); + it->label = eina_stringshare_add(label); + p->items = eina_list_append(p->items, it); +} + +static void +_item_icon_get(Evry_Item *it, Evas *e) +{ + it->o_icon = edje_object_add(e); + e_theme_edje_object_set(it->o_icon, "base/theme/borders", (const char *)it->data[1]); +} + diff --git a/src/modules/everything/evry_plug_config.c b/src/modules/everything/evry_plug_config.c index 2729352bc..08eff4b9d 100644 --- a/src/modules/everything/evry_plug_config.c +++ b/src/modules/everything/evry_plug_config.c @@ -1,59 +1,43 @@ #include "e.h" #include "e_mod_main.h" -static Evry_Plugin_Class class; -static Evry_Plugin *_plug_new(); -static void _plug_free(Evry_Plugin *p); -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_Configure_It *eci, int prio); -static void _item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e); +static int _fetch(const char *input); +static int _action(Evry_Item *item, const char *input); +static void _cleanup(void); +static void _item_add(E_Configure_It *eci, int prio); +static void _item_icon_get(Evry_Item *it, Evas *e); static int _cb_sort(const void *data1, const void *data2); +static Evry_Plugin *p; + EAPI int evry_plug_config_init(void) { - class.name = "Settings"; - class.type_in = "NONE"; - class.type_out = "NONE"; - class.instances = NULL; - class.new = &_plug_new; - class.free = &_plug_free; - evry_plugin_register(&class); + p = E_NEW(Evry_Plugin, 1); + p->name = "Settings"; + p->type_in = "NONE"; + p->type_out = "NONE"; + p->prio = 4; + p->fetch = &_fetch; + p->action = &_action; + p->cleanup = &_cleanup; + p->icon_get = &_item_icon_get; + + evry_plugin_register(p); return 1; } EAPI int evry_plug_config_shutdown(void) { - evry_plugin_unregister(&class); + evry_plugin_unregister(p); + E_FREE(p); return 1; } -static Evry_Plugin * -_plug_new() -{ - Evry_Plugin *p = E_NEW(Evry_Plugin, 1); - p->class = &class; - p->fetch = &_fetch; - p->action = &_action; - p->cleanup = &_cleanup; - p->icon_get = &_item_icon_get; - p->items = NULL; -} - - -static void -_plug_free(Evry_Plugin *p) -{ - _cleanup(p); - E_FREE(p); -} - static int -_action(Evry_Plugin *p, Evry_Item *it, const char *input) +_action(Evry_Item *it, const char *input) { E_Configure_It *eci, *eci2; E_Container *con; @@ -90,20 +74,19 @@ _action(Evry_Plugin *p, Evry_Item *it, const char *input) } static void -_cleanup(Evry_Plugin *p) +_cleanup(void) { Evry_Item *it; EINA_LIST_FREE(p->items, it) { if (it->label) eina_stringshare_del(it->label); - if (it->o_icon) evas_object_del(it->o_icon); free(it); } } static int -_fetch(Evry_Plugin *p, const char *input) +_fetch(const char *input) { E_Manager *man; E_Zone *zone; @@ -114,7 +97,7 @@ _fetch(Evry_Plugin *p, const char *input) E_Configure_Cat *ecat; E_Configure_It *eci; - _cleanup(p); + _cleanup(); snprintf(match1, sizeof(match1), "%s*", input); snprintf(match2, sizeof(match2), "*%s*", input); @@ -130,13 +113,13 @@ _fetch(Evry_Plugin *p, const char *input) if (eci->pri >= 0) { if (e_util_glob_case_match(eci->label, match1)) - _item_add(p, eci, 1); + _item_add(eci, 1); else if (e_util_glob_case_match(eci->label, match2)) - _item_add(p, eci, 2); + _item_add(eci, 2); else if (e_util_glob_case_match(ecat->label, match1)) - _item_add(p, eci, 3); + _item_add(eci, 3); else if (e_util_glob_case_match(ecat->label, match2)) - _item_add(p, eci, 4); + _item_add(eci, 4); } } } @@ -144,9 +127,7 @@ _fetch(Evry_Plugin *p, const char *input) if (eina_list_count(p->items) > 0) { - p->items = eina_list_sort(p->items, - eina_list_count(p->items), - _cb_sort); + p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); return 1; } @@ -154,7 +135,7 @@ _fetch(Evry_Plugin *p, const char *input) } static void -_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Item *it, Evas *e) { E_Configure_It *eci = it->data[0]; Evas_Object *o = NULL; @@ -173,7 +154,7 @@ _item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) } static void -_item_add(Evry_Plugin *p, E_Configure_It *eci, int prio) +_item_add(E_Configure_It *eci, int prio) { Evry_Item *it; @@ -186,8 +167,6 @@ _item_add(Evry_Plugin *p, E_Configure_It *eci, int prio) p->items = eina_list_append(p->items, it); } - -// TODO sort name? static int _cb_sort(const void *data1, const void *data2) { @@ -196,5 +175,7 @@ _cb_sort(const void *data1, const void *data2) it1 = data1; it2 = data2; + /* TODO sort by name? */ + return (it1->priority - it2->priority); } diff --git a/src/modules/everything/evry_plug_dir_browse.c b/src/modules/everything/evry_plug_dir_browse.c index a58cafd0d..574ed42ed 100644 --- a/src/modules/everything/evry_plug_dir_browse.c +++ b/src/modules/everything/evry_plug_dir_browse.c @@ -1,36 +1,40 @@ #include "e.h" #include "e_mod_main.h" -typedef struct _Inst Inst; +typedef struct _State State; -struct _Inst +struct _State { const char *directory; + Eina_List *items; }; -static Evry_Plugin *_plug_new(); -static void _plug_free(Evry_Plugin *p); -static int _begin(Evry_Plugin *p, Evry_Item *item); -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 int _begin(Evry_Item *it); +static int _fetch(const char *input); +static int _action(Evry_Item *it, const char *input); +static void _cleanup(void); static int _cb_sort(const void *data1, const void *data2); -static void _item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e); -static void _list_free(Evry_Plugin *p); +static void _item_icon_get(Evry_Item *it, Evas *e); +static void _list_free(void); static Evry_Item *_item_fill(const char *directory, const char *file); -static Evry_Plugin_Class class; +static Evry_Plugin *p; EAPI int evry_plug_dir_browse_init(void) { - class.name = "Browse Files"; - class.type_in = "NONE|FILE"; - class.type_out = "FILE"; - class.prio = 2; - class.new = &_plug_new; - class.free = &_plug_free; - evry_plugin_register(&class); + p = E_NEW(Evry_Plugin, 1); + p->name = "Browse Files"; + p->type_in = "NONE|FILE"; + p->type_out = "FILE"; + p->prio = 2; + p->begin = &_begin; + p->fetch = &_fetch; + p->action = &_action; + p->cleanup = &_cleanup; + p->icon_get = &_item_icon_get; + + evry_plugin_register(p); return 1; } @@ -38,50 +42,45 @@ evry_plug_dir_browse_init(void) EAPI int evry_plug_dir_browse_shutdown(void) { - evry_plugin_unregister(&class); + evry_plugin_unregister(p); + E_FREE(p); return 1; } -static Evry_Plugin * -_plug_new() +static int +_begin(Evry_Item *it) { - Evry_Plugin *p = E_NEW(Evry_Plugin, 1); - p->class = &class; - p->begin = &_begin; - p->fetch = &_fetch; - p->action = &_action; - p->cleanup = &_cleanup; - p->icon_get = &_item_icon_get; - p->items = NULL; + State *s; + + if (it) + { + if (!it->uri || !ecore_file_is_dir(it->uri)) + return 0; - Inst *inst = E_NEW(Inst, 1); - inst->directory = eina_stringshare_add(e_user_homedir_get()); - p->priv = inst; + s = E_NEW(State, 1); + s->directory = eina_stringshare_add(it->uri); + } + else + { + s = E_NEW(State, 1); + s->directory = eina_stringshare_add(e_user_homedir_get()); + } - return p; + p->states = eina_list_prepend(p->states, s); + p->items = NULL; + + return 1; } -static void -_plug_free(Evry_Plugin *p) -{ - _cleanup(p); - - Inst *inst = p->priv; - eina_stringshare_del(inst->directory); - E_FREE(inst); - E_FREE(p); -} - - static int -_action(Evry_Plugin *p, Evry_Item *item, const char *input) +_action(Evry_Item *it, const char *input) { return 0; } static void -_list_free(Evry_Plugin *p) +_list_free() { Evry_Item *it; @@ -90,7 +89,6 @@ _list_free(Evry_Plugin *p) if (it->label) eina_stringshare_del(it->label); if (it->uri) eina_stringshare_del(it->uri); if (it->mime) eina_stringshare_del(it->mime); - if (it->o_icon) evas_object_del(it->o_icon); free(it); } @@ -98,41 +96,43 @@ _list_free(Evry_Plugin *p) static void -_cleanup(Evry_Plugin *p) +_cleanup() { - _list_free(p); -} - -static int -_begin(Evry_Plugin *p, Evry_Item *item) -{ - Inst *inst = p->priv; + State *s; - if (item->uri && ecore_file_is_dir(item->uri)) - { - eina_stringshare_del(inst->directory); - inst->directory = eina_stringshare_add(item->uri); - - return 1; - } + if (!p->states) return; - return 0; + s = p->states->data; + + _list_free(); + + eina_stringshare_del(s->directory); + + E_FREE(s); + + p->states = eina_list_remove_list(p->states, p->states); + + if (p->states) + { + s = p->states->data; + p->items = s->items; + } } /* based on directory-watcher from drawer module */ static int -_fetch(Evry_Plugin *p, const char *input) +_fetch(const char *input) { Eina_List *files; char *file; Evry_Item *it; char match1[4096]; char match2[4096]; - Inst *inst = p->priv; + State *s = p->states->data; - _list_free(p); + _list_free(); - files = ecore_file_ls(inst->directory); + files = ecore_file_ls(s->directory); if (input) { @@ -144,37 +144,41 @@ _fetch(Evry_Plugin *p, const char *input) { it = NULL; - if (file[0] == '.') goto end; + if (file[0] == '.') + { + free(file); + continue; + } if (input) { if (e_util_glob_case_match(file, match1)) { - it = _item_fill(inst->directory, file); + it = _item_fill(s->directory, file); it->priority += 1; } else if (e_util_glob_case_match(file, match2)) { - it = _item_fill(inst->directory, file); + it = _item_fill(s->directory, file); } } else { - it = _item_fill(inst->directory, file); + it = _item_fill(s->directory, file); } if (it) p->items = eina_list_append(p->items, it); - end: free(file); - } if (eina_list_count(p->items) > 0) { p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort); + s->items = p->items; + return 1; } @@ -236,7 +240,7 @@ _item_fill(const char *directory, const char *file) } static void -_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Item *it, Evas *e) { char *item_path; diff --git a/src/modules/everything/evry_plug_tracker.c b/src/modules/everything/evry_plug_tracker.c index 144ca9ab2..e59c64b0c 100644 --- a/src/modules/everything/evry_plug_tracker.c +++ b/src/modules/everything/evry_plug_tracker.c @@ -10,83 +10,67 @@ struct _Inst E_DBus_Connection *conn; }; -static Evry_Plugin *_plug_new(); -static void _plug_free(Evry_Plugin *p); -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, char *file, char *service, char *mime, int prio); -static void _item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e); +static int _fetch(const char *input); +static int _action(Evry_Item *it, const char *input); +static void _cleanup(void); +static void _item_add(char *file, char *service, char *mime, int prio); +static void _item_icon_get(Evry_Item *it, Evas *e); static void _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error); -static Evry_Plugin_Class class; +static Evry_Plugin *p; +static Inst *inst; EAPI int evry_plug_tracker_init(void) { - class.name = "Search Files"; - class.type_in = "NONE"; - class.type_out = "FILE"; - class.need_query = 1; - class.new = &_plug_new; - class.free = &_plug_free; - evry_plugin_register(&class); + E_DBus_Connection *conn = e_dbus_bus_get(DBUS_BUS_SESSION); + + if (!conn) return 0; + + p = E_NEW(Evry_Plugin, 1); + p->name = "Search Files"; + p->type_in = "NONE"; + p->type_out = "FILE"; + p->need_query = 1; + p->prio = 3; + p->fetch = &_fetch; + p->action = &_action; + p->cleanup = &_cleanup; + p->icon_get = &_item_icon_get; + inst = E_NEW(Inst, 1); + inst->conn = conn; + + evry_plugin_register(p); + return 1; } EAPI int evry_plug_tracker_shutdown(void) { - evry_plugin_unregister(&class); + evry_plugin_unregister(p); + + if (inst) + { + if (inst->conn) + e_dbus_connection_close(inst->conn); + E_FREE(inst); + } + + if (p) E_FREE(p); return 1; } -static Evry_Plugin * -_plug_new() -{ - Evry_Plugin *p; - Inst *inst; - E_DBus_Connection *conn = e_dbus_bus_get(DBUS_BUS_SESSION); - - if (!conn) return NULL; - - p = E_NEW(Evry_Plugin, 1); - p->class = &class; - p->fetch = &_fetch; - p->action = &_action; - p->cleanup = &_cleanup; - p->icon_get = &_item_icon_get; - p->items = NULL; - - inst = E_NEW(Inst, 1); - inst->conn = conn; - p->priv = inst; - - return p; -} - -static void -_plug_free(Evry_Plugin *p) -{ - Inst *inst = p->priv; - - _cleanup(p); - e_dbus_connection_close(inst->conn); - - E_FREE(inst); - E_FREE(p); -} - static int -_action(Evry_Plugin *p, Evry_Item *it, const char *input) +_action(Evry_Item *it, const char *input) { return 0; } static void -_cleanup(Evry_Plugin *p) +_cleanup(void) { Evry_Item *it; @@ -95,13 +79,12 @@ _cleanup(Evry_Plugin *p) if (it->mime) eina_stringshare_del(it->mime); if (it->uri) eina_stringshare_del(it->uri); if (it->label) eina_stringshare_del(it->label); - if (it->o_icon) evas_object_del(it->o_icon); free(it); } } static int -_fetch(Evry_Plugin *p, const char *input) +_fetch(const char *input) { Eina_List *list; DBusMessage *msg; @@ -111,9 +94,8 @@ _fetch(Evry_Plugin *p, const char *input) int max_hits = 50; char *service = "Files"; char *match; - Inst *inst = p->priv; - _cleanup(p); + _cleanup(); match = malloc(sizeof(char) * strlen(input) + 2); sprintf(match, "%s*", input); @@ -129,7 +111,7 @@ _fetch(Evry_Plugin *p, const char *input) 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(inst->conn, msg, _dbus_cb_reply, -1, NULL); dbus_message_unref(msg); free(match); @@ -138,7 +120,7 @@ _fetch(Evry_Plugin *p, const char *input) } static void -_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) +_item_icon_get(Evry_Item *it, Evas *e) { char *item_path; @@ -164,7 +146,7 @@ _item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e) } static void -_item_add(Evry_Plugin *p, char *file, char *service, char *mime, int prio) +_item_add(char *file, char *service, char *mime, int prio) { Evry_Item *it; @@ -183,7 +165,6 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) { DBusMessageIter array, iter, item; char *val; - Evry_Plugin *p = data; if (dbus_error_is_set(error)) { @@ -213,7 +194,7 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error) if (uri && service && mime) { - _item_add(p, uri, service, mime, 1); + _item_add(uri, service, mime, 1); } }