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;
|
break;
|
||||||
|
|
||||||
|
case E_FM_OP_VOLUME_LIST_DONE:
|
||||||
|
e_fm2_device_check_desktop_icons();
|
||||||
|
break;
|
||||||
case E_FM_OP_VOLUME_ADD: /*volume add*/
|
case E_FM_OP_VOLUME_ADD: /*volume add*/
|
||||||
if ((e->data) && (e->size > 0))
|
if ((e->data) && (e->size > 0))
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
#include "e_fm_op.h"
|
#include "e_fm_op.h"
|
||||||
#undef E_TYPEDEFS
|
#undef E_TYPEDEFS
|
||||||
#include "e_fm_main.h"
|
#include "e_fm_main.h"
|
||||||
|
#include "e_fm_shared_codec.h"
|
||||||
#define DEF_SYNC_NUM 8
|
#define DEF_SYNC_NUM 8
|
||||||
#define DEF_ROUND_TRIP 0.05
|
#define DEF_ROUND_TRIP 0.05
|
||||||
#define DEF_ROUND_TRIP_TOLERANCE 0.01
|
#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_ipc_slaves = NULL;
|
||||||
static Eina_List *_e_fm_tasks = 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 */
|
/* 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_add(void *data, int type, void *event);
|
||||||
static Eina_Bool _e_fm_ipc_cb_server_del(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;
|
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_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_error_cb(void *data, int type, void *event);
|
||||||
Eina_Bool _e_fm_ipc_slave_del_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 E_Storage *e_storage_add(const char *udi);
|
||||||
EAPI void e_storage_del(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;
|
v->validated = EINA_TRUE;
|
||||||
{
|
e_fm_ipc_volume_add(v);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 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);
|
// if (s) printf(" for storage: %s\n", s->udi);
|
||||||
// else printf(" storage unknown\n");
|
// else printf(" storage unknown\n");
|
||||||
v->validated = EINA_TRUE;
|
v->validated = EINA_TRUE;
|
||||||
{
|
e_fm_ipc_volume_add(v);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
|
|
@ -534,20 +534,7 @@ _e_fm_main_udisks_cb_vol_prop(E_Volume *v,
|
||||||
// if (s) printf(" for storage: %s", s->udi);
|
// if (s) printf(" for storage: %s", s->udi);
|
||||||
// else printf(" storage unknown");
|
// else printf(" storage unknown");
|
||||||
v->validated = EINA_TRUE;
|
v->validated = EINA_TRUE;
|
||||||
{
|
e_fm_ipc_volume_add(v);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error:
|
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_stores = NULL;
|
||||||
static Eina_List *_e_vols = 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
|
static void
|
||||||
_e_fm2_device_volume_setup(E_Volume *v)
|
_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);
|
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
|
EAPI void
|
||||||
e_fm2_device_show_desktop_icons(void)
|
e_fm2_device_show_desktop_icons(void)
|
||||||
{
|
{
|
||||||
|
@ -619,6 +665,13 @@ e_fm2_device_show_desktop_icons(void)
|
||||||
char buf2[PATH_MAX] = {0};
|
char buf2[PATH_MAX] = {0};
|
||||||
const char *id;
|
const char *id;
|
||||||
|
|
||||||
|
if (_check_vols)
|
||||||
|
{
|
||||||
|
_check_run_hide = EINA_FALSE;
|
||||||
|
_check_run_show = EINA_TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EINA_LIST_FOREACH(_e_vols, l, v)
|
EINA_LIST_FOREACH(_e_vols, l, v)
|
||||||
{
|
{
|
||||||
if (!v) continue;
|
if (!v) continue;
|
||||||
|
@ -650,6 +703,13 @@ e_fm2_device_hide_desktop_icons(void)
|
||||||
char buf[PATH_MAX] = {0};
|
char buf[PATH_MAX] = {0};
|
||||||
const char *id;
|
const char *id;
|
||||||
|
|
||||||
|
if (_check_vols)
|
||||||
|
{
|
||||||
|
_check_run_show = EINA_FALSE;
|
||||||
|
_check_run_hide = EINA_TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
EINA_LIST_FOREACH(_e_vols, l, v)
|
EINA_LIST_FOREACH(_e_vols, l, v)
|
||||||
{
|
{
|
||||||
if (!v) continue;
|
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 *
|
EAPI Eina_List *
|
||||||
e_fm2_device_volume_list_get(void)
|
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_show_desktop_icons(void);
|
||||||
EAPI void e_fm2_device_hide_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);
|
EAPI Eina_List *e_fm2_device_volume_list_get(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -52,7 +52,8 @@ typedef enum _E_Fm_Op_Type
|
||||||
E_FM_OP_EJECT_DONE,
|
E_FM_OP_EJECT_DONE,
|
||||||
E_FM_OP_EJECT_ERROR,
|
E_FM_OP_EJECT_ERROR,
|
||||||
E_FM_OP_SECURE_REMOVE,
|
E_FM_OP_SECURE_REMOVE,
|
||||||
E_FM_OP_DESTROY
|
E_FM_OP_DESTROY,
|
||||||
|
E_FM_OP_VOLUME_LIST_DONE
|
||||||
} E_Fm_Op_Type;
|
} E_Fm_Op_Type;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in New Issue