'everything' module:

- use const for items passed to plugin functions
- fixed possible segv in dirbrowse plugin
- added tracker search for folders
- restrict tracker search results to supported mimetypes when using 'open file' action


SVN revision: 41702
This commit is contained in:
Hannes Janetzek 2009-08-12 12:17:43 +00:00
parent 5e3f6b5179
commit 363bd7a050
11 changed files with 423 additions and 241 deletions

View File

@ -110,20 +110,23 @@ struct _Evry_Plugin
Eina_Bool browseable;
/* run when plugin is activated. */
int (*begin) (Evry_Plugin *p, Evry_Item *item);
int (*begin) (Evry_Plugin *p, const Evry_Item *item);
int (*browse) (Evry_Plugin *p, const Evry_Item *item);
/* get candidates matching string, fills 'candidates' list */
int (*fetch) (Evry_Plugin *p, const char *input);
/* run before new query and when hiding 'everything' */
void (*cleanup) (Evry_Plugin *p);
Evas_Object *(*icon_get) (Evry_Plugin *p, Evry_Item *it, Evas *e);
Evas_Object *(*icon_get) (Evry_Plugin *p, const Evry_Item *it, Evas *e);
/* provide more information for a candidate */
/* int (*candidate_info) (Evas *evas, Evry_Item *item); */
/* optional: default action for this plugins items */
int (*action) (Evry_Plugin *p, Evry_Item *item, const char *input);
int (*action) (Evry_Plugin *p, const Evry_Item *item, const char *input);
Evry_Action *act;
/* optional: create list of items when shown (e.g. for sorting) */
@ -150,9 +153,9 @@ struct _Evry_Action
const char *type_in2;
const char *type_out;
int (*action) (Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input);
int (*action) (Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input);
int (*check_item) (Evry_Action *act, Evry_Item *it);
int (*check_item) (Evry_Action *act, const Evry_Item *it);
Evas_Object *(*icon_get) (Evry_Action *act, Evas *e);

View File

@ -109,7 +109,7 @@ static int _evry_cb_key_down(void *data, int type, void *event);
* static void _evry_cb_item_mouse_in(void *data, Evas *evas, Evas_Object *obj, void *event_info);
* static void _evry_cb_item_mouse_out(void *data, Evas *evas, Evas_Object *obj, void *event_info); */
static void _evry_matches_update(Evry_Selector *sel, Evry_Plugin *plugin);
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);
@ -157,18 +157,18 @@ static int _evry_list_scroll_timer(void *data);
static int _evry_list_item_idler(void *data);
static int _evry_plug_actions_init(void);
static int _evry_plug_actions_begin(Evry_Plugin *p, Evry_Item *it);
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, Evry_Item *it, Evas *e);
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_begin(Evry_Plugin *p, Evry_Item *it);
static int _evry_plug_aggregator_begin(Evry_Plugin *p, const Evry_Item *it);
static int _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input);
static int _evry_plug_aggregator_action(Evry_Plugin *p, Evry_Item *item, 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, Evry_Item *it, Evas *e);
static Evas_Object *_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, const Evry_Item *it, Evas *e);
/* static int _evry_cb_plugin_sort_by_trigger(const void *data1, const void *data2); */
/* local subsystem globals */
@ -592,7 +592,7 @@ _evry_selector_free(Evry_Selector *sel)
_evry_plug_aggregator_free(sel->aggregator);
eina_list_free(sel->plugins);
if (sel->plugins) eina_list_free(sel->plugins);
E_FREE(sel);
}
@ -613,7 +613,7 @@ _evry_selector_activate(Evry_Selector *sel)
if (s && s->plugin && !s->plugin->async_query)
{
_evry_list_clear_list(s);
_evry_matches_update(selector, s->plugin);
_evry_matches_update(selector);
_evry_selector_update(selector);
}
ecore_timer_del(update_timer);
@ -697,8 +697,11 @@ _evry_selector_update(Evry_Selector *sel)
_evry_select_plugin(s, s->cur_plugins->data);
}
else
s->plugin = NULL;
{
s->plugin = NULL;
s->sel_item = NULL;
}
it = s->sel_item;
if (!it && s->plugin)
@ -775,7 +778,7 @@ _evry_selector_subjects_get(void)
_evry_state_new(sel, plugins);
_evry_matches_update(sel, NULL);
_evry_matches_update(sel);
return 1;
}
@ -815,7 +818,7 @@ _evry_selector_actions_get(Evry_Item *it)
_evry_state_new(sel, plugins);
_evry_matches_update(sel, NULL);
_evry_matches_update(sel);
return 1;
}
@ -831,8 +834,9 @@ _evry_selector_objects_get(const char *type)
while (sel->state)
_evry_state_pop(sel);
it = NULL; // TODO let 'object' plugins take subject and action
// into account. selectors[0]->state->sel_item;
// TODO let 'object' plugins take subject and action
// into account. selectors[0]->state->sel_item;
it = selectors[0]->state->sel_item;
EINA_LIST_FOREACH(sel->plugins, l, p)
{
@ -852,7 +856,7 @@ _evry_selector_objects_get(const char *type)
_evry_state_new(sel, plugins);
_evry_matches_update(sel, NULL);
_evry_matches_update(sel);
return 1;
}
@ -883,7 +887,7 @@ _evry_state_pop(Evry_Selector *sel)
free(sel->state->input);
EINA_LIST_FREE(sel->state->plugins, p)
p->cleanup(p);
E_FREE(sel->state);
sel->states = eina_list_remove_list(sel->states, sel->states);
@ -907,23 +911,20 @@ _evry_browse_item(Evry_Selector *sel)
if (!it || !it->browseable) return;
_evry_list_clear_list(sel->state);
EINA_LIST_FOREACH(sel->plugins, l, p)
{
if (!p->browse) continue;
if (!strstr(p->type_in, it->plugin->type_out)) continue;
if (p->begin)
{
if (p->begin(p, it))
plugins = eina_list_append(plugins, p);
}
else
if (p->browse(p, it))
plugins = eina_list_append(plugins, p);
}
if (plugins)
{
_evry_state_new(sel, plugins);
_evry_matches_update(sel, NULL);
_evry_matches_update(sel);
_evry_selector_update(sel);
}
@ -973,7 +974,7 @@ _evry_selectors_switch(void)
if (!s->plugin->async_query)
{
_evry_list_clear_list(s);
_evry_matches_update(selector, s->plugin);
_evry_matches_update(selector);
_evry_selector_update(selector);
}
ecore_timer_del(update_timer);
@ -1071,6 +1072,7 @@ _evry_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
((strlen(s->input) < (INPUTLEN - strlen(ev->compose)))))
{
strcat(s->input, ev->compose);
/* _evry_update_timer(s); */
_evry_update(s);
}
return 1;
@ -1089,6 +1091,7 @@ _evry_backspace(Evry_State *s)
{
s->input[pos] = 0;
_evry_update(s);
/* _evry_update_timer(s); */
}
}
}
@ -1120,12 +1123,12 @@ _evry_update_timer(void *data)
{
Evry_State *s = data;
/* XXX pass selector as data? */
_evry_list_clear_list(s);
_evry_matches_update(selector, s->plugin);
_evry_list_clear_list(s);
_evry_matches_update(selector);
_evry_selector_update(selector);
_evry_list_update(selector->state);
update_timer = NULL;
return 0;
}
@ -1156,7 +1159,7 @@ _evry_plugin_action(Evry_Selector *sel, int finished)
/* XXX what if an async plugin is selected */
if (!selector->state->plugin->async_query)
{
_evry_matches_update(selector, selector->state->plugin);
_evry_matches_update(selector);
_evry_selector_update(selector);
}
@ -1323,14 +1326,14 @@ _evry_list_item_idler(void *data)
static void
_evry_matches_update(Evry_Selector *sel, Evry_Plugin *plugin)
_evry_matches_update(Evry_Selector *sel)
{
Evry_State *s = sel->state;
Evry_Plugin *p;
Eina_List *l;
Eina_Bool has_items = EINA_FALSE;
eina_list_free(s->cur_plugins);
if (s->cur_plugins) eina_list_free(s->cur_plugins);
s->cur_plugins = NULL;
s->sel_item = NULL;
@ -1850,7 +1853,7 @@ _evry_plug_actions_init(void)
}
static int
_evry_plug_actions_begin(Evry_Plugin *p, Evry_Item *it)
_evry_plug_actions_begin(Evry_Plugin *p, const Evry_Item *it)
{
Evry_Action *act;
Eina_List *l;
@ -1934,12 +1937,12 @@ _evry_plug_actions_cleanup(Evry_Plugin *p)
evry_item_free(it);
p->items = NULL;
eina_list_free(sel->actions);
if (sel->actions) eina_list_free(sel->actions);
sel->actions = NULL;
}
static Evas_Object *
_evry_plug_actions_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
_evry_plug_actions_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o;
Evry_Action *act = it->data[0];
@ -1998,10 +2001,9 @@ _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input __UNUSED__)
int cnt;
if (p->items)
{
eina_list_free(p->items);
p->items = NULL;
}
eina_list_free(p->items);
p->items = NULL;
EINA_LIST_FOREACH(s->cur_plugins, l, plugin)
{
@ -2016,7 +2018,7 @@ _evry_plug_aggregator_fetch(Evry_Plugin *p, const char *input __UNUSED__)
}
static int
_evry_plug_aggregator_action(Evry_Plugin *p, Evry_Item *it, const char *input)
_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);
@ -2027,12 +2029,12 @@ _evry_plug_aggregator_action(Evry_Plugin *p, Evry_Item *it, const char *input)
static void
_evry_plug_aggregator_cleanup(Evry_Plugin *p)
{
eina_list_free(p->items);
if (p->items) eina_list_free(p->items);
p->items = NULL;
}
static Evas_Object *
_evry_plug_aggregator_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e)
_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);
@ -2061,6 +2063,7 @@ evry_plugin_async_update(Evry_Plugin *p, int action)
if (p == s->plugin)
{
s->plugin = NULL;
/* _evry_list_clear_list(s); */
_evry_selector_update(selector);
if (list->visible)

View File

@ -8,7 +8,7 @@ struct _Inst
Eina_Hash *added;
Eina_List *apps_mime;
Eina_List *apps_all;
Evry_Item *candidate;
const Evry_Item *candidate;
};
static Evry_Plugin *p1;
@ -21,7 +21,7 @@ static Eina_List *exe_path = NULL;
static int
_begin(Evry_Plugin *p, Evry_Item *it)
_begin(Evry_Plugin *p, const Evry_Item *it)
{
const char *mime;
Inst *inst = NULL;
@ -367,7 +367,7 @@ _fetch(Evry_Plugin *p, const char *input)
}
static Evas_Object *
_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o = NULL;
Evry_App *app = it->data[0];
@ -385,7 +385,7 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
}
static int
_exec_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it)
_exec_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it)
{
Evry_App *app = it->data[0];
if (app->desktop)
@ -398,7 +398,7 @@ _exec_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it)
}
static int
_app_action(Evry_Item *it_app, Evry_Item *it_file)
_app_action(const Evry_Item *it_app, const Evry_Item *it_file)
{
E_Zone *zone;
Evry_App *app = NULL;
@ -447,13 +447,13 @@ _app_action(Evry_Item *it_app, Evry_Item *it_file)
}
static int
_exec_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input)
_exec_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input)
{
return _app_action(it1, it2);
}
static int
_open_with_action(Evry_Plugin *p, Evry_Item *it, const char *input __UNUSED__)
_open_with_action(Evry_Plugin *p, const Evry_Item *it, const char *input __UNUSED__)
{
Inst *inst = p->private;
if (inst->candidate)
@ -461,7 +461,7 @@ _open_with_action(Evry_Plugin *p, Evry_Item *it, const char *input __UNUSED__)
}
static int
_edit_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it)
_edit_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it)
{
Evry_App *app = it->data[0];
if (app->desktop)
@ -472,7 +472,7 @@ _edit_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it)
static int
_edit_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input)
_edit_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input)
{
Evry_App *app;
Efreet_Desktop *desktop;
@ -499,7 +499,7 @@ _edit_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *i
static int
_new_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it)
_new_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it)
{
Evry_App *app = it->data[0];
if (app->desktop)
@ -513,7 +513,7 @@ _new_app_check_item(Evry_Action *act __UNUSED__, Evry_Item *it)
static int
_new_app_action(Evry_Action *act, Evry_Item *it1, Evry_Item *it2, const char *input)
_new_app_action(Evry_Action *act, const Evry_Item *it1, const Evry_Item *it2, const char *input)
{
Evry_App *app;
char *name;

View File

@ -202,7 +202,7 @@ _cb_del(void *data, int type __UNUSED__, void *event)
}
static int
_begin(Evry_Plugin *plugin, Evry_Item *it __UNUSED__)
_begin(Evry_Plugin *plugin, const Evry_Item *it __UNUSED__)
{
Plugin *p = (Plugin *)plugin;

View File

@ -1,46 +1,34 @@
#include "e.h"
#include "e_mod_main.h"
static int _fetch(Evry_Plugin *p, const char *input);
/* static int _action(Evry_Plugin *p, Evry_Item *item, const char *input); */
static void _cleanup(Evry_Plugin *p);
static void _item_add(Evry_Plugin *p, E_Border *bd, int prio);
static int _cb_sort(const void *data1, const void *data2);
static Evas_Object *_item_icon_get(Evry_Plugin *p, Evry_Item *it, Evas *e);
static Eina_Bool _init(void);
static void _shutdown(void);
EINA_MODULE_INIT(_init);
EINA_MODULE_SHUTDOWN(_shutdown);
static Evry_Plugin *p;
static Eina_Bool
_init(void)
{
p = E_NEW(Evry_Plugin, 1);
p->name = "Windows";
p->type = type_subject;
p->type_in = "NONE";
p->type_out = "BORDER";
p->need_query = 0;
p->fetch = &_fetch;
/* p->action = &_action; */
p->cleanup = &_cleanup;
p->icon_get = &_item_icon_get;
evry_plugin_register(p);
return EINA_TRUE;
}
static void
_shutdown(void)
_item_add(Evry_Plugin *p, E_Border *bd, int prio)
{
evry_plugin_unregister(p);
E_FREE(p);
Evry_Item *it;
it = evry_item_new(p, e_border_name_get(bd));
/* e_object_ref(E_OBJECT(bd)); */
it->data[0] = bd;
it->priority = prio;
p->items = eina_list_append(p->items, it);
}
/* TODO sort by focus history and name? */
static int
_cb_sort(const void *data1, const void *data2)
{
const Evry_Item *it1, *it2;
it1 = data1;
it2 = data2;
return (it1->priority - it2->priority);
}
static void
_cleanup(Evry_Plugin *p)
@ -118,7 +106,7 @@ _fetch(Evry_Plugin *p, const char *input)
}
static Evas_Object *
_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o = NULL;
E_Border *bd = it->data[0];
@ -155,29 +143,30 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
return o;
}
static Eina_Bool
_init(void)
{
p = E_NEW(Evry_Plugin, 1);
p->name = "Windows";
p->type = type_subject;
p->type_in = "NONE";
p->type_out = "BORDER";
p->need_query = 0;
p->fetch = &_fetch;
/* p->action = &_action; */
p->cleanup = &_cleanup;
p->icon_get = &_item_icon_get;
evry_plugin_register(p);
return EINA_TRUE;
}
static void
_item_add(Evry_Plugin *p, E_Border *bd, int prio)
_shutdown(void)
{
Evry_Item *it;
it = evry_item_new(p, e_border_name_get(bd));
/* e_object_ref(E_OBJECT(bd)); */
it->data[0] = bd;
it->priority = prio;
p->items = eina_list_append(p->items, it);
}
/* TODO sort by focus history and name? */
static int
_cb_sort(const void *data1, const void *data2)
{
const Evry_Item *it1, *it2;
it1 = data1;
it2 = data2;
return (it1->priority - it2->priority);
evry_plugin_unregister(p);
E_FREE(p);
}
EINA_MODULE_INIT(_init);
EINA_MODULE_SHUTDOWN(_shutdown);

View File

@ -62,7 +62,7 @@ _act_cb_border_unminimize(E_Border *bd)
}
static int
_begin(Evry_Plugin *p __UNUSED__, Evry_Item *item)
_begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item)
{
E_Border *bd;
@ -165,7 +165,7 @@ _fetch(Evry_Plugin *p, const char *input __UNUSED__)
}
static int
_action(Evry_Plugin *p __UNUSED__, Evry_Item *item, const char *input __UNUSED__)
_action(Evry_Plugin *p __UNUSED__, const Evry_Item *item, const char *input __UNUSED__)
{
void (*border_action) (E_Border *bd);
border_action = item->data[0];
@ -175,7 +175,7 @@ _action(Evry_Plugin *p __UNUSED__, Evry_Item *item, const char *input __UNUSED__
}
static Evas_Object *
_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o;

View File

@ -17,7 +17,7 @@ static int error = 0;
static int
_begin(Evry_Plugin *p, Evry_Item *it __UNUSED__)
_begin(Evry_Plugin *p, const Evry_Item *it __UNUSED__)
{
data_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _cb_data, p);
@ -54,7 +54,7 @@ _cleanup(Evry_Plugin *p)
}
static int
_action(Evry_Plugin *p, Evry_Item *it, const char *input __UNUSED__)
_action(Evry_Plugin *p, const Evry_Item *it, const char *input __UNUSED__)
{
if (p->items)
{

View File

@ -5,14 +5,14 @@ static Evry_Action *act;
static Ecore_X_Window clipboard_win = 0;
static int
_action(Evry_Action *act __UNUSED__, Evry_Item *it, Evry_Item *it2 __UNUSED__, const char *input __UNUSED__)
_action(Evry_Action *act __UNUSED__, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__)
{
ecore_x_selection_primary_set(clipboard_win, it->label, strlen(it->label));
ecore_x_selection_clipboard_set(clipboard_win, it->label, strlen(it->label));
}
static int
_check_item(Evry_Action *act __UNUSED__, Evry_Item *it)
_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it)
{
return (it && it->label && (strlen(it->label) > 0));
}

View File

@ -83,7 +83,7 @@ _fetch(Evry_Plugin *p, const char *input)
}
static Evas_Object *
_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o = NULL;
E_Configure_It *eci = it->data[0];
@ -102,7 +102,7 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
}
static int
_action(Evry_Action *act, Evry_Item *it, Evry_Item *it2 __UNUSED__, const char *input __UNUSED__)
_action(Evry_Action *act, const Evry_Item *it, const Evry_Item *it2 __UNUSED__, const char *input __UNUSED__)
{
E_Configure_It *eci, *eci2;
E_Container *con;

View File

@ -15,13 +15,13 @@ struct _State
Eina_Bool command;
};
static Evry_Plugin *p;
static Evry_Plugin *p1;
static Evry_Plugin *p2;
static Ecore_Idler *idler = NULL;
static Evry_Item *
_item_add(const char *directory, const char *file)
_item_add(Evry_Plugin *p, const char *directory, const char *file)
{
Evry_Item *it = NULL;
char buf[4096];
@ -132,35 +132,17 @@ _dirbrowse_idler(void *data)
}
static int
_begin(Evry_Plugin *p, Evry_Item *it)
_begin(Evry_Plugin *p, const Evry_Item *it)
{
State *s;
char *file;
Eina_List *files;
Eina_List *stack = p->private;
if (stack)
{
s = stack->data;
/* if (s->command) evry_clear_input(); */
}
if (it)
{
if (!it->uri || !ecore_file_is_dir(it->uri))
return 0;
s = E_NEW(State, 1);
s->directory = eina_stringshare_add(it->uri);
p->items = NULL;
}
else
{
s = E_NEW(State, 1);
s->directory = eina_stringshare_add(e_user_homedir_get());
p->items = NULL;
}
s = E_NEW(State, 1);
s->directory = eina_stringshare_add(e_user_homedir_get());
p->items = NULL;
files = ecore_file_ls(s->directory);
EINA_LIST_FREE(files, file)
@ -173,7 +155,7 @@ _begin(Evry_Plugin *p, Evry_Item *it)
continue;
}
it = _item_add(s->directory, file);
it = _item_add(p, s->directory, file);
if (it)
s->items = eina_list_append(s->items, it);
@ -185,13 +167,59 @@ _begin(Evry_Plugin *p, Evry_Item *it)
ecore_idler_del(idler);
idler = ecore_idler_add(_dirbrowse_idler, p);
stack = eina_list_prepend(stack, s);
p->private = stack;
return 1;
}
static int
_browse(Evry_Plugin *p, const Evry_Item *it_file)
{
State *s;
char *file;
Eina_List *files;
Evry_Item *it;
Eina_List *stack = p->private;
if (!it_file || !it_file->uri || !ecore_file_is_dir(it_file->uri))
return 0;
s = E_NEW(State, 1);
s->directory = eina_stringshare_add(it_file->uri);
/* previous states items are saved in s->items !*/
p->items = NULL;
files = ecore_file_ls(s->directory);
EINA_LIST_FREE(files, file)
{
it = NULL;
if (file[0] == '.')
{
free(file);
continue;
}
it = _item_add(p, s->directory, file);
if (it)
s->items = eina_list_append(s->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;
}
static void
_cleanup(Evry_Plugin *p)
{
@ -220,15 +248,15 @@ _cleanup(Evry_Plugin *p)
E_FREE(s);
eina_list_free(p->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;
}
}
@ -243,13 +271,13 @@ _fetch(Evry_Plugin *p, const char *input)
char match2[4096];
int cnt = 0;
State *s = ((Eina_List *)p->private)->data;
if (!s->command)
{
if (p->items) eina_list_free(p->items);
p->items = NULL;
}
/* input is command ? */
if (input)
{
@ -343,6 +371,7 @@ _fetch(Evry_Plugin *p, const char *input)
}
}
s->cur = p->items;
if (p->items)
{
p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort);
@ -354,13 +383,13 @@ _fetch(Evry_Plugin *p, const char *input)
}
static Evas_Object *
_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
Evas_Object *o = NULL;
char *icon_path;
if (!it->mime)
_item_fill(it);
_item_fill((Evry_Item *)it);
if (!it->mime) return NULL;
@ -390,17 +419,18 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
static Eina_Bool
_init(void)
{
p = E_NEW(Evry_Plugin, 1);
p->name = "Files";
p->type = type_subject;
p->type_in = "NONE|FILE";
p->type_out = "FILE";
p->browseable = EINA_TRUE;
p->begin = &_begin;
p->fetch = &_fetch;
p->cleanup = &_cleanup;
p->icon_get = &_item_icon_get;
evry_plugin_register(p);
p1 = E_NEW(Evry_Plugin, 1);
p1->name = "Files";
p1->type = type_subject;
p1->type_in = "NONE|FILE";
p1->type_out = "FILE";
p1->browseable = EINA_TRUE;
p1->begin = &_begin;
p1->browse = &_browse;
p1->fetch = &_fetch;
p1->cleanup = &_cleanup;
p1->icon_get = &_item_icon_get;
evry_plugin_register(p1);
p2 = E_NEW(Evry_Plugin, 1);
p2->name = "Files";
@ -409,6 +439,7 @@ _init(void)
p2->type_out = "FILE";
p2->browseable = EINA_TRUE;
p2->begin = &_begin;
p2->browse = &_browse;
p2->fetch = &_fetch;
p2->cleanup = &_cleanup;
p2->icon_get = &_item_icon_get;
@ -420,9 +451,9 @@ _init(void)
static void
_shutdown(void)
{
evry_plugin_unregister(p);
evry_plugin_unregister(p1);
evry_plugin_unregister(p2);
E_FREE(p);
E_FREE(p1);
E_FREE(p2);
}

View File

@ -7,19 +7,80 @@ typedef struct _Inst Inst;
struct _Inst
{
E_DBus_Connection *conn;
int active;
char *condition;
char *service;
Eina_List *items;
};
static Evry_Plugin *p1;
static Evry_Plugin *p2;
static Inst *inst;
static Eina_Bool active = EINA_FALSE;
static E_DBus_Connection *conn = NULL;
static Evry_Plugin *p1 = NULL;
static Evry_Plugin *p2 = NULL;
static Evry_Plugin *p3 = NULL;
static Evry_Plugin *p4 = NULL;
static int
_begin(Evry_Plugin *p, const Evry_Item *it)
{
Inst *inst = p->private;
inst->active = 0;
if (!strcmp(it->plugin->type_out, "APPLICATION"))
{
Efreet_Desktop *desktop;
Eina_List *l;
const char *mime;
Evry_App *app = it->data[0];
char mime_entry[256];
char rdf_query[32768];
int len = 0;
inst->service = "Files";
if (inst->condition[0]) free (inst->condition);
inst->condition = "";
if (!app->desktop || !app->desktop->mime_types)
return 1;
rdf_query[0] = '\0';
strcat(rdf_query, "<rdfq:Condition><rdfq:or>");
EINA_LIST_FOREACH(app->desktop->mime_types, l, mime)
{
if (!strcmp(mime, "x-directory/normal"))
return 0;
snprintf(mime_entry, 256,
"<rdfq:contains>"
"<rdfq:Property name=\"File:Mime\" />"
"<rdf:String>%s</rdf:String> "
"</rdfq:contains>",
mime);
strcat(rdf_query, mime_entry);
len += 256;
if (len > 32000) break;
}
strcat(rdf_query, "</rdfq:or></rdfq:Condition>");
inst->condition = strdup(rdf_query);
}
return 1;
}
static void
_item_add(Evry_Plugin *p, char *file, char *mime, int prio)
{
Evry_Item *it;
const char *filename;
int folder = (!strcmp(mime, "Folder"));
/* folders are specifically searched by p2 and p4 ;) */
if (folder && ((p == p1) || (p == p3))) return;
filename = ecore_file_file_get(file);
@ -29,7 +90,7 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio)
it->priority = prio;
it->uri = eina_stringshare_add(file);
if (!strcmp(mime, "Folder"))
if (folder)
{
it->browseable = EINA_TRUE;
it->mime = eina_stringshare_add("x-directory/normal");
@ -40,15 +101,32 @@ _item_add(Evry_Plugin *p, char *file, char *mime, int prio)
p->items = eina_list_append(p->items, it);
}
static void
_cleanup(Evry_Plugin *p)
{
Evry_Item *it;
Inst *inst = p->private;
EINA_LIST_FREE(p->items, it)
{
if (it->mime) eina_stringshare_del(it->mime);
if (it->uri) eina_stringshare_del(it->uri);
evry_item_free(it);
}
p->items = NULL;
}
static void
_dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error)
{
DBusMessageIter array, iter, item;
Evry_Plugin *p;
char *uri, *mime, *date;
Evry_Plugin *p = data;
Inst *inst = p->private;
if (!active) return;
p = data;
if (inst->active) inst->active--;
if (inst->active) return;
if (dbus_error_is_set(error))
{
@ -56,14 +134,16 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error)
return;
}
/* evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_CLEAR);
* _cleanup(p);
* */
dbus_message_iter_init(msg, &array);
if(dbus_message_iter_get_arg_type(&array) == DBUS_TYPE_ARRAY)
{
dbus_message_iter_recurse(&array, &item);
while(dbus_message_iter_get_arg_type(&item) == DBUS_TYPE_ARRAY)
{
char *uri, *mime;
{
dbus_message_iter_recurse(&item, &iter);
if (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING)
@ -73,11 +153,11 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error)
/* dbus_message_iter_get_basic(&iter, &service); */
dbus_message_iter_next(&iter);
dbus_message_iter_get_basic(&iter, &mime);
if (uri && mime)
{
_item_add(p, uri, mime, 1);
}
/* dbus_message_iter_next(&iter);
* dbus_message_iter_get_basic(&iter, &date); */
/* printf("date: %s\n",date); */
if (uri && mime) _item_add(p, uri, mime, 1);
}
dbus_message_iter_next(&item);
}
@ -86,62 +166,77 @@ _dbus_cb_reply(void *data, DBusMessage *msg, DBusError *error)
evry_plugin_async_update(p, EVRY_ASYNC_UPDATE_ADD);
}
static void
_cleanup(Evry_Plugin *p)
{
Evry_Item *it;
EINA_LIST_FREE(p->items, it)
{
if (it->mime) eina_stringshare_del(it->mime);
if (it->uri) eina_stringshare_del(it->uri);
evry_item_free(it);
}
p->items = NULL;
active = EINA_FALSE;
}
static int
_fetch(Evry_Plugin *p, const char *input)
{
Inst *inst = p->private;
DBusMessage *msg;
DBusMessageIter iter;
int live_query_id = 0;
int offset = 0;
int max_hits = 50;
char *service = "Files";
char *match;
int max_hits = 100;
int sort_descending = 1;
int sort_by_service = 0;
char *search_text;
char *fields[2];
char *keywords[1];
char *sort_fields[1];
fields[0] = "File:Mime";
fields[1] = "File:Accessed";
keywords[0] = "";
sort_fields[0] = "";
_cleanup(p);
char **_fields = fields;
char **_keywords = keywords;
char **_sort_fields = sort_fields;
if (!input || (strlen(input) < 3)) return 0;
active = EINA_TRUE;
match = malloc(sizeof(char) * strlen(input) + 2);
sprintf(match, "%s*", input);
_cleanup(p);
if (!conn) return 0;
/* if (!input || (strlen(input) < 3)) return 0; */
if (input && (strlen(input) > 2))
{
search_text = malloc(sizeof(char) * strlen(input) + 3);
sprintf(search_text, "*%s*", input);
}
else if (p == p2 || p == p4)
{
search_text = "";
}
else return 0;
inst->active++;
msg = dbus_message_new_method_call("org.freedesktop.Tracker",
"/org/freedesktop/Tracker/Search",
"org.freedesktop.Tracker.Search",
"TextDetailed");
"Query");
dbus_message_append_args(msg,
DBUS_TYPE_INT32, &live_query_id,
DBUS_TYPE_STRING, &inst->service,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_fields, 1,
DBUS_TYPE_STRING, &search_text,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_keywords, 0,
DBUS_TYPE_STRING, &inst->condition,
DBUS_TYPE_BOOLEAN, &sort_by_service,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &_sort_fields, 0,
DBUS_TYPE_BOOLEAN, &sort_descending,
DBUS_TYPE_INT32, &offset,
DBUS_TYPE_INT32, &max_hits,
DBUS_TYPE_INVALID);
dbus_message_iter_init_append(msg, &iter);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &live_query_id);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &service);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &match);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &offset);
dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &max_hits);
e_dbus_message_send(inst->conn, msg, _dbus_cb_reply, -1, p);
e_dbus_message_send(conn, msg, _dbus_cb_reply, -1, p);
dbus_message_unref(msg);
free(match);
if (input && (strlen(input) > 2))
free(search_text);
return 0;
}
static Evas_Object *
_item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
_item_icon_get(Evry_Plugin *p __UNUSED__, const Evry_Item *it, Evas *e)
{
char *icon_path;
Evas_Object *o = NULL;
@ -172,9 +267,10 @@ _item_icon_get(Evry_Plugin *p __UNUSED__, Evry_Item *it, Evas *e)
static Eina_Bool
_init(void)
{
E_DBus_Connection *conn = e_dbus_bus_get(DBUS_BUS_SESSION);
if (!conn) return 0;
Inst *inst;
conn = e_dbus_bus_get(DBUS_BUS_SESSION);
if (!conn) return EINA_FALSE;
p1 = E_NEW(Evry_Plugin, 1);
p1->name = "Find Files";
@ -185,21 +281,57 @@ _init(void)
p1->fetch = &_fetch;
p1->cleanup = &_cleanup;
p1->icon_get = &_item_icon_get;
inst = E_NEW(Inst, 1);
inst->condition = "";
inst->service = "Files";
p1->private = inst;
evry_plugin_register(p1);
p2 = E_NEW(Evry_Plugin, 1);
p2->name = "Find Files";
p2->type = type_object;
p2->name = "Folders";
p2->type = type_subject;
p2->type_in = "NONE";
p2->type_out = "FILE";
p2->async_query = 1;
p2->fetch = &_fetch;
p2->cleanup = &_cleanup;
p2->icon_get = &_item_icon_get;
evry_plugin_register(p2);
inst = E_NEW(Inst, 1);
inst->conn = conn;
inst->condition = "";
inst->service = "Folders";
p2->private = inst;
evry_plugin_register(p2);
p3 = E_NEW(Evry_Plugin, 1);
p3->name = "Find Files";
p3->type = type_object;
p3->type_in = "NONE";
p3->type_out = "FILE";
p3->async_query = 1;
p3->begin = &_begin;
p3->fetch = &_fetch;
p3->cleanup = &_cleanup;
p3->icon_get = &_item_icon_get;
inst = E_NEW(Inst, 1);
inst->condition = "";
inst->service = "Files";
p3->private = inst;
evry_plugin_register(p3);
p4 = E_NEW(Evry_Plugin, 1);
p4->name = "Folders";
p4->type = type_object;
p4->type_in = "NONE";
p4->type_out = "FILE";
p4->async_query = 1;
p4->fetch = &_fetch;
p4->cleanup = &_cleanup;
p4->icon_get = &_item_icon_get;
inst = E_NEW(Inst, 1);
inst->condition = "";
inst->service = "Folders";
p4->private = inst;
evry_plugin_register(p4);
return EINA_TRUE;
}
@ -207,17 +339,41 @@ _init(void)
static void
_shutdown(void)
{
evry_plugin_unregister(p1);
evry_plugin_unregister(p2);
Inst *inst;
if (conn) e_dbus_connection_close(conn);
if (p1) E_FREE(p1);
if (p2) E_FREE(p2);
if (inst)
{
if (inst->conn)
e_dbus_connection_close(inst->conn);
if (p1)
{
evry_plugin_unregister(p1);
inst = p1->private;
E_FREE(inst);
E_FREE(p1);
}
if (p2)
{
evry_plugin_unregister(p2);
inst = p2->private;
E_FREE(inst);
E_FREE(p2);
}
if (p3)
{
evry_plugin_unregister(p3);
inst = p3->private;
if (inst->condition[0]) free(inst->condition);
E_FREE(inst);
E_FREE(p3);
}
if (p4)
{
evry_plugin_unregister(p4);
inst = p4->private;
E_FREE(inst);
E_FREE(p4);
}
}