'everything' module:
authorHannes Janetzek <hannes.janetzek@gmail.com>
Wed, 12 Aug 2009 12:17:43 +0000 (12:17 +0000)
committerHannes Janetzek <hannes.janetzek@gmail.com>
Wed, 12 Aug 2009 12:17:43 +0000 (12:17 +0000)
- 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

src/modules/everything/e_mod_main.h
src/modules/everything/evry.c
src/modules/everything/evry_plug_apps.c
src/modules/everything/evry_plug_aspell.c
src/modules/everything/evry_plug_border.c
src/modules/everything/evry_plug_border_act.c
src/modules/everything/evry_plug_calc.c
src/modules/everything/evry_plug_clipboard.c
src/modules/everything/evry_plug_config.c
src/modules/everything/evry_plug_dir_browse.c
src/modules/everything/evry_plug_tracker.c

index 6fb0239ca5eb03c0d038446b0b6ef7050e9d975f..06b6b13c1c244dc34fb276805f6ed1cf7eef62b3 100644 (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);  
 
index f971c7c27a959946160592cbce303ed127f4afe4..d153aacc0b53b71238b825bd617fe5142c96d682 100644 (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)
index 8ff0384731e80f56c81fcf96a527aac7506d157a..f6ce22fe547ee77d2b9de9c41e9f201c163c5fa3 100644 (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;
index 4e5d70529fd5d2b654da145b37caa93a8e1af160..d4ea84a3a50fb9205b4a1844de32566c60b7c580 100644 (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;
 
index 06f35da11ba9161690d34235b9849842ec3454d6..f59f277992c1cad1eafa2fde861e4e129e2b161d 100644 (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)
+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)
@@ -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 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);
index 282035a28dde9470fdb295e78cb754cf88208a4e..65c7b9a4282bb858ec98d63414e8c527ae1da866 100644 (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;
 
index 8d3386a6c3e82d3437b47102e4792bf792eee1f7..433b8657bb93431d31a24c56f87a570d7e960646 100644 (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)
      {
index bffb770525595aa7f5cb54e5352e25077749c34e..25688e3a06134c3c7125b3c08123f86c1fc34ac7 100644 (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));
 }
index bf09eb66dd78bf91978f3293d8a4cb9fb10c651b..50ded555aea512ffaec4bcb7fc68b272883fc39c 100644 (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;
index 66932bd3a5fa8a38eec8809b238263bcf691b000..8cf8bb05826b4aeb958676d9e9f316f87622d37a 100644 (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,65 @@ _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 = 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)
@@ -173,7 +203,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,11 +215,9 @@ _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 void
@@ -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);
 }
 
index 92ddcae948e2a72b62bebb46fcbcea252b41bbe0..bbed4384efdc55eff50d1f39f0d3546a522c3799 100644 (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");
-
-   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;
@@ -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;
+   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;
 }
@@ -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)
+     { 
+       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);
      }
 }