forked from enlightenment/enlightenment
efm now checks (on startup) for stale device links on desktop and tries to remove them
ticket #1689 SVN revision: 78608
This commit is contained in:
parent
b26e49dbff
commit
676c71a2a1
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue