forked from enlightenment/enlightenment
handle if efsd goes away and restart it... also have abackoff timeout to try
restarting efsd... :) SVN revision: 4673
This commit is contained in:
parent
f59e0487d6
commit
e9d5f13344
11
src/e.h
11
src/e.h
|
@ -146,6 +146,7 @@ typedef struct _E_Build_Menu E_Build_Menu;
|
||||||
typedef struct _E_Entry E_Entry;
|
typedef struct _E_Entry E_Entry;
|
||||||
typedef struct _E_Pack_Object_Class E_Pack_Object_Class;
|
typedef struct _E_Pack_Object_Class E_Pack_Object_Class;
|
||||||
typedef struct _E_Pack_Object E_Pack_Object;
|
typedef struct _E_Pack_Object E_Pack_Object;
|
||||||
|
typedef struct _E_FS_Restarter E_FS_Restarter;
|
||||||
|
|
||||||
struct _E_Object
|
struct _E_Object
|
||||||
{
|
{
|
||||||
|
@ -376,6 +377,8 @@ struct _E_View
|
||||||
int is_listing;
|
int is_listing;
|
||||||
int monitor_id;
|
int monitor_id;
|
||||||
|
|
||||||
|
E_FS_Restarter *restarter;
|
||||||
|
|
||||||
Evas_List icons;
|
Evas_List icons;
|
||||||
Evas_List shelves;
|
Evas_List shelves;
|
||||||
|
|
||||||
|
@ -654,6 +657,12 @@ struct _E_Pack_Object
|
||||||
Evas_List children;
|
Evas_List children;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _E_FS_Restarter
|
||||||
|
{
|
||||||
|
void (*func) (void *data);
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
#define DO(_object, _method, _args...) \
|
#define DO(_object, _method, _args...) \
|
||||||
{ if (_object->class._method) _object->class._method(_object->data.object, ## _args); }
|
{ if (_object->class._method) _object->class._method(_object->data.object, ## _args); }
|
||||||
|
|
||||||
|
@ -975,6 +984,8 @@ void e_build_menu_free(E_Build_Menu *bm);
|
||||||
E_Build_Menu *e_build_menu_new_from_db(char *file);
|
E_Build_Menu *e_build_menu_new_from_db(char *file);
|
||||||
E_Build_Menu *e_build_menu_new_from_gnome_apps(char *dir);
|
E_Build_Menu *e_build_menu_new_from_gnome_apps(char *dir);
|
||||||
|
|
||||||
|
E_FS_Restarter *e_fs_add_restart_handler(void (*func) (void *data), void *data);
|
||||||
|
void e_fs_del_restart_handler(E_FS_Restarter *rs);
|
||||||
void e_fs_add_event_handler(void (*func) (EfsdEvent *ev));
|
void e_fs_add_event_handler(void (*func) (EfsdEvent *ev));
|
||||||
void e_fs_init(void);
|
void e_fs_init(void);
|
||||||
EfsdConnection *e_fs_get_connection(void);
|
EfsdConnection *e_fs_get_connection(void);
|
||||||
|
|
102
src/fs.c
102
src/fs.c
|
@ -2,8 +2,29 @@
|
||||||
|
|
||||||
static EfsdConnection *ec = NULL;
|
static EfsdConnection *ec = NULL;
|
||||||
static Evas_List fs_handlers = NULL;
|
static Evas_List fs_handlers = NULL;
|
||||||
|
static Evas_List fs_restart_handlers = NULL;
|
||||||
|
static pid_t efsd_pid = 0;
|
||||||
|
|
||||||
|
static void e_fs_child_handle(Eevent *ev);
|
||||||
static void _e_fs_fd_handle(int fd);
|
static void _e_fs_fd_handle(int fd);
|
||||||
|
static void _e_fs_restarter(int val, void *data);
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_fs_child_handle(Eevent *ev)
|
||||||
|
{
|
||||||
|
Ev_Child *e;
|
||||||
|
|
||||||
|
e = ev->event;
|
||||||
|
printf("child exit code %i pid %i, efsd pid = %i\n", e->exit_code, e->pid, efsd_pid);
|
||||||
|
if (e->pid == efsd_pid)
|
||||||
|
{
|
||||||
|
efsd_close(ec);
|
||||||
|
efsd_pid = 0;
|
||||||
|
ec = NULL;
|
||||||
|
printf("efsd exited.\n");
|
||||||
|
_e_fs_restarter(0, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_fs_fd_handle(int fd)
|
_e_fs_fd_handle(int fd)
|
||||||
|
@ -34,9 +55,13 @@ _e_fs_fd_handle(int fd)
|
||||||
efsd_close(ec);
|
efsd_close(ec);
|
||||||
e_del_event_fd(fd);
|
e_del_event_fd(fd);
|
||||||
ec = NULL;
|
ec = NULL;
|
||||||
|
if (efsd_pid == -2)
|
||||||
|
_e_fs_restarter(0, NULL);
|
||||||
|
/* efsd_pid = 0;*/
|
||||||
/* FIXME: need to queue a popup dialog here saying */
|
/* FIXME: need to queue a popup dialog here saying */
|
||||||
/* efsd went wonky */
|
/* efsd went wonky */
|
||||||
printf("EEEEEEEEEEK efsd went wonky\n");
|
printf("EEEEEEEEEEK efsd went wonky\n");
|
||||||
|
/* _e_fs_restarter(0, NULL);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/* spent more thna 1/20th of a second here.. get out */
|
/* spent more thna 1/20th of a second here.. get out */
|
||||||
|
@ -50,6 +75,63 @@ _e_fs_fd_handle(int fd)
|
||||||
/* printf("############## fs done\n"); */
|
/* printf("############## fs done\n"); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_fs_restarter(int val, void *data)
|
||||||
|
{
|
||||||
|
if (ec) return;
|
||||||
|
printf("%i\n", efsd_pid);
|
||||||
|
if (val > 0)
|
||||||
|
{
|
||||||
|
if (efsd_pid <= 0)
|
||||||
|
efsd_pid = e_exec_run("efsd -f");
|
||||||
|
if (efsd_pid > 0)
|
||||||
|
ec = efsd_open();
|
||||||
|
}
|
||||||
|
if (ec)
|
||||||
|
{
|
||||||
|
Evas_List l;
|
||||||
|
|
||||||
|
printf("connect!\n");
|
||||||
|
for (l = fs_restart_handlers; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_FS_Restarter *rs;
|
||||||
|
|
||||||
|
rs = l->data;
|
||||||
|
rs->func(rs->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double gap;
|
||||||
|
|
||||||
|
gap = (double)val / 10;
|
||||||
|
if (gap > 10.0) gap = 10.0;
|
||||||
|
e_add_event_timer("e_fs_restarter", gap, _e_fs_restarter, val + 1, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
E_FS_Restarter *
|
||||||
|
e_fs_add_restart_handler(void (*func) (void *data), void *data)
|
||||||
|
{
|
||||||
|
E_FS_Restarter *rs;
|
||||||
|
|
||||||
|
rs = NEW(E_FS_Restarter, 1);
|
||||||
|
ZERO(rs, E_FS_Restarter, 1);
|
||||||
|
rs->func = func;
|
||||||
|
rs->data = data;
|
||||||
|
fs_restart_handlers = evas_list_append(fs_restart_handlers, rs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
e_fs_del_restart_handler(E_FS_Restarter *rs)
|
||||||
|
{
|
||||||
|
if (evas_list_find(fs_restart_handlers, rs))
|
||||||
|
{
|
||||||
|
fs_restart_handlers = evas_list_remove(fs_restart_handlers, rs);
|
||||||
|
FREE(rs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
e_fs_add_event_handler(void (*func) (EfsdEvent *ev))
|
e_fs_add_event_handler(void (*func) (EfsdEvent *ev))
|
||||||
{
|
{
|
||||||
|
@ -62,26 +144,32 @@ e_fs_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
e_event_filter_handler_add(EV_CHILD, e_fs_child_handle);
|
||||||
/* already have an efsd around? */
|
/* already have an efsd around? */
|
||||||
ec = efsd_open();
|
ec = efsd_open();
|
||||||
/* no - efsd around */
|
/* no - efsd around */
|
||||||
if (!ec)
|
if (!ec)
|
||||||
{
|
{
|
||||||
/* start efsd */
|
/* start efsd */
|
||||||
e_exec_run("efsd");
|
efsd_pid = e_exec_run("efsd -f");
|
||||||
for (i = 0; (!ec) && (i < 4); i++)
|
if (efsd_pid > 0)
|
||||||
{
|
{
|
||||||
sleep(1);
|
for (i = 0; (!ec) && (i < 4); i++)
|
||||||
ec = efsd_open();
|
{
|
||||||
|
sleep(1);
|
||||||
|
ec = efsd_open();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
efsd_pid = -2;
|
||||||
/* after several atempts to talk to efsd - lets give up */
|
/* after several atempts to talk to efsd - lets give up */
|
||||||
if (!ec)
|
if (!ec)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "efsd is not running - please run efsd.\n");
|
fprintf(stderr, "efsd is not running !!!\n");
|
||||||
exit(-1);
|
|
||||||
}
|
}
|
||||||
e_add_event_fd(efsd_get_connection_fd(ec), _e_fs_fd_handle);
|
if (ec)
|
||||||
|
e_add_event_fd(efsd_get_connection_fd(ec), _e_fs_fd_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
EfsdConnection *
|
EfsdConnection *
|
||||||
|
|
|
@ -134,7 +134,7 @@ e_icon_get_icon(E_Icon *icon)
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
strcpy(m2, icon->info.mime.type);
|
strcpy(m2, icon->info.mime.type);
|
||||||
p = strrchr(m2, '-');
|
p = strrchr(m2, '/');
|
||||||
while (p)
|
while (p)
|
||||||
{
|
{
|
||||||
p[0] = 0;
|
p[0] = 0;
|
||||||
|
@ -145,7 +145,7 @@ e_icon_get_icon(E_Icon *icon)
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
p = strrchr(m2, '-');
|
p = strrchr(m2, '/');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found)
|
if (!found)
|
||||||
|
|
76
src/view.c
76
src/view.c
|
@ -16,6 +16,7 @@ static void e_mouse_in(Eevent * ev);
|
||||||
static void e_mouse_out(Eevent * ev);
|
static void e_mouse_out(Eevent * ev);
|
||||||
static void e_window_expose(Eevent * ev);
|
static void e_window_expose(Eevent * ev);
|
||||||
static void e_view_handle_fs(EfsdEvent *ev);
|
static void e_view_handle_fs(EfsdEvent *ev);
|
||||||
|
static void e_view_handle_fs_restart(void *data);
|
||||||
|
|
||||||
/* FIXME: hack to test entry boxes */
|
/* FIXME: hack to test entry boxes */
|
||||||
static E_Entry *entry = NULL;
|
static E_Entry *entry = NULL;
|
||||||
|
@ -359,6 +360,41 @@ e_window_expose(Eevent * ev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
e_view_handle_fs_restart(void *data)
|
||||||
|
{
|
||||||
|
E_View *v;
|
||||||
|
Evas_List icons = NULL, l;
|
||||||
|
|
||||||
|
v = data;
|
||||||
|
|
||||||
|
printf("e_view_handle_fs_restart\n");
|
||||||
|
for (l = v->icons; l; l = l->next)
|
||||||
|
{
|
||||||
|
icons = evas_list_prepend(icons, l->data);
|
||||||
|
}
|
||||||
|
if (icons)
|
||||||
|
{
|
||||||
|
for (l = icons; l; l = l->next)
|
||||||
|
{
|
||||||
|
E_Icon *i;
|
||||||
|
|
||||||
|
i = l->data;
|
||||||
|
e_view_file_deleted(v->monitor_id, i->file);
|
||||||
|
}
|
||||||
|
evas_list_free(icons);
|
||||||
|
}
|
||||||
|
if (e_fs_get_connection())
|
||||||
|
v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir,
|
||||||
|
efsd_ops(2,
|
||||||
|
efsd_op_get_stat(),
|
||||||
|
efsd_op_get_filetype()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
printf("restarted monior id (connection = %p), %i for %s\n", e_fs_get_connection(), v->monitor_id, v->dir);
|
||||||
|
v->is_listing = 1;
|
||||||
|
}
|
||||||
|
|
||||||
Eevent *
|
Eevent *
|
||||||
e_view_get_current_event(void)
|
e_view_get_current_event(void)
|
||||||
{
|
{
|
||||||
|
@ -452,6 +488,7 @@ e_view_file_deleted(int id, char *file)
|
||||||
v = e_view_find_by_monitor_id(id);
|
v = e_view_find_by_monitor_id(id);
|
||||||
if (!v) return;
|
if (!v) return;
|
||||||
icon = e_view_find_icon_by_file(v, file);
|
icon = e_view_find_icon_by_file(v, file);
|
||||||
|
printf("%p %s\n", icon, file);
|
||||||
if (icon)
|
if (icon)
|
||||||
{
|
{
|
||||||
e_view_del_icon(v, icon);
|
e_view_del_icon(v, icon);
|
||||||
|
@ -542,9 +579,15 @@ e_view_handle_fs(EfsdEvent *ev)
|
||||||
ev->efsd_filechange_event.file);
|
ev->efsd_filechange_event.file);
|
||||||
*/ break;
|
*/ break;
|
||||||
case EFSD_CHANGE_END_EXISTS:
|
case EFSD_CHANGE_END_EXISTS:
|
||||||
printf("EFSD_CHANGE_END_EXISTS: %i %s\n",
|
{
|
||||||
ev->efsd_filechange_event.id,
|
E_View *v;
|
||||||
ev->efsd_filechange_event.file);
|
|
||||||
|
v = e_view_find_by_monitor_id(ev->efsd_filechange_event.id);
|
||||||
|
if (v) v->is_listing = 0;
|
||||||
|
printf("EFSD_CHANGE_END_EXISTS: %i %s\n",
|
||||||
|
ev->efsd_filechange_event.id,
|
||||||
|
ev->efsd_filechange_event.file);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -702,6 +745,9 @@ void
|
||||||
e_view_free(E_View *v)
|
e_view_free(E_View *v)
|
||||||
{
|
{
|
||||||
views = evas_list_remove(views, v);
|
views = evas_list_remove(views, v);
|
||||||
|
if (v->restarter)
|
||||||
|
e_fs_del_restart_handler(v->restarter);
|
||||||
|
v->restarter = NULL;
|
||||||
FREE(v);
|
FREE(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -786,15 +832,18 @@ e_view_set_dir(E_View *v, char *dir)
|
||||||
v->dir = e_file_real(dir);
|
v->dir = e_file_real(dir);
|
||||||
/* start monitoring new dir */
|
/* start monitoring new dir */
|
||||||
|
|
||||||
/* v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir); */
|
v->restarter = e_fs_add_restart_handler(e_view_handle_fs_restart, v);
|
||||||
v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir,
|
if (e_fs_get_connection())
|
||||||
efsd_ops(2,
|
{
|
||||||
efsd_op_get_stat(),
|
v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir,
|
||||||
efsd_op_get_filetype()
|
efsd_ops(2,
|
||||||
)
|
efsd_op_get_stat(),
|
||||||
);
|
efsd_op_get_filetype()
|
||||||
v->is_listing = 1;
|
)
|
||||||
v->changed = 1;
|
);
|
||||||
|
v->is_listing = 1;
|
||||||
|
v->changed = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -920,6 +969,7 @@ e_view_realize(E_View *v)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: hack to test entry boxes */
|
/* FIXME: hack to test entry boxes */
|
||||||
|
/*
|
||||||
{
|
{
|
||||||
entry = e_entry_new();
|
entry = e_entry_new();
|
||||||
e_entry_set_evas(entry, v->evas);
|
e_entry_set_evas(entry, v->evas);
|
||||||
|
@ -936,7 +986,7 @@ e_view_realize(E_View *v)
|
||||||
e_entry_resize(entry, ew, eh);
|
e_entry_resize(entry, ew, eh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
v->changed = 1;
|
v->changed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue