added input_type to plugins:

using it automatically creates an action
 that allows to browse any selected item
 of that type. 

move plugin functions in separate file

text_plugin reuses current item so that it doesnt flicker 
 while typing

use e_fm function for path to uri espace

remove duplicated macros in evry_api.h and e_mod_main.h

fix set usage of exebuf items



SVN revision: 49066
This commit is contained in:
Hannes Janetzek 2010-05-20 15:41:27 +00:00
parent 276fbbb674
commit 66f1ffbefc
13 changed files with 443 additions and 399 deletions

View File

@ -222,14 +222,14 @@ _hist_exe_get_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata
Eina_List *l; Eina_List *l;
Evry_Item_App *app; Evry_Item_App *app;
int match; int match;
const char *exe = key;
char *exe = strdup(key);
EINA_LIST_FOREACH(he->items, l, hi) EINA_LIST_FOREACH(he->items, l, hi)
{ {
app = NULL; app = NULL;
if (strcmp(hi->plugin, EVRY_PLUGIN(p)->name)) if (strcmp(hi->plugin, EVRY_PLUGIN(p)->name))
continue; continue;
if (!p->input) if (!p->input)
@ -241,12 +241,15 @@ _hist_exe_get_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata
app = _item_exe_add(p, exe, match); app = _item_exe_add(p, exe, match);
} }
if (app) EVRY_ITEM(app)->hi = hi; if (app)
{
EVRY_ITEM(app)->hi = hi;
evry->history_item_usage_set(EVRY_ITEM(app), p->input, NULL);
}
break; break;
} }
free(exe);
return EINA_TRUE; return EINA_TRUE;
} }

View File

