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;
Evry_Item_App *app;
int match;
char *exe = strdup(key);
const char *exe = key;
EINA_LIST_FOREACH(he->items, l, hi)
{
app = NULL;
if (strcmp(hi->plugin, EVRY_PLUGIN(p)->name))
if (strcmp(hi->plugin, EVRY_PLUGIN(p)->name))
continue;
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);
}
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;
}
free(exe);
return EINA_TRUE;
}

View File

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

View File

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

View File

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

View File

@ -104,7 +104,7 @@ e_modapi_init(E_Module *m)
{
Eina_List *l;
Evry_Module *em;
_e_module_evry_log_dom = eina_log_domain_register
("e_module_everything", EINA_LOG_DEFAULT_COLOR);
@ -206,12 +206,12 @@ e_modapi_init(E_Module *m)
SET(history_types_get);
SET(history_item_usage_set);
#undef SET
e_datastore_set("everything_loaded", _api);
EINA_LIST_FOREACH(e_datastore_get("everything_modules"), l, em)
em->active = em->init(_api);
/* cleanup every hour :) */
cleanup_timer = ecore_timer_add(3600, _cleanup_history, NULL);
@ -225,13 +225,13 @@ e_modapi_shutdown(E_Module *m __UNUSED__)
const char *t;
Eina_List *l;
Evry_Module *em;
EINA_LIST_FOREACH(e_datastore_get("everything_modules"), l, em)
em->shutdown();
e_datastore_del("everything_loaded");
E_FREE(_api);
evry_shutdown();
view_thumb_shutdown();
@ -352,7 +352,7 @@ _config_init()
evry_conf = E_NEW(Evry_Config, 1);
evry_conf->version = (MOD_CONFIG_FILE_EPOCH << 16);
}
#define IFMODCFG(v) if ((evry_conf->version & 0xffff) < v) {
#define IFMODCFGEND }
@ -373,13 +373,13 @@ _config_init()
evry_conf->history_sort_mode = 0;
evry_conf->first_run = EINA_TRUE;
IFMODCFGEND;
IFMODCFG(0x0002);
evry_conf->width = 435;
evry_conf->height = 415;
evry_conf->rel_y = 0.40;
IFMODCFGEND;
evry_conf->version = MOD_CONFIG_FILE_VERSION;
}
@ -387,7 +387,7 @@ static void
_plugin_config_free(void)
{
Plugin_Config *pc;
EINA_LIST_FREE(evry_conf->conf_subjects, pc)
{
if (pc->name) eina_stringshare_del(pc->name);
@ -492,156 +492,6 @@ EAPI int evry_api_version_check(int version)
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
_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);
int evry_state_push(Evry_Selector *sel, Eina_List *plugins);
void evry_selectors_switch(int dir);
extern Evry_History *evry_hist;
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) \
(_base *) evry_item_new(EVRY_ITEM(E_NEW(_base, 1)), EVRY_PLUGIN(_plugin), \
_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, \
_begin, _cleanup, _fetch, _free)
#define EVRY_ACTION_NEW(_name, _in1, _in2, _icon, _action, _check) \
evry_action_new(_name, _(_name), _in1, _in2, _icon, _action, _check)
#define EVRY_PLUGIN_FREE(_p) \
if (_p) evry_plugin_free(EVRY_PLUGIN(_p))
#define EVRY_PLUGIN_UPDATE(_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) { \
Evry_Item *it; \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, 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) \
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 ***/
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 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 void _evry_selector_free(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 int _evry_selector_subjects_get(const char *plugin_name);
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_label_set(Evry_Selector *sel, const char *part, const char *label);
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 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[1])
_evry_selectors_switch(-1);
evry_selectors_switch(-1);
else if (win->selector == win->selectors[2])
_evry_selectors_switch(1);
evry_selectors_switch(1);
}
/* just to be sure */
@ -663,7 +662,7 @@ evry_plugin_update(Evry_Plugin *p, int action)
(!(s->plugin) || !(s->plugin->items)) &&
(win->selector == win->selectors[1]))
{
_evry_selectors_switch(-1);
evry_selectors_switch(-1);
_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: */
if (win->selector != win->selectors[2])
_evry_selectors_switch(1);
evry_selectors_switch(1);
}
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 (win->selector == win->selectors[1])
_evry_selectors_switch(-1);
evry_selectors_switch(-1);
else
_evry_selectors_switch(1);
evry_selectors_switch(1);
}
else if (sel == win->selectors[1])
{
if (win->selector == win->selectors[0])
_evry_selectors_switch(1);
evry_selectors_switch(1);
else
_evry_selectors_switch(-1);
evry_selectors_switch(-1);
}
else if (sel == win->selectors[2])
{
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;
}
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
evry_browse_item(Evry_Item *it)
{
@ -1613,6 +1658,8 @@ evry_browse_back(Evry_Selector *sel)
s = sel->state;
_evry_aggregator_fetch(sel, s->input);
_evry_selector_update(sel);
if (sel == win->selectors[0])
_evry_selector_update_actions(sel);
_evry_update_text_label(s);
_evry_view_show(s->view);
s->view->update(s->view, 1);
@ -1620,8 +1667,8 @@ evry_browse_back(Evry_Selector *sel)
return 1;
}
static void
_evry_selectors_switch(int dir)
void
evry_selectors_switch(int dir)
{
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_SHIFT)))
{
_evry_selectors_switch(1);
evry_selectors_switch(1);
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) &&
(sel != win->selectors[2]))
_evry_selectors_switch(1);
evry_selectors_switch(1);
}
else if (!strcmp(ev->key, "Left"))
{
if (!evry_browse_back(sel))
_evry_selectors_switch(-1);
evry_selectors_switch(-1);
}
else if (!strcmp(ev->key, "Return"))
{
@ -2180,7 +2227,7 @@ _evry_plugin_action(Evry_Selector *sel, int finished)
if (!it_obj)
{
if (win->selectors[1] == win->selector)
_evry_selectors_switch(1);
evry_selectors_switch(1);
return;
}
@ -2395,8 +2442,8 @@ _evry_matches_update(Evry_Selector *sel, int async)
if ((!input || !s->trigger_active) &&
(!win->plugin_dedicated))
{
EINA_LIST_FREE(s->cur_plugins, p);
s->trigger_active = EINA_FALSE;
EINA_LIST_FREE(s->cur_plugins, p);
s->trigger_active = EINA_FALSE;
}
if (s->trigger_active)
@ -2456,11 +2503,13 @@ _evry_matches_update(Evry_Selector *sel, int async)
{
EINA_LIST_FOREACH(s->plugins, l, p)
{
if ((p->config->top_level) && (sel == win->selectors[0]))
{
if ((p->config->trigger) && (p->config->trigger_only))
continue;
}
/* skip plugins in toplevel which trigger-only */
if ((!(sel->states->next)) &&
(sel == win->selectors[0]) &&
(p->config->top_level) &&
(p->config->trigger) &&
(p->config->trigger_only))
continue;
/* dont wait for async plugin. use their current items */
if (!async && p->async_fetch && p->items)

View File

@ -3,7 +3,7 @@
#include "evry_types.h"
#define EVRY_API_VERSION 21
#define EVRY_API_VERSION 23
#define EVRY_ACTION_OTHER 0
#define EVRY_ACTION_FINISHED 1
@ -64,7 +64,7 @@ in e_modapi_init do:
in e_modapi_shutdown:
_plugins_shutdown();
EVRY_MODULE_UNREGISTER(evry_module);
E_FREE(evry_module);
@ -81,7 +81,7 @@ struct _Evry_Module
struct _Evry_API
{
int (*api_version_check)(int version);
Evry_Item *(*item_new)(Evry_Item *base, Evry_Plugin *p, const char *label,
Evas_Object *(*icon_get) (Evry_Item *it, Evas *e),
void (*cb_free) (Evry_Item *item));
@ -90,7 +90,7 @@ struct _Evry_API
void (*item_ref)(Evry_Item *it);
/* send EVRY_EVENT_ITEM_CHANGED event */
void (*item_changed)(Evry_Item *it, int change_icon, int change_selected);
Evry_Plugin *(*plugin_new)(Evry_Plugin *base, const char *name,
const char *label, const char *icon,
Evry_Type item_type,
@ -105,7 +105,7 @@ struct _Evry_API
int (*plugin_register)(Evry_Plugin *p, int type, int priority);
void (*plugin_unregister)(Evry_Plugin *p);
void (*plugin_update)(Evry_Plugin *plugin, int state);
Evry_Action *(*action_new)(const char *name, const char *label,
Evry_Type type1, Evry_Type type2,
const char *icon,
@ -155,7 +155,6 @@ struct _Evry_Event_Action_Performed
const Evry_Item *it2;
};
#ifndef EVRY_H
/*** cast default types ***/
@ -174,16 +173,6 @@ struct _Evry_Event_Action_Performed
#define GET_PLUGIN(_p, _plugin) Plugin *_p = (Plugin*) _plugin
#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_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); \
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); \
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 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_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_ITEM_APPEND(_p, _item) \
EVRY_PLUGIN(_p)->items = eina_list_append(EVRY_PLUGIN(_p)->items, EVRY_ITEM(_item))
#define EVRY_PLUGIN_INSTANCE(_p, _plugin) { \
_p = E_NEW(Plugin, 1); \
@ -231,33 +218,15 @@ struct _Evry_Event_Action_Performed
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, it) \
if (it) it->fuzzy_match = 0; }
#define EVRY_PLUGIN_ITEMS_FREE(_p) { \
Evry_Item *it; \
EINA_LIST_FREE(EVRY_PLUGIN(_p)->items, 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))
// 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_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"); \
l = eina_list_remove(l, _module); \
e_datastore_set("everything_modules", l); }
/*** handy macros ***/
@ -268,15 +237,45 @@ struct _Evry_Event_Action_Performed
(x) = NULL; \
} 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"); \
l = eina_list_remove(l, _module); \
e_datastore_set("everything_modules", l); }
#ifndef EVRY_H
/*** 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)
/*** 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
@ -295,4 +294,3 @@ struct _Evry_Event_Action_Performed
#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,
EVRY_TYPE_ACTION, NULL, NULL, NULL, NULL);
@ -201,7 +202,8 @@ int evry_plug_actions_init()
return 1;
}
void evry_plug_actions_shutdown()
void
evry_plug_actions_shutdown()
{
Evry_Item *it;
@ -213,7 +215,7 @@ void evry_plug_actions_shutdown()
}
EAPI void
void
evry_action_register(Evry_Action *act, int priority)
{
EVRY_ITEM(act)->priority = priority;
@ -222,7 +224,7 @@ evry_action_register(Evry_Action *act, int priority)
/* TODO sorting, initialization, etc */
}
EAPI void
void
evry_action_unregister(Evry_Action *act)
{
evry_conf->actions = eina_list_remove(evry_conf->actions, act);
@ -239,7 +241,7 @@ _action_free_cb(Evry_Item *it)
E_FREE(act);
}
EAPI Evry_Action *
Evry_Action *
evry_action_new(const char *name, const char *label,
Evry_Type type_in1, Evry_Type type_in2,
const char *icon,
@ -262,7 +264,7 @@ evry_action_new(const char *name, const char *label,
return act;
}
EAPI void
void
evry_action_free(Evry_Action *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
names soon */
EAPI Evry_Action *
Evry_Action *
evry_action_find(const char *name)
{
Evry_Action *act = NULL;

View File

@ -3,7 +3,6 @@
static Evry_Plugin *p1;
static Evry_Plugin *p2;
static void
_finish(Evry_Plugin *p)
{
@ -15,17 +14,22 @@ _fetch(Evry_Plugin *p, const char *input)
{
Evry_Item *it;
EVRY_PLUGIN_ITEMS_FREE(p);
if (input)
{
it = evry_item_new(NULL, p, input, NULL, NULL);
it->fuzzy_match = 999;
EVRY_PLUGIN_ITEM_APPEND(p, it);
if (!p->items)
{
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 0;
}
@ -43,15 +47,19 @@ evry_plug_text_init(void)
if (evry_plugin_register(p1, EVRY_PLUGIN_OBJECT,999))
{
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))
{
p2->config->trigger_only = 1;
p2->config->trigger = eina_stringshare_add(" ");
p2->config->aggregate = EINA_FALSE;
p2->config->view_mode = VIEW_MODE_LIST;
}
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 */
Evry_Type subtype;
/* do not set! */
Eina_List *items;
Evas_Object *(*icon_get) (Evry_Item *it, Evas *e);
void (*free) (Evry_Item *it);
/* do not set by plugin! */
int ref;
Eina_List *items;
Eina_Bool selected;
Eina_Bool marked;
Evry_Plugin *plugin;
int ref;
double usage;
History_Item *hi;
};
@ -172,6 +170,9 @@ struct _Evry_Plugin
have extended plugin struct */
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 */
/* default FALSE */
Eina_Bool async_fetch;

View File

@ -750,29 +750,9 @@ _isalnum(unsigned char in)
}
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 *
_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;
char *ns;
@ -791,8 +771,7 @@ _evry_util_url_escape(const char *string, int inlength, int path)
{
in = *string;
if (_isalnum(in) ||
(path && _isuric(in)))
if (_isalnum(in))
{
/* just copy this */
ns[strindex++]=in;
@ -825,14 +804,7 @@ _evry_util_url_escape(const char *string, int inlength, int path)
return ns;
}
EAPI char *
evry_util_url_escape(const char *string, int inlength)
{
return _evry_util_url_escape(string, inlength, 0);
}
EAPI const char*
const char*
evry_file_path_get(Evry_Item_File *file)
{
const char *tmp;
@ -861,8 +833,9 @@ evry_file_path_get(Evry_Item_File *file)
EAPI const char*
evry_file_url_get(Evry_Item_File *file)
{
char buf[PATH_MAX];
char *escaped;
char dest[PATH_MAX * 3 + 7];
const char *p;
int i;
if (file->url)
return file->url;
@ -870,19 +843,37 @@ evry_file_url_get(Evry_Item_File *file)
if (!file->path)
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);
E_FREE(escaped);
file->url = eina_stringshare_add(buf);
return file->url;
if (isalnum(*p) || strchr("/$-_.+!*'()", *p))
dest[i] = *p;
else
{
snprintf(&(dest[i]), 4, "%%%02X", (unsigned char)*p);
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