'everything' module:

- support the inheritance of plugins for 
  plugins with one instances per state (dir_browse)
- moved internal plugins action_selector and aggregator
  to separate files
- all type_in/out checks are now done with pointer comparison


SVN revision: 41920
This commit is contained in:
Hannes Janetzek 2009-08-21 22:42:06 +00:00
parent f8c05999e4
commit a9589df2e7
17 changed files with 889 additions and 907 deletions

View File

@ -76,11 +76,12 @@ struct _Evry_Plugin
/* whether the plugin uses evry_async_update to add new items */
int async_fetch;
/* run when plugin is activated. when return true plugin is added
to the list of current plugins and queried for results */
int (*begin) (Evry_Plugin *p, const Evry_Item *item);
/* list of items visible for everything */
Eina_List *items;
int (*browse) (Evry_Plugin *p, const Evry_Item *item);
/* run when plugin is activated. when return plugin is added
to the list of current plugins and queried for results */
Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item);
/* get candidates matching string, fills 'candidates' list */
int (*fetch) (Evry_Plugin *p, const char *input);
@ -95,15 +96,9 @@ struct _Evry_Plugin
/* optional: default action for this plugins items */
int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input);
Eina_List *items;
Evas_Object *(*config_page) (Evry_Plugin *p);
void (*config_apply) (Evry_Plugin *p);
/* only for internal use by plugin */
void *private;
/* not to be set by plugin! */
Plugin_Config *config;
};
@ -157,7 +152,8 @@ struct _Evry_Action
const char *type_in1;
const char *type_in2;
const char *type_out;
int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input);
int (*check_item) (Evry_Action *act, const Evry_Item *it);
@ -207,24 +203,24 @@ EAPI Evas_Object *evry_icon_theme_get(const char *icon, Evas *e);
EAPI int evry_fuzzy_match(const char *str, const char *match);
EAPI Evry_Plugin *evry_plugin_new(const char *name, int type,
const char *type_in, const char *type_out,
int async_fetch, const char *icon, const char *trigger,
int (*begin) (Evry_Plugin *p, const Evry_Item *item),
void (*cleanup) (Evry_Plugin *p),
int (*fetch) (Evry_Plugin *p, const char *input),
int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input),
int (*browse) (Evry_Plugin *p, const Evry_Item *item),
Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e),
Evas_Object *(*config_page) (Evry_Plugin *p),
void (*config_apply) (Evry_Plugin *p));
EAPI Evry_Plugin *evry_plugin_new(Evry_Plugin *base, const char *name, int type,
const char *type_in, const char *type_out,
int async_fetch, const char *icon, const char *trigger,
Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item),
void (*cleanup) (Evry_Plugin *p),
int (*fetch) (Evry_Plugin *p, const char *input),
int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input),
Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e),
Evas_Object *(*config_page) (Evry_Plugin *p),
void (*config_apply) (Evry_Plugin *p));
EAPI void evry_plugin_free(Evry_Plugin *p);
EAPI void evry_plugin_free(Evry_Plugin *p, int free_pointer);
EAPI Evry_Action *evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *icon,
int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input),
int (*check_item) (Evry_Action *act, const Evry_Item *it),
Evas_Object *(*icon_get) (Evry_Action *act, Evas *e));
EAPI Evry_Action *evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *type_out,
const char *icon,
int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input),
int (*check_item) (Evry_Action *act, const Evry_Item *it),
Evas_Object *(*icon_get) (Evry_Action *act, Evas *e));
EAPI void evry_action_free(Evry_Action *act);

View File

@ -27,7 +27,9 @@ module_la_SOURCES = $(EVRYHEADERS) \
e_mod_main.c \
e_mod_main.h \
evry.c \
evry_config.c
evry_config.c \
evry_plug_aggregator.c \
evry_plug_actions.c
module_la_LIBADD = @e_libs@ @dlopen_libs@

View File

@ -42,8 +42,6 @@ static Eina_Bool list_cb(Eina_Module *m, void *data)
return EINA_FALSE;
}
EAPI void *
e_modapi_init(E_Module *m)
{
@ -168,10 +166,6 @@ e_modapi_shutdown(E_Module *m __UNUSED__)
e_action_del("everything");
}
/* conf_module = NULL; */
if (evry_conf->plugins) eina_list_free(evry_conf->plugins);
if (evry_conf->actions) eina_list_free(evry_conf->actions);
if (plugins)
{
eina_module_list_unload(plugins);
@ -187,6 +181,8 @@ e_modapi_shutdown(E_Module *m __UNUSED__)
e_configure_registry_item_del("extensions/run_everything");
e_configure_registry_category_del("extensions");
if (evry_conf->plugins) eina_list_free(evry_conf->plugins);
if (evry_conf->actions) eina_list_free(evry_conf->actions);
if (evry_conf->conf_subjects) eina_list_free(evry_conf->conf_subjects);
if (evry_conf->conf_actions) eina_list_free(evry_conf->conf_actions);
if (evry_conf->conf_objects) eina_list_free(evry_conf->conf_objects);
@ -272,19 +268,23 @@ _evry_cb_plugin_sort(const void *data1, const void *data2)
}
Evry_Plugin *
evry_plugin_new(const char *name, int type,
evry_plugin_new(Evry_Plugin *base, const char *name, int type,
const char *type_in, const char *type_out,
int async_fetch, const char *icon, const char *trigger,
int (*begin) (Evry_Plugin *p, const Evry_Item *item),
Evry_Plugin *(*begin) (Evry_Plugin *p, const Evry_Item *item),
void (*cleanup) (Evry_Plugin *p),
int (*fetch) (Evry_Plugin *p, const char *input),
int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input),
int (*browse) (Evry_Plugin *p, const Evry_Item *item),
Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e),
Evas_Object *(*config_page) (Evry_Plugin *p),
void (*config_apply) (Evry_Plugin *p))
{
Evry_Plugin *p = E_NEW(Evry_Plugin, 1);
Evry_Plugin *p;
if (base)
p = base;
else
p = E_NEW(Evry_Plugin, 1);
p->name = eina_stringshare_add(name);
p->type = type;
@ -298,7 +298,6 @@ evry_plugin_new(const char *name, int type,
p->fetch = fetch;
p->icon_get = icon_get;
p->action = action;
p->browse = browse;
p->config_page = config_page;
p->config_apply = config_apply;
@ -306,7 +305,7 @@ evry_plugin_new(const char *name, int type,
}
void
evry_plugin_free(Evry_Plugin *p)
evry_plugin_free(Evry_Plugin *p, int free_pointer)
{
evry_plugin_unregister(p);
@ -325,13 +324,14 @@ evry_plugin_free(Evry_Plugin *p)
E_FREE(p->config);
}
E_FREE(p);
if (free_pointer)
E_FREE(p);
}
Evry_Action *
evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *icon,
evry_action_new(const char *name, const char *type_in1, const char *type_in2, const char *type_out, const char *icon,
int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input),
int (*check_item) (Evry_Action *act, const Evry_Item *it),
Evas_Object *(*icon_get) (Evry_Action *act, Evas *e))
@ -340,6 +340,7 @@ evry_action_new(const char *name, const char *type_in1, const char *type_in2, co
act->name = eina_stringshare_add(name);
act->type_in1 = (type_in1 ? eina_stringshare_add(type_in1) : NULL);
act->type_in2 = (type_in2 ? eina_stringshare_add(type_in2) : NULL);
act->type_out = (type_out ? eina_stringshare_add(type_out) : NULL);
act->action = action;
act->check_item = check_item;
act->icon = (icon ? eina_stringshare_add(icon) : NULL);
@ -356,6 +357,7 @@ evry_action_free(Evry_Action *act)
if (act->name) eina_stringshare_del(act->name);
if (act->type_in1) eina_stringshare_del(act->type_in1);
if (act->type_in2) eina_stringshare_del(act->type_in2);
if (act->type_out) eina_stringshare_del(act->type_out);
if (act->icon) eina_stringshare_del(act->icon);
E_FREE(act);
@ -479,3 +481,81 @@ evry_view_unregister(Evry_View *view)
{
evry_conf->views = eina_list_remove(evry_conf->views, view);
}
/* taken from e_utils. just changed 48 to 72.. we need
evry_icon_theme_set(Evas_Object *obj, const char *icon,
size:small, mid, large) imo */
static int
_evry_icon_theme_set(Evas_Object *obj, const char *icon)
{
const char *file;
char buf[4096];
if ((!icon) || (!icon[0])) return 0;
snprintf(buf, sizeof(buf), "e/icons/%s", icon);
file = e_theme_edje_file_get("base/theme/icons", buf);
if (file[0])
{
e_icon_file_edje_set(obj, file, buf);
return 1;
}
return 0;
}
static int
_evry_icon_fdo_set(Evas_Object *obj, const char *icon)
{
char *path = NULL;
unsigned int size;
if ((!icon) || (!icon[0])) return 0;
size = e_util_icon_size_normalize(72 * e_scale);
path = efreet_icon_path_find(e_config->icon_theme, icon, size);
if (!path) return 0;
e_icon_file_set(obj, path);
E_FREE(path);
return 1;
}
Evas_Object *
evry_icon_theme_get(const char *icon, Evas *e)
{
Evas_Object *o = e_icon_add(e);
if (e_config->icon_theme_overrides)
{
if (_evry_icon_fdo_set(o, icon) ||
_evry_icon_theme_set(o, icon))
return o;
}
else
{
if (_evry_icon_theme_set(o, icon) ||
_evry_icon_fdo_set(o, icon))
return o;
}
evas_object_del(o);
return NULL;
}
Evas_Object *
evry_icon_mime_get(const char *mime, Evas *e)
{
char *icon;
icon = efreet_mime_type_icon_get(mime, e_config->icon_theme, 64);
if (icon)
return e_util_icon_add(icon, e);
else
return evry_icon_theme_get("none", e);
free(icon);
return NULL;
}

View File

@ -5,6 +5,7 @@
typedef struct _Config Config;
typedef struct _Evry_Selector Evry_Selector;
struct _Config
{
@ -37,6 +38,27 @@ struct _Config
Eina_Hash *history;
};
struct _Evry_Selector
{
Evas_Object *o_main;
Evas_Object *o_icon;
/* current state */
Evry_State *state;
/* stack of states (for browseable plugins) */
Eina_List *states;
/* provides collection of items from other plugins */
Evry_Plugin *aggregator;
/* */
Eina_List *actions;
/* all plugins that belong to this selector*/
Eina_List *plugins;
};
EAPI extern E_Module_Api e_modapi;
EAPI void *e_modapi_init (E_Module *m);
@ -49,6 +71,13 @@ int evry_shutdown(void);
int evry_show(E_Zone *zone, const char *params);
void evry_hide(void);
Evry_Plugin *evry_plug_aggregator_new(Evry_Selector *selector);
void evry_plug_aggregator_free(Evry_Plugin *plugin);
Evry_Plugin *evry_plug_actions_new(void);
void evry_plug_actions_free(Evry_Plugin *plugin);
extern Config *evry_conf;
extern Evry_Selector **selectors;
#endif

View File

@ -17,29 +17,7 @@
typedef struct _Evry_Window Evry_Window;
typedef struct _Evry_List_Window Evry_List_Window;
typedef struct _Evry_Selector Evry_Selector;
/* */
struct _Evry_Selector
{
Evas_Object *o_main;
Evas_Object *o_icon;
/* current state */
Evry_State *state;
/* stack of states (for browseable plugins) */
Eina_List *states;
/* provides collection of items from other plugins */
Evry_Plugin *aggregator;
/* */
Eina_List *actions;
/* all plugins that belong to this selector*/
Eina_List *plugins;
};
struct _Evry_Window
{
@ -54,45 +32,46 @@ struct _Evry_List_Window
{
E_Popup *popup;
Evas_Object *o_main;
Eina_Bool visible;
Eina_Bool visible;
};
static void _evry_matches_update(Evry_Selector *sel);
static void _evry_plugin_action(Evry_Selector *sel, int finished);
static void _evry_backspace(Evry_State *s);
static void _evry_update(Evry_State *s, int fetch);
static int _evry_clear(Evry_State *s);
static int _evry_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 void _evry_update_text_label(Evry_State *s);
static void _evry_browse_item(Evry_Selector *sel);
static void _evry_browse_back(Evry_Selector *sel);
static void _evry_selectors_switch(void);
static void _evry_plugin_select(Evry_State *s, Evry_Plugin *p);
static void _evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p);
static void _evry_backspace(Evry_State *s);
static void _evry_update(Evry_State *s, int fetch);
static void _evry_update_text_label(Evry_State *s);
static int _evry_clear(Evry_State *s);
static int _evry_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 Evry_Window *_evry_window_new(E_Zone *zone);
static void _evry_window_free(Evry_Window *win);
static Evry_Selector *_evry_selector_new(int type);
static void _evry_selector_free(Evry_Selector *sel);
static void _evry_selector_activate(Evry_Selector *sel);
static void _evry_selectors_switch(void);
static void _evry_selector_update(Evry_Selector *sel);
static void _evry_selector_icon_set(Evry_Selector *sel);
static int _evry_selector_subjects_get(const char *plugin_name);
static int _evry_selector_actions_get(Evry_Item *it);
static int _evry_selector_objects_get(const char *type);
static int _evry_selector_objects_get(Evry_Action *act);
static void _evry_browse_item(Evry_Selector *sel);
static void _evry_browse_back(Evry_Selector *sel);
static Evry_Window *_evry_window_new(E_Zone *zone);
static void _evry_window_free(Evry_Window *win);
static Evry_List_Window *_evry_list_win_new(E_Zone *zone);
static void _evry_list_win_free(Evry_List_Window *win);
static void _evry_list_win_show(void);
static void _evry_list_win_update(Evry_State *s);
static void _evry_list_win_clear(int hide);
static void _evry_view_clear(Evry_State *s);
static void _evry_list_win_update(Evry_State *s);
static void _evry_view_update(Evry_State *s, Evry_Plugin *plugin);
static int _evry_view_key_press(Evry_State *s, Ecore_Event_Key *ev);
static int _evry_view_toggle(Evry_State *s, const char *trigger);
@ -102,20 +81,6 @@ static void _evry_view_hide(Evry_View *v);
static void _evry_item_desel(Evry_State *s, Evry_Item *it);
static void _evry_item_sel(Evry_State *s, Evry_Item *it);
static int _evry_plug_actions_init(void);
static void _evry_plug_actions_free(void);
static int _evry_plug_actions_begin(Evry_Plugin *p, const Evry_Item *it);
static int _evry_plug_actions_fetch(Evry_Plugin *p, const char *input);
static void _evry_plug_actions_cleanup(Evry_Plugin *p);
static Evas_Object *_evry_plug_actions_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e);
static Evry_Plugin *_evry_plug_aggregator_new(void);
static void _evry_plug_aggregator_free(Evry_Plugin *p);
static int _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input);
static int _evry_plug_aggregator_action(Evry_Plugin *p, const Evry_Item *item, const char *input);
static void _evry_plug_aggregator_cleanup(Evry_Plugin *p);
static Evas_Object *_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e);
static int _evry_cb_key_down(void *data, int type, void *event);
static int _evry_cb_selection_notify(void *data, int type, void *event);
@ -125,16 +90,16 @@ static Evry_List_Window *list = NULL;
static Ecore_X_Window input_window = 0;
static Eina_List *handlers = NULL;
static Ecore_Timer *update_timer = NULL;
static Evry_Selector *selectors[3];
static Evry_Selector *selector = NULL;
static Evry_Plugin *action_selector = NULL;
static Evry_Selector *selector = NULL;
Evry_Selector **selectors;
/* externally accessible functions */
int
evry_init(void)
{
_evry_plug_actions_init();
action_selector = evry_plug_actions_new();
return 1;
}
@ -142,7 +107,8 @@ int
evry_shutdown(void)
{
evry_hide();
_evry_plug_actions_free();
evry_plug_actions_free(action_selector);
return 1;
}
@ -170,7 +136,7 @@ evry_show(E_Zone *zone, const char *params)
list->visible = EINA_FALSE;
/* TODO check NULL */
selectors = E_NEW(Evry_Selector*, 3);
selectors[0] = _evry_selector_new(type_subject);
selectors[1] = _evry_selector_new(type_action);
selectors[2] = _evry_selector_new(type_object);
@ -238,10 +204,8 @@ evry_hide(void)
_evry_selector_free(selectors[0]);
_evry_selector_free(selectors[1]);
_evry_selector_free(selectors[2]);
selectors[0] = NULL;
selectors[1] = NULL;
selectors[2] = NULL;
selector = NULL;
E_FREE(selectors);
_evry_list_win_free(list);
list = NULL;
@ -742,8 +706,8 @@ _evry_selector_new(int type)
else if (type == type_object)
edje_object_part_swallow(win->o_main, "e.swallow.object_selector", o);
p = _evry_plug_aggregator_new();
p->private = sel;
p = evry_plug_aggregator_new(sel);
sel->plugins = eina_list_append(sel->plugins, p);
sel->aggregator = p;
@ -770,7 +734,7 @@ _evry_selector_free(Evry_Selector *sel)
while (sel->states)
_evry_state_pop(sel);
_evry_plug_aggregator_free(sel->aggregator);
evry_plug_aggregator_free(sel->aggregator);
if (sel->plugins) eina_list_free(sel->plugins);
E_FREE(sel);
@ -926,27 +890,26 @@ static int
_evry_selector_subjects_get(const char *plugin_name)
{
Eina_List *l, *plugins = NULL;
Evry_Plugin *p;
Evry_Plugin *p, *plugin;
Evry_Selector *sel = selectors[0];
EINA_LIST_FOREACH(sel->plugins, l, p)
EINA_LIST_FOREACH(sel->plugins, l, plugin)
{
if (plugin_name && strcmp(plugin_name, p->name))
if (plugin_name && strcmp(plugin_name, plugin->name))
continue;
if (p->begin)
if (plugin->begin)
{
if (p->begin(p, NULL))
if ((p = plugin->begin(plugin, NULL)))
plugins = eina_list_append(plugins, p);
}
else
plugins = eina_list_append(plugins, p);
plugins = eina_list_append(plugins, plugin);
}
if (!plugins) return 0;
_evry_state_new(sel, plugins);
_evry_matches_update(sel);
return 1;
@ -956,7 +919,7 @@ static int
_evry_selector_actions_get(Evry_Item *it)
{
Eina_List *l, *plugins = NULL;
Evry_Plugin *p;
Evry_Plugin *p, *plugin;
Evry_Selector *sel = selectors[1];
const char *type_out;
@ -967,61 +930,64 @@ _evry_selector_actions_get(Evry_Item *it)
type_out = it->plugin->type_out;
EINA_LIST_FOREACH(sel->plugins, l, p)
EINA_LIST_FOREACH(sel->plugins, l, plugin)
{
if ((p == action_selector) || (p == sel->aggregator) ||
(p->type_in && type_out && p->type_in == type_out))
if ((plugin == action_selector) || (plugin == sel->aggregator) ||
(plugin->type_in && type_out && plugin->type_in == type_out))
{
if (p->begin)
if (plugin->begin)
{
if (p->begin(p, it))
if ((p = plugin->begin(plugin, it)))
plugins = eina_list_append(plugins, p);
}
else
plugins = eina_list_append(plugins, p);
plugins = eina_list_append(plugins, plugin);
}
}
if (!plugins) return 0;
_evry_state_new(sel, plugins);
_evry_matches_update(sel);
return 1;
}
static int
_evry_selector_objects_get(const char *type)
_evry_selector_objects_get(Evry_Action *act)
{
Eina_List *l, *plugins = NULL;
Evry_Plugin *p;
Evry_Plugin *p, *plugin;
Evry_Selector *sel = selectors[2];
Evry_Item *it;
const char *type_in = act->type_in2;
while (sel->state)
_evry_state_pop(sel);
it = selectors[0]->state->sel_item;
EINA_LIST_FOREACH(sel->plugins, l, p)
EINA_LIST_FOREACH(sel->plugins, l, plugin)
{
if (strcmp(p->type_out, type) &&
(p != sel->aggregator)) continue;
if ((plugin->type_out != type_in) &&
(plugin != sel->aggregator)) continue;
if (p->begin)
if (plugin->begin)
{
if (p->begin(p, it))
if ((act->type_out) &&
(act->type_out == plugin->type_in) &&
(p = plugin->begin(plugin, it)))
plugins = eina_list_append(plugins, p);
else if (p = plugin->begin(plugin, NULL))
plugins = eina_list_append(plugins, p);
}
else
plugins = eina_list_append(plugins, p);
plugins = eina_list_append(plugins, plugin);
}
if (!plugins) return 0;
_evry_state_new(sel, plugins);
_evry_matches_update(sel);
return 1;
@ -1075,7 +1041,7 @@ _evry_browse_item(Evry_Selector *sel)
Evry_State *s = sel->state;
Evry_Item *it;
Eina_List *l, *plugins = NULL;
Evry_Plugin *p;
Evry_Plugin *p, *plugin;
const char *type_out;
it = s->sel_item;
@ -1088,12 +1054,13 @@ _evry_browse_item(Evry_Selector *sel)
if (!type_out)
return;
EINA_LIST_FOREACH(sel->plugins, l, p)
EINA_LIST_FOREACH(sel->plugins, l, plugin)
{
if (!p->browse || !p->type_in || p->type_in != type_out)
if ((!plugin->begin || !plugin->type_in) ||
(plugin->type_in != type_out))
continue;
if (p->browse(p, it))
if ((p = plugin->begin(plugin, it)))
plugins = eina_list_append(plugins, p);
}
@ -1122,12 +1089,9 @@ _evry_browse_back(Evry_Selector *sel)
sel->aggregator->fetch(sel->aggregator, s->input);
_evry_selector_update(sel);
_evry_view_show(s->view);
/*** _evry_tabs_update(s); */
_evry_update_text_label(s);
_evry_view_show(s->view);
}
static void
@ -1159,10 +1123,12 @@ _evry_selectors_switch(void)
int next_selector = 0;
Evry_Action *act;
if (s->sel_item && (s->sel_item->plugin == action_selector) &&
(act = s->sel_item->data[0]) && act->type_in2)
if ((s->sel_item) &&
(s->sel_item->plugin == action_selector) &&
(act = s->sel_item->data[0]) &&
(act->type_in2))
{
_evry_selector_objects_get(act->type_in2);
_evry_selector_objects_get(act);
_evry_selector_update(selectors[2]);
edje_object_signal_emit(win->o_main,
"e,state,object_selector_show", "e");
@ -1519,7 +1485,7 @@ _evry_view_toggle(Evry_State *s, const char *trigger)
{
if (view->trigger && !strncmp(trigger, view->trigger, 1) &&
(v = view->create(view, s, list->o_main)))
break;
goto found;
}
}
else
@ -1675,283 +1641,6 @@ evry_plugin_select(const Evry_State *s, Evry_Plugin *p)
_evry_selector_update(selector);
}
static int
_evry_fuzzy_sort_cb(const void *data1, const void *data2)
{
const Evry_Item *it1 = data1;
const Evry_Item *it2 = data2;
if ((it1->plugin == it2->plugin) &&
(it1->priority - it2->priority))
return (it1->priority - it2->priority);
if (it1->fuzzy_match || it2->fuzzy_match)
{
if (it1->fuzzy_match && !it2->fuzzy_match)
return -1;
if (!it1->fuzzy_match && it2->fuzzy_match)
return 1;
if (it1->fuzzy_match - it2->fuzzy_match)
return (it1->fuzzy_match - it2->fuzzy_match);
}
if (it1->plugin->config->priority - it2->plugin->config->priority)
return (it1->plugin->config->priority - it2->plugin->config->priority);
if (it1->priority - it2->priority)
return (it1->priority - it2->priority);
return 0;
}
/* action selector plugin: provides list of actions registered for
candidate types provided by current plugin */
static int
_evry_plug_actions_init(void)
{
Evry_Plugin *p;
p = evry_plugin_new("Select Action", type_action, "", "", 0, NULL, NULL,
_evry_plug_actions_begin,
_evry_plug_actions_cleanup,
_evry_plug_actions_fetch,
NULL, NULL,
_evry_plug_actions_item_icon_get,
NULL, NULL);
action_selector = p;
evry_plugin_register(p, 2);
return 1;
}
static void
_evry_plug_actions_free(void)
{
Evry_Plugin *p = action_selector;
eina_stringshare_del(p->config->name);
E_FREE(p->config);
evry_plugin_free(p);
}
static int
_evry_plug_actions_begin(Evry_Plugin *p, const Evry_Item *it)
{
Evry_Action *act;
Eina_List *l;
Evry_Selector *sel = selectors[1];
_evry_plug_actions_cleanup(p);
if (!it) return 0;
const char *type = it->plugin->type_out;
if (!type) return 0;
EINA_LIST_FOREACH(evry_conf->actions, l, act)
{
if (act->type_in1 && (act->type_in1 == type) &&
(!act->check_item || act->check_item(act, it)))
{
sel->actions = eina_list_append(sel->actions, act);
}
}
if (sel->actions) return 1;
return 0;
}
static int
_evry_plug_actions_fetch(Evry_Plugin *p, const char *input)
{
Evry_Action *act;
Eina_List *l;
Evry_Item *it;
Evry_Selector *sel = selectors[1];
int match = 0;
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
EINA_LIST_FOREACH(sel->actions, l, act)
{
if (input)
match = evry_fuzzy_match(act->name, input);
if (!input || match)
{
it = evry_item_new(p, act->name, NULL);
it->fuzzy_match = match;
it->data[0] = act;
p->items = eina_list_append(p->items, it);
}
}
if (input)
p->items = eina_list_sort(p->items, eina_list_count(p->items), _evry_fuzzy_sort_cb);
if (p->items) return 1;
return 0;
}
static void
_evry_plug_actions_cleanup(Evry_Plugin *p)
{
Evry_Item *it;
Evry_Selector *sel = selectors[1];
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
if (sel->actions) eina_list_free(sel->actions);
sel->actions = NULL;
}
static Evas_Object *
_evry_plug_actions_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o = NULL;
Evry_Action *act = it->data[0];
if (!act) return NULL;
if (act->icon_get)
o = act->icon_get(act, e);
else if (act->icon)
o = evry_icon_theme_get(act->icon, e);
return o;
}
static Evry_Plugin *
_evry_plug_aggregator_new(void)
{
Evry_Plugin *p;
Plugin_Config *pc;
p = evry_plugin_new("All", 0, "", "", 0, NULL, NULL,
NULL,
_evry_plug_aggregator_cleanup,
_evry_plug_aggregator_fetch,
_evry_plug_aggregator_action,
NULL,
_evry_plug_aggregator_item_icon_get,
NULL, NULL);
pc = E_NEW(Plugin_Config, 1);
pc->name = eina_stringshare_add(p->name);
pc->enabled = 1;
pc->priority = -1;
p->config = pc;
return p;
}
static void
_evry_plug_aggregator_free(Evry_Plugin *p)
{
if (p->config->name) eina_stringshare_del(p->config->name);
E_FREE(p->config);
evry_plugin_free(p);
}
static int
_evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input)
{
Evry_Selector *selector = p->private;
Evry_State *s = selector->state;
Eina_List *l, *ll;
Evry_Plugin *plugin;
Evry_Item *it;
int cnt = 0;
Eina_List *items = NULL;
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
EINA_LIST_FOREACH(s->cur_plugins, l, plugin)
cnt += eina_list_count(plugin->items);
if (input[0])
{
EINA_LIST_FOREACH(s->cur_plugins, l, plugin)
{
EINA_LIST_FOREACH(plugin->items, ll, it)
{
if (!it->fuzzy_match)
it->fuzzy_match = evry_fuzzy_match(it->label, input);
if (it->fuzzy_match || selector == selectors[2])
{
evry_item_ref(it);
items = eina_list_append(items, it);
p->items = eina_list_append(p->items, it);
}
}
}
}
if (!input[0] || eina_list_count(items) < 20)
{
EINA_LIST_FOREACH(s->cur_plugins, l, plugin)
{
for (cnt = 0, ll = plugin->items; ll && cnt < 15; ll = ll->next, cnt++)
{
if (!items || !eina_list_data_find_list(items, ll->data))
{
it = ll->data;
evry_item_ref(it);
it->fuzzy_match = 0;
p->items = eina_list_append(p->items, it);
}
}
}
}
if (items) eina_list_free(items);
if (input[0])
p->items = eina_list_sort(p->items, eina_list_count(p->items), _evry_fuzzy_sort_cb);
return 1;
}
static int
_evry_plug_aggregator_action(Evry_Plugin *p, const Evry_Item *it, const char *input)
{
if (it->plugin && it->plugin->action)
return it->plugin->action(it->plugin, it, input);
return 0;
}
static void
_evry_plug_aggregator_cleanup(Evry_Plugin *p)
{
Evry_Item *it;
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
}
static Evas_Object *
_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e)
{
if (it->plugin && it->plugin->icon_get)
return it->plugin->icon_get(it->plugin, it, e);
return NULL;
}
static void
_evry_plugin_list_insert(Evry_State *s, Evry_Plugin *p)
{
@ -2000,79 +1689,3 @@ _evry_cb_selection_notify(void *data, int type, void *event)
return 1;
}
/* taken from e_utils. just changed 48 to 72.. we need
evry_icon_theme_set(Evas_Object *obj, const char *icon,
size:small, mid, large) imo */
static int
_evry_icon_theme_set(Evas_Object *obj, const char *icon)
{
const char *file;
char buf[4096];
if ((!icon) || (!icon[0])) return 0;
snprintf(buf, sizeof(buf), "e/icons/%s", icon);
file = e_theme_edje_file_get("base/theme/icons", buf);
if (file[0])
{
e_icon_file_edje_set(obj, file, buf);
return 1;
}
return 0;
}
static int
_evry_icon_fdo_set(Evas_Object *obj, const char *icon)
{
char *path = NULL;
unsigned int size;
if ((!icon) || (!icon[0])) return 0;
size = e_util_icon_size_normalize(72 * e_scale);
path = efreet_icon_path_find(e_config->icon_theme, icon, size);
if (!path) return 0;
e_icon_file_set(obj, path);
E_FREE(path);
return 1;
}
Evas_Object *
evry_icon_theme_get(const char *icon, Evas *e)
{
Evas_Object *o = e_icon_add(e);
if (e_config->icon_theme_overrides)
{
if (_evry_icon_fdo_set(o, icon) ||
_evry_icon_theme_set(o, icon))
return o;
}
else
{
if (_evry_icon_theme_set(o, icon) ||
_evry_icon_fdo_set(o, icon))
return o;
}
evas_object_del(o);
return NULL;
}
Evas_Object *
evry_icon_mime_get(const char *mime, Evas *e)
{
char *icon;
icon = efreet_mime_type_icon_get(mime, e_config->icon_theme, 64);
if (icon)
return e_util_icon_add(icon, e);
else
return evry_icon_theme_get("none", e);
free(icon);
return NULL;
}

View File

@ -0,0 +1,147 @@
#include "e_mod_main.h"
/* action selector plugin: provides list of actions registered for
candidate types provided by current plugin */
static void
_cleanup(Evry_Plugin *p)
{
Evry_Item *it;
Evry_Selector *sel = selectors[1];
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
if (sel->actions) eina_list_free(sel->actions);
sel->actions = NULL;
}
static Evry_Plugin *
_begin(Evry_Plugin *p, const Evry_Item *it)
{
Evry_Action *act;
Eina_List *l;
Evry_Selector *sel = selectors[1];
_cleanup(p);
if (!it) return NULL;
const char *type = it->plugin->type_out;
if (!type) return NULL;
EINA_LIST_FOREACH(evry_conf->actions, l, act)
{
if (act->type_in1 && (act->type_in1 == type) &&
(!act->check_item || act->check_item(act, it)))
{
sel->actions = eina_list_append(sel->actions, act);
}
}
if (!sel->actions) return NULL;
return p;
}
static int
_cb_sort(const void *data1, const void *data2)
{
const Evry_Item *it1 = data1;
const Evry_Item *it2 = data2;
if ((it1->plugin == it2->plugin) &&
(it1->priority - it2->priority))
return (it1->priority - it2->priority);
if (it1->fuzzy_match || it2->fuzzy_match)
{
if (it1->fuzzy_match && !it2->fuzzy_match)
return -1;
if (!it1->fuzzy_match && it2->fuzzy_match)
return 1;
if (it1->fuzzy_match - it2->fuzzy_match)
return (it1->fuzzy_match - it2->fuzzy_match);
}
if (it1->plugin->config->priority - it2->plugin->config->priority)
return (it1->plugin->config->priority - it2->plugin->config->priority);
if (it1->priority - it2->priority)
return (it1->priority - it2->priority);
return 0;
}
static int
_fetch(Evry_Plugin *p, const char *input)
{
Evry_Action *act;
Eina_List *l;
Evry_Item *it;
Evry_Selector *sel = selectors[1];
int match = 0;
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
EINA_LIST_FOREACH(sel->actions, l, act)
{
if (input)
match = evry_fuzzy_match(act->name, input);
if (!input || match)
{
it = evry_item_new(p, act->name, NULL);
it->fuzzy_match = match;
it->data[0] = act;
p->items = eina_list_append(p->items, it);
}
}
if (input)
p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort);
if (p->items) return 1;
return 0;
}
static Evas_Object *
_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o = NULL;
Evry_Action *act = it->data[0];
if (!act) return NULL;
if (act->icon_get)
o = act->icon_get(act, e);
else if (act->icon)
o = evry_icon_theme_get(act->icon, e);
return o;
}
Evry_Plugin *
evry_plug_actions_new(void)
{
Evry_Plugin *p;
p = evry_plugin_new(NULL, "Select Action", type_action, "", "", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, _icon_get, NULL, NULL);
evry_plugin_register(p, 2);
return p;
}
void
evry_plug_actions_free(Evry_Plugin *plugin)
{
evry_plugin_free(plugin, 1);
}

View File

@ -0,0 +1,165 @@
#include "e_mod_main.h"
typedef struct _Plugin Plugin;
struct _Plugin
{
Evry_Plugin base;
Evry_Selector *selector;
};
static int
_cb_sort(const void *data1, const void *data2)
{
const Evry_Item *it1 = data1;
const Evry_Item *it2 = data2;
if ((it1->plugin == it2->plugin) &&
(it1->priority - it2->priority))
return (it1->priority - it2->priority);
if (it1->fuzzy_match || it2->fuzzy_match)
{
if (it1->fuzzy_match && !it2->fuzzy_match)
return -1;
if (!it1->fuzzy_match && it2->fuzzy_match)
return 1;
if (it1->fuzzy_match - it2->fuzzy_match)
return (it1->fuzzy_match - it2->fuzzy_match);
}
if (it1->plugin->config->priority - it2->plugin->config->priority)
return (it1->plugin->config->priority - it2->plugin->config->priority);
if (it1->priority - it2->priority)
return (it1->priority - it2->priority);
return 0;
}
static int
_fetch(Evry_Plugin *plugin, const char *input)
{
Plugin *p = (Plugin *) plugin;
Evry_Plugin *pp;
Evry_State *s;
Eina_List *l, *ll;
Evry_Item *it;
int cnt = 0;
Eina_List *items = NULL;
s = p->selector->state;
EINA_LIST_FREE(p->base.items, it)
evry_item_free(it);
EINA_LIST_FOREACH(s->cur_plugins, l, pp)
cnt += eina_list_count(pp->items);
if (input[0])
{
EINA_LIST_FOREACH(s->cur_plugins, l, pp)
{
EINA_LIST_FOREACH(pp->items, ll, it)
{
if (!it->fuzzy_match)
it->fuzzy_match = evry_fuzzy_match(it->label, input);
if (it->fuzzy_match || p->selector == selectors[2])
{
evry_item_ref(it);
items = eina_list_append(items, it);
p->base.items = eina_list_append(p->base.items, it);
}
}
}
}
if (!input[0] || eina_list_count(items) < 20)
{
EINA_LIST_FOREACH(s->cur_plugins, l, pp)
{
for (cnt = 0, ll = pp->items; ll && cnt < 15; ll = ll->next, cnt++)
{
if (!items || !eina_list_data_find_list(items, ll->data))
{
it = ll->data;
evry_item_ref(it);
it->fuzzy_match = 0;
p->base.items = eina_list_append(p->base.items, it);
}
}
}
}
if (items) eina_list_free(items);
if (input[0])
p->base.items = eina_list_sort
(p->base.items, eina_list_count(p->base.items), _cb_sort);
return 1;
}
static int
_action(Evry_Plugin *plugin, const Evry_Item *it, const char *input)
{
if (it->plugin && it->plugin->action)
return it->plugin->action(it->plugin, it, input);
return 0;
}
static void
_cleanup(Evry_Plugin *plugin)
{
Evry_Item *it;
EINA_LIST_FREE(plugin->items, it)
evry_item_free(it);
}
static Evas_Object *
_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e)
{
if (it->plugin && it->plugin->icon_get)
return it->plugin->icon_get(it->plugin, it, e);
return NULL;
}
Evry_Plugin *
evry_plug_aggregator_new(Evry_Selector *selector)
{
Plugin *p;
Plugin_Config *pc;
p = E_NEW(Plugin, 1);
evry_plugin_new(&p->base, "All", 0, "", "", 0, NULL, NULL,
NULL, _cleanup, _fetch, _action, _icon_get,
NULL, NULL);
pc = E_NEW(Plugin_Config, 1);
pc->enabled = 1;
pc->priority = -1;
p->base.config = pc;
p->selector = selector;
return &p->base;
}
void
evry_plug_aggregator_free(Evry_Plugin *plugin)
{
Plugin *p = (Plugin *) plugin;
evry_plugin_free(&p->base, 0);
E_FREE(p);
}

View File

@ -1,17 +1,18 @@
#include "Evry.h"
typedef struct _Inst Inst;
typedef struct _Plugin Plugin;
struct _Inst
struct _Plugin
{
Evry_Plugin base;
Eina_Hash *added;
Eina_List *apps_mime;
Eina_List *apps_all;
const Evry_Item *candidate;
};
static Evry_Plugin *p1;
static Evry_Plugin *p2;
static Plugin *p1;
static Plugin *p2;
static Evry_Action *act;
static Evry_Action *act1;
static Evry_Action *act2;
@ -20,52 +21,44 @@ static Evry_Action *act4;
static Eina_List *exe_path = NULL;
static int
_begin(Evry_Plugin *p, const Evry_Item *it)
static Evry_Plugin *
_begin(Evry_Plugin *plugin, const Evry_Item *it)
{
Plugin *p = (Plugin*) plugin;
const char *mime;
Inst *inst = NULL;
if (it)
{
Efreet_Desktop *desktop;
if (!it->uri) return 0;
if (!it->uri) return NULL;
if (!it->mime)
mime = efreet_mime_type_get(it->uri);
else
mime = it->mime;
/* TODO show plugin for items without mimetype ? */
if (!mime) return 0;
if (!mime) return NULL;
inst = E_NEW(Inst, 1);
inst->candidate = it;
inst->apps_mime = efreet_util_desktop_mime_list(mime);
p->candidate = it;
p->apps_mime = efreet_util_desktop_mime_list(mime);
desktop = e_exehist_mime_desktop_get(mime);
if (desktop)
{
efreet_desktop_ref(desktop);
inst->apps_mime = eina_list_prepend(inst->apps_mime, desktop);
p->apps_mime = eina_list_prepend(p->apps_mime, desktop);
}
}
else
{
inst = E_NEW(Inst, 1);
}
p->private = inst;
return 1;
return &p->base;
}
static void
_list_free(Evry_Plugin *p)
_list_free(Evry_Plugin *plugin)
{
Evry_Item *it;
EINA_LIST_FREE(p->items, it)
EINA_LIST_FREE(plugin->items, it)
evry_item_free(it);
}
@ -81,33 +74,26 @@ _item_free(Evry_Item *it)
}
static void
_cleanup(Evry_Plugin *p)
_cleanup(Evry_Plugin *plugin)
{
Inst *inst = p->private;
Plugin *p = (Plugin*) plugin;
Efreet_Desktop *desktop;
_list_free(p);
_list_free(plugin);
if (inst)
{
Efreet_Desktop *desktop;
EINA_LIST_FREE(inst->apps_mime, desktop)
efreet_desktop_free(desktop);
EINA_LIST_FREE(inst->apps_all, desktop)
efreet_desktop_free(desktop);
EINA_LIST_FREE(p->apps_mime, desktop)
efreet_desktop_free(desktop);
E_FREE(inst);
}
p->private = NULL;
EINA_LIST_FREE(p->apps_all, desktop)
efreet_desktop_free(desktop);
}
static int
_item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match)
_item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match)
{
Evry_Item *it;
Evry_App *app;
Efreet_Desktop *d2;
Inst *inst = p->private;
int already_refd = 0;
if (desktop)
@ -122,7 +108,7 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match)
int len;
char *tmp;
if (eina_hash_find(inst->added, file))
if (eina_hash_find(p->added, file))
return 0;
len = strlen(file);
@ -144,26 +130,26 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match)
free(tmp);
if (!desktop)
eina_hash_add(inst->added, file, file);
eina_hash_add(p->added, file, file);
}
if (desktop)
{
if ((d2 = eina_hash_find(inst->added, file)) &&
if ((d2 = eina_hash_find(p->added, file)) &&
((desktop == d2) ||
(!strcmp(desktop->exec, d2->exec))))
return 0;
if (!already_refd)
efreet_desktop_ref(desktop);
eina_hash_add(inst->added, file, desktop);
eina_hash_add(p->added, file, desktop);
file = NULL;
}
if (desktop)
it = evry_item_new(p, desktop->name, _item_free);
it = evry_item_new(&p->base, desktop->name, _item_free);
else
it = evry_item_new(p, file, _item_free);
it = evry_item_new(&p->base, file, _item_free);
app = E_NEW(Evry_App, 1);
app->desktop = desktop;
@ -171,13 +157,13 @@ _item_add(Evry_Plugin *p, Efreet_Desktop *desktop, char *file, int match)
it->data[0] = app;
it->fuzzy_match = match;
p->items = eina_list_append(p->items, it);
p->base.items = eina_list_append(p->base.items, it);
return 1;
}
static void
_add_desktop_list(Evry_Plugin *p, Eina_List *apps, const char *input)
_add_desktop_list(Plugin *p, Eina_List *apps, const char *input)
{
Efreet_Desktop *desktop;
Eina_List *l;
@ -185,7 +171,7 @@ _add_desktop_list(Evry_Plugin *p, Eina_List *apps, const char *input)
EINA_LIST_FOREACH(apps, l, desktop)
{
if (eina_list_count(p->items) > 199) continue;
if (eina_list_count(p->base.items) > 199) continue;
if (!desktop->name || !desktop->exec) continue;
char *exec = strrchr(desktop->exec, '/');
@ -245,29 +231,27 @@ _cb_sort(const void *data1, const void *data2)
}
static int
_fetch(Evry_Plugin *p, const char *input)
_fetch(Evry_Plugin *plugin, const char *input)
{
Plugin *p = (Plugin*) plugin;
Eina_List *l;
Efreet_Desktop *desktop;
char *file;
Evry_Item *it;
Evry_App *app;
Inst *inst = p->private;
inst->added = eina_hash_string_small_new(NULL);
p->added = eina_hash_string_small_new(NULL);
_list_free(p);
_list_free(plugin);
/* add apps for a given mimetype */
if (p->type == type_action)
if (p->base.type == type_action)
{
if (input)
{
_add_desktop_list(p, inst->apps_mime, input);
}
_add_desktop_list(p, p->apps_mime, input);
else
{
EINA_LIST_FOREACH(inst->apps_mime, l, desktop)
EINA_LIST_FOREACH(p->apps_mime, l, desktop)
_item_add(p, desktop, NULL, 1);
}
}
@ -275,16 +259,16 @@ _fetch(Evry_Plugin *p, const char *input)
/* add apps matching input */
if (input)
{
if (!inst->apps_all)
if (!p->apps_all)
{
Eina_List *apps = NULL;
Eina_List *stuff;
Eina_List *cats;
Eina_List *l, *ll;
apps = efreet_util_desktop_name_glob_list("*");
stuff = efreet_util_desktop_category_list("Screensaver");
cats = efreet_util_desktop_category_list("Screensaver");
EINA_LIST_FOREACH(stuff, l, desktop)
EINA_LIST_FOREACH(cats, l, desktop)
{
ll = eina_list_data_find_list(apps, desktop);
if (ll)
@ -292,16 +276,15 @@ _fetch(Evry_Plugin *p, const char *input)
efreet_desktop_free(desktop);
apps = eina_list_remove_list(apps, ll);
}
/* efreet_desktop_free(desktop); */
}
inst->apps_all = apps;
p->apps_all = apps;
}
_add_desktop_list(p, inst->apps_all, input);
_add_desktop_list(p, p->apps_all, input);
}
/* add exe history items */
else if (!p->items)
else if (!plugin->items)
{
l = e_exehist_list_get();
EINA_LIST_FREE(l, file)
@ -309,7 +292,7 @@ _fetch(Evry_Plugin *p, const char *input)
}
/* show 'Run Command' item */
if (input || p == p2)
if (input)
{
int found = 0;
char *end;
@ -317,60 +300,53 @@ _fetch(Evry_Plugin *p, const char *input)
char cmd[1024];
char path[1024];
if (input)
snprintf(cmd, sizeof(cmd), "%s", input);
if ((end = strchr(input, ' ')))
{
snprintf(cmd, sizeof(cmd), "%s", input);
int len = (end - input) + 1;
if (len >= 0)
snprintf(cmd, len, "%s", input);
}
if ((end = strchr(input, ' ')))
EINA_LIST_FOREACH(exe_path, l, dir)
{
snprintf(path, sizeof(path), "%s/%s", dir, cmd);
if (ecore_file_exists(path))
{
int len = (end - input) + 1;
if (len >= 0)
snprintf(cmd, len, "%s", input);
}
EINA_LIST_FOREACH(exe_path, l, dir)
{
snprintf(path, sizeof(path), "%s/%s", dir, cmd);
if (ecore_file_exists(path))
{
found = 1;
break;
}
found = 1;
break;
}
}
if (found || p == p2)
if (found)
{
it = evry_item_new(p, _("Run Command"), _item_free);
it = evry_item_new(plugin, _("Run Command"), _item_free);
app = E_NEW(Evry_App, 1);
if (input)
app->file = eina_stringshare_add(input);
else
app->file = eina_stringshare_add("");
app->file = eina_stringshare_add(input);
it->data[0] = app;
it->priority = 9999;
p->items = eina_list_append(p->items, it);
plugin->items = eina_list_append(plugin->items, it);
snprintf(cmd, sizeof(cmd), "xterm -hold -e %s", input);
it = evry_item_new(p, _("Run in Terminal"), _item_free);
it = evry_item_new(plugin, _("Run in Terminal"), _item_free);
app = E_NEW(Evry_App, 1);
if (input)
app->file = eina_stringshare_add(cmd);
else
app->file = eina_stringshare_add("");
app->file = eina_stringshare_add(cmd);
it->data[0] = app;
it->priority = 1000;
p->items = eina_list_append(p->items, it);
plugin->items = eina_list_append(plugin->items, it);
}
}
eina_hash_free(inst->added);
eina_hash_free(p->added);
if (p->items)
if (plugin->items)
{
int prio = 0;
p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort);
EINA_LIST_FOREACH(p->items, l, it)
l = plugin->items;
plugin->items = eina_list_sort(l, eina_list_count(l), _cb_sort);
EINA_LIST_FOREACH(plugin->items, l, it)
it->priority = prio++;
return 1;
@ -525,11 +501,12 @@ _exec_border_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2
}
static int
_open_with_action(Evry_Plugin *p, const Evry_Item *it, const char *input __UNUSED__)
_open_with_action(Evry_Plugin *plugin, const Evry_Item *it, const char *input __UNUSED__)
{
Inst *inst = p->private;
if (inst->candidate)
return _app_action(it, inst->candidate);
Plugin *p = (Plugin*) plugin;
if (p->candidate)
return _app_action(it, p->candidate);
return 0;
}
@ -649,30 +626,36 @@ _init(void)
{
char *path, *p, *last;
p1 = evry_plugin_new("Applications", type_subject, "", "APPLICATION", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, NULL,
_icon_get, NULL, NULL);
p1 = E_NEW(Plugin, 1);
evry_plugin_new(&p1->base, "Applications", type_subject, "", "APPLICATION", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, _icon_get, NULL, NULL);
p2 = evry_plugin_new("Open With...", type_action, "FILE", "", 0, NULL, NULL,
_begin, _cleanup, _fetch, _open_with_action, NULL,
_icon_get, NULL, NULL);
p2 = E_NEW(Plugin, 1);
evry_plugin_new(&p2->base, "Open With...", type_action, "FILE", "", 0, NULL, NULL,
_begin, _cleanup, _fetch, _open_with_action,
_icon_get, NULL, NULL);
evry_plugin_register(p1, 1);
evry_plugin_register(p2, 3);
evry_plugin_register(&p1->base, 1);
evry_plugin_register(&p2->base, 3);
act = evry_action_new("Launch", "APPLICATION", NULL, "everything-launch",
act = evry_action_new("Launch", "APPLICATION", NULL, NULL,
"everything-launch",
_exec_app_action, _exec_app_check_item, NULL);
act1 = evry_action_new("Open File...", "APPLICATION", "FILE", "document-open",
act1 = evry_action_new("Open File...", "APPLICATION", "FILE", "APPLICATION",
"document-open",
_exec_app_action, _exec_app_check_item, NULL);
act2 = evry_action_new("Edit Application Entry", "APPLICATION", NULL, "everything-launch",
act2 = evry_action_new("Edit Application Entry", "APPLICATION", NULL, NULL,
"everything-launch",
_edit_app_action, _edit_app_check_item, NULL);
act3 = evry_action_new("New Application Entry", "APPLICATION", NULL, "everything-launch",
act3 = evry_action_new("New Application Entry", "APPLICATION", NULL, NULL,
"everything-launch",
_new_app_action, _new_app_check_item, NULL);
act4 = evry_action_new("Open File...", "BORDER", "FILE", "everything-launch",
act4 = evry_action_new("Open File...", "BORDER", "FILE", NULL,
"everything-launch",
_exec_border_action, _exec_border_check_item, NULL);
evry_action_register(act);
@ -709,8 +692,11 @@ _shutdown(void)
{
char *str;
evry_plugin_free(p1);
evry_plugin_free(p2);
evry_plugin_free(&p1->base, 0);
evry_plugin_free(&p2->base, 0);
E_FREE(p1);
E_FREE(p2);
evry_action_free(act);
evry_action_free(act1);
evry_action_free(act2);

View File

@ -21,7 +21,7 @@ struct _Plugin
Eina_Bool is_first;
};
static Plugin *_singleton = NULL;
static Plugin *plugin = NULL;
static Eina_Bool
_exe_restart(Plugin *p)
@ -187,7 +187,7 @@ _cb_data(void *data, int type __UNUSED__, void *event)
}
evry_plugin_async_update(plugin, EVRY_ASYNC_UPDATE_ADD);
return 1;
}
@ -229,7 +229,7 @@ _fetch(Evry_Plugin *plugin, const char *input)
if (!input) return 0;
if (!p->handler.data && !_begin(plugin, NULL)) return 0;
len = sizeof(LANG_MODIFIER) - 1;
if (strncmp(input, LANG_MODIFIER, len) == 0)
{
@ -331,42 +331,27 @@ _init(void)
{
Plugin *p;
if (_singleton)
return EINA_TRUE;
p = E_NEW(Plugin, 1);
p->base.name = "Spell Checker";
p->base.type = type_subject;
p->base.type_out = eina_stringshare_add("TEXT");
p->base.icon = "accessories-dictionary";
p->base.trigger = TRIGGER;
p->base.fetch = _fetch;
p->base.cleanup = _cleanup;
evry_plugin_new(&p->base, "Spell Checker", type_subject, "", "TEXT", 1,
"accessories-dictionary", TRIGGER,
NULL, _cleanup, _fetch, NULL, NULL, NULL, NULL);
evry_plugin_register(&p->base, 100);
_singleton = p;
plugin = p;
return EINA_TRUE;
}
static void
_shutdown(void)
{
Evry_Item *it;
Plugin *p;
if (!_singleton)
return;
p = plugin;
p = _singleton;
_singleton = NULL;
_cleanup(&p->base);
EINA_LIST_FREE(p->base.items, it)
evry_item_free(it);
eina_stringshare_del(p->base.type_out);
evry_plugin_unregister(&p->base);
evry_plugin_free(&p->base, 0);
E_FREE(p);
}

View File

@ -28,14 +28,14 @@ _cb_border_remove(void *data, int type, void *event)
return 1;
}
static int
static Evry_Plugin *
_begin(Evry_Plugin *p, const Evry_Item *it)
{
handlers = eina_list_append
(handlers, ecore_event_handler_add
(E_EVENT_BORDER_REMOVE, _cb_border_remove, NULL));
return 1;
return p;
}
static void
@ -218,8 +218,8 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
static Eina_Bool
_init(void)
{
p = evry_plugin_new("Windows", type_subject, NULL, "BORDER", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, NULL, _item_icon_get, NULL, NULL);
p = evry_plugin_new(NULL, "Windows", type_subject, NULL, "BORDER", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, _item_icon_get, NULL, NULL);
evry_plugin_register(p, 2);
@ -229,7 +229,7 @@ _init(void)
static void
_shutdown(void)
{
evry_plugin_free(p);
evry_plugin_free(p, 1);
}

View File

@ -83,7 +83,7 @@ _act_cb_border_unminimize(E_Border *bd)
if (!bd->lock_user_iconify) e_border_uniconify(bd);
}
static int
static Evry_Plugin *
_begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item)
{
E_Border *bd;
@ -92,7 +92,7 @@ _begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item)
/* e_object_ref(E_OBJECT(bd)); */
inst->border = bd;
return 1;
return p;
}
static int
@ -212,8 +212,8 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
static Eina_Bool
_init(void)
{
p = evry_plugin_new("Window Action", type_action, "BORDER", NULL, 0, NULL, NULL,
_begin, _cleanup, _fetch, _action, NULL, _item_icon_get, NULL, NULL);
p = evry_plugin_new(NULL, "Window Action", type_action, "BORDER", NULL, 0, NULL, NULL,
_begin, _cleanup, _fetch, _action, _item_icon_get, NULL, NULL);
evry_plugin_register(p, 1);
@ -225,7 +225,7 @@ _init(void)
static void
_shutdown(void)
{
evry_plugin_free(p);
evry_plugin_free(p, 1);
E_FREE(inst);
}

View File

@ -14,7 +14,7 @@ static int error = 0;
static int
static Evry_Plugin *
_begin(Evry_Plugin *p, const Evry_Item *item __UNUSED__)
{
Evry_Item *it;
@ -34,7 +34,7 @@ _begin(Evry_Plugin *p, const Evry_Item *item __UNUSED__)
it = evry_item_new(p, "0", NULL);
p->items = eina_list_prepend(p->items, it);
return 1;
return p;
}
static int
@ -207,8 +207,8 @@ _cb_del(void *data __UNUSED__, int type __UNUSED__, void *event)
static Eina_Bool
_init(void)
{
p1 = evry_plugin_new("Calculator", type_subject, NULL, "TEXT", 1, "accessories-calculator", "=",
_begin, _cleanup, _fetch, _action, NULL, NULL, NULL, NULL);
p1 = evry_plugin_new(NULL, "Calculator", type_subject, NULL, "TEXT", 1, "accessories-calculator", "=",
_begin, _cleanup, _fetch, _action, NULL, NULL, NULL);
evry_plugin_register(p1, 0);
@ -223,7 +223,7 @@ _shutdown(void)
EINA_LIST_FREE(history, result)
eina_stringshare_del(result);
evry_plugin_free(p1);
evry_plugin_free(p1, 1);
}

View File

@ -25,7 +25,7 @@ _init(void)
Ecore_X_Window win = ecore_x_window_new(0, 0, 0, 1, 1);
if (!win) return EINA_FALSE;
act = evry_action_new("Copy to Clipboard", "TEXT", NULL, "edit-copy",
act = evry_action_new("Copy to Clipboard", "TEXT", NULL, NULL, "edit-copy",
_action, _check_item, NULL);
evry_action_register(act);

View File

@ -130,10 +130,10 @@ _action(Evry_Action *act, const Evry_Item *it, const Evry_Item *it2 __UNUSED__,
static Eina_Bool
_init(void)
{
p = evry_plugin_new("Settings", type_subject, NULL, "E_SETTINGS", 0, NULL, NULL,
NULL, _cleanup, _fetch, NULL, NULL, _item_icon_get, NULL, NULL);
p = evry_plugin_new(NULL, "Settings", type_subject, NULL, "E_SETTINGS", 0, NULL, NULL,
NULL, _cleanup, _fetch, NULL, _item_icon_get, NULL, NULL);
act = evry_action_new("Show Dialog", "E_SETTINGS", NULL, "preferences-advanced",
act = evry_action_new("Show Dialog", "E_SETTINGS", NULL, NULL, "preferences-advanced",
_action, NULL, NULL);
evry_plugin_register(p, 10);
@ -145,7 +145,9 @@ _init(void)
static void
_shutdown(void)
{
evry_plugin_free(p);
evry_plugin_free(p, 1);
evry_action_free(act);
}

View File

@ -3,30 +3,33 @@
#define MAX_ITEMS 100
typedef struct _State State;
typedef struct _Plugin Plugin;
struct _State
struct _Plugin
{
Evry_Plugin base;
const char *directory;
/* all files of directory */
Eina_List *items;
/* current list of files */
Eina_List *cur;
Eina_Bool command;
Ecore_Idler *idler;
};
static Evry_Plugin *p1;
static Evry_Plugin *p2;
static Evry_Action *act;
static Ecore_Idler *idler = NULL;
static Evry_Item *
_item_add(Evry_Plugin *p, const char *directory, const char *file)
_item_add(Plugin *p, const char *directory, const char *file)
{
Evry_Item *it = NULL;
char buf[4096];
it = evry_item_new(p, file, NULL);
it = evry_item_new(&p->base, file, NULL);
if (!it) return NULL;
snprintf(buf, sizeof(buf), "%s/%s", directory, file);
@ -94,15 +97,12 @@ _cb_sort(const void *data1, const void *data2)
static int
_dirbrowse_idler(void *data)
{
Evry_Plugin *p = data;
State *s = ((Eina_List *)p->private)->data;
int cnt = 10;
Plugin *p = data;
Eina_List *l;
Evry_Item *it;
int cnt = 10;
if (!idler) return 0;
EINA_LIST_FOREACH(s->items, l, it)
EINA_LIST_FOREACH(p->items, l, it)
{
if (!it->mime)
{
@ -112,38 +112,28 @@ _dirbrowse_idler(void *data)
if (cnt == 0) break;
}
if (!s->command)
l = p->base.items;
p->base.items = eina_list_sort(l, eina_list_count(l), _cb_sort);
evry_plugin_async_update(&p->base, EVRY_ASYNC_UPDATE_ADD);
if (cnt > 0)
{
if (eina_list_count(p->items) > 0)
{
p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort);
s->cur = p->items;
}
evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_ADD);
if (cnt > 0)
{
idler = NULL;
return 0;
}
p->idler = NULL;
return 0;
}
return 1;
}
static void
_push_directory(Evry_Plugin *p, State *s)
_read_directory(Plugin *p)
{
char *file;
Eina_List *files;
Evry_Item *it;
Eina_List *stack = p->private;
/* previous states items are saved in s->items !*/
p->items = NULL;
files = ecore_file_ls(s->directory);
files = ecore_file_ls(p->directory);
EINA_LIST_FREE(files, file)
{
@ -155,164 +145,141 @@ _push_directory(Evry_Plugin *p, State *s)
continue;
}
it = _item_add(p, s->directory, file);
it = _item_add(p, p->directory, file);
if (it)
s->items = eina_list_append(s->items, it);
p->items = eina_list_append(p->items, it);
free(file);
}
if (idler)
ecore_idler_del(idler);
idler = ecore_idler_add(_dirbrowse_idler, p);
stack = eina_list_prepend(stack, s);
p->private = stack;
p->idler = ecore_idler_add(_dirbrowse_idler, p);
}
static int
_begin(Evry_Plugin *p, const Evry_Item *item __UNUSED__)
static Evry_Plugin *
_begin(Evry_Plugin *plugin, const Evry_Item *it)
{
State *s;
Plugin *p;
s = E_NEW(State, 1);
s->directory = eina_stringshare_add(e_user_homedir_get());
_push_directory(p, s);
/* is FILE ? */
if (it && (it->plugin->type_out == plugin->type_in))
{
if (!it->uri || !ecore_file_is_dir(it->uri))
return NULL;
return 1;
}
p = E_NEW(Plugin, 1);
p->base = *plugin;
static int
_browse(Evry_Plugin *p, const Evry_Item *it_file)
{
State *s;
p->directory = eina_stringshare_add(it->uri);
}
else
{
p = E_NEW(Plugin, 1);
p->base = *plugin;
if (!it_file || !it_file->uri || !ecore_file_is_dir(it_file->uri))
return 0;
p->directory = eina_stringshare_add(e_user_homedir_get());
}
_read_directory(p);
s = E_NEW(State, 1);
s->directory = eina_stringshare_add(it_file->uri);
_push_directory(p, s);
return 1;
return &p->base;
}
static void
_cleanup(Evry_Plugin *p)
_cleanup(Evry_Plugin *plugin)
{
State *s;
Plugin *p = (Plugin*) plugin;
Evry_Item *it;
Eina_List *stack = p->private;
if (!stack) return;
if (p->directory)
eina_stringshare_del(p->directory);
s = stack->data;
if (s->directory) eina_stringshare_del(s->directory);
EINA_LIST_FREE(s->items, it)
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
if (idler)
{
ecore_idler_del(idler);
idler = NULL;
}
if (p->idler)
ecore_idler_del(p->idler);
E_FREE(s);
if (plugin->items)
eina_list_free(plugin->items);
if (p->items) eina_list_free(p->items);
p->items = NULL;
stack = eina_list_remove_list(stack, stack);
p->private = stack;
if (stack)
{
s = stack->data;
p->items = s->cur;
}
E_FREE(p);
}
static int
_fetch(Evry_Plugin *p, const char *input)
_fetch(Evry_Plugin *plugin, const char *input)
{
Plugin *p = (Plugin*) plugin;
Evry_Item *it;
Eina_List *l;
int cnt = 0;
State *s = ((Eina_List *)p->private)->data;
if (!s->command)
if (!p->command)
{
if (p->items) eina_list_free(p->items);
p->items = NULL;
if (p->base.items) eina_list_free(p->base.items);
plugin->items = NULL;
}
/* input is command ? */
if (input)
{
if (!strncmp(input, "/", 1))
{
if (s->command) return 1;
if (!strncmp(input, "/", 1))
{
if (p->command) return 1;
it = evry_item_new(p, "/", NULL);
if (!it) return 0;
it->uri = eina_stringshare_add("/");
p->items = eina_list_append(p->items, it);
s->cur = p->items;
s->command = EINA_TRUE;
return 1;
}
else if (!strncmp(input, "..", 2))
{
char *end;
char dir[4096];
char *tmp;
int prio = 0;
it = evry_item_new(&p->base, "/", NULL);
if (!it) return 0;
it->uri = eina_stringshare_add("/");
p->base.items = eina_list_append(p->base.items, it);
p->command = EINA_TRUE;
return 1;
}
else if (!strncmp(input, "..", 2))
{
char *end;
char dir[4096];
char *tmp;
int prio = 0;
if (s->command) return 1;
if (p->command) return 1;
if (!strcmp(s->directory, "/")) return 0;
if (!strcmp(p->directory, "/")) return 0;
snprintf(dir, 4096, "%s", s->directory);
end = strrchr(dir, '/');
snprintf(dir, 4096, "%s", p->directory);
end = strrchr(dir, '/');
while (end != dir)
{
tmp = strdup(dir);
snprintf(dir, (end - dir) + 1, "%s", tmp);
it = evry_item_new(p, dir, NULL);
if (!it) break;
it->uri = eina_stringshare_add(dir);
it->priority = prio;
p->items = eina_list_append(p->items, it);
end = strrchr(dir, '/');
free(tmp);
prio--;
}
while (end != dir)
{
tmp = strdup(dir);
snprintf(dir, (end - dir) + 1, "%s", tmp);
it = evry_item_new(&p->base, dir, NULL);
if (!it) break;
it->uri = eina_stringshare_add(dir);
it->priority = prio;
p->base.items = eina_list_append(p->base.items, it);
end = strrchr(dir, '/');
free(tmp);
prio--;
}
it = evry_item_new(p, "/", NULL);
if (!it) return 0;
it->uri = eina_stringshare_add("/");
it->priority = prio;
p->items = eina_list_append(p->items, it);
s->cur = p->items;
s->command = EINA_TRUE;
return 1;
}
it = evry_item_new(&p->base, "/", NULL);
if (!it) return 0;
it->uri = eina_stringshare_add("/");
it->priority = prio;
p->base.items = eina_list_append(p->base.items, it);
p->command = EINA_TRUE;
return 1;
}
}
if (s->command)
if (p->command)
{
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
s->command = EINA_FALSE;
p->command = EINA_FALSE;
EINA_LIST_FREE(p->base.items, it)
evry_item_free(it);
}
EINA_LIST_FOREACH(s->items, l, it)
EINA_LIST_FOREACH(p->items, l, it)
{
if (input)
{
@ -325,17 +292,16 @@ _fetch(Evry_Plugin *p, const char *input)
if (it)
{
p->items = eina_list_prepend(p->items, it);
cnt++;
if (cnt >= MAX_ITEMS) break;
p->base.items = eina_list_append(p->base.items, it);
if (cnt++ >= MAX_ITEMS) break;
}
}
s->cur = p->items;
if (p->items)
if (p->base.items)
{
p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort);
s->cur = p->items;
p->base.items = eina_list_sort
(p->base.items, eina_list_count(p->base.items), _cb_sort);
return 1;
}
@ -355,7 +321,7 @@ _icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
if (it->browseable)
o = evry_icon_theme_get("folder", e);
else
o = evry_icon_mime_get(it->mime, e);
o = evry_icon_mime_get(it->mime, e);
return o;
}
@ -368,7 +334,8 @@ _open_folder_check(Evry_Action *act __UNUSED__, const Evry_Item *it)
}
static int
_open_folder_action(Evry_Action *act __UNUSED__, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__)
_open_folder_action(Evry_Action *act __UNUSED__, const Evry_Item *it,
const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__)
{
E_Action *action = e_action_find("fileman");
char *path;
@ -393,21 +360,22 @@ _open_folder_action(Evry_Action *act __UNUSED__, const Evry_Item *it, const Evry
return 1;
}
static Eina_Bool
_init(void)
{
p1 = evry_plugin_new("Files", type_subject, "FILE", "FILE", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, _browse, _icon_get,
p1 = evry_plugin_new(NULL, "Files", type_subject, "FILE", "FILE", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, _icon_get,
NULL, NULL);
p2 = evry_plugin_new("Files", type_object, "FILE", "FILE", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, _browse, _icon_get,
p2 = evry_plugin_new(NULL, "Files", type_object, "FILE", "FILE", 0, NULL, NULL,
_begin, _cleanup, _fetch, NULL, _icon_get,
NULL, NULL);
evry_plugin_register(p1, 3);
evry_plugin_register(p2, 1);
act = evry_action_new("Open Folder (EFM)", "FILE", NULL, "folder-open",
act = evry_action_new("Open Folder (EFM)", "FILE", NULL, NULL, "folder-open",
_open_folder_action, _open_folder_check, NULL);
evry_action_register(act);
@ -418,8 +386,9 @@ _init(void)
static void
_shutdown(void)
{
evry_plugin_free(p1);
evry_plugin_free(p2);
evry_plugin_free(p1, 1);
evry_plugin_free(p2, 1);
evry_action_free(act);
}

View File

@ -195,6 +195,9 @@ _view_create(Evry_View *view, const Evry_State *s, const Evas_Object *swallow)
Image_View *v;
int w, h, x, y;
if (!s->plugin)
return NULL;
if (!_get_list(s))
return NULL;

View File

@ -3,10 +3,12 @@
/* TODO check if trackerd is running and version */
typedef struct _Inst Inst;
typedef struct _Plugin Plugin;
struct _Inst
struct _Plugin
{
Evry_Plugin base;
int active;
char *condition;
char *service;
@ -20,14 +22,15 @@ static E_DBus_Connection *conn = NULL;
static Eina_List *plugins = NULL;
static int _prio = 5;
static int
_begin(Evry_Plugin *p, const Evry_Item *it)
static Evry_Plugin *
_begin(Evry_Plugin *plugin, const Evry_Item *it)
{
Inst *inst = p->private;
Plugin *p = (Plugin*) plugin;
inst->active = 0;
p->active = 0;
if (!strcmp(it->plugin->type_out, "APPLICATION"))
/* is application */
if (it->plugin->type_out == plugin->type_in)
{
Eina_List *l;
const char *mime;
@ -36,11 +39,11 @@ _begin(Evry_Plugin *p, const Evry_Item *it)
char rdf_query[32768];
int len = 0;
if (inst->condition[0]) free (inst->condition);
inst->condition = "";
if (p->condition[0]) free (p->condition);
p->condition = "";
if (!app->desktop || !app->desktop->mime_types)
return 1;
return NULL;
rdf_query[0] = '\0';
strcat(rdf_query, "<rdfq:Condition><rdfq:or>");
@ -48,7 +51,7 @@ _begin(Evry_Plugin *p, const Evry_Item *it)
EINA_LIST_FOREACH(app->desktop->mime_types, l, mime)
{
if (!strcmp(mime, "x-directory/normal"))
return 0;
return NULL;
snprintf(mime_entry, 256,
"<rdfq:contains>"
@ -63,21 +66,21 @@ _begin(Evry_Plugin *p, const Evry_Item *it)
}
strcat(rdf_query, "</rdfq:or></rdfq:Condition>");
inst->condition = strdup(rdf_query);
p->condition = strdup(rdf_query);
}
return 1;
return plugin;
}
static Evry_Item *
_item_add(Evry_Plugin *p, char *file, char *mime, int prio)
_item_add(Plugin *p, char *file, char *mime, int prio)
{
Evry_Item *it;
const char *filename;
int folder = (!strcmp(mime, "Folder"));
/* folders are specifically searched */
if (folder && p->begin)
if (folder && p->base.begin)
return NULL;
filename = ecore_file_file_get(file);
@ -85,7 +88,7 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio)
if (!filename)
return NULL;
it = evry_item_new(p, filename, NULL);
it = evry_item_new(&p->base, filename, NULL);
if (!it)
return NULL;
it->priority = prio;
@ -104,27 +107,27 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio)
}
static void
_cleanup(Evry_Plugin *p)
_cleanup(Evry_Plugin *plugin)
{
Plugin *p = (Plugin*) plugin;
Evry_Item *it;
Inst *inst = p->private;
inst->active = 0;
p->active = 0;
if (inst->input)
eina_stringshare_del(inst->input);
inst->input = NULL;
if (p->input)
eina_stringshare_del(p->input);
p->input = NULL;
if (inst->matched)
eina_stringshare_del(inst->matched);
inst->matched = NULL;
if (p->matched)
eina_stringshare_del(p->matched);
p->matched = NULL;
EINA_LIST_FREE(inst->items, it)
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
if (p->items)
eina_list_free(p->items);
p->items = NULL;
if (p->base.items)
eina_list_free(p->base.items);
p->base.items = NULL;
}
static int
@ -145,19 +148,18 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error)
char *uri, *mime, *date;
Evry_Item *it;
Eina_List *items = NULL;
Evry_Plugin *p = data;
Inst *inst = p->private;
Plugin *p = data;
if (inst->active) inst->active--;
if (p->active) p->active--;
if (dbus_error_is_set(error))
{
_cleanup(p);
_cleanup(&p->base);
printf("Error: %s - %s\n", error->name, error->message);
return;
}
if (inst->active) return;
if (p->active) return;
dbus_message_iter_init(msg, &array);
if(dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY)
@ -189,63 +191,63 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error)
}
}
if (p->items)
eina_list_free(p->items);
p->items = NULL;
if (p->base.items)
eina_list_free(p->base.items);
p->base.items = NULL;
if (items)
{
Eina_List *l;
EINA_LIST_FREE(inst->items, it)
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
items = eina_list_sort(items, eina_list_count(items), _cb_sort);
inst->items = items;
p->items = items;
EINA_LIST_FOREACH(inst->items, l, it)
p->items = eina_list_append(p->items, it);
EINA_LIST_FOREACH(p->items, l, it)
p->base.items = eina_list_append(p->base.items, it);
if (inst->matched)
eina_stringshare_del(inst->matched);
if (inst->input)
inst->matched = eina_stringshare_add(inst->input);
if (p->matched)
eina_stringshare_del(p->matched);
if (p->input)
p->matched = eina_stringshare_add(p->input);
else
inst->matched = NULL;
p->matched = NULL;
}
else if (inst->items && inst->input && inst->matched &&
(strlen(inst->input) > strlen(inst->matched)))
else if (p->items && p->input && p->matched &&
(strlen(p->input) > strlen(p->matched)))
{
Eina_List *l;
EINA_LIST_FOREACH(inst->items, l, it)
if (evry_fuzzy_match(it->label, (inst->input + strlen(inst->matched))))
p->items = eina_list_append(p->items, it);
EINA_LIST_FOREACH(p->items, l, it)
if (evry_fuzzy_match(it->label, (p->input + strlen(p->matched))))
p->base.items = eina_list_append(p->base.items, it);
}
else
{
EINA_LIST_FREE(inst->items, it)
EINA_LIST_FREE(p->items, it)
evry_item_free(it);
if (inst->input)
eina_stringshare_del(inst->input);
inst->input = NULL;
if (p->input)
eina_stringshare_del(p->input);
p->input = NULL;
if (inst->matched)
eina_stringshare_del(inst->matched);
inst->matched = NULL;
if (p->matched)
eina_stringshare_del(p->matched);
p->matched = NULL;
}
evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_ADD);
evry_plugin_async_update(&p->base, EVRY_ASYNC_UPDATE_ADD);
}
static int
_fetch(Evry_Plugin *p, const char *input)
_fetch(Evry_Plugin *plugin, const char *input)
{
Inst *inst = p->private;
Plugin *p = (Plugin*) plugin;
DBusMessage *msg;
int live_query_id = 0;
int max_hits = inst->max_hits;
int max_hits = p->max_hits;
int offset = 0;
int sort_descending = 1;
int sort_by_service = 0;
@ -262,35 +264,35 @@ _fetch(Evry_Plugin *p, const char *input)
char **_keywords = keywords;
char **_sort_fields = sort_fields;
if (inst->input)
eina_stringshare_del(inst->input);
inst->input = NULL;
if (p->input)
eina_stringshare_del(p->input);
p->input = NULL;
if (!conn)
{
_cleanup(p);
_cleanup(plugin);
return 0;
}
if (input && (strlen(input) > 2))
{
inst->input = eina_stringshare_add(input);
p->input = eina_stringshare_add(input);
search_text = malloc(sizeof(char) * strlen(input) + 1);
sprintf(search_text, "%s", input);
max_hits = 100;
}
else if (!input && !p->begin && p->type == type_object)
else if (!input && !plugin->begin && plugin->type == type_object)
{
sort_by_access = 1;
search_text = "";
}
else
{
_cleanup(p);
_cleanup(plugin);
return 0;
}
inst->active++;
p->active++;
msg = dbus_message_new_method_call("org.freedesktop.Tracker",
"/org/freedesktop/Tracker/Search",
@ -298,13 +300,13 @@ _fetch(Evry_Plugin *p, const char *input)
"Query");
dbus_message_append_args(msg,
DBUS_TYPE_INT32, &live_query_id,
DBUS_TYPE_STRING, &inst->service,
DBUS_TYPE_STRING, &p->service,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
&_fields, 2,
DBUS_TYPE_STRING, &search_text,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
&_keywords, 0,
DBUS_TYPE_STRING, &inst->condition,
DBUS_TYPE_STRING, &p->condition,
DBUS_TYPE_BOOLEAN, &sort_by_service,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
&_sort_fields, sort_by_access,
@ -338,21 +340,26 @@ _icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
static void
_plugin_new(const char *name, int type, char *service, int max_hits, int begin)
{
Evry_Plugin *p;
Inst *inst;
Plugin *p;
p = evry_plugin_new(name, type, "", "FILE", 0, NULL, NULL,
(begin ? _begin : NULL), _cleanup, _fetch,
NULL, NULL, _icon_get, NULL, NULL);
p = E_NEW(Plugin, 1);
p->condition = "";
p->service = service;
p->max_hits = max_hits;
p->active = 0;
if (!begin)
evry_plugin_new(&p->base, name, type, "", "FILE", 0, NULL, NULL,
NULL, _cleanup, _fetch,
NULL, _icon_get, NULL, NULL);
else
evry_plugin_new(&p->base, name, type, "APPLICATION", "FILE", 0, NULL, NULL,
_begin, _cleanup, _fetch,
NULL, _icon_get, NULL, NULL);
inst = E_NEW(Inst, 1);
inst->condition = "";
inst->service = service;
inst->max_hits = max_hits;
inst->active = 0;
p->private = inst;
evry_plugin_register(p, _prio++);
plugins = eina_list_append(plugins, p);
evry_plugin_register(&p->base, _prio++);
}
@ -378,19 +385,17 @@ _init(void)
static void
_shutdown(void)
{
Inst *inst;
Evry_Plugin *p;
Plugin *p;
if (conn) e_dbus_connection_close(conn);
EINA_LIST_FREE(plugins, p)
{
evry_plugin_free(&p->base, 0);
inst = p->private;
if (inst->condition[0]) free(inst->condition);
E_FREE(inst);
evry_plugin_free(p);
if (p->condition[0]) free(p->condition);
E_FREE(p);
}
}