@ -591,19 +591,14 @@ _begin(Evry_Plugin *plugin, const Evry_Item *it)
{ {
Plugin *p = NULL; Plugin *p = NULL;
if (it && !CHECK_TYPE(it, EVRY_TYPE_ACTION))
return NULL;
if (it) if (it)
{ {
/* provide object */
const char *dir = NULL; const char *dir = NULL;
/* provide object */
GET_ACTION(act, it); if ((CHECK_TYPE(it, EVRY_TYPE_FILE)) ||
if (!strcmp(act->name, "Browse Folder...")) (CHECK_SUBTYPE(it, EVRY_TYPE_FILE)))
{ {
GET_FILE(file, act->it1.item); GET_FILE(file, it);
if (!evry->file_path_get(file)) if (!evry->file_path_get(file))
return NULL; return NULL;
@ -611,10 +606,10 @@ _begin(Evry_Plugin *plugin, const Evry_Item *it)
dir = eina_stringshare_add(tmp); dir = eina_stringshare_add(tmp);
E_FREE(tmp); E_FREE(tmp);
} }
else else return NULL;
{
dir = eina_stringshare_add(e_user_homedir_get()); if (!dir)
} dir = eina_stringshare_add(e_user_homedir_get());
p = E_NEW(Plugin, 1); p = E_NEW(Plugin, 1);
p->base = *plugin; p->base = *plugin;
@ -1207,12 +1202,6 @@ _open_folder_action(Evry_Action *act)
return 1; return 1;
} }
static int
_browse_folder_action(Evry_Action *act)
{
return 0;
}
static int static int
_file_trash_action(Evry_Action *act) _file_trash_action(Evry_Action *act)
{ {
@ -1303,6 +1292,7 @@ _plugins_init(const Evry_API *api)
PLUGIN_NEW(N_("Files"), _module_icon, PLUGIN_NEW(N_("Files"), _module_icon,
_begin, _finish, _fetch); _begin, _finish, _fetch);
p->browse = &_browse; p->browse = &_browse;
p->input_type = EVRY_TYPE_FILE;
if (evry->plugin_register(p, EVRY_PLUGIN_SUBJECT, 2)) if (evry->plugin_register(p, EVRY_PLUGIN_SUBJECT, 2))
p->config->min_query = 1; p->config->min_query = 1;
@ -1357,9 +1347,6 @@ _plugins_init(const Evry_API *api)
* _file_trash_action, NULL); * _file_trash_action, NULL);
* EVRY_ITEM_DATA_INT_SET(act, ACT_DELETE); */ * EVRY_ITEM_DATA_INT_SET(act, ACT_DELETE); */
ACTION_NEW(N_("Browse Folder..."), EVRY_TYPE_FILE, "folder-open",
_browse_folder_action, NULL);
ACTION_NEW(N_("Open Folder (EFM)"), 0, "folder-open", ACTION_NEW(N_("Open Folder (EFM)"), 0, "folder-open",
_open_folder_action, _open_folder_check); _open_folder_action, _open_folder_check);
act->remember_context = EINA_TRUE; act->remember_context = EINA_TRUE;

View File

@ -379,7 +379,7 @@ _plugins_init(const Evry_API *_api)
_actions = eina_list_append(_actions, act); _actions = eina_list_append(_actions, act);
act = EVRY_ACTION_NEW(_("Iconify"), act = EVRY_ACTION_NEW(_("Iconify"),
EVRY_TYPE_BORDER, 0, "iconic", EVRY_TYPE_BORDER, 0, "go-down",
_act_border, _check_border); _act_border, _check_border);
EVRY_ITEM_DATA_INT_SET(act, BORDER_HIDE); EVRY_ITEM_DATA_INT_SET(act, BORDER_HIDE);
_actions = eina_list_append(_actions, act); _actions = eina_list_append(_actions, act);
@ -393,7 +393,7 @@ _plugins_init(const Evry_API *_api)
evry->action_register(act, 4); evry->action_register(act, 4);
act = EVRY_ACTION_NEW(_("Close"), act = EVRY_ACTION_NEW(_("Close"),
EVRY_TYPE_BORDER, 0, "view-fullscreen", EVRY_TYPE_BORDER, 0, "list-remove",
_act_border, _check_border); _act_border, _check_border);
EVRY_ITEM_DATA_INT_SET(act, BORDER_CLOSE); EVRY_ITEM_DATA_INT_SET(act, BORDER_CLOSE);
_actions = eina_list_append(_actions, act); _actions = eina_list_append(_actions, act);

View File

@ -30,6 +30,7 @@ module_la_SOURCES = $(EVRYHEADERS) \
evry_config.c \ evry_config.c \
evry_util.c \ evry_util.c \
evry_history.c \ evry_history.c \
evry_plugin.c \
evry_plug_aggregator.c \ evry_plug_aggregator.c \
evry_plug_actions.c \ evry_plug_actions.c \
evry_view_plugin_tabs.c \ evry_view_plugin_tabs.c \

View File

@ -104,7 +104,7 @@ e_modapi_init(E_Module *m)
{ {
Eina_List *l; Eina_List *l;
Evry_Module *em; Evry_Module *em;
_e_module_evry_log_dom = eina_log_domain_register _e_module_evry_log_dom = eina_log_domain_register
("e_module_everything", EINA_LOG_DEFAULT_COLOR); ("e_module_everything", EINA_LOG_DEFAULT_COLOR);
@ -206,12 +206,12 @@ e_modapi_init(E_Module *m)
SET(history_types_get); SET(history_types_get);
SET(history_item_usage_set); SET(history_item_usage_set);
#undef SET #undef SET
e_datastore_set("everything_loaded", _api); e_datastore_set("everything_loaded", _api);
EINA_LIST_FOREACH(e_datastore_get("everything_modules"), l, em) EINA_LIST_FOREACH(e_datastore_get("everything_modules"), l, em)
em->active = em->init(_api); em->active = em->init(_api);
/* cleanup every hour :) */ /* cleanup every hour :) */
cleanup_timer = ecore_timer_add(3600, _cleanup_history, NULL); cleanup_timer = ecore_timer_add(3600, _cleanup_history, NULL);
@ -225,13 +225,13 @@ e_modapi_shutdown(E_Module *m __UNUSED__)
const char *t; const char *t;
Eina_List *l; Eina_List *l;
Evry_Module *em; Evry_Module *em;
EINA_LIST_FOREACH(e_datastore_get("everything_modules"), l, em) EINA_LIST_FOREACH(e_datastore_get("everything_modules"), l, em)
em->shutdown(); em->shutdown();
e_datastore_del("everything_loaded"); e_datastore_del("everything_loaded");
E_FREE(_api); E_FREE(_api);
evry_shutdown(); evry_shutdown();
view_thumb_shutdown(); view_thumb_shutdown();
@ -352,7 +352,7 @@ _config_init()
evry_conf = E_NEW(Evry_Config, 1); evry_conf = E_NEW(Evry_Config, 1);
evry_conf->version = (MOD_CONFIG_FILE_EPOCH << 16); evry_conf->version = (MOD_CONFIG_FILE_EPOCH << 16);
} }
#define IFMODCFG(v) if ((evry_conf->version & 0xffff) < v) { #define IFMODCFG(v) if ((evry_conf->version & 0xffff) < v) {
#define IFMODCFGEND } #define IFMODCFGEND }
@ -373,13 +373,13 @@ _config_init()
evry_conf->history_sort_mode = 0; evry_conf->history_sort_mode = 0;
evry_conf->first_run = EINA_TRUE; evry_conf->first_run = EINA_TRUE;
IFMODCFGEND; IFMODCFGEND;
IFMODCFG(0x0002); IFMODCFG(0x0002);
evry_conf->width = 435; evry_conf->width = 435;
evry_conf->height = 415; evry_conf->height = 415;
evry_conf->rel_y = 0.40; evry_conf->rel_y = 0.40;
IFMODCFGEND; IFMODCFGEND;
evry_conf->version = MOD_CONFIG_FILE_VERSION; evry_conf->version = MOD_CONFIG_FILE_VERSION;
} }
@ -387,7 +387,7 @@ static void
_plugin_config_free(void) _plugin_config_free(void)
{ {
Plugin_Config *pc; Plugin_Config *pc;
EINA_LIST_FREE(evry_conf->conf_subjects, pc) EINA_LIST_FREE(evry_conf->conf_subjects, pc)
{ {
if (pc->name) eina_stringshare_del(pc->name); if (pc->name) eina_stringshare_del(pc->name);
@ -492,156 +492,6 @@ EAPI int evry_api_version_check(int version)
return 0; return 0;
} }
static int
_evry_cb_plugin_sort(const void *data1, const void *data2)
{
const Plugin_Config *pc1 = data1;
const Plugin_Config *pc2 = data2;
return pc1->priority - pc2->priority;
}
void
_evry_plugin_free(Evry_Item *it)
{
GET_EVRY_PLUGIN(p, it);
evry_plugin_unregister(p);
DBG("%s", p->name);
if (p->config) p->config->plugin = NULL;
if (p->name) eina_stringshare_del(p->name);
if (p->free)
p->free(p);
else
E_FREE(p);
}
EAPI Evry_Plugin *
evry_plugin_new(Evry_Plugin *base, const char *name, const char *label,
const char *icon, Evry_Type item_type,
Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item),
void (*finish) (Evry_Plugin *p),
int (*fetch) (Evry_Plugin *p, const char *input),
void (*cb_free) (Evry_Plugin *p))
{
Evry_Plugin *p;
Evry_Item *it;
if (base)
p = base;
else
p = E_NEW(Evry_Plugin, 1);
it = evry_item_new(EVRY_ITEM(p), NULL, label, NULL, _evry_plugin_free);
it->plugin = p;
it->browseable = EINA_TRUE;
it->type = EVRY_TYPE_PLUGIN;
if (item_type)
it->subtype = item_type;
if (icon)
it->icon = eina_stringshare_add(icon);
p->name = eina_stringshare_add(name);
p->begin = begin;
p->finish = finish;
p->fetch = fetch;
p->async_fetch = EINA_FALSE;
p->history = EINA_TRUE;
p->free = cb_free;
return p;
}
EAPI void
evry_plugin_free(Evry_Plugin *p)
{
evry_item_free(EVRY_ITEM(p));
}
/* TODO make int return */
EAPI int
evry_plugin_register(Evry_Plugin *p, int type, int priority)
{
Eina_List *l;
Plugin_Config *pc;
Eina_List *conf[3];
int i = 0;
int new_conf = 0;
if (type < 0 || type > 2)
return 0;
conf[0] = evry_conf->conf_subjects;
conf[1] = evry_conf->conf_actions;
conf[2] = evry_conf->conf_objects;
EINA_LIST_FOREACH(conf[type], l, pc)
if (pc->name && p->name && !strcmp(pc->name, p->name))
break;
if (!pc)
{
new_conf = 1;
pc = E_NEW(Plugin_Config, 1);
pc->name = eina_stringshare_add(p->name);
pc->enabled = 1;
pc->priority = priority ? priority : 100;
pc->view_mode = VIEW_MODE_NONE;
pc->aggregate = EINA_TRUE;
pc->top_level = EINA_TRUE;
conf[type] = eina_list_append(conf[type], pc);
}
if (pc->trigger && strlen(pc->trigger) == 0)
{
eina_stringshare_del(pc->trigger);
pc->trigger = NULL;
}
p->config = pc;
pc->plugin = p;
conf[type] = eina_list_sort(conf[type], -1, _evry_cb_plugin_sort);
EINA_LIST_FOREACH(conf[type], l, pc)
pc->priority = i++;
evry_conf->conf_subjects = conf[0];
evry_conf->conf_actions = conf[1];
evry_conf->conf_objects = conf[2];
if (type == EVRY_PLUGIN_SUBJECT)
{
char buf[256];
snprintf(buf, sizeof(buf), _("Show %s Plugin"), p->name);
e_action_predef_name_set(_("Everything Launcher"), buf,
"everything", p->name, NULL, 1);
}
return new_conf;
}
EAPI void
evry_plugin_unregister(Evry_Plugin *p)
{
DBG("%s", p->name);
Eina_List *l = evry_conf->conf_subjects;
if (l && eina_list_data_find_list(l, p->config))
{
char buf[256];
snprintf(buf, sizeof(buf), _("Show %s Plugin"), p->name);
e_action_predef_name_del(_("Everything"), buf);
}
}
static int static int
_evry_cb_view_sort(const void *data1, const void *data2) _evry_cb_view_sort(const void *data1, const void *data2)

View File

@ -298,48 +298,12 @@ int evry_browse_back(Evry_Selector *sel);
void evry_plugin_action(int finished); void evry_plugin_action(int finished);
int evry_state_push(Evry_Selector *sel, Eina_List *plugins);
void evry_selectors_switch(int dir);
extern Evry_History *evry_hist; extern Evry_History *evry_hist;
extern Evry_Config *evry_conf; extern Evry_Config *evry_conf;
#define EVRY_ITEM(_item) ((Evry_Item *)_item)
#define EVRY_ACTN(_item) ((Evry_Action *) _item)
#define EVRY_PLUGIN(_plugin) ((Evry_Plugin *) _plugin)
#define EVRY_VIEW(_view) ((Evry_View *) _view)
#define EVRY_FILE(_it) ((Evry_Item_File *) _it)
#define CHECK_TYPE(_item, _type) \
(((Evry_Item *)_item)->type && ((Evry_Item *)_item)->type == _type)
#define CHECK_SUBTYPE(_item, _type) \
(((Evry_Item *)_item)->subtype && ((Evry_Item *)_item)->subtype == _type)
#define IS_BROWSEABLE(_item) \
((Evry_Item *)_item)->browseable
#define GET_APP(_app, _item) Evry_Item_App *_app = (Evry_Item_App *) _item
#define GET_FILE(_file, _item) Evry_Item_File *_file = (Evry_Item_File *) _item
#define GET_EVRY_PLUGIN(_p, _plugin) Evry_Plugin *_p = (Evry_Plugin*) _plugin
#define GET_VIEW(_v, _view) View *_v = (View*) _view
#define GET_ACTION(_act, _item) Evry_Action *_act = (Evry_Action *) _item
#define GET_PLUGIN(_p, _plugin) Plugin *_p = (Plugin*) _plugin
#define GET_ITEM(_it, _any) Evry_Item *_it = (Evry_Item *) _any
#define EVRY_ITEM_DATA_INT_SET(_item, _data) ((Evry_Item *)_item)->data = (void*)(long) _data
#define EVRY_ITEM_DATA_INT_GET(_item) (long) ((Evry_Item *)_item)->data
#define EVRY_ITEM_ICON_SET(_item, _icon) ((Evry_Item *)_item)->icon = _icon
#define EVRY_ITEM_DETAIL_SET(_it, _detail) \
if (EVRY_ITEM(_it)->detail) eina_stringshare_del(EVRY_ITEM(_it)->detail); \
EVRY_ITEM(_it)->detail = eina_stringshare_add(_detail);
#define EVRY_ITEM_LABEL_SET(_it, _label) \
if (EVRY_ITEM(_it)->label) eina_stringshare_del(EVRY_ITEM(_it)->label); \
EVRY_ITEM(_it)->label = eina_stringshare_add(_label);
#define EVRY_ITEM_CONTEXT_SET(_it, _context) \
if (EVRY_ITEM(_it)->context) eina_stringshare_del(EVRY_ITEM(_it)->context); \
EVRY_ITEM(_it)->context = eina_stringshare_add(_context);
#define EVRY_ITEM_NEW(_base, _plugin, _label, _icon_get, _free) \ #define EVRY_ITEM_NEW(_base, _plugin, _label, _icon_get, _free) \
(_base *) evry_item_new(EVRY_ITEM(E_NEW(_base, 1)), EVRY_PLUGIN(_plugin), \ (_base *) evry_item_new(EVRY_ITEM(E_NEW(_base, 1)), EVRY_PLUGIN(_plugin), \
_label, _icon_get, _free) _label, _icon_get, _free)
@ -351,45 +315,23 @@ extern Evry_Config *evry_conf;
evry_plugin_new(EVRY_PLUGIN(E_NEW(_base, 1)), _name, _(_name), _icon, _item_type, \ evry_plugin_new(EVRY_PLUGIN(E_NEW(_base, 1)), _name, _(_name), _icon, _item_type, \
_begin, _cleanup, _fetch, _free) _begin, _cleanup, _fetch, _free)
#define EVRY_ACTION_NEW(_name, _in1, _in2, _icon, _action, _check) \ #define EVRY_ACTION_NEW(_name, _in1, _in2, _icon, _action, _check) \
evry_action_new(_name, _(_name), _in1, _in2, _icon, _action, _check) evry_action_new(_name, _(_name), _in1, _in2, _icon, _action, _check)
#define EVRY_PLUGIN_FREE(_p) \ #define EVRY_PLUGIN_FREE(_p) \
if (_p) evry_plugin_free(EVRY_PLUGIN(_p)) if (_p) evry_plugin_free(EVRY_PLUGIN(_p))
#define EVRY_PLUGIN_UPDATE(_p, _action) \ #define EVRY_PLUGIN_UPDATE(_p, _action) \
if (_p) evry_plugin_update(EVRY_PLUGIN(_p), _action) if (_p) evry_plugin_update(EVRY_PLUGIN(_p), _action)
#define EVRY_PLUGIN_ITEMS_CLEAR(_p) { \
Evry_Item *it; \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \
it->fuzzy_match = 0; }
#define EVRY_PLUGIN_ITEMS_FREE(_p) { \ #define EVRY_PLUGIN_ITEMS_FREE(_p) { \
Evry_Item *it; \ Evry_Item *it; \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \ EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \
evry_item_free(it); } evry_item_free(it); }
#define EVRY_PLUGIN_ITEMS_SORT(_p, _sortcb) \
EVRY_PLUGIN(_p)->items = eina_list_sort \
(EVRY_PLUGIN(_p)->items, eina_list_count(EVRY_PLUGIN(_p)->items), _sortcb)
#define EVRY_PLUGIN_ITEM_APPEND(_p, _item) \
EVRY_PLUGIN(_p)->items = eina_list_append(EVRY_PLUGIN(_p)->items, EVRY_ITEM(_item))
#define EVRY_PLUGIN_ITEMS_ADD(_plugin, _items, _input, _match_detail, _set_usage) \ #define EVRY_PLUGIN_ITEMS_ADD(_plugin, _items, _input, _match_detail, _set_usage) \
evry_util_plugin_items_add(EVRY_PLUGIN(_plugin), _items, _input, _match_detail, _set_usage) evry_util_plugin_items_add(EVRY_PLUGIN(_plugin), _items, _input, _match_detail, _set_usage)
#define IF_RELEASE(x) do { \
if (x) { \
const char *__tmp; __tmp = (x); (x) = NULL; eina_stringshare_del(__tmp); \
} \
(x) = NULL; \
} while (0)
/*** Common Logging ***/ /*** Common Logging ***/
extern int _e_module_evry_log_dom; extern int _e_module_evry_log_dom;

