'everything'
authorHannes Janetzek <hannes.janetzek@gmail.com>
Wed, 2 Sep 2009 19:43:16 +0000 (19:43 +0000)
committerHannes Janetzek <hannes.janetzek@gmail.com>
Wed, 2 Sep 2009 19:43:16 +0000 (19:43 +0000)
- added sudo app action and config option
- remove unused item after seven days from history

SVN revision: 42189

src/modules/everything/e_mod_main.c
src/modules/everything/e_mod_main.h
src/modules/everything/evry_config.c
src/modules/everything/evry_history.c
src/modules/everything/sources/evry_plug_apps.c

index fae1ccae8f473e8c300684e95e7af5c33313420b..898d58c2dda72e6efeead6d04d92a9a6ff9667fe 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "e_mod_main.h"
 
-#define CONFIG_VERSION 5
+#define CONFIG_VERSION 6
 
 /* actual module specifics */
 static void _e_mod_action_cb(E_Object *obj, const char *params);
@@ -187,6 +187,7 @@ _config_init()
    E_CONFIG_VAL(D, T, hide_list, INT);
    E_CONFIG_VAL(D, T, quick_nav, INT);
    E_CONFIG_VAL(D, T, cmd_terminal, STR);
+   E_CONFIG_VAL(D, T, cmd_sudo, STR);
    E_CONFIG_LIST(D, T, conf_subjects, conf_item_edd);
    E_CONFIG_LIST(D, T, conf_actions, conf_item_edd);
    E_CONFIG_LIST(D, T, conf_objects, conf_item_edd);
@@ -219,6 +220,7 @@ _config_init()
        evry_conf->conf_objects = NULL;
        evry_conf->conf_views   = NULL;
        evry_conf->cmd_terminal = eina_stringshare_add("/usr/bin/xterm");
+       evry_conf->cmd_sudo = eina_stringshare_add("/usr/bin/gksudo --preserve-env");
      }
 }
 
index b97c7c0c15f73ee2c2149d35ae576077e31e3c25..76cb8a7cdbd38dea668b0dd7a75a4f69062884db 100644 (file)
@@ -34,6 +34,7 @@ struct _Config
   int quick_nav;
 
   const char *cmd_terminal;
+  const char *cmd_sudo;
 
   /* not saved data */
   Eina_List *plugins;
@@ -51,6 +52,7 @@ struct _History_Item
   const char *context;
   const char *input;
   double last_used;
+  double usage;
   int count;
   int transient;
 };
index c0e268d062e48e54805757092f162b949cb19ad8..3925a345b6acc622d5e08f7417d861de9f676cd5 100644 (file)
@@ -22,6 +22,7 @@ struct _E_Config_Dialog_Data
   int scroll_animate;
 
   char *cmd_terminal;
+  char *cmd_sudo;
 
   Evas_Object *l_subject;
   Evas_Object *l_action;
@@ -78,6 +79,9 @@ _fill_data(E_Config_Dialog_Data *cfdata)
 
    if (evry_conf->cmd_terminal)
      cfdata->cmd_terminal = strdup(evry_conf->cmd_terminal);   
+
+   if (evry_conf->cmd_sudo)
+     cfdata->cmd_sudo = strdup(evry_conf->cmd_sudo);   
 }
 
 static void *
@@ -97,6 +101,7 @@ _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
    if (cfdata->p_action)  eina_list_free(cfdata->p_action);
    if (cfdata->p_object)  eina_list_free(cfdata->p_object);
    E_FREE(cfdata->cmd_terminal);
+   E_FREE(cfdata->cmd_sudo);
    E_FREE(cfdata);
 }
 
@@ -124,6 +129,9 @@ _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
    if (evry_conf->cmd_terminal)
      eina_stringshare_del(evry_conf->cmd_terminal);
    evry_conf->cmd_terminal = eina_stringshare_add(cfdata->cmd_terminal);
+   if (evry_conf->cmd_sudo)
+     eina_stringshare_del(evry_conf->cmd_sudo);
+   evry_conf->cmd_sudo = eina_stringshare_add(cfdata->cmd_sudo);
    
    e_config_save_queue();
    return 1;
@@ -223,7 +231,12 @@ _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dial
    e_widget_framelist_object_append(of, ob);
    ob = e_widget_entry_add(evas, &(cfdata->cmd_terminal), NULL, NULL, NULL);
    e_widget_framelist_object_append(of, ob);
-   
+
+   ob = e_widget_label_add(evas, _("Sudo GUI"));
+   e_widget_framelist_object_append(of, ob);
+   ob = e_widget_entry_add(evas, &(cfdata->cmd_sudo), NULL, NULL, NULL);
+   e_widget_framelist_object_append(of, ob);
+
    e_widget_list_object_append(o, of, 1, 1, 0.5);
 
 
index 39face0b8f74ba0aa83f0f85ad9a5b933bfa26b6..fa5b4d45d68bbe36f9221bd5d7e0cdb29027b2f6 100644 (file)
@@ -1,8 +1,10 @@
 #include "e_mod_main.h"
 
-#define HISTORY_VERSION 6
+#define HISTORY_VERSION 7
 
-#define TIME_NOW (1.0 - (evry_hist->begin / ecore_time_get())) / 1000000000000.0
+#define SEVEN_DAYS 604800
+
+#define TIME_FACTOR(_now) (1.0 - (evry_hist->begin / _now)) / 1000000000000000.0
 
 typedef struct _Cleanup_Data Cleanup_Data;
 
@@ -27,11 +29,12 @@ evry_history_init(void)
    hist_item_edd = E_CONFIG_DD_NEW("History_Item", History_Item);
 #define T History_Item
 #define D hist_item_edd
-   E_CONFIG_VAL(D, T, plugin, STR);
-   E_CONFIG_VAL(D, T, context, STR);
-   E_CONFIG_VAL(D, T, input, STR);
+   E_CONFIG_VAL(D, T, plugin,    STR);
+   E_CONFIG_VAL(D, T, context,   STR);
+   E_CONFIG_VAL(D, T, input,     STR);
    E_CONFIG_VAL(D, T, last_used, DOUBLE);
-   E_CONFIG_VAL(D, T, count, INT);
+   E_CONFIG_VAL(D, T, usage,     DOUBLE);
+   E_CONFIG_VAL(D, T, count,     INT);
    E_CONFIG_VAL(D, T, transient, INT);
 #undef T
 #undef D
@@ -44,10 +47,10 @@ evry_history_init(void)
    hist_edd = E_CONFIG_DD_NEW("History", History);
 #define T History
 #define D hist_edd
-   E_CONFIG_VAL(D, T,  version, INT);
+   E_CONFIG_VAL(D, T,  version,  INT);
+   E_CONFIG_VAL(D, T,  begin,    DOUBLE);
    E_CONFIG_HASH(D, T, subjects, hist_entry_edd);
    E_CONFIG_HASH(D, T, actions,  hist_entry_edd);
-   E_CONFIG_VAL(D, T,  begin, DOUBLE);
 #undef T
 #undef D
 }
@@ -83,6 +86,12 @@ _hist_cleanup_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata
 
    EINA_LIST_FOREACH_SAFE(he->items, l, ll, hi)
      {
+       if (hi->last_used < d->time - SEVEN_DAYS)
+         {
+            hi->count--;
+            hi->last_used = d->time - SEVEN_DAYS/2;
+         }
+       
        /* item is transient or too old */
        if (!hi->count || hi->transient)
          {
@@ -117,7 +126,7 @@ evry_history_free(void)
    if (evry_hist)
      {
        d = E_NEW(Cleanup_Data, 1);
-       /* d->time = ecore_time_get() - SOME_YEARS; */
+       d->time = ecore_time_get();
 
        if (evry_hist->subjects)
          {
@@ -193,17 +202,14 @@ evry_history_add(Eina_Hash *hist, Evry_State *s)
    Evry_Item *it;
    Eina_List *l;
    const char *id;
-
+   
    if (!s) return;
 
    it = s->cur_item;
    if (!it) return;
 
-   if (it->id)
-     id = it->id;
-   else
-     id = it->label;
-
+   id = (it->id ? it->id : it->label);
+   
    he = eina_hash_find(hist, id);
    if (!he)
      {
@@ -212,73 +218,33 @@ evry_history_add(Eina_Hash *hist, Evry_State *s)
      }
    else
      {
-       /* found history entry */
        EINA_LIST_FOREACH(he->items, l, hi)
          if (hi->plugin == it->plugin->name) break;
-
-       if (hi)
-         {
-            /* found history item */
-            if (hi->input)
-              {
-                 if (!s->input || !strncmp (hi->input, s->input, strlen(s->input)))
-                   {
-                      /* s->input matches hi->input and is equal or shorter */
-                      hi->last_used = TIME_NOW;
-                      hi->count++;
-                      hi->transient = it->transient;
-                      if (it->transient)
-                        hi->count++;
-
-                   }
-                 else if (s->input)
-                   {
-                      if (!strncmp (hi->input, s->input, strlen(hi->input)))
-                        {
-                           /* s->input matches hi->input but is longer */
-                           eina_stringshare_del(hi->input);
-                           hi->input = eina_stringshare_add(s->input);
-                        }
-                      else
-                        {
-                           /* s->input is different from hi->input
-                              -> create new item */
-                           hi = NULL;
-                        }
-                   }
-              }
-            else
-              {
-                 /* remember input for item */
-                 hi->count++;
-                 
-                 if (it->transient)
-                   hi->count++;
-
-                 /* hi->last_used /= 2.0; */
-                 hi->last_used = TIME_NOW;
-
-                 if (s->input)
-                   hi->input = eina_stringshare_add(s->input);
-              }
-         }
      }
 
    if (!hi)
      {
        hi = E_NEW(History_Item, 1);
        hi->plugin = eina_stringshare_ref(it->plugin->name);
-       hi->last_used = TIME_NOW;
+       he->items = eina_list_append(he->items, hi);
+     }
 
-       hi->count = 1;
-       if (it->transient)
-         hi->count++;
+   if (hi)
+     {
+       hi->last_used = ecore_time_get();
+       hi->usage /= 4.0;
+       hi->usage += TIME_FACTOR(hi->last_used);
+       hi->transient = it->transient;
+       hi->count += (hi->transient ? 2:1);
 
        if (s->input)
-         hi->input = eina_stringshare_add(s->input);
+         {
+            if (hi->input)
+              eina_stringshare_del(hi->input);
 
-       he->items = eina_list_append(he->items, hi);
-     }
+            hi->input = eina_stringshare_add(s->input);
+         }
+     }   
 }
 
 int
@@ -286,18 +252,11 @@ evry_history_item_usage_set(Eina_Hash *hist, Evry_Item *it, const char *input)
 {
    History_Entry *he;
    History_Item *hi;
-   const char *id;
    Eina_List *l;
-   int cnt;
-   
-   if (it->id)
-     id = it->id;
-   else
-     id = it->label;
 
-   it->usage = 0;
+   it->usage = 0.0;
    
-   if (!(he = eina_hash_find(hist, id)))
+   if (!(he = eina_hash_find(hist, (it->id ? it->id : it->label))))
      return 0;
    
    EINA_LIST_FOREACH(he->items, l, hi)
@@ -305,28 +264,26 @@ evry_history_item_usage_set(Eina_Hash *hist, Evry_Item *it, const char *input)
        if (hi->plugin != it->plugin->name)
          continue;
 
-       cnt = 0;
-            
        if (!input || !hi->input)
          {
-            cnt = hi->count;
+            it->usage = hi->usage * hi->count;
          }
        else
          {
             /* higher priority for exact matches */
             if (!strncmp(input, hi->input, strlen(input)))
               {
-                 cnt += hi->count*2;
+                 it->usage += hi->usage * hi->count;
               }
             if (!strncmp(input, hi->input, strlen(hi->input)))
               {
-                 cnt += hi->count*2;
+                 it->usage += hi->usage * hi->count;
               }
          }
-       it->usage += (cnt * hi->last_used);
      }
    
-   if (it->usage) return 1;
+   if (it->usage > 0.0)
+     return 1;
 
    return 0;
 }
index 761124fe8bf3e7db9deae7cd606a01bc63e08b6b..9bbff8e98c1f3edbe8f47b02c868a0a0eb91c3ea 100644 (file)
@@ -1,4 +1,4 @@
-#include "Evry.h"
+#include "e_mod_main.h"
 
 #define TERM_ACTION_CMD "/usr/bin/xterm -hold -e '%s'"
 
@@ -35,6 +35,7 @@ static Evry_Action *act1 = NULL;
 static Evry_Action *act2 = NULL;
 static Evry_Action *act3 = NULL;
 static Evry_Action *act4 = NULL;
+static Evry_Action *act5 = NULL;
 
 static Eina_List *exe_path = NULL;
 static Ecore_Idler *exe_scan_idler = NULL;
@@ -89,7 +90,7 @@ _begin_open_with(Evry_Plugin *plugin, const Evry_Item *item)
    if (!p->added)
      p->added = eina_hash_string_small_new(_hash_free);
    added = p->added;
-   
+
    return plugin;
 }
 
@@ -97,7 +98,7 @@ static Evry_Plugin *
 _begin(Evry_Plugin *plugin, const Evry_Item *item)
 {
    PLUGIN(p, plugin);
-   
+
    /* taken from exebuf module */
    char *path, *pp, *last;
    E_Exe_List *el;
@@ -209,7 +210,7 @@ _cleanup_open_with(Evry_Plugin *plugin)
      efreet_desktop_free(desktop);
 }
 
-static int
+static Evry_Item_App *
 _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match)
 {
    Evry_Item_App *app;
@@ -232,7 +233,7 @@ _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match)
                  EVRY_ITEM(app)->plugin = EVRY_PLUGIN(p);
                  EVRY_PLUGIN_ITEM_APPEND(p, app);
               }
-            return 1;
+            return app;
          }
 
        len = strlen(file);
@@ -258,7 +259,7 @@ _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match)
    else
      exe = file;
 
-   if (!exe) return 0;
+   if (!exe) return NULL;
 
    if ((app = eina_hash_find(p->added, exe)) &&
        (!desktop || (desktop == app->desktop)))
@@ -269,7 +270,7 @@ _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match)
             EVRY_ITEM(app)->plugin = EVRY_PLUGIN(p);
             EVRY_PLUGIN_ITEM_APPEND(p, app);
          }
-       return 1;
+       return app;
      }
 
    if (desktop && !already_refd)
@@ -306,7 +307,7 @@ _item_add(Plugin *p, Efreet_Desktop *desktop, char *file, int match)
    EVRY_ITEM(app)->fuzzy_match = match;
    EVRY_PLUGIN_ITEM_APPEND(p, app);
 
-   return 1;
+   return app;
 }
 
 static void
@@ -456,14 +457,32 @@ _fetch(Evry_Plugin *plugin, const char *input)
    if (input && len > 2)
      {
        char *space;
-
+       Evry_Item_App *app;
+       char buf[256];
        if ((space = strchr(input, ' ')))
          len = (space - input);
 
        EINA_LIST_FOREACH(exe_list, l, file)
          {
             if (!strncmp(file, input, len))
-              _item_add(p, NULL, file, 100);
+              /* && (!space || (strlen(file) == len))) */
+              {
+                 app = _item_add(p, NULL, file, 100);
+
+                 if (app)
+                   {
+                      eina_stringshare_del(EVRY_ITEM(app)->label);
+                      if (!space)
+                        EVRY_ITEM(app)->label = eina_stringshare_add(file);
+                      else
+                        {
+                           snprintf(buf, sizeof(buf), "%s%s", file, space);
+                           EVRY_ITEM(app)->label = eina_stringshare_add(buf);
+                           eina_stringshare_del(app->file);
+                           app->file = eina_stringshare_add(buf);
+                        }
+                   }
+              }
          }
      }
 
@@ -514,7 +533,6 @@ _exec_app_action(Evry_Action *act)
    return evry_util_exec_app(act->item1, act->item2);
 }
 
-/* TODO config option for terminal and shell! */
 static int
 _exec_term_action(Evry_Action *act)
 {
@@ -524,7 +542,11 @@ _exec_term_action(Evry_Action *act)
    int ret;
 
    tmp = E_NEW(Evry_Item_App, 1);
-   snprintf(buf, sizeof(buf), TERM_ACTION_CMD, app->file);
+   snprintf(buf, sizeof(buf), "%s%s %s",
+           evry_conf->cmd_terminal,
+           (strcmp(evry_conf->cmd_terminal, "/usr/bin/xterm") ? "" : " -hold -e"),
+           app->file);
+
    tmp->file = buf;
    ret = evry_util_exec_app(EVRY_ITEM(tmp), NULL);
 
@@ -544,6 +566,27 @@ _exec_term_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it)
    return 0;
 }
 
+static int
+_exec_sudo_action(Evry_Action *act)
+{
+   ITEM_APP(app, act->item1);
+   Evry_Item_App *tmp;
+   char buf[1024];
+   int ret;
+
+   tmp = E_NEW(Evry_Item_App, 1);
+   snprintf(buf, sizeof(buf), "%s %s",
+           evry_conf->cmd_sudo,
+           (app->desktop ? app->desktop->exec : app->file));
+
+   tmp->file = buf;
+   ret = evry_util_exec_app(EVRY_ITEM(tmp), NULL);
+
+   E_FREE(tmp);
+
+   return ret;
+}
+
 static int
 _open_with_action(Evry_Plugin *plugin, const Evry_Item *it)
 {
@@ -555,8 +598,6 @@ _open_with_action(Evry_Plugin *plugin, const Evry_Item *it)
    return 0;
 }
 
-
-
 static int
 _edit_app_check_item(Evry_Action *act __UNUSED__, const Evry_Item *it)
 {
@@ -678,7 +719,7 @@ _init(void)
                         "everything-launch",
                         _exec_app_action, _exec_app_check_item,
                         NULL, NULL,NULL);
-   
+
    act1 = evry_action_new("Open File...", "APPLICATION", "FILE", "APPLICATION",
                          "document-open",
                          _exec_app_action, _exec_app_check_item,
@@ -693,22 +734,23 @@ _init(void)
                          "everything-launch",
                          _edit_app_action, _edit_app_check_item,
                          NULL, NULL, NULL);
-   
+
    act4 = evry_action_new("New Application Entry", "APPLICATION", NULL, NULL,
                          "everything-launch",
                          _new_app_action, _new_app_check_item,
                          NULL, NULL, NULL);
 
-   evry_action_register(act, 0);
+   act5 = evry_action_new("Run with Sudo", "APPLICATION", NULL, NULL,
+                         "system-run",
+                         _exec_sudo_action, NULL, NULL, NULL, NULL);
+
+   evry_action_register(act,  0);
    evry_action_register(act1, 1);
    evry_action_register(act2, 2);
    evry_action_register(act3, 3);
    evry_action_register(act4, 4);
+   evry_action_register(act5, 5);
 
-   
-
-
-   
    /* taken from e_exebuf.c */
    exelist_exe_edd = E_CONFIG_DD_NEW("E_Exe", E_Exe);
 #undef T
@@ -738,6 +780,7 @@ _shutdown(void)
    evry_action_free(act2);
    evry_action_free(act3);
    evry_action_free(act4);
+   evry_action_free(act5);
 
    E_CONFIG_DD_FREE(exelist_edd);
    E_CONFIG_DD_FREE(exelist_exe_edd);