ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=4e3ff8f70202ab6fd5fc9276904513c92ec31ab4

commit 4e3ff8f70202ab6fd5fc9276904513c92ec31ab4
Author: Andy Williams <a...@andywilliams.me>
Date:   Thu Mar 30 22:28:35 2017 +0100

    filepanel: use data object to avoid file lookups
    
    Save memory and save isdir lookups all over
---
 src/bin/edi_filepanel.c | 139 +++++++++++++++++++++++++++---------------------
 1 file changed, 78 insertions(+), 61 deletions(-)

diff --git a/src/bin/edi_filepanel.c b/src/bin/edi_filepanel.c
index d3ce90f..e9ef1a5 100644
--- a/src/bin/edi_filepanel.c
+++ b/src/bin/edi_filepanel.c
@@ -32,7 +32,7 @@ static Eina_Hash *_list_items;
 static edi_filepanel_item_clicked_cb _open_cb;
 
 static Evas_Object *menu, *_main_win, *_filepanel_box, *_filter_box, *_filter;
-static const char *_menu_cb_path, *_root_path;
+static const char *_root_path;
 static regex_t _filter_regex;
 static Eina_Bool _filter_set = EINA_FALSE;
 static Edi_Dir_Data *_root_dir;
@@ -63,85 +63,101 @@ _file_path_hidden(const char *path, Eina_Bool filter)
 }
 
 static void
-_item_menu_open_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+_item_menu_open_cb(void *data, Evas_Object *obj EINA_UNUSED,
                    void *event_info EINA_UNUSED)
 {
-   if (ecore_file_is_dir(_menu_cb_path))
+   Edi_Dir_Data *sd;
+
+   sd = data;
+   if (sd->isdir)
      return;
 
-   _open_cb(_menu_cb_path, NULL, EINA_FALSE);
+   _open_cb(sd->path, NULL, EINA_FALSE);
 }
 
 static void
-_item_menu_open_window_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
-                   void *event_info EINA_UNUSED)
+_item_menu_open_window_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                          void *event_info EINA_UNUSED)
 {
-   if (ecore_file_is_dir(_menu_cb_path))
+   Edi_Dir_Data *sd;
+
+   sd = data;
+   if (sd->isdir)
      return;
 
-   _open_cb(_menu_cb_path, NULL, EINA_TRUE);
+   _open_cb(sd->path, NULL, EINA_TRUE);
 }
 
 static void
-_item_menu_xdgopen_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+_item_menu_xdgopen_cb(void *data, Evas_Object *obj EINA_UNUSED,
                       void *event_info EINA_UNUSED)
 {
    char *cmd;
    int cmdlen;
    const char *format = "xdg-open \"%s\"";
+   Edi_Dir_Data *sd;
 
-   cmdlen = strlen(format) + strlen(_menu_cb_path) - 1;
+   sd = data;
+   cmdlen = strlen(format) + strlen(sd->path) - 1;
    cmd = malloc(sizeof(char) * cmdlen);
-   snprintf(cmd, cmdlen, format, _menu_cb_path);
+   snprintf(cmd, cmdlen, format, sd->path);
 
    ecore_exe_run(cmd, NULL);
    free(cmd);
 }
 
 static void
-_item_menu_open_as_text_cb(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED,
+_item_menu_open_as_text_cb(void *data, Evas_Object *obj EINA_UNUSED,
                            void *event_info EINA_UNUSED)
 {
-   _open_cb(_menu_cb_path, "text", EINA_FALSE);
+   Edi_Dir_Data *sd;
+
+   sd = data;
+   _open_cb(sd->path, "text", EINA_FALSE);
 }
 
 static void
-_item_menu_open_as_code_cb(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED,
+_item_menu_open_as_code_cb(void *data, Evas_Object *obj EINA_UNUSED,
                            void *event_info EINA_UNUSED)
 {
-   _open_cb(_menu_cb_path, "code", EINA_FALSE);
+   Edi_Dir_Data *sd;
+
+   sd = data;
+   _open_cb(sd->path, "code", EINA_FALSE);
 }
 
 static void
-_item_menu_open_as_image_cb(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED,
+_item_menu_open_as_image_cb(void *data, Evas_Object *obj EINA_UNUSED,
                             void *event_info EINA_UNUSED)
 {
-   _open_cb(_menu_cb_path, "image", EINA_FALSE);
+   Edi_Dir_Data *sd;
+
+   sd = data;
+   _open_cb(sd->path, "image", EINA_FALSE);
 }
 
 static void
-_item_menu_del_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+_item_menu_del_cb(void *data, Evas_Object *obj EINA_UNUSED,
                       void *event_info EINA_UNUSED)
 {
-   const char *filename = _menu_cb_path;
+   Edi_Dir_Data *sd;
 
-   edi_mainview_item_close_path(filename);
+   sd = data;
+   edi_mainview_item_close_path(sd->path);
 
-   ecore_file_unlink(filename);
+   ecore_file_unlink(sd->path);
 }
 
 static void
 _item_menu_dismissed_cb(void *data EINA_UNUSED, Evas_Object *obj,
                         void *ev EINA_UNUSED)
 {
-   eina_stringshare_del(_menu_cb_path);
-   _menu_cb_path = NULL;
    evas_object_del(obj);
 }
 
 static void
 _item_menu_filetype_create(Evas_Object *menu, Elm_Object_Item *parent, const 
char *type,
-                           Evas_Smart_Cb func)
+                           Evas_Smart_Cb func, Edi_Dir_Data *sd)
 {
    Edi_Content_Provider *provider;
 
@@ -149,100 +165,103 @@ _item_menu_filetype_create(Evas_Object *menu, 
Elm_Object_Item *parent, const cha
    if (!provider)
      return;
 
-   elm_menu_item_add(menu, parent, provider->icon, provider->id, func, NULL);
+   elm_menu_item_add(menu, parent, provider->icon, provider->id, func, sd);
 }
 
 static void
-_item_menu_create(Evas_Object *win)
+_item_menu_create(Evas_Object *win, Edi_Dir_Data *sd)
 {
    Elm_Object_Item *menu_it;
 
    menu = elm_menu_add(win);
    evas_object_smart_callback_add(menu, "dismissed", _item_menu_dismissed_cb, 
NULL);
 
-   elm_menu_item_add(menu, NULL, "fileopen", "open", _item_menu_open_cb, NULL);
-   elm_menu_item_add(menu, NULL, "window-new", "open new window", 
_item_menu_open_window_cb, NULL);
+   elm_menu_item_add(menu, NULL, "fileopen", "open", _item_menu_open_cb, sd);
+   elm_menu_item_add(menu, NULL, "window-new", "open new window", 
_item_menu_open_window_cb, sd);
 
    menu_it = elm_menu_item_add(menu, NULL, "gtk-execute", "open external",
-                               _item_menu_xdgopen_cb, NULL);
+                               _item_menu_xdgopen_cb, sd);
    menu_it = elm_menu_item_add(menu, NULL, NULL, "open as", NULL, NULL);
-   _item_menu_filetype_create(menu, menu_it, "text", 
_item_menu_open_as_text_cb);
-   _item_menu_filetype_create(menu, menu_it, "code", 
_item_menu_open_as_code_cb);
-   _item_menu_filetype_create(menu, menu_it, "image", 
_item_menu_open_as_image_cb);
-   menu_it = elm_menu_item_add(menu, NULL, "edit-delete", "delete", 
_item_menu_del_cb, NULL);
+   _item_menu_filetype_create(menu, menu_it, "text", 
_item_menu_open_as_text_cb, sd);
+   _item_menu_filetype_create(menu, menu_it, "code", 
_item_menu_open_as_code_cb, sd);
+   _item_menu_filetype_create(menu, menu_it, "image", 
_item_menu_open_as_image_cb, sd);
+   menu_it = elm_menu_item_add(menu, NULL, "edit-delete", "delete", 
_item_menu_del_cb, sd);
 }
 
 static void
-_item_menu_open_terminal_cb(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED,
+_item_menu_open_terminal_cb(void *data, Evas_Object *obj EINA_UNUSED,
                    void *event_info EINA_UNUSED)
 {
    const char *format;
    char *cmd;
    int cmdlen;
+   Edi_Dir_Data *sd;
 
+   sd = data;
    format = "terminology -d=\"%s\"";
 
-   if (!ecore_file_is_dir(_menu_cb_path))
+   if (!sd->isdir)
      return;
 
-   cmdlen = strlen(_menu_cb_path) + strlen(format) + 1;
+   cmdlen = strlen(sd->path) + strlen(format) + 1;
    cmd = malloc(sizeof(char) * cmdlen);
-   snprintf(cmd, cmdlen, format, _menu_cb_path);
+   snprintf(cmd, cmdlen, format, sd->path);
 
    ecore_exe_run(cmd, NULL);
    free(cmd);
 }
 
 static void
-_item_menu_rmdir_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+_item_menu_rmdir_cb(void *data, Evas_Object *obj EINA_UNUSED,
                       void *event_info EINA_UNUSED)
 {
-   const char *path = _menu_cb_path;
-   if (!ecore_file_is_dir(path))
+   Edi_Dir_Data *sd;
+
+   sd = data;
+   if (!sd->isdir)
      return;
 
-   ecore_file_recursive_rm(path);
+   ecore_file_recursive_rm(sd->path);
 }
 
 static void
-_item_menu_create_file_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+_item_menu_create_file_cb(void *data, Evas_Object *obj EINA_UNUSED,
                       void *event_info EINA_UNUSED)
 {
-   Evas_Object *win = data;
+   Edi_Dir_Data *sd;
 
-   const char *directory = _menu_cb_path;
-   if (!ecore_file_is_dir(directory))
+   sd = data;
+   if (!sd->isdir)
      return;
 
-   edi_file_create_file(win, directory);
+   edi_file_create_file(_main_win, sd->path);
 }
 
 static void
 _item_menu_create_dir_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
                       void *event_info EINA_UNUSED)
 {
-   Evas_Object *win = data;
-
-   const char *directory = _menu_cb_path;
+   Edi_Dir_Data *sd;
 
-   if (!ecore_file_is_dir(directory))
+   sd = data;
+   if (!sd->isdir)
      return;
 
-   edi_file_create_dir(win, directory);
+   edi_file_create_dir(_main_win, sd->path);
 }
 
 static void
-_item_menu_dir_create(Evas_Object *win)
+_item_menu_dir_create(Evas_Object *win, Edi_Dir_Data *sd)
 {
    menu = elm_menu_add(win);
    evas_object_smart_callback_add(menu, "dismissed", _item_menu_dismissed_cb, 
NULL);
 
-   elm_menu_item_add(menu, NULL, "document-new", "create file here", 
_item_menu_create_file_cb, win);
-   elm_menu_item_add(menu, NULL, "folder-new", "create directory here", 
_item_menu_create_dir_cb, win);
+   elm_menu_item_add(menu, NULL, "document-new", "create file here", 
_item_menu_create_file_cb, sd);
+   elm_menu_item_add(menu, NULL, "folder-new", "create directory here", 
_item_menu_create_dir_cb, sd);
    if (ecore_file_app_installed("terminology"))
-     elm_menu_item_add(menu, NULL, "terminal", "open terminal here", 
_item_menu_open_terminal_cb, NULL);
-   if (ecore_file_dir_is_empty(_menu_cb_path))
-     elm_menu_item_add(menu, NULL, "edit-delete", "remove directory", 
_item_menu_rmdir_cb, NULL);
+     elm_menu_item_add(menu, NULL, "terminal", "open terminal here", 
_item_menu_open_terminal_cb, sd);
+   if (ecore_file_dir_is_empty(sd->path))
+     elm_menu_item_add(menu, NULL, "edit-delete", "remove directory", 
_item_menu_rmdir_cb, sd);
 }
 
 static void
@@ -266,12 +285,10 @@ _item_clicked_cb(void *data EINA_UNUSED, Evas *e 
EINA_UNUSED, Evas_Object *obj,
      }
    if (ev->button != 3) return;
 
-   _menu_cb_path = eina_stringshare_add(sd->path);
-
    if (sd->isdir)
-     _item_menu_dir_create(_main_win);
+     _item_menu_dir_create(_main_win, sd);
    else
-     _item_menu_create(_main_win);
+     _item_menu_create(_main_win, sd);
 
    elm_object_item_focus_set(it, EINA_TRUE);
 

-- 


Reply via email to