okra pushed a commit to branch master.

http://git.enlightenment.org/apps/ephoto.git/commit/?id=469c3ca1d122dc13cf9bdecd2d8abc7aa3e8490e

commit 469c3ca1d122dc13cf9bdecd2d8abc7aa3e8490e
Author: Stephen Houston <[email protected]>
Date:   Tue Aug 9 21:42:59 2016 -0500

    Ephoto: Improve directory monitoring, especially regarding symlinks.
---
 src/bin/ephoto.h                   |   1 -
 src/bin/ephoto_directory_browser.c | 149 +++++++++++++++++--------------------
 src/bin/ephoto_main.c              |   6 +-
 3 files changed, 73 insertions(+), 83 deletions(-)

diff --git a/src/bin/ephoto.h b/src/bin/ephoto.h
index 3d113a6..f9eadd3 100644
--- a/src/bin/ephoto.h
+++ b/src/bin/ephoto.h
@@ -311,7 +311,6 @@ struct _Ephoto_Entry
    double size;
    Ephoto *ephoto;
    Eio_Monitor *monitor;
-   Eio_Monitor *link_monitor;
    Eina_List *monitor_handlers;
    Elm_Object_Item *item;
    Elm_Object_Item *parent;
diff --git a/src/bin/ephoto_directory_browser.c 
b/src/bin/ephoto_directory_browser.c
index 89356e3..40ec21d 100644
--- a/src/bin/ephoto_directory_browser.c
+++ b/src/bin/ephoto_directory_browser.c
@@ -45,6 +45,8 @@ static Elm_Genlist_Item_Class *_ephoto_dir_tree_class;
 
 static char * _drag_data_extract(char **drag_data);
 
+static Eina_Bool _monitor_cb(void *data, int type,
+    void *event);
 static void _fsel_mouse_up_cb(void *data, Evas *e EINA_UNUSED,
     Evas_Object *obj EINA_UNUSED, void *event_info);
 
@@ -710,6 +712,36 @@ _todo_items_free(Ephoto_Directory_Browser *db)
    db->todo_items = NULL;
 }
 
+static void
+_monitor_add(Ephoto_Entry *e)
+{
+   e->monitor = eio_monitor_add(ecore_file_realpath(e->path));
+   e->monitor_handlers =
+       eina_list_append(e->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_FILE_CREATED,
+               _monitor_cb, e));
+   e->monitor_handlers =
+       eina_list_append(e->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED,
+               _monitor_cb, e));
+   e->monitor_handlers =
+       eina_list_append(e->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_FILE_DELETED,
+               _monitor_cb, e));
+   e->monitor_handlers =
+       eina_list_append(e->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED,
+               _monitor_cb, e));
+   e->monitor_handlers =
+       eina_list_append(e->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED,
+               _monitor_cb, e));
+   e->monitor_handlers =
+       eina_list_append(e->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED,
+               _monitor_cb, e));
+}
+
 static Eina_Bool
 _monitor_cb(void *data, int type,
     void *event)
@@ -730,7 +762,7 @@ _monitor_cb(void *data, int type,
    snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file));
    if (strcmp(entry->path, dir))
      return ECORE_CALLBACK_PASS_ON;
-   if (type == EIO_MONITOR_DIRECTORY_CREATED)
+   if (type == EIO_MONITOR_DIRECTORY_CREATED || type == 
EIO_MONITOR_FILE_CREATED)
      {
         if (!ecore_file_is_dir(ecore_file_realpath(ev->filename)))
           return ECORE_CALLBACK_PASS_ON;
@@ -746,25 +778,16 @@ _monitor_cb(void *data, int type,
                  EINA_FILE_DIR);
              e->genlist = entry->genlist;
              e->parent = entry->item;
-             e->item =
+             if (!_check_for_subdirs(e))
+               e->item =
                  elm_genlist_item_sorted_insert(entry->genlist, ic, e,
                  e->parent, ELM_GENLIST_ITEM_NONE, _entry_cmp, NULL, NULL);
+             else
+               e->item =
+                 elm_genlist_item_sorted_insert(entry->genlist, ic, e,
+                 e->parent, ELM_GENLIST_ITEM_TREE, _entry_cmp, NULL, NULL);
              if (e->item)
-               {
-                  e->monitor = eio_monitor_add(e->path);
-                  e->monitor_handlers =
-                      eina_list_append(e->monitor_handlers,
-                          
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED,
-                              _monitor_cb, e));
-                  e->monitor_handlers =
-                      eina_list_append(e->monitor_handlers,
-                          
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED,
-                              _monitor_cb, e));
-                  e->monitor_handlers =
-                      eina_list_append(e->monitor_handlers,
-                          
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED,
-                              _monitor_cb, e));
-               }
+               _monitor_add(e);
           }
         else if (elm_genlist_item_type_get(entry->item) == 
ELM_GENLIST_ITEM_NONE)
           {
@@ -781,12 +804,14 @@ _monitor_cb(void *data, int type,
           }
         return ECORE_CALLBACK_PASS_ON;
      }
-   else if (type == EIO_MONITOR_DIRECTORY_DELETED)
+   else if (type == EIO_MONITOR_DIRECTORY_DELETED || type == 
EIO_MONITOR_FILE_DELETED)
      {
         item = elm_genlist_first_item_get(entry->genlist);
         while (item)
           {
              e = elm_object_item_data_get(item);
+             if (!e->is_dir)
+               continue;
              if (!strcmp(e->path, ev->filename))
                {
                     elm_object_item_del(e->item);
@@ -811,19 +836,7 @@ _monitor_cb(void *data, int type,
                     ecore_event_handler_del(handler);
                }
              entry->item = parent;
-             entry->monitor = eio_monitor_add(entry->path);
-             entry->monitor_handlers =
-                 eina_list_append(entry->monitor_handlers,
-                     ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED,
-                         _monitor_cb, entry));
-             entry->monitor_handlers =
-                 eina_list_append(entry->monitor_handlers,
-                     ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED,
-                         _monitor_cb, entry));
-             entry->monitor_handlers =
-                 eina_list_append(entry->monitor_handlers,
-                     ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED,
-                         _monitor_cb, entry));
+             _monitor_add(entry);
              entry->no_delete = EINA_FALSE;
              
           }
@@ -834,7 +847,7 @@ _monitor_cb(void *data, int type,
           }
         return ECORE_CALLBACK_PASS_ON;
      }
-   else if (type == EIO_MONITOR_DIRECTORY_MODIFIED)
+   else if (type == EIO_MONITOR_DIRECTORY_MODIFIED || type == 
EIO_MONITOR_FILE_MODIFIED)
      {
         if (!ecore_file_is_dir(ecore_file_realpath(ev->filename)))
           return ECORE_CALLBACK_PASS_ON;
@@ -875,7 +888,7 @@ _top_monitor_cb(void *data, int type,
 
    if (strcmp(db->ephoto->top_directory, dir))
      return ECORE_CALLBACK_PASS_ON;
-   if (type == EIO_MONITOR_DIRECTORY_CREATED)
+   if (type == EIO_MONITOR_DIRECTORY_CREATED || type == 
EIO_MONITOR_FILE_CREATED)
      {
         if (!ecore_file_is_dir(ecore_file_realpath(ev->filename)))
           return ECORE_CALLBACK_PASS_ON; 
@@ -890,29 +903,17 @@ _top_monitor_cb(void *data, int type,
             elm_genlist_item_append(db->fsel, ic, e,
             NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
         if (e->item)
-          {
-             e->monitor = eio_monitor_add(e->path);
-             e->monitor_handlers =
-                 eina_list_append(e->monitor_handlers,
-                     ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED,
-                         _monitor_cb, e));
-             e->monitor_handlers =
-                 eina_list_append(e->monitor_handlers,
-                     ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED,
-                         _monitor_cb, e));
-             e->monitor_handlers =
-                 eina_list_append(e->monitor_handlers,
-                     ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED,
-                         _monitor_cb, e));
-          }
+          _monitor_add(e);
         return ECORE_CALLBACK_PASS_ON;
      }
-   else if (type == EIO_MONITOR_DIRECTORY_DELETED)
+   else if (type == EIO_MONITOR_DIRECTORY_DELETED || type == 
EIO_MONITOR_FILE_DELETED)
      {
         item = elm_genlist_first_item_get(db->fsel);
         while (item)
           {
              e = elm_object_item_data_get(item);
+             if (!e->is_dir)
+               continue;
              if (!strcmp(e->path, ev->filename))
                {
                   if (!strcmp(ev->filename, db->ephoto->config->directory))
@@ -925,7 +926,7 @@ _top_monitor_cb(void *data, int type,
           }
         return ECORE_CALLBACK_PASS_ON;
      }
-   else if (type == EIO_MONITOR_DIRECTORY_MODIFIED)
+   else if (type == EIO_MONITOR_DIRECTORY_MODIFIED || type == 
EIO_MONITOR_FILE_MODIFIED)
      {
         if (!ecore_file_is_dir(ecore_file_realpath(ev->filename)))
           return ECORE_CALLBACK_PASS_ON;
@@ -993,19 +994,7 @@ _todo_items_process(void *data)
             }
            else
              {
-                entry->monitor = eio_monitor_add(entry->path);
-                entry->monitor_handlers =
-                    eina_list_append(entry->monitor_handlers,
-                        ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED,
-                            _monitor_cb, entry));
-                entry->monitor_handlers =
-                    eina_list_append(entry->monitor_handlers,
-                        ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED,
-                            _monitor_cb, entry));
-                entry->monitor_handlers =
-                    eina_list_append(entry->monitor_handlers,
-                        ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED,
-                            _monitor_cb, entry));
+                _monitor_add(entry);
                 entry->genlist = db->fsel;
              }
         }
@@ -1140,7 +1129,19 @@ ephoto_directory_browser_top_dir_set(Ephoto *ephoto, 
const char *dir)
      eina_stringshare_replace(&ephoto->top_directory, dir);
    else
      ephoto->top_directory = eina_stringshare_add(dir);
-   db->monitor = eio_monitor_add(dir);
+   db->monitor = eio_monitor_add(ecore_file_realpath(dir));
+   db->monitor_handlers =
+       eina_list_append(db->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_FILE_CREATED,
+               _top_monitor_cb, db));
+   db->monitor_handlers =
+       eina_list_append(db->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED,
+               _top_monitor_cb, db));
+   db->monitor_handlers =
+       eina_list_append(db->monitor_handlers,
+           ecore_event_handler_add(EIO_MONITOR_FILE_DELETED,
+               _top_monitor_cb, db));
    db->monitor_handlers =
        eina_list_append(db->monitor_handlers,
            ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED,
@@ -1213,14 +1214,16 @@ ephoto_directory_browser_initialize_structure(Ephoto 
*ephoto)
                             ic = _ephoto_dir_tree_class;
                             entry->item =
                                 elm_genlist_item_sorted_insert(db->fsel, ic, 
entry,
-                                entry->parent, ELM_GENLIST_ITEM_TREE, 
_entry_cmp, NULL, NULL);
+                                entry->parent, ELM_GENLIST_ITEM_TREE, 
_entry_cmp,
+                                NULL, NULL);
                          }
                        else
                          {
                             ic = _ephoto_dir_class;
                             entry->item =
                                 elm_genlist_item_sorted_insert(db->fsel, ic, 
entry,
-                                entry->parent, ELM_GENLIST_ITEM_NONE, 
_entry_cmp, NULL, NULL);
+                                entry->parent, ELM_GENLIST_ITEM_NONE, 
_entry_cmp,
+                                NULL, NULL);
                          }
                        if (!entry->item)
                          {
@@ -1228,19 +1231,7 @@ ephoto_directory_browser_initialize_structure(Ephoto 
*ephoto)
                          }
                        else
                          {
-                            entry->monitor = eio_monitor_add(entry->path);
-                            entry->monitor_handlers =
-                                eina_list_append(entry->monitor_handlers,
-                                    
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED,
-                                        _monitor_cb, entry));
-                            entry->monitor_handlers =
-                                eina_list_append(entry->monitor_handlers,
-                                    
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED,
-                                        _monitor_cb, entry));
-                            entry->monitor_handlers =
-                                eina_list_append(entry->monitor_handlers,
-                                    
ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED,
-                                        _monitor_cb, entry));
+                            _monitor_add(entry);
                             entry->genlist = db->fsel;
                          }
                        if (n)
diff --git a/src/bin/ephoto_main.c b/src/bin/ephoto_main.c
index 8b1a581..33435fb 100644
--- a/src/bin/ephoto_main.c
+++ b/src/bin/ephoto_main.c
@@ -756,6 +756,8 @@ _ephoto_populate_filter(void *data, Eio_File *handler 
EINA_UNUSED,
    else if (info->type == EINA_FILE_LNK && ecore_file_is_dir(
        ecore_file_realpath(info->path)))
      {
+        if (ed->thumbs_only)
+          return EINA_FALSE;
         return ecore_file_is_dir(ecore_file_realpath(info->path));
      }
    else if (!ed->dirs_only)
@@ -1087,7 +1089,7 @@ ephoto_entry_new(Ephoto *ephoto, const char *path, const 
char *label,
        ecore_file_realpath(entry->path)))
      entry->is_dir = EINA_TRUE;
    else
-      entry->is_dir = EINA_FALSE;
+     entry->is_dir = EINA_FALSE;
    if (type == EINA_FILE_LNK)
      entry->is_link = EINA_TRUE;
    else
@@ -1137,8 +1139,6 @@ ephoto_entry_free(Ephoto *ephoto, Ephoto_Entry *entry)
    eina_stringshare_del(entry->label);
    if (entry->monitor)
      {
-        if (entry->link_monitor)
-          eio_monitor_del(entry->link_monitor);
         eio_monitor_del(entry->monitor);
         EINA_LIST_FREE(entry->monitor_handlers, handler)
           ecore_event_handler_del(handler);

-- 


Reply via email to