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) */
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);
* 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);
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 */
_evry_plug_aggregator_free(sel->aggregator);
- eina_list_free(sel->plugins);
+ if (sel->plugins) eina_list_free(sel->plugins);
E_FREE(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);
_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)
_evry_state_new(sel, plugins);
- _evry_matches_update(sel, NULL);
+ _evry_matches_update(sel);
return 1;
}
_evry_state_new(sel, plugins);
- _evry_matches_update(sel, NULL);
+ _evry_matches_update(sel);
return 1;
}
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)
{
_evry_state_new(sel, plugins);
- _evry_matches_update(sel, NULL);
+ _evry_matches_update(sel);
return 1;
}
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);
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);
}
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);
((strlen(s->input) < (INPUTLEN - strlen(ev->compose)))))
{
strcat(s->input, ev->compose);
+ /* _evry_update_timer(s); */
_evry_update(s);
}
return 1;
{
s->input[pos] = 0;
_evry_update(s);
+ /* _evry_update_timer(s); */
}
}
}
{
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;
}
/* 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);
}
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;
}
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;
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];
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)
{
}
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);
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);
if (p == s->plugin)
{
+ s->plugin = NULL;
/* _evry_list_clear_list(s); */
_evry_selector_update(selector);
if (list->visible)
Eina_Hash *added;
Eina_List *apps_mime;
Eina_List *apps_all;
- Evry_Item *candidate;
+ const Evry_Item *candidate;
};
static Evry_Plugin *p1;
static int
-_begin(Evry_Plugin *p, Evry_Item *it)
+_begin(Evry_Plugin *p, const Evry_Item *it)
{
const char *mime;
Inst *inst = NULL;
}
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];
}
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)
}
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;
}
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)
}
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)
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;
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)
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;
}
static int
-_begin(Evry_Plugin *plugin, Evry_Item *it __UNUSED__)
+_begin(Evry_Plugin *plugin, const Evry_Item *it __UNUSED__)
{
Plugin *p = (Plugin *)plugin;
#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)
+static void
+_item_add(Evry_Plugin *p, E_Border *bd, int prio)
{
- 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);
+ Evry_Item *it;
- return EINA_TRUE;
+ 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);
}
-static void
-_shutdown(void)
+/* TODO sort by focus history and name? */
+static int
+_cb_sort(const void *data1, const void *data2)
{
- evry_plugin_unregister(p);
- E_FREE(p);
-}
+ const Evry_Item *it1, *it2;
+ it1 = data1;
+ it2 = data2;
+
+ return (it1->priority - it2->priority);
+}
static void
_cleanup(Evry_Plugin *p)
}
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];
return o;
}
-static void
-_item_add(Evry_Plugin *p, E_Border *bd, int prio)
+static Eina_Bool
+_init(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 = 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);
- p->items = eina_list_append(p->items, it);
+ return EINA_TRUE;
}
-/* TODO sort by focus history and name? */
-static int
-_cb_sort(const void *data1, const void *data2)
+static void
+_shutdown(void)
{
- 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);
}
static int
-_begin(Evry_Plugin *p __UNUSED__, Evry_Item *item)
+_begin(Evry_Plugin *p __UNUSED__, const Evry_Item *item)
{
E_Border *bd;
}
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];
}
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;
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);
}
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)
{
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));
}
}
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];
}
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;
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];
}
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 = 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)
{
- s = stack->data;
- /* if (s->command) evry_clear_input(); */
+ 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;
- if (it)
- {
- if (!it->uri || !ecore_file_is_dir(it->uri))
- return 0;
+ return 1;
+}
- 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;
- }
+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)
continue;
}
- it = _item_add(s->directory, file);
+ it = _item_add(p, s->directory, file);
if (it)
s->items = eina_list_append(s->items, it);
ecore_idler_del(idler);
idler = ecore_idler_add(_dirbrowse_idler, p);
-
+
stack = eina_list_prepend(stack, s);
p->private = stack;
-
- return 1;
}
static void
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;
}
}
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)
{
}
}
+ s->cur = p->items;
if (p->items)
{
p->items = eina_list_sort(p->items, eina_list_count(p->items), _cb_sort);
}
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;
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";
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;
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);
}
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);
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");
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))
{
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)
/* 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);
}
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");
-
- 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);
+ "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);
+
+ 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;
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";
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;
+ inst = E_NEW(Inst, 1);
+ 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->conn = conn;
+ inst->condition = "";
+ inst->service = "Folders";
+ p4->private = inst;
+ evry_plugin_register(p4);
return EINA_TRUE;
}
static void
_shutdown(void)
{
- evry_plugin_unregister(p1);
- evry_plugin_unregister(p2);
+ Inst *inst;
+
+ if (conn) e_dbus_connection_close(conn);
+
+ if (p1)
+ {
+ evry_plugin_unregister(p1);
+ inst = p1->private;
+ E_FREE(inst);
+ E_FREE(p1);
+ }
- if (p1) E_FREE(p1);
- if (p2) E_FREE(p2);
+ if (p2)
+ {
+ evry_plugin_unregister(p2);
+ inst = p2->private;
+ E_FREE(inst);
+ E_FREE(p2);
+ }
- if (inst)
+ if (p3)
{
- if (inst->conn)
- e_dbus_connection_close(inst->conn);
+ 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);
}
}