View File

@ -26,11 +26,9 @@ static int _evry_cb_update_timer(void *data);
static Evry_State *_evry_state_new(Evry_Selector *sel, Eina_List *plugins); static Evry_State *_evry_state_new(Evry_Selector *sel, Eina_List *plugins);
static void _evry_state_pop(Evry_Selector *sel); static void _evry_state_pop(Evry_Selector *sel);
static int _evry_selectors_shift(int dir);
static Evry_Selector *_evry_selector_new(Evry_Window *win, int type); static Evry_Selector *_evry_selector_new(Evry_Window *win, int type);
static void _evry_selector_free(Evry_Selector *sel); static void _evry_selector_free(Evry_Selector *sel);
static void _evry_selector_activate(Evry_Selector *sel); static void _evry_selector_activate(Evry_Selector *sel);
static void _evry_selectors_switch(int dir);
static void _evry_selector_update(Evry_Selector *sel); static void _evry_selector_update(Evry_Selector *sel);
static int _evry_selector_subjects_get(const char *plugin_name); static int _evry_selector_subjects_get(const char *plugin_name);
static int _evry_selector_actions_get(Evry_Item *it); static int _evry_selector_actions_get(Evry_Item *it);
@ -40,6 +38,7 @@ static void _evry_selector_item_update(Evry_Selector *sel);
static void _evry_selector_item_clear(Evry_Selector *sel); static void _evry_selector_item_clear(Evry_Selector *sel);
static void _evry_selector_label_set(Evry_Selector *sel, const char *part, const char *label); static void _evry_selector_label_set(Evry_Selector *sel, const char *part, const char *label);
static void _evry_selector_signal_emit(Evry_Selector *sel, const char *msg); static void _evry_selector_signal_emit(Evry_Selector *sel, const char *msg);
static int _evry_selectors_shift(int dir);;
static Evry_Window *_evry_window_new(E_Zone *zone); static Evry_Window *_evry_window_new(E_Zone *zone);
static void _evry_window_free(Evry_Window *win); static void _evry_window_free(Evry_Window *win);
@ -290,9 +289,9 @@ evry_hide(int clear)
if (win->selector != win->selectors[0]) if (win->selector != win->selectors[0])
{ {
if (win->selector == win->selectors[1]) if (win->selector == win->selectors[1])
_evry_selectors_switch(-1); evry_selectors_switch(-1);
else if (win->selector == win->selectors[2]) else if (win->selector == win->selectors[2])
_evry_selectors_switch(1); evry_selectors_switch(1);
} }
/* just to be sure */ /* just to be sure */
@ -663,7 +662,7 @@ evry_plugin_update(Evry_Plugin *p, int action)
(!(s->plugin) || !(s->plugin->items)) && (!(s->plugin) || !(s->plugin->items)) &&
(win->selector == win->selectors[1])) (win->selector == win->selectors[1]))
{ {
_evry_selectors_switch(-1); evry_selectors_switch(-1);
_evry_clear(win->selectors[0]); _evry_clear(win->selectors[0]);
} }
} }
@ -921,11 +920,11 @@ _evry_selector_cb_wheel(void *data, Evas *e, Evas_Object *obj, void *event_info)
{ {
/* FIXME dont loose selector 2 state until state 0 changed: */ /* FIXME dont loose selector 2 state until state 0 changed: */
if (win->selector != win->selectors[2]) if (win->selector != win->selectors[2])
_evry_selectors_switch(1); evry_selectors_switch(1);
} }
else if (ev->z < 0) else if (ev->z < 0)
{ {
_evry_selectors_switch(-1); evry_selectors_switch(-1);
} }
} }
@ -947,22 +946,22 @@ _evry_selector_cb_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
if (sel == win->selectors[0]) if (sel == win->selectors[0])
{ {
if (win->selector == win->selectors[1]) if (win->selector == win->selectors[1])
_evry_selectors_switch(-1); evry_selectors_switch(-1);
else else
_evry_selectors_switch(1); evry_selectors_switch(1);
} }
else if (sel == win->selectors[1]) else if (sel == win->selectors[1])
{ {
if (win->selector == win->selectors[0]) if (win->selector == win->selectors[0])
_evry_selectors_switch(1); evry_selectors_switch(1);
else else
_evry_selectors_switch(-1); evry_selectors_switch(-1);
} }
else if (sel == win->selectors[2]) else if (sel == win->selectors[2])
{ {
if (win->selector == win->selectors[1]) if (win->selector == win->selectors[1])
_evry_selectors_switch(1); evry_selectors_switch(1);
} }
} }
} }
@ -1493,6 +1492,52 @@ _evry_state_pop(Evry_Selector *sel)
sel->state = prev; sel->state = prev;
} }
int
evry_state_push(Evry_Selector *sel, Eina_List *plugins)
{
Evry_State *s, *new_state;
Eina_List *l;
Evry_Plugin *p, *pp;
Evry_View *view = NULL;
int browse_aggregator = 0;
s = sel->state;
if (!(new_state = _evry_state_new(sel, plugins)))
{
DBG("no new state");
return 0;
}
EINA_LIST_FOREACH(plugins, l, p)
p->state = new_state;
if (s && s->view)
{
_evry_view_hide(s->view, 1);
view = s->view;
}
_evry_matches_update(sel, 1);
s = new_state;
_evry_selector_update(sel);
if (view && win->visible)
{
s->view = view->create(view, s, win->o_main);
if (s->view)
{
_evry_view_show(s->view);
s->view->update(s->view, -1);
}
}
_evry_update_text_label(sel->state);
return 1;
}
int int
evry_browse_item(Evry_Item *it) evry_browse_item(Evry_Item *it)
{ {
@ -1613,6 +1658,8 @@ evry_browse_back(Evry_Selector *sel)
s = sel->state; s = sel->state;
_evry_aggregator_fetch(sel, s->input); _evry_aggregator_fetch(sel, s->input);
_evry_selector_update(sel); _evry_selector_update(sel);
if (sel == win->selectors[0])
_evry_selector_update_actions(sel);
_evry_update_text_label(s); _evry_update_text_label(s);
_evry_view_show(s->view); _evry_view_show(s->view);
s->view->update(s->view, 1); s->view->update(s->view, 1);
@ -1620,8 +1667,8 @@ evry_browse_back(Evry_Selector *sel)
return 1; return 1;
} }
static void void
_evry_selectors_switch(int dir) evry_selectors_switch(int dir)
{ {
Evry_State *s = win->selector->state; Evry_State *s = win->selector->state;
@ -1870,7 +1917,7 @@ _evry_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
!((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) || !((ev->modifiers & ECORE_EVENT_MODIFIER_CTRL) ||
(ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT))) (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)))
{ {
_evry_selectors_switch(1); evry_selectors_switch(1);
goto end; goto end;
} }
@ -1934,12 +1981,12 @@ _evry_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
{ {
if (!evry_browse_item(sel->state->cur_item) && if (!evry_browse_item(sel->state->cur_item) &&
(sel != win->selectors[2])) (sel != win->selectors[2]))
_evry_selectors_switch(1); evry_selectors_switch(1);
} }
else if (!strcmp(ev->key, "Left")) else if (!strcmp(ev->key, "Left"))
{ {
if (!evry_browse_back(sel)) if (!evry_browse_back(sel))
_evry_selectors_switch(-1); evry_selectors_switch(-1);
} }
else if (!strcmp(ev->key, "Return")) else if (!strcmp(ev->key, "Return"))
{ {
@ -2180,7 +2227,7 @@ _evry_plugin_action(Evry_Selector *sel, int finished)
if (!it_obj) if (!it_obj)
{ {
if (win->selectors[1] == win->selector) if (win->selectors[1] == win->selector)
_evry_selectors_switch(1); evry_selectors_switch(1);
return; return;
} }
@ -2395,8 +2442,8 @@ _evry_matches_update(Evry_Selector *sel, int async)
if ((!input || !s->trigger_active) && if ((!input || !s->trigger_active) &&
(!win->plugin_dedicated)) (!win->plugin_dedicated))
{ {
EINA_LIST_FREE(s->cur_plugins, p); EINA_LIST_FREE(s->cur_plugins, p);
s->trigger_active = EINA_FALSE; s->trigger_active = EINA_FALSE;
} }
if (s->trigger_active) if (s->trigger_active)
@ -2456,11 +2503,13 @@ _evry_matches_update(Evry_Selector *sel, int async)
{ {
EINA_LIST_FOREACH(s->plugins, l, p) EINA_LIST_FOREACH(s->plugins, l, p)
{ {
if ((p->config->top_level) && (sel == win->selectors[0])) /* skip plugins in toplevel which trigger-only */
{ if ((!(sel->states->next)) &&
if ((p->config->trigger) && (p->config->trigger_only)) (sel == win->selectors[0]) &&
continue; (p->config->top_level) &&
} (p->config->trigger) &&
(p->config->trigger_only))
continue;
/* dont wait for async plugin. use their current items */ /* dont wait for async plugin. use their current items */
if (!async && p->async_fetch && p->items) if (!async && p->async_fetch && p->items)

View File

@ -3,7 +3,7 @@
#include "evry_types.h" #include "evry_types.h"
#define EVRY_API_VERSION 21 #define EVRY_API_VERSION 23
#define EVRY_ACTION_OTHER 0 #define EVRY_ACTION_OTHER 0
#define EVRY_ACTION_FINISHED 1 #define EVRY_ACTION_FINISHED 1
@ -64,7 +64,7 @@ in e_modapi_init do:
in e_modapi_shutdown: in e_modapi_shutdown:
_plugins_shutdown(); _plugins_shutdown();
EVRY_MODULE_UNREGISTER(evry_module); EVRY_MODULE_UNREGISTER(evry_module);
E_FREE(evry_module); E_FREE(evry_module);
@ -81,7 +81,7 @@ struct _Evry_Module
struct _Evry_API struct _Evry_API
{ {
int (*api_version_check)(int version); int (*api_version_check)(int version);
Evry_Item *(*item_new)(Evry_Item *base, Evry_Plugin *p, const char *label, Evry_Item *(*item_new)(Evry_Item *base, Evry_Plugin *p, const char *label,
Evas_Object *(*icon_get) (Evry_Item *it, Evas *e), Evas_Object *(*icon_get) (Evry_Item *it, Evas *e),
void (*cb_free) (Evry_Item *item)); void (*cb_free) (Evry_Item *item));
@ -90,7 +90,7 @@ struct _Evry_API
void (*item_ref)(Evry_Item *it); void (*item_ref)(Evry_Item *it);
/* send EVRY_EVENT_ITEM_CHANGED event */ /* send EVRY_EVENT_ITEM_CHANGED event */
void (*item_changed)(Evry_Item *it, int change_icon, int change_selected); void (*item_changed)(Evry_Item *it, int change_icon, int change_selected);
Evry_Plugin *(*plugin_new)(Evry_Plugin *base, const char *name, Evry_Plugin *(*plugin_new)(Evry_Plugin *base, const char *name,
const char *label, const char *icon, const char *label, const char *icon,
Evry_Type item_type, Evry_Type item_type,
@ -105,7 +105,7 @@ struct _Evry_API
int (*plugin_register)(Evry_Plugin *p, int type, int priority); int (*plugin_register)(Evry_Plugin *p, int type, int priority);
void (*plugin_unregister)(Evry_Plugin *p); void (*plugin_unregister)(Evry_Plugin *p);
void (*plugin_update)(Evry_Plugin *plugin, int state); void (*plugin_update)(Evry_Plugin *plugin, int state);
Evry_Action *(*action_new)(const char *name, const char *label, Evry_Action *(*action_new)(const char *name, const char *label,
Evry_Type type1, Evry_Type type2, Evry_Type type1, Evry_Type type2,
const char *icon, const char *icon,
@ -155,7 +155,6 @@ struct _Evry_Event_Action_Performed
const Evry_Item *it2; const Evry_Item *it2;
}; };
#ifndef EVRY_H
/*** cast default types ***/ /*** cast default types ***/
@ -174,16 +173,6 @@ struct _Evry_Event_Action_Performed
#define GET_PLUGIN(_p, _plugin) Plugin *_p = (Plugin*) _plugin #define GET_PLUGIN(_p, _plugin) Plugin *_p = (Plugin*) _plugin
#define GET_ITEM(_it, _any) Evry_Item *_it = (Evry_Item *) _any #define GET_ITEM(_it, _any) Evry_Item *_it = (Evry_Item *) _any
/*** Evry_Item macros ***/
#define EVRY_ITEM_NEW(_base, _plugin, _label, _icon_get, _free) \
(_base *) evry->item_new(EVRY_ITEM(E_NEW(_base, 1)), EVRY_PLUGIN(_plugin), \
_label, _icon_get, _free)
#define EVRY_ITEM_FREE(_item) evry->item_free((Evry_Item *)_item)
#define EVRY_ITEM_REF(_item) evry->item_ref((Evry_Item *)_item)
#define EVRY_ITEM_DATA_INT_SET(_item, _data) ((Evry_Item *)_item)->data = (void*)(long) _data #define EVRY_ITEM_DATA_INT_SET(_item, _data) ((Evry_Item *)_item)->data = (void*)(long) _data
#define EVRY_ITEM_DATA_INT_GET(_item) (long) ((Evry_Item *)_item)->data #define EVRY_ITEM_DATA_INT_GET(_item) (long) ((Evry_Item *)_item)->data
@ -199,7 +188,7 @@ struct _Evry_Event_Action_Performed
if (EVRY_ITEM(_it)->context) eina_stringshare_del(EVRY_ITEM(_it)->context); \ if (EVRY_ITEM(_it)->context) eina_stringshare_del(EVRY_ITEM(_it)->context); \
EVRY_ITEM(_it)->context = eina_stringshare_add(_context); EVRY_ITEM(_it)->context = eina_stringshare_add(_context);
#define EVRY_ITEM_ICON_SET(_it, _icon) \ #define EVRY_ITEM_ICON_SET(_it, _icon) \
if (EVRY_ITEM(_it)->icon) eina_stringshare_del(EVRY_ITEM(_it)->icon); \ if (EVRY_ITEM(_it)->icon) eina_stringshare_del(EVRY_ITEM(_it)->icon); \
EVRY_ITEM(_it)->icon = eina_stringshare_add(_icon); EVRY_ITEM(_it)->icon = eina_stringshare_add(_icon);
@ -211,14 +200,12 @@ struct _Evry_Event_Action_Performed
#define IS_BROWSEABLE(_item) ((Evry_Item *)_item)->browseable #define IS_BROWSEABLE(_item) ((Evry_Item *)_item)->browseable
#define EVRY_PLUGIN_ITEMS_SORT(_p, _sortcb) \
EVRY_PLUGIN(_p)->items = eina_list_sort \
(EVRY_PLUGIN(_p)->items, eina_list_count(EVRY_PLUGIN(_p)->items), _sortcb)
/*** Evry_Plugin macros ***/ #define EVRY_PLUGIN_ITEM_APPEND(_p, _item) \
EVRY_PLUGIN(_p)->items = eina_list_append(EVRY_PLUGIN(_p)->items, EVRY_ITEM(_item))
#define EVRY_PLUGIN_NEW(_base, _name, _icon, _item_type, _begin, _finish, _fetch, _free) \
evry->plugin_new(EVRY_PLUGIN(E_NEW(_base, 1)), _name, _(_name), _icon, _item_type, \
_begin, _finish, _fetch, _free)
#define EVRY_PLUGIN_FREE(_p) if (_p) evry->plugin_free(EVRY_PLUGIN(_p))
#define EVRY_PLUGIN_INSTANCE(_p, _plugin) { \ #define EVRY_PLUGIN_INSTANCE(_p, _plugin) { \
_p = E_NEW(Plugin, 1); \ _p = E_NEW(Plugin, 1); \
@ -231,33 +218,15 @@ struct _Evry_Event_Action_Performed
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \ EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \
if (it) it->fuzzy_match = 0; } if (it) it->fuzzy_match = 0; }
#define EVRY_PLUGIN_ITEMS_FREE(_p) { \ #define EVRY_MODULE_REGISTER(_module) { \
Evry_Item *it; \ Eina_List *l = e_datastore_get("everything_modules"); \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \ l = eina_list_append(l, _module); \
evry->item_free(it); } e_datastore_set("everything_modules", l); }
#define EVRY_PLUGIN_ITEMS_SORT(_p, _sortcb) \
EVRY_PLUGIN(_p)->items = eina_list_sort \
(EVRY_PLUGIN(_p)->items, eina_list_count(EVRY_PLUGIN(_p)->items), _sortcb)
#define EVRY_PLUGIN_ITEM_APPEND(_p, _item) \
EVRY_PLUGIN(_p)->items = eina_list_append(EVRY_PLUGIN(_p)->items, EVRY_ITEM(_item))
// should be renamed to ITEMS_FILTER
#define EVRY_PLUGIN_ITEMS_ADD(_plugin, _items, _input, _match_detail, _set_usage) \
evry->util_plugin_items_add(EVRY_PLUGIN(_plugin), _items, _input, _match_detail, _set_usage)
#define EVRY_PLUGIN_UPDATE(_p, _action) \
if (_p) evry->plugin_update(EVRY_PLUGIN(_p), _action)
/*** Evry_Action macros ***/
#define EVRY_ACTION_NEW(_name, _in1, _in2, _icon, _action, _check) \
evry->action_new(_name, _(_name), _in1, _in2, _icon, _action, _check)
#define EVRY_ACTION_FREE(_act) if (_act) evry->action_free(EVRY_ACTN(_act))
#define EVRY_MODULE_UNREGISTER(_module) { \
Eina_List *l = e_datastore_get("everything_modules"); \
l = eina_list_remove(l, _module); \
e_datastore_set("everything_modules", l); }
/*** handy macros ***/ /*** handy macros ***/
@ -268,15 +237,45 @@ struct _Evry_Event_Action_Performed
(x) = NULL; \ (x) = NULL; \
} while (0) } while (0)
#define EVRY_MODULE_REGISTER(_module) { \
Eina_List *l = e_datastore_get("everything_modules"); \
l = eina_list_append(l, _module); \
e_datastore_set("everything_modules", l); }
#define EVRY_MODULE_UNREGISTER(_module) { \
Eina_List *l = e_datastore_get("everything_modules"); \ #ifndef EVRY_H
l = eina_list_remove(l, _module); \ /*** Evry_Item macros ***/
e_datastore_set("everything_modules", l); }
#define EVRY_ITEM_NEW(_base, _plugin, _label, _icon_get, _free) \
(_base *) evry->item_new(EVRY_ITEM(E_NEW(_base, 1)), EVRY_PLUGIN(_plugin), \
_label, _icon_get, _free)
#define EVRY_ITEM_FREE(_item) evry->item_free((Evry_Item *)_item)
#define EVRY_ITEM_REF(_item) evry->item_ref((Evry_Item *)_item)
/*** Evry_Plugin macros ***/
#define EVRY_PLUGIN_NEW(_base, _name, _icon, _item_type, _begin, _finish, _fetch, _free) \
evry->plugin_new(EVRY_PLUGIN(E_NEW(_base, 1)), _name, _(_name), _icon, _item_type, \
_begin, _finish, _fetch, _free)
#define EVRY_PLUGIN_FREE(_p) if (_p) evry->plugin_free(EVRY_PLUGIN(_p))
#define EVRY_PLUGIN_ITEMS_FREE(_p) { \
Evry_Item *it; \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \
evry->item_free(it); }
// should be renamed to ITEMS_FILTER
#define EVRY_PLUGIN_ITEMS_ADD(_plugin, _items, _input, _match_detail, _set_usage) \
evry->util_plugin_items_add(EVRY_PLUGIN(_plugin), _items, _input, _match_detail, _set_usage)
#define EVRY_PLUGIN_UPDATE(_p, _action) \
if (_p) evry->plugin_update(EVRY_PLUGIN(_p), _action)
/*** Evry_Action macros ***/
#define EVRY_ACTION_NEW(_name, _in1, _in2, _icon, _action, _check) \
evry->action_new(_name, _(_name), _in1, _in2, _icon, _action, _check)
#define EVRY_ACTION_FREE(_act) if (_act) evry->action_free(EVRY_ACTN(_act))
#ifndef EINA_LOG_DEFAULT_COLOR #ifndef EINA_LOG_DEFAULT_COLOR
@ -295,4 +294,3 @@ struct _Evry_Event_Action_Performed
#endif #endif
#endif #endif

View File

@ -193,7 +193,8 @@ evry_plug_actions_new(Evry_Selector *sel, int type)
/***************************************************************************/ /***************************************************************************/
int evry_plug_actions_init() int
evry_plug_actions_init()
{ {
_base_plug = evry_plugin_new(NULL, _("Actions"), NULL, NULL, _base_plug = evry_plugin_new(NULL, _("Actions"), NULL, NULL,
EVRY_TYPE_ACTION, NULL, NULL, NULL, NULL); EVRY_TYPE_ACTION, NULL, NULL, NULL, NULL);
@ -201,7 +202,8 @@ int evry_plug_actions_init()
return 1; return 1;
} }
void evry_plug_actions_shutdown() void
evry_plug_actions_shutdown()
{ {
Evry_Item *it; Evry_Item *it;
@ -213,7 +215,7 @@ void evry_plug_actions_shutdown()
} }
EAPI void void
evry_action_register(Evry_Action *act, int priority) evry_action_register(Evry_Action *act, int priority)
{ {
EVRY_ITEM(act)->priority = priority; EVRY_ITEM(act)->priority = priority;
@ -222,7 +224,7 @@ evry_action_register(Evry_Action *act, int priority)
/* TODO sorting, initialization, etc */ /* TODO sorting, initialization, etc */
} }
EAPI void void
evry_action_unregister(Evry_Action *act) evry_action_unregister(Evry_Action *act)
{ {
evry_conf->actions = eina_list_remove(evry_conf->actions, act); evry_conf->actions = eina_list_remove(evry_conf->actions, act);
@ -239,7 +241,7 @@ _action_free_cb(Evry_Item *it)
E_FREE(act); E_FREE(act);
} }
EAPI Evry_Action * Evry_Action *
evry_action_new(const char *name, const char *label, evry_action_new(const char *name, const char *label,
Evry_Type type_in1, Evry_Type type_in2, Evry_Type type_in1, Evry_Type type_in2,
const char *icon, const char *icon,
@ -262,7 +264,7 @@ evry_action_new(const char *name, const char *label,
return act; return act;
} }
EAPI void void
evry_action_free(Evry_Action *act) evry_action_free(Evry_Action *act)
{ {
evry_action_unregister(act); evry_action_unregister(act);
@ -273,7 +275,7 @@ evry_action_free(Evry_Action *act)
/* TODO assign actions to plugins othersie there will be too liitle /* TODO assign actions to plugins othersie there will be too liitle
names soon */ names soon */
EAPI Evry_Action * Evry_Action *
evry_action_find(const char *name) evry_action_find(const char *name)
{ {
Evry_Action *act = NULL; Evry_Action *act = NULL;

View File

@ -3,7 +3,6 @@
static Evry_Plugin *p1; static Evry_Plugin *p1;
static Evry_Plugin *p2; static Evry_Plugin *p2;
static void static void
_finish(Evry_Plugin *p) _finish(Evry_Plugin *p)
{ {
@ -15,17 +14,22 @@ _fetch(Evry_Plugin *p, const char *input)
{ {
Evry_Item *it; Evry_Item *it;
EVRY_PLUGIN_ITEMS_FREE(p);
if (input) if (input)
{ {
it = evry_item_new(NULL, p, input, NULL, NULL); if (!p->items)
it->fuzzy_match = 999; {
EVRY_PLUGIN_ITEM_APPEND(p, it); it = evry_item_new(NULL, p, input, NULL, NULL);
it->fuzzy_match = 999;
EVRY_PLUGIN_ITEM_APPEND(p, it);
}
else
{
it = p->items->data;
EVRY_ITEM_LABEL_SET(it, input);
evry_item_changed(it, 0, 0);
}
return 1; return 1;
} }
return 0; return 0;
} }
@ -43,15 +47,19 @@ evry_plug_text_init(void)
if (evry_plugin_register(p1, EVRY_PLUGIN_OBJECT,999)) if (evry_plugin_register(p1, EVRY_PLUGIN_OBJECT,999))
{ {
p1->config->trigger_only = 1; p1->config->trigger_only = 1;
p1->config->trigger = eina_stringshare_add(" "); p1->config->trigger = eina_stringshare_add(" ");
p1->config->aggregate = EINA_FALSE;
p1->config->view_mode = VIEW_MODE_LIST;
} }
if (evry_plugin_register(p2, EVRY_PLUGIN_SUBJECT, 999)) if (evry_plugin_register(p2, EVRY_PLUGIN_SUBJECT, 999))
{ {
p2->config->trigger_only = 1; p2->config->trigger_only = 1;
p2->config->trigger = eina_stringshare_add(" "); p2->config->trigger = eina_stringshare_add(" ");
p2->config->aggregate = EINA_FALSE;
p2->config->view_mode = VIEW_MODE_LIST;
} }
return EINA_TRUE; return EINA_TRUE;
} }

View File

@ -0,0 +1,212 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#include "e_mod_main.h"
static Eina_List *actions = NULL;
int
evry_plugins_init(void)
{
}
void
evry_plugins_shutdown(void)
{
Evry_Action *act;
EINA_LIST_FREE(actions, act)
evry_action_free(act);
}
static int
_evry_cb_plugin_sort(const void *data1, const void *data2)
{
const Plugin_Config *pc1 = data1;
const Plugin_Config *pc2 = data2;
return pc1->priority - pc2->priority;
}
void
_evry_plugin_free(Evry_Item *it)
{
GET_EVRY_PLUGIN(p, it);
evry_plugin_unregister(p);
DBG("%s", p->name);
if (p->config) p->config->plugin = NULL;
if (p->name) eina_stringshare_del(p->name);
if (p->free)
p->free(p);
else
E_FREE(p);
}
EAPI Evry_Plugin *
evry_plugin_new(Evry_Plugin *base, const char *name, const char *label,
const char *icon, Evry_Type item_type,
Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item),
void (*finish) (Evry_Plugin *p),
int (*fetch) (Evry_Plugin *p, const char *input),
void (*cb_free) (Evry_Plugin *p))
{
Evry_Plugin *p;
Evry_Item *it;
if (base)
p = base;
else
p = E_NEW(Evry_Plugin, 1);
it = evry_item_new(EVRY_ITEM(p), NULL, label, NULL, _evry_plugin_free);
it->plugin = p;
it->browseable = EINA_TRUE;
it->type = EVRY_TYPE_PLUGIN;
if (item_type)
it->subtype = item_type;
if (icon)
it->icon = eina_stringshare_add(icon);
p->name = eina_stringshare_add(name);
p->begin = begin;
p->finish = finish;
p->fetch = fetch;
p->async_fetch = EINA_FALSE;
p->history = EINA_TRUE;
p->free = cb_free;
return p;
}
EAPI void
evry_plugin_free(Evry_Plugin *p)
{
evry_item_free(EVRY_ITEM(p));
}
static int
_evry_plugin_action_browse(Evry_Action *act)
{
Evry_Plugin *p;
Eina_List *plugins = NULL;
Evry_Selector *sel;
GET_ITEM(it, act->it1.item);
GET_EVRY_PLUGIN(pp, EVRY_ITEM(act)->data);
if (!it->plugin || !it->plugin->state)
return 0;
sel = it->plugin->state->selector;
evry_selectors_switch(-1);
if ((p = pp->begin(pp, it)))
{
plugins = eina_list_append(plugins, p);
if (!evry_state_push(sel, plugins))
eina_list_free(plugins);
}
return 0;
}
/* TODO make int return */
EAPI int
evry_plugin_register(Evry_Plugin *p, int type, int priority)
{
Eina_List *l;
Plugin_Config *pc;
Eina_List *conf[3];
int i = 0;
int new_conf = 0;
if (type < 0 || type > 2)
return 0;
conf[0] = evry_conf->conf_subjects;
conf[1] = evry_conf->conf_actions;
conf[2] = evry_conf->conf_objects;
EINA_LIST_FOREACH(conf[type], l, pc)
if (pc->name && p->name && !strcmp(pc->name, p->name))
break;
if (!pc)
{
new_conf = 1;
pc = E_NEW(Plugin_Config, 1);
pc->name = eina_stringshare_add(p->name);
pc->enabled = 1;
pc->priority = priority ? priority : 100;
pc->view_mode = VIEW_MODE_NONE;
pc->aggregate = EINA_TRUE;
pc->top_level = EINA_TRUE;
conf[type] = eina_list_append(conf[type], pc);
}
if (pc->trigger && strlen(pc->trigger) == 0)
{
eina_stringshare_del(pc->trigger);
pc->trigger = NULL;
}
p->config = pc;
pc->plugin = p;
conf[type] = eina_list_sort(conf[type], -1, _evry_cb_plugin_sort);
EINA_LIST_FOREACH(conf[type], l, pc)
pc->priority = i++;
evry_conf->conf_subjects = conf[0];
evry_conf->conf_actions = conf[1];
evry_conf->conf_objects = conf[2];
if (type == EVRY_PLUGIN_SUBJECT)
{
char buf[256];
snprintf(buf, sizeof(buf), _("Show %s Plugin"), p->name);
e_action_predef_name_set(_("Everything Launcher"), buf,
"everything", p->name, NULL, 1);
}
if (p->input_type)
{
Evry_Action *act;
char buf[256];
snprintf(buf, sizeof(buf), _("Browse %s"), EVRY_ITEM(p)->label);
act = EVRY_ACTION_NEW(buf, p->input_type, 0, EVRY_ITEM(p)->icon,
_evry_plugin_action_browse, NULL);
EVRY_ITEM(act)->data = p;
evry_action_register(act, 1);
actions = eina_list_append(actions, act);
}
return new_conf;
}
EAPI void
evry_plugin_unregister(Evry_Plugin *p)
{
DBG("%s", p->name);
Eina_List *l = evry_conf->conf_subjects;
if (l && eina_list_data_find_list(l, p->config))
{
char buf[256];
snprintf(buf, sizeof(buf), _("Show %s Plugin"), p->name);
e_action_predef_name_del(_("Everything"), buf);
}
}

View File

@ -50,18 +50,16 @@ struct _Evry_Item
/* optional */ /* optional */
Evry_Type subtype; Evry_Type subtype;
/* do not set! */
Eina_List *items;
Evas_Object *(*icon_get) (Evry_Item *it, Evas *e); Evas_Object *(*icon_get) (Evry_Item *it, Evas *e);
void (*free) (Evry_Item *it); void (*free) (Evry_Item *it);
/* do not set by plugin! */ /* do not set by plugin! */
int ref;
Eina_List *items;
Eina_Bool selected; Eina_Bool selected;
Eina_Bool marked; Eina_Bool marked;
Evry_Plugin *plugin; Evry_Plugin *plugin;
int ref;
double usage; double usage;
History_Item *hi; History_Item *hi;
}; };
@ -172,6 +170,9 @@ struct _Evry_Plugin
have extended plugin struct */ have extended plugin struct */
void (*free) (Evry_Plugin *p); void (*free) (Evry_Plugin *p);
/* optional: set type which the plugin can handle in begin */
Evry_Type input_type;
/* optional: whether the plugin uses evry_async_update to add new items */ /* optional: whether the plugin uses evry_async_update to add new items */
/* default FALSE */ /* default FALSE */
Eina_Bool async_fetch; Eina_Bool async_fetch;

View File

@ -750,29 +750,9 @@ _isalnum(unsigned char in)
} }
return EINA_FALSE; return EINA_FALSE;
} }
/* FIXME there seem to be too many ways of not following a standard.
find out which is the most popular */
static Eina_Bool
_isuric(unsigned char in)
{
switch (in)
{
case '/': case '.': case '(': case ')': case '-':
case '~': case '\'': case '_': case '@': case '+':
/* case ';': case ':':
* case '&': case '=': case '$': case ',':
* case '.': case '!':
* case '\'': */
return EINA_TRUE;
default:
break;
}
return EINA_FALSE;
}
char * char *
_evry_util_url_escape(const char *string, int inlength, int path) evry_util_url_escape(const char *string, int inlength)
{ {
size_t alloc = (inlength?(size_t)inlength:strlen(string))+1; size_t alloc = (inlength?(size_t)inlength:strlen(string))+1;
char *ns; char *ns;
@ -791,8 +771,7 @@ _evry_util_url_escape(const char *string, int inlength, int path)
{ {
in = *string; in = *string;
if (_isalnum(in) || if (_isalnum(in))
(path && _isuric(in)))
{ {
/* just copy this */ /* just copy this */
ns[strindex++]=in; ns[strindex++]=in;
@ -825,14 +804,7 @@ _evry_util_url_escape(const char *string, int inlength, int path)
return ns; return ns;
} }
EAPI char * const char*
evry_util_url_escape(const char *string, int inlength)
{
return _evry_util_url_escape(string, inlength, 0);
}
EAPI const char*
evry_file_path_get(Evry_Item_File *file) evry_file_path_get(Evry_Item_File *file)
{ {
const char *tmp; const char *tmp;
@ -861,8 +833,9 @@ evry_file_path_get(Evry_Item_File *file)
EAPI const char* EAPI const char*
evry_file_url_get(Evry_Item_File *file) evry_file_url_get(Evry_Item_File *file)
{ {
char buf[PATH_MAX]; char dest[PATH_MAX * 3 + 7];
char *escaped; const char *p;
int i;
if (file->url) if (file->url)
return file->url; return file->url;
@ -870,19 +843,37 @@ evry_file_url_get(Evry_Item_File *file)
if (!file->path) if (!file->path)
return NULL; return NULL;
escaped = _evry_util_url_escape(file->path, 0, 1); memset(dest, 0, PATH_MAX * 3 + 7);
if (escaped) snprintf(dest, 8, "file://");
/* Most app doesn't handle the hostname in the uri so it's put to NULL */
for (i = 7, p = file->path; *p != '\0'; p++, i++)
{ {
snprintf(buf, sizeof(buf), "file://%s", escaped); if (isalnum(*p) || strchr("/$-_.+!*'()", *p))
E_FREE(escaped); dest[i] = *p;
else
file->url = eina_stringshare_add(buf); {
snprintf(&(dest[i]), 4, "%%%02X", (unsigned char)*p);
return file->url; i += 2;
}
} }
return NULL; file->url = eina_stringshare_add(dest);
return file->url;
/* escaped = _evry_util_url_escape(file->path, 0, 1);
*
* if (escaped)
* {
* snprintf(buf, sizeof(buf), "file://%s", escaped);
* E_FREE(escaped);
*
* file->url = eina_stringshare_add(buf);
*
* return file->url;
* } */
} }
static void static void