From 97e82b216f0191697691d768451cca6824d447e6 Mon Sep 17 00:00:00 2001 From: Stephen okra Houston Date: Mon, 29 Feb 2016 11:15:52 -0600 Subject: [PATCH] Ephoto: Move to Ecore_File_Monitor: It behaves better than Eio at this point. --- src/bin/ephoto.h | 6 +- src/bin/ephoto_main.c | 242 ++++++++--------- src/bin/ephoto_single_browser.c | 57 ++-- src/bin/ephoto_thumb_browser.c | 451 +++++++++++--------------------- 4 files changed, 295 insertions(+), 461 deletions(-) diff --git a/src/bin/ephoto.h b/src/bin/ephoto.h index c828b60..adc1d61 100644 --- a/src/bin/ephoto.h +++ b/src/bin/ephoto.h @@ -171,8 +171,7 @@ struct _Ephoto Eina_List *searchentries; Eina_List *thumbs; - Eio_Monitor *monitor; - Eina_List *monitor_handlers; + Ecore_File_Monitor *monitor; const char *top_directory; @@ -203,8 +202,7 @@ struct _Ephoto_Entry const char *label; double size; Ephoto *ephoto; - Eio_Monitor *monitor; - Eina_List *monitor_handlers; + Ecore_File_Monitor *monitor; Elm_Object_Item *item; Elm_Object_Item *parent; Eina_List *free_listeners; diff --git a/src/bin/ephoto_main.c b/src/bin/ephoto_main.c index 9b35096..62c3c83 100644 --- a/src/bin/ephoto_main.c +++ b/src/bin/ephoto_main.c @@ -166,13 +166,7 @@ _win_free(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, if (ephoto->timer.thumb_regen) ecore_timer_del(ephoto->timer.thumb_regen); if (ephoto->monitor) - { - Ecore_Event_Handler *handler; - - EINA_LIST_FREE(ephoto->monitor_handlers, handler) - ecore_event_handler_del(handler); - eio_monitor_del(ephoto->monitor); - } + ecore_file_monitor_del(ephoto->monitor); ephoto_config_save(ephoto); free(ephoto); } @@ -461,133 +455,133 @@ _ephoto_change_dir(void *data) _ephoto_populate_entries(ed); } -static Eina_Bool -_monitor_created(void *data, int type EINA_UNUSED, void *event) +static void +_monitor_cb(void *data, Ecore_File_Monitor *em EINA_UNUSED, + Ecore_File_Event event, const char *path) { Ephoto *ephoto = data; - Eio_Monitor_Event *ev = event; char file[PATH_MAX], dir[PATH_MAX]; - snprintf(file, PATH_MAX, "%s", ev->filename); + snprintf(file, PATH_MAX, "%s", path); snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); if (strcmp(ephoto->config->directory, dir)) - return ECORE_CALLBACK_PASS_ON; + return; - if (evas_object_image_extension_can_load_get(ev->filename)) + if (evas_object_image_extension_can_load_get(path)) { - Eina_List *l; - Ephoto_Entry *entry; - char buf[PATH_MAX]; + if (event == ECORE_FILE_EVENT_CREATED_FILE) + { + Eina_List *l; + Ephoto_Entry *entry; + char buf[PATH_MAX]; - EINA_LIST_FOREACH(ephoto->entries, l, entry) - { - if (!strcmp(entry->path, ev->filename)) - return ECORE_CALLBACK_PASS_ON; - } - snprintf(buf, PATH_MAX, "%s", ev->filename); - entry = ephoto_entry_new(ephoto, ev->filename, basename(buf), - EINA_FILE_REG); - ephoto_single_browser_path_created(ephoto->single_browser, entry); - if (!ephoto->entries) - { - ephoto->entries = eina_list_append(ephoto->entries, entry); - } - else - { - int near_cmp; - Eina_List *near_node = - eina_list_search_sorted_near_list(ephoto->entries, - ephoto_entries_cmp, entry, &near_cmp); - - if (near_cmp < 0) - ephoto->entries = - eina_list_append_relative_list(ephoto->entries, entry, - near_node); - else - ephoto->entries = - eina_list_prepend_relative_list(ephoto->entries, entry, - near_node); - } - ephoto_thumb_browser_insert(ephoto, entry); - } - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_monitor_deleted(void *data, int type EINA_UNUSED, void *event) -{ - Ephoto *ephoto = data; - Eio_Monitor_Event *ev = event; - char file[PATH_MAX], dir[PATH_MAX]; - - snprintf(file, PATH_MAX, "%s", ev->filename); - snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); - - if (strcmp(ephoto->config->directory, dir)) - return ECORE_CALLBACK_PASS_ON; - - if (evas_object_image_extension_can_load_get(ev->filename)) - { - Eina_List *l; - Ephoto_Entry *entry; - - EINA_LIST_FOREACH(ephoto->entries, l, entry) - { - if (!strcmp(entry->path, ev->filename)) + EINA_LIST_FOREACH(ephoto->entries, l, entry) { - ephoto_thumb_browser_remove(ephoto, entry); - ephoto_entry_free(ephoto, entry); - break; + if (!strcmp(entry->path, path)) + return; } - } - } - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_monitor_modified(void *data, int type EINA_UNUSED, void *event) -{ - Ephoto *ephoto = data; - Eio_Monitor_Event *ev = event; - char file[PATH_MAX], dir[PATH_MAX]; - - snprintf(file, PATH_MAX, "%s", ev->filename); - snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); - - if (strcmp(ephoto->config->directory, dir)) - return ECORE_CALLBACK_PASS_ON; - - if (evas_object_image_extension_can_load_get(ev->filename)) - { - Eina_List *l; - Ephoto_Entry *entry; - int found = 0; - - EINA_LIST_FOREACH(ephoto->entries, l, entry) - { - if (!strcmp(entry->path, ev->filename)) + snprintf(buf, PATH_MAX, "%s", path); + entry = ephoto_entry_new(ephoto, path, basename(buf), + EINA_FILE_REG); + ephoto_single_browser_path_created(ephoto->single_browser, entry); + if (!ephoto->entries) { - if (!ecore_file_exists(entry->path)) + ephoto->entries = eina_list_append(ephoto->entries, entry); + } + else + { + int near_cmp; + Eina_List *near_node = + eina_list_search_sorted_near_list(ephoto->entries, + ephoto_entries_cmp, entry, &near_cmp); + + if (near_cmp < 0) + ephoto->entries = + eina_list_append_relative_list(ephoto->entries, entry, + near_node); + else + ephoto->entries = + eina_list_prepend_relative_list(ephoto->entries, entry, + near_node); + } + ephoto_thumb_browser_insert(ephoto, entry); + return; + } + else if (event == ECORE_FILE_EVENT_DELETED_FILE) + { + Eina_List *l; + Ephoto_Entry *entry; + + EINA_LIST_FOREACH(ephoto->entries, l, entry) + { + if (!strcmp(entry->path, path)) { - elm_object_item_del(entry->item); + ephoto_thumb_browser_remove(ephoto, entry); ephoto_entry_free(ephoto, entry); + break; + } + } + return; + } + else if (event == ECORE_FILE_EVENT_MODIFIED) + { + Eina_List *l; + Ephoto_Entry *entry; + int found = 0; + + EINA_LIST_FOREACH(ephoto->entries, l, entry) + { + if (!strcmp(entry->path, path)) + { + if (!ecore_file_exists(entry->path)) + { + elm_object_item_del(entry->item); + ephoto_entry_free(ephoto, entry); + } + else + { + if (!entry->item) + ephoto_thumb_browser_insert(ephoto, entry); + else + ephoto_thumb_browser_update(ephoto, entry); + } + found = 1; + break; + } + } + if (!found) + { + char buf[PATH_MAX]; + snprintf(buf, PATH_MAX, "%s", path); + entry = ephoto_entry_new(ephoto, path, basename(buf), + EINA_FILE_REG); + ephoto_single_browser_path_created(ephoto->single_browser, entry); + if (!ephoto->entries) + { + ephoto->entries = eina_list_append(ephoto->entries, entry); } else { - if (!entry->item) - ephoto_thumb_browser_insert(ephoto, entry); + int near_cmp; + Eina_List *near_node = + eina_list_search_sorted_near_list(ephoto->entries, + ephoto_entries_cmp, entry, &near_cmp); + + if (near_cmp < 0) + ephoto->entries = + eina_list_append_relative_list(ephoto->entries, entry, + near_node); else - ephoto_thumb_browser_update(ephoto, entry); + ephoto->entries = + eina_list_prepend_relative_list(ephoto->entries, entry, + near_node); } - found = 1; - break; + ephoto_thumb_browser_insert(ephoto, entry); + return; } } - if (!found) - _monitor_created(ephoto, 0, ev); } - return ECORE_CALLBACK_PASS_ON; } void @@ -610,23 +604,8 @@ ephoto_directory_set(Ephoto *ephoto, const char *path, Evas_Object *expanded, ecore_job_del(ed->ephoto->job.change_dir); ed->ephoto->job.change_dir = ecore_job_add(_ephoto_change_dir, ed); if (ephoto->monitor) - { - Ecore_Event_Handler *handler; - - EINA_LIST_FREE(ephoto->monitor_handlers, handler) - ecore_event_handler_del(handler); - eio_monitor_del(ephoto->monitor); - } - ephoto->monitor = eio_monitor_add(path); - ephoto->monitor_handlers = eina_list_append(ephoto->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, _monitor_created, - ephoto)); - ephoto->monitor_handlers = eina_list_append(ephoto->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, _monitor_deleted, - ephoto)); - ephoto->monitor_handlers = eina_list_append(ephoto->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, _monitor_modified, - ephoto)); + ecore_file_monitor_del(ephoto->monitor); + ephoto->monitor = ecore_file_monitor_add(path, _monitor_cb, ephoto); } static Eina_Bool @@ -789,8 +768,7 @@ ephoto_entry_free(Ephoto *ephoto, Ephoto_Entry *entry) { Ephoto_Entry_Free_Listener *fl; Eina_List *node; - Ecore_Event_Handler *handler; - + EINA_LIST_FREE(entry->free_listeners, fl) { fl->cb((void *) fl->data, entry); @@ -810,9 +788,7 @@ ephoto_entry_free(Ephoto *ephoto, Ephoto_Entry *entry) eina_stringshare_del(entry->path); eina_stringshare_del(entry->label); if (entry->monitor) - eio_monitor_del(entry->monitor); - EINA_LIST_FREE(entry->monitor_handlers, handler) - ecore_event_handler_del(handler); + ecore_file_monitor_del(entry->monitor); free(entry); } diff --git a/src/bin/ephoto_single_browser.c b/src/bin/ephoto_single_browser.c index f99e518..9dd7044 100644 --- a/src/bin/ephoto_single_browser.c +++ b/src/bin/ephoto_single_browser.c @@ -40,7 +40,7 @@ struct _Ephoto_Single_Browser struct _Ephoto_Viewer { Eina_List *handlers; - Eio_Monitor *monitor; + Ecore_File_Monitor *monitor; Evas_Object *scroller; Evas_Object *table; Evas_Object *image; @@ -61,12 +61,8 @@ _viewer_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Ephoto_Viewer *v = data; - Ecore_Event_Handler *handler; - - EINA_LIST_FREE(v->handlers, handler) - ecore_event_handler_del(handler); if (v->monitor) - eio_monitor_del(v->monitor); + ecore_file_monitor_del(v->monitor); free(v); } @@ -176,34 +172,37 @@ _get_edje_group(const char *path) return group; } -static Eina_Bool -_monitor_modified(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) +static void +_monitor_cb(void *data, Ecore_File_Monitor *em EINA_UNUSED, + Ecore_File_Event event, const char *path EINA_UNUSED) { Ephoto_Single_Browser *sb = data; Ephoto_Viewer *v = evas_object_data_get(sb->viewer, "viewer"); - if (!ecore_file_exists(sb->entry->path)) - ephoto_entry_free(sb->ephoto, sb->entry); - else + if (event == ECORE_FILE_EVENT_MODIFIED) { - Evas_Object *tmp; - Evas_Coord w, h; - const char *group = _get_edje_group(sb->entry->path); - - tmp = evas_object_image_add(evas_object_evas_get(v->table)); - evas_object_image_file_set(tmp, sb->entry->path, group); - evas_object_image_size_get(tmp, &w, &h); - evas_object_del(tmp); - - if (w > 0 && h > 0) + if (!ecore_file_exists(sb->entry->path)) + ephoto_entry_free(sb->ephoto, sb->entry); + else { - evas_object_hide(v->image); - elm_image_file_set(v->image, sb->entry->path, group); - evas_object_show(v->image); + Evas_Object *tmp; + Evas_Coord w, h; + const char *group = _get_edje_group(sb->entry->path); + + tmp = evas_object_image_add(evas_object_evas_get(v->table)); + evas_object_image_file_set(tmp, sb->entry->path, group); + evas_object_image_size_get(tmp, &w, &h); + evas_object_del(tmp); + + if (w > 0 && h > 0) + { + evas_object_hide(v->image); + elm_image_file_set(v->image, sb->entry->path, group); + evas_object_show(v->image); + } } } - - return ECORE_CALLBACK_PASS_ON; + return; } static Evas_Object * @@ -258,10 +257,7 @@ _viewer_add(Evas_Object *parent, const char *path, Ephoto_Single_Browser *sb) } - v->monitor = eio_monitor_add(path); - v->handlers = eina_list_append(v->handlers, - ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, - _monitor_modified, sb)); + v->monitor = ecore_file_monitor_add(path, _monitor_cb, sb); return v->scroller; error: @@ -1353,6 +1349,7 @@ _save_image_as_done(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) } else { + evas_object_del(opopup); char *dir = ecore_file_dir_get(buf); if (strcmp(dir, sb->ephoto->config->directory)) diff --git a/src/bin/ephoto_thumb_browser.c b/src/bin/ephoto_thumb_browser.c index f3e221b..97ee42c 100644 --- a/src/bin/ephoto_thumb_browser.c +++ b/src/bin/ephoto_thumb_browser.c @@ -39,8 +39,7 @@ struct _Ephoto_Thumb_Browser Elm_Object_Item *last_sel; Ephoto_Sort sort; Eio_File *ls; - Eio_Monitor *monitor; - Eina_List *monitor_handlers; + Ecore_File_Monitor *monitor; Eina_List *cut_items; Eina_List *copy_items; Eina_List *handlers; @@ -86,12 +85,8 @@ static void _grid_mouse_up_cb(void *data, Evas *e EINA_UNUSED, static void _ephoto_thumb_activated(void *data, Evas_Object *obj EINA_UNUSED, void *event_info); static void _zoom_set(Ephoto_Thumb_Browser *tb, int zoom); -static Eina_Bool _monitor_created(void *data, int type EINA_UNUSED, - void *event); -static Eina_Bool _monitor_deleted(void *data, int type EINA_UNUSED, - void *event); -static Eina_Bool _monitor_modified(void *data, int type EINA_UNUSED, - void *event); +static void _monitor_cb(void *data, Ecore_File_Monitor *em EINA_UNUSED, + Ecore_File_Event event, const char *path); static void _update_info_label(Ephoto_Thumb_Browser *tb) @@ -494,181 +489,124 @@ _check_for_subdirs(Ephoto_Entry *entry) return EINA_FALSE; } -static Eina_Bool -_monitor_created(void *data, int type EINA_UNUSED, void *event) +static void +_monitor_cb(void *data, Ecore_File_Monitor *em EINA_UNUSED, + Ecore_File_Event event, const char *path) { Elm_Object_Item *item; Ephoto_Entry *entry = data; Ephoto_Entry *e; - Eio_Monitor_Event *ev = event; char file[PATH_MAX], dir[PATH_MAX]; const Elm_Genlist_Item_Class *ic; char buf[PATH_MAX]; if (!entry) - return ECORE_CALLBACK_PASS_ON; - if (!ecore_file_is_dir(ev->filename)) - return ECORE_CALLBACK_PASS_ON; + return; - snprintf(file, PATH_MAX, "%s", ev->filename); + snprintf(file, PATH_MAX, "%s", path); snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); if (strcmp(entry->path, dir)) - return ECORE_CALLBACK_PASS_ON; - - item = elm_genlist_first_item_get(entry->genlist); - while (item) + return; + if (event == ECORE_FILE_EVENT_CREATED_DIRECTORY) { - e = elm_object_item_data_get(item); - if (!strcmp(e->path, ev->filename)) - return ECORE_CALLBACK_PASS_ON; - item = elm_genlist_item_next_get(item); - } - if (elm_genlist_item_type_get(entry->item) == ELM_GENLIST_ITEM_TREE && - elm_genlist_item_expanded_get(entry->item) == EINA_TRUE) - { - ic = &_ephoto_dir_class; - snprintf(buf, PATH_MAX, "%s", ev->filename); - e = ephoto_entry_new(entry->ephoto, ev->filename, basename(buf), - EINA_FILE_DIR); - e->genlist = entry->genlist; - e->parent = entry->item; - e->item = - elm_genlist_item_sorted_insert(entry->genlist, ic, e, - e->parent, ELM_GENLIST_ITEM_NONE, _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_created, e)); - e->monitor_handlers = eina_list_append(e->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, - _monitor_deleted, e)); - e->monitor_handlers = eina_list_append(e->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, - _monitor_modified, e)); - } - } - if (elm_genlist_item_type_get(entry->item) == ELM_GENLIST_ITEM_NONE) - { - Elm_Object_Item *parent; - Ecore_Event_Handler *handler; - - ic = &_ephoto_dir_class; - parent = - elm_genlist_item_insert_before(entry->genlist, ic, entry, - entry->parent, entry->item, ELM_GENLIST_ITEM_TREE, NULL, NULL); - entry->no_delete = EINA_TRUE; - if (entry->monitor) - { - eio_monitor_del(entry->monitor); - EINA_LIST_FREE(entry->monitor_handlers, handler) - ecore_event_handler_del(handler); - } - elm_object_item_del(entry->item); - entry->item = parent; - entry->no_delete = EINA_FALSE; - 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_created, entry)); - entry->monitor_handlers = eina_list_append(entry->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, - _monitor_deleted, entry)); - entry->monitor_handlers = eina_list_append(entry->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, - _monitor_modified, entry)); - } - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_monitor_deleted(void *data, int type EINA_UNUSED, void *event) -{ - Elm_Object_Item *item; - Ephoto_Entry *entry = data; - Eio_Monitor_Event *ev = event; - char file[PATH_MAX], dir[PATH_MAX]; - const Elm_Genlist_Item_Class *ic; - - if (!entry) - return ECORE_CALLBACK_PASS_ON; - - snprintf(file, PATH_MAX, "%s", ev->filename); - snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); - - if (strcmp(entry->path, dir)) - return ECORE_CALLBACK_PASS_ON; - - item = elm_genlist_first_item_get(entry->genlist); - while (item) - { - Ephoto_Entry *e = elm_object_item_data_get(item); - if (!strcmp(e->path, ev->filename)) - { - elm_object_item_del(e->item); - break; - } - item = elm_genlist_item_next_get(item); - } - if (elm_genlist_item_type_get(entry->item) == ELM_GENLIST_ITEM_TREE && - _check_for_subdirs(entry) == EINA_FALSE) - { - Elm_Object_Item *parent; - - ic = &_ephoto_dir_class; - parent = - elm_genlist_item_insert_before(entry->genlist, ic, entry, - entry->parent, entry->item, ELM_GENLIST_ITEM_NONE, NULL, NULL); - entry->no_delete = EINA_TRUE; - elm_object_item_del(entry->item); - entry->item = parent; - entry->no_delete = EINA_FALSE; - } - if (!ecore_file_exists(entry->ephoto->config->directory)) - { - ephoto_directory_set(entry->ephoto, entry->path, entry->parent, 0, 1); - ephoto_title_set(entry->ephoto, entry->path); - } - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_monitor_modified(void *data, int type EINA_UNUSED, void *event) -{ - Ephoto_Entry *entry = data; - Eio_Monitor_Event *ev = event; - char file[PATH_MAX], dir[PATH_MAX]; - - if (!entry) - return ECORE_CALLBACK_PASS_ON; - if (!ecore_file_is_dir(ev->filename)) - return ECORE_CALLBACK_PASS_ON; - - snprintf(file, PATH_MAX, "%s", ev->filename); - snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); - - if (strcmp(entry->path, dir)) - return ECORE_CALLBACK_PASS_ON; - - if ((elm_genlist_item_expanded_get(entry->item) == EINA_TRUE)) - { - Elm_Object_Item *item; - + if (!ecore_file_is_dir(path)) + return; item = elm_genlist_first_item_get(entry->genlist); while (item) { - Ephoto_Entry *e = elm_object_item_data_get(item); - if (!strcmp(e->path, ev->filename)) + e = elm_object_item_data_get(item); + if (!strcmp(e->path, path)) + return; + item = elm_genlist_item_next_get(item); + } + if (elm_genlist_item_type_get(entry->item) == ELM_GENLIST_ITEM_TREE && + elm_genlist_item_expanded_get(entry->item) == EINA_TRUE) + { + ic = &_ephoto_dir_class; + snprintf(buf, PATH_MAX, "%s", path); + e = ephoto_entry_new(entry->ephoto, path, basename(buf), + EINA_FILE_DIR); + e->genlist = entry->genlist; + e->parent = entry->item; + e->item = + elm_genlist_item_sorted_insert(entry->genlist, ic, e, + e->parent, ELM_GENLIST_ITEM_NONE, _entry_cmp, NULL, NULL); + if (e->item) + e->monitor = ecore_file_monitor_add(e->path, _monitor_cb, e); + } + if (elm_genlist_item_type_get(entry->item) == ELM_GENLIST_ITEM_NONE) + { + Elm_Object_Item *parent; + + ic = &_ephoto_dir_class; + parent = + elm_genlist_item_insert_before(entry->genlist, ic, entry, + entry->parent, entry->item, ELM_GENLIST_ITEM_TREE, NULL, NULL); + entry->no_delete = EINA_TRUE; + if (entry->monitor) + ecore_file_monitor_del(entry->monitor); + elm_object_item_del(entry->item); + entry->item = parent; + entry->no_delete = EINA_FALSE; + entry->monitor = ecore_file_monitor_add(entry->path, _monitor_cb, entry); + } + return; + } + else if (event == ECORE_FILE_EVENT_DELETED_DIRECTORY) + { + item = elm_genlist_first_item_get(entry->genlist); + while (item) + { + e = elm_object_item_data_get(item); + if (!strcmp(e->path, path)) { - elm_genlist_item_update(e->item); + elm_object_item_del(e->item); break; } item = elm_genlist_item_next_get(item); } + if (elm_genlist_item_type_get(entry->item) == ELM_GENLIST_ITEM_TREE && + _check_for_subdirs(entry) == EINA_FALSE) + { + Elm_Object_Item *parent; + + ic = &_ephoto_dir_class; + parent = + elm_genlist_item_insert_before(entry->genlist, ic, entry, + entry->parent, entry->item, ELM_GENLIST_ITEM_NONE, NULL, NULL); + entry->no_delete = EINA_TRUE; + elm_object_item_del(entry->item); + entry->item = parent; + entry->no_delete = EINA_FALSE; + } + if (!ecore_file_exists(entry->ephoto->config->directory)) + { + ephoto_directory_set(entry->ephoto, entry->path, entry->parent, 0, 1); + ephoto_title_set(entry->ephoto, entry->path); + } + return; + } + else if (event == ECORE_FILE_EVENT_MODIFIED) + { + if (!ecore_file_is_dir(path)) + return; + if ((elm_genlist_item_expanded_get(entry->item) == EINA_TRUE)) + { + item = elm_genlist_first_item_get(entry->genlist); + while (item) + { + e = elm_object_item_data_get(item); + if (!strcmp(e->path, path)) + { + elm_genlist_item_update(e->item); + break; + } + item = elm_genlist_item_next_get(item); + } + } + return; } - return ECORE_CALLBACK_PASS_ON; } static Eina_Bool @@ -715,20 +653,8 @@ _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_created, entry)); - entry->monitor_handlers = eina_list_append( - entry->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, - _monitor_deleted, entry)); - entry->monitor_handlers = eina_list_append( - entry->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, - _monitor_modified, entry)); - entry->genlist = tb->fsel; + entry->monitor = ecore_file_monitor_add(entry->path, _monitor_cb, entry); + entry->genlist = tb->fsel; } } else @@ -3566,12 +3492,7 @@ _main_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, if (tb->searchentries) eina_list_free(tb->searchentries); if (tb->monitor) - { - eio_monitor_del(tb->monitor); - EINA_LIST_FREE(tb->monitor_handlers, handler) - ecore_event_handler_del(handler); - } - + ecore_file_monitor_del(tb->monitor); free(tb); } @@ -3638,123 +3559,79 @@ _ephoto_thumb_populate_error(void *data, int type EINA_UNUSED, return ECORE_CALLBACK_PASS_ON; } -static Eina_Bool -_top_monitor_created(void *data, int type EINA_UNUSED, void *event) +static void +_top_monitor_cb(void *data, Ecore_File_Monitor *em EINA_UNUSED, + Ecore_File_Event event, const char *path) { Elm_Object_Item *item; Ephoto_Thumb_Browser *tb = data; - Eio_Monitor_Event *ev = event; Ephoto_Entry *e; const Elm_Genlist_Item_Class *ic; char buf[PATH_MAX], file[PATH_MAX], dir[PATH_MAX]; if (!tb) - return ECORE_CALLBACK_PASS_ON; - if (!ecore_file_is_dir(ev->filename)) - return ECORE_CALLBACK_PASS_ON; - - snprintf(file, PATH_MAX, "%s", ev->filename); + return; + snprintf(file, PATH_MAX, "%s", path); snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); if (strcmp(tb->ephoto->top_directory, dir)) - return ECORE_CALLBACK_PASS_ON; - - item = elm_genlist_first_item_get(tb->fsel); - while (item) + return; + if (event == ECORE_FILE_EVENT_CREATED_DIRECTORY) { - e = elm_object_item_data_get(item); - if (!strcmp(e->path, ev->filename)) - return ECORE_CALLBACK_PASS_ON; - item = elm_genlist_item_next_get(item); - } - snprintf(buf, PATH_MAX, "%s", ev->filename); - e = ephoto_entry_new(tb->ephoto, ev->filename, basename(buf), - EINA_FILE_DIR); - e->genlist = tb->fsel; - ic = &_ephoto_dir_class; - e->item = - elm_genlist_item_append(tb->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_created, e)); - e->monitor_handlers = eina_list_append(e->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, - _monitor_deleted, e)); - e->monitor_handlers = eina_list_append(e->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, - _monitor_modified, e)); - } - - return ECORE_CALLBACK_PASS_ON; -} - -static Eina_Bool -_top_monitor_deleted(void *data, int type EINA_UNUSED, void *event) -{ - Elm_Object_Item *item; - Ephoto_Thumb_Browser *tb = data; - Eio_Monitor_Event *ev = event; - char file[PATH_MAX], dir[PATH_MAX]; - - if (!tb) - return ECORE_CALLBACK_PASS_ON; - - snprintf(file, PATH_MAX, "%s", ev->filename); - snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); - - if (strcmp(tb->ephoto->top_directory, dir)) - return ECORE_CALLBACK_PASS_ON; - - item = elm_genlist_first_item_get(tb->fsel); - while (item) - { - Ephoto_Entry *e = elm_object_item_data_get(item); - if (!strcmp(e->path, ev->filename)) + if (!ecore_file_is_dir(path)) + return; + item = elm_genlist_first_item_get(tb->fsel); + while (item) { - elm_object_item_del(e->item); - break; + e = elm_object_item_data_get(item); + if (!strcmp(e->path, path)) + return; + item = elm_genlist_item_next_get(item); } - item = elm_genlist_item_next_get(item); + snprintf(buf, PATH_MAX, "%s", path); + e = ephoto_entry_new(tb->ephoto, path, basename(buf), + EINA_FILE_DIR); + e->genlist = tb->fsel; + ic = &_ephoto_dir_class; + e->item = + elm_genlist_item_append(tb->fsel, ic, e, + NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL); + if (e->item) + e->monitor = ecore_file_monitor_add(e->path, _monitor_cb, e); + return; } - return ECORE_CALLBACK_PASS_ON; -} - - -static Eina_Bool -_top_monitor_modified(void *data, int type EINA_UNUSED, void *event) -{ - Elm_Object_Item *item; - Ephoto_Thumb_Browser *tb = data; - Eio_Monitor_Event *ev = event; - char file[PATH_MAX], dir[PATH_MAX]; - - if (!tb) - return ECORE_CALLBACK_PASS_ON; - if (!ecore_file_is_dir(ev->filename)) - return ECORE_CALLBACK_PASS_ON; - - snprintf(file, PATH_MAX, "%s", ev->filename); - snprintf(dir, PATH_MAX, "%s", ecore_file_dir_get(file)); - - if (strcmp(tb->ephoto->top_directory, dir)) - return ECORE_CALLBACK_PASS_ON; - - item = elm_genlist_first_item_get(tb->fsel); - while (item) + else if (event == ECORE_FILE_EVENT_DELETED_DIRECTORY) { - Ephoto_Entry *e = elm_object_item_data_get(item); - if (!strcmp(e->path, ev->filename)) + item = elm_genlist_first_item_get(tb->fsel); + while (item) { - elm_genlist_item_update(e->item); - break; + e = elm_object_item_data_get(item); + if (!strcmp(e->path, path)) + { + elm_object_item_del(e->item); + break; + } + item = elm_genlist_item_next_get(item); } - item = elm_genlist_item_next_get(item); + return; + } + else if (event == ECORE_FILE_EVENT_MODIFIED) + { + if (!ecore_file_is_dir(path)) + return; + item = elm_genlist_first_item_get(tb->fsel); + while (item) + { + e = elm_object_item_data_get(item); + if (!strcmp(e->path, path)) + { + elm_genlist_item_update(e->item); + break; + } + item = elm_genlist_item_next_get(item); + } + return; } - return ECORE_CALLBACK_PASS_ON; } static Eina_Bool @@ -3885,26 +3762,12 @@ ephoto_thumb_browser_top_dir_set(Ephoto *ephoto, const char *dir) evas_object_data_get(ephoto->thumb_browser, "thumb_browser"); if (tb->monitor) - { - Ecore_Event_Handler *handler; - eio_monitor_del(tb->monitor); - EINA_LIST_FREE(tb->monitor_handlers, handler) - ecore_event_handler_del(handler); - } + ecore_file_monitor_del(tb->monitor); if (ephoto->top_directory) eina_stringshare_replace(&ephoto->top_directory, dir); else ephoto->top_directory = eina_stringshare_add(dir); - tb->monitor = eio_monitor_add(dir); - tb->monitor_handlers = eina_list_append(tb->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED, - _top_monitor_created, tb)); - tb->monitor_handlers = eina_list_append(tb->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, - _top_monitor_deleted, tb)); - tb->monitor_handlers = eina_list_append(tb->monitor_handlers, - ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, - _top_monitor_modified, tb)); + tb->monitor = ecore_file_monitor_add(dir, _top_monitor_cb, tb); } void