From 676c71a2a1e2935b04ed04469410ccc316db7646 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 29 Oct 2012 09:52:23 +0000 Subject: [PATCH] efm now checks (on startup) for stale device links on desktop and tries to remove them ticket #1689 SVN revision: 78608 --- src/bin/e_fm.c | 3 ++ src/bin/e_fm/e_fm_ipc.c | 36 +++++++++++++- src/bin/e_fm/e_fm_ipc.h | 1 + src/bin/e_fm/e_fm_main_eeze.c | 15 +----- src/bin/e_fm/e_fm_main_hal.c | 15 +----- src/bin/e_fm/e_fm_main_udisks.c | 15 +----- src/bin/e_fm_device.c | 84 +++++++++++++++++++++++++++++++++ src/bin/e_fm_device.h | 2 +- src/bin/e_fm_op.h | 3 +- 9 files changed, 129 insertions(+), 45 deletions(-) diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index 33663a007..3ec60bc86 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -2892,6 +2892,9 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) } break; + case E_FM_OP_VOLUME_LIST_DONE: + e_fm2_device_check_desktop_icons(); + break; case E_FM_OP_VOLUME_ADD: /*volume add*/ if ((e->data) && (e->size > 0)) { diff --git a/src/bin/e_fm/e_fm_ipc.c b/src/bin/e_fm/e_fm_ipc.c index b47109674..371ca1d52 100644 --- a/src/bin/e_fm/e_fm_ipc.c +++ b/src/bin/e_fm/e_fm_ipc.c @@ -41,7 +41,7 @@ #include "e_fm_op.h" #undef E_TYPEDEFS #include "e_fm_main.h" - +#include "e_fm_shared_codec.h" #define DEF_SYNC_NUM 8 #define DEF_ROUND_TRIP 0.05 #define DEF_ROUND_TRIP_TOLERANCE 0.01 @@ -123,6 +123,9 @@ static int _e_sync_num = 0; static Eina_List *_e_fm_ipc_slaves = NULL; static Eina_List *_e_fm_tasks = NULL; +static Eina_Bool _init_timer_run = EINA_FALSE; +static Ecore_Timer *_init_timer = NULL; + /* local subsystem functions */ static Eina_Bool _e_fm_ipc_cb_server_add(void *data, int type, void *event); static Eina_Bool _e_fm_ipc_cb_server_del(void *data, int type, void *event); @@ -1463,3 +1466,34 @@ _e_fm_ipc_prepare_command(E_Fm_Op_Type type, const char *args) return buffer; } + +static Eina_Bool +_e_fm_ipc_timer_cb(void *d __UNUSED__) +{ + ecore_ipc_server_send(_e_fm_ipc_server, + 6 /*E_IPC_DOMAIN_FM*/, + E_FM_OP_VOLUME_LIST_DONE, + 0, 0, 0, "", 1); + _init_timer_run = EINA_TRUE; + return EINA_FALSE; +} + +void +e_fm_ipc_volume_add(E_Volume *v) +{ + void *msg_data; + int msg_size; + + if (_init_timer && (!_init_timer_run)) + ecore_timer_reset(_init_timer); + else if ((!_init_timer) && (!_init_timer_run)) + _init_timer = ecore_timer_add(2.0, _e_fm_ipc_timer_cb, NULL); + + msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size); + if (!msg_data) return; + ecore_ipc_server_send(_e_fm_ipc_server, + 6 /*E_IPC_DOMAIN_FM*/, + E_FM_OP_VOLUME_ADD, + 0, 0, 0, msg_data, msg_size); + free(msg_data); +} diff --git a/src/bin/e_fm/e_fm_ipc.h b/src/bin/e_fm/e_fm_ipc.h index d73a46e04..5389d261b 100644 --- a/src/bin/e_fm/e_fm_ipc.h +++ b/src/bin/e_fm/e_fm_ipc.h @@ -7,6 +7,7 @@ int _e_fm_ipc_init(void); Eina_Bool _e_fm_ipc_slave_data_cb(void *data, int type, void *event); Eina_Bool _e_fm_ipc_slave_error_cb(void *data, int type, void *event); Eina_Bool _e_fm_ipc_slave_del_cb(void *data, int type, void *event); +void e_fm_ipc_volume_add(E_Volume *v); EAPI E_Storage *e_storage_add(const char *udi); EAPI void e_storage_del(const char *udi); diff --git a/src/bin/e_fm/e_fm_main_eeze.c b/src/bin/e_fm/e_fm_main_eeze.c index b8fc8bb88..4114089af 100644 --- a/src/bin/e_fm/e_fm_main_eeze.c +++ b/src/bin/e_fm/e_fm_main_eeze.c @@ -455,20 +455,7 @@ _e_fm_main_eeze_volume_add(const char *syspath, } v->validated = EINA_TRUE; - { - void *msg_data; - int msg_size; - - msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size); - if (msg_data) - { - ecore_ipc_server_send(_e_fm_ipc_server, - 6 /*E_IPC_DOMAIN_FM*/, - E_FM_OP_VOLUME_ADD, - 0, 0, 0, msg_data, msg_size); - free(msg_data); - } - } + e_fm_ipc_volume_add(v); return v; } diff --git a/src/bin/e_fm/e_fm_main_hal.c b/src/bin/e_fm/e_fm_main_hal.c index d2e478e83..eeb2a0721 100644 --- a/src/bin/e_fm/e_fm_main_hal.c +++ b/src/bin/e_fm/e_fm_main_hal.c @@ -562,20 +562,7 @@ _e_fm_main_hal_cb_vol_prop(void *data, // if (s) printf(" for storage: %s\n", s->udi); // else printf(" storage unknown\n"); v->validated = EINA_TRUE; - { - void *msg_data; - int msg_size; - - msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size); - if (msg_data) - { - ecore_ipc_server_send(_e_fm_ipc_server, - 6 /*E_IPC_DOMAIN_FM*/, - E_FM_OP_VOLUME_ADD, - 0, 0, 0, msg_data, msg_size); - free(msg_data); - } - } + e_fm_ipc_volume_add(v); return; error: diff --git a/src/bin/e_fm/e_fm_main_udisks.c b/src/bin/e_fm/e_fm_main_udisks.c index e509409bb..0a1321495 100644 --- a/src/bin/e_fm/e_fm_main_udisks.c +++ b/src/bin/e_fm/e_fm_main_udisks.c @@ -534,20 +534,7 @@ _e_fm_main_udisks_cb_vol_prop(E_Volume *v, // if (s) printf(" for storage: %s", s->udi); // else printf(" storage unknown"); v->validated = EINA_TRUE; - { - void *msg_data; - int msg_size; - - msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size); - if (msg_data) - { - ecore_ipc_server_send(_e_fm_ipc_server, - 6 /*E_IPC_DOMAIN_FM*/, - E_FM_OP_VOLUME_ADD, - 0, 0, 0, msg_data, msg_size); - free(msg_data); - } - } + e_fm_ipc_volume_add(v); return; error: diff --git a/src/bin/e_fm_device.c b/src/bin/e_fm_device.c index 84fc6050c..71a63d2ed 100644 --- a/src/bin/e_fm_device.c +++ b/src/bin/e_fm_device.c @@ -13,6 +13,10 @@ static void _e_fm2_device_unmount_fail(E_Fm2_Mount *m) EINA_ARG_NONNULL(1); static Eina_List *_e_stores = NULL; static Eina_List *_e_vols = NULL; +static Eina_Bool _check_run_show = EINA_FALSE; +static Eina_Bool _check_run_hide = EINA_FALSE; +static Ecore_Thread *_check_vols = NULL; + static void _e_fm2_device_volume_setup(E_Volume *v) { @@ -610,6 +614,48 @@ _e_fm2_device_unmount_fail(E_Fm2_Mount *m) m->unmount_fail(m->data); } +static void +_e_fm2_device_check_desktop_icons_cb_end(void *data __UNUSED__, Ecore_Thread *eth __UNUSED__) +{ + _check_vols = NULL; + if (_check_run_show) + e_fm2_device_show_desktop_icons(); + else if (_check_run_hide) + e_fm2_device_hide_desktop_icons(); + _check_run_hide = _check_run_show = EINA_FALSE; +} + +static void +_e_fm2_device_check_desktop_icons_list_cb(const char *name, const char *path, void *data) +{ + char buf[PATH_MAX], buf2[PATH_MAX]; + Eina_List *l; + char *file; + + if (path[0] != '|') return; // not e17 link + if (!eina_str_has_extension(name, ".desktop")) return; + snprintf(buf, sizeof(buf), "%s/%s", path, name); + if (ecore_file_size(buf) > 200) return; // unlikely that we're going to write a desktop file this long + e_user_dir_snprintf(buf2, sizeof(buf2), "fileman/favorites/%s", name); + if (!ecore_file_exists(buf2)) return; + EINA_LIST_FOREACH(data, l, file) + if (!strcmp(file, buf)) return; // valid link + + ecore_file_unlink(buf); + ecore_file_unlink(buf2); +} + +static void +_e_fm2_device_check_desktop_icons_cb(void *data, Ecore_Thread *eth __UNUSED__) +{ + char buf[PATH_MAX]; + + e_user_homedir_concat_static(buf, _("Desktop")); + eina_file_dir_list(buf, EINA_FALSE, _e_fm2_device_check_desktop_icons_list_cb, data); + + E_FREE_LIST(data, free); +} + EAPI void e_fm2_device_show_desktop_icons(void) { @@ -619,6 +665,13 @@ e_fm2_device_show_desktop_icons(void) char buf2[PATH_MAX] = {0}; const char *id; + if (_check_vols) + { + _check_run_hide = EINA_FALSE; + _check_run_show = EINA_TRUE; + return; + } + EINA_LIST_FOREACH(_e_vols, l, v) { if (!v) continue; @@ -650,6 +703,13 @@ e_fm2_device_hide_desktop_icons(void) char buf[PATH_MAX] = {0}; const char *id; + if (_check_vols) + { + _check_run_show = EINA_FALSE; + _check_run_hide = EINA_TRUE; + return; + } + EINA_LIST_FOREACH(_e_vols, l, v) { if (!v) continue; @@ -669,6 +729,30 @@ e_fm2_device_hide_desktop_icons(void) } } +EAPI void +e_fm2_device_check_desktop_icons(void) +{ + Eina_List *l, *thd = NULL; + E_Volume *v; + char buf[PATH_MAX] = {0}; + const char *id; + + if (_check_vols) return; + EINA_LIST_FOREACH(_e_vols, l, v) + { + if (!v) continue; + if (!v->storage) continue; + + id = ecore_file_file_get(v->storage->udi); + + e_user_homedir_snprintf(buf, sizeof(buf), + "%s/|%s_%d.desktop", + _("Desktop"), id, v->partition_number); + thd = eina_list_append(thd, strdup(buf)); + } + _check_vols = ecore_thread_run(_e_fm2_device_check_desktop_icons_cb, _e_fm2_device_check_desktop_icons_cb_end, _e_fm2_device_check_desktop_icons_cb_end, thd); +} + EAPI Eina_List * e_fm2_device_volume_list_get(void) { diff --git a/src/bin/e_fm_device.h b/src/bin/e_fm_device.h index 9c8883096..e3c971d28 100644 --- a/src/bin/e_fm_device.h +++ b/src/bin/e_fm_device.h @@ -27,7 +27,7 @@ EAPI void e_fm2_device_unmount_fail(E_Volume *v); EAPI void e_fm2_device_show_desktop_icons(void); EAPI void e_fm2_device_hide_desktop_icons(void); - +EAPI void e_fm2_device_check_desktop_icons(void); EAPI Eina_List *e_fm2_device_volume_list_get(void); #endif diff --git a/src/bin/e_fm_op.h b/src/bin/e_fm_op.h index 2ef6d22ac..ff50b5178 100644 --- a/src/bin/e_fm_op.h +++ b/src/bin/e_fm_op.h @@ -52,7 +52,8 @@ typedef enum _E_Fm_Op_Type E_FM_OP_EJECT_DONE, E_FM_OP_EJECT_ERROR, E_FM_OP_SECURE_REMOVE, - E_FM_OP_DESTROY + E_FM_OP_DESTROY, + E_FM_OP_VOLUME_LIST_DONE } E_Fm_Op_Type; #else