diff --git a/src/e_file.c b/src/e_file.c index e3150a195..0c03a642e 100644 --- a/src/e_file.c +++ b/src/e_file.c @@ -27,6 +27,9 @@ e_file_new(char *file) E_File *f; D_ENTER; + if (!file || *file == 0) + D_RETURN_(NULL); + f = NEW(E_File, 1); e_object_init(E_OBJECT(f), @@ -47,8 +50,13 @@ e_file_get_by_name(Evas_List l, char *file) { Evas_List ll; E_File *f; + D_ENTER; - for (ll=l;ll;ll=ll->next) + + if (!l || !file || *file == 0) + D_RETURN_(NULL); + + for (ll=l; ll; ll=ll->next) { f = (E_File*) ll->data; @@ -57,6 +65,7 @@ e_file_get_by_name(Evas_List l, char *file) D_RETURN_(f); } } + D_RETURN_(NULL); } @@ -68,15 +77,20 @@ e_file_set_mime(E_File *f, char *base, char *mime) char *p; D_ENTER; + + if (!f || !base || !mime) + D_RETURN; + D("Setting mime: %40s: %s/%s\n", f->file, base, mime); + + if ( ((f->info.mime.base) && !(strcmp(f->info.mime.base, base))) - &&((f->info.mime.type) && !(strcmp(f->info.mime.type, mime)))) - D_RETURN; + &&((f->info.mime.type) && !(strcmp(f->info.mime.type, mime)))) + D_RETURN; + + IF_FREE(f->info.mime.base); + IF_FREE(f->info.mime.type); - if (f->info.mime.base) - free(f->info.mime.base); - if (f->info.mime.type) - free(f->info.mime.type); f->info.mime.base = strdup(base); f->info.mime.type = strdup(mime); @@ -125,6 +139,9 @@ e_file_set_link(E_File *f, char *link) { D_ENTER; + if (!f) + D_RETURN; + if ((!link) && (f->info.link)) { free(f->info.link); @@ -140,5 +157,6 @@ e_file_set_link(E_File *f, char *link) /* effect changes here */ } } + D_RETURN; } diff --git a/src/e_view_machine.c b/src/e_view_machine.c index a099050eb..e222b9cf0 100644 --- a/src/e_view_machine.c +++ b/src/e_view_machine.c @@ -9,12 +9,16 @@ void e_view_machine_init() { D_ENTER; - /* FIXME make this a singleton */ - VM= NEW(E_View_Model, 1); - VM->views = NULL; - VM->models = NULL; - e_view_init(); - e_view_model_init(); + + if (VM == NULL) + { + VM = NEW(E_View_Model, 1); + VM->views = NULL; + VM->models = NULL; + e_view_init(); + e_view_model_init(); + } + D_RETURN; } @@ -41,44 +45,58 @@ e_view_machine_unregister_view(E_View *v) static E_View_Model * -get_model_from_realpath(char *path) +view_model_lookup(char *path) { E_View_Model *m; Evas_List l; + char *realpath = NULL; D_ENTER; - if (path) - { - for (l=VM->models; l; l = l->next) - { - m = l->data; - if (!strcmp(m->dir, path)) + + if (!path) + D_RETURN_(NULL); + + realpath = e_file_realpath(path); + + for (l=VM->models; l; l = l->next) + { + m = l->data; + if (!strcmp(m->dir, realpath)) { - D("Model for this dir already exists\n"); - e_object_ref (E_OBJECT(m)); - D_RETURN_(m); + D("Model for this dir already exists\n"); + + IF_FREE(realpath); + + e_object_ref (E_OBJECT(m)); + D_RETURN_(m); } - } - } + } + + IF_FREE(realpath); D_RETURN_(NULL); } + void e_view_machine_get_model(E_View *v, char *path, int is_desktop) { E_View_Model *m = NULL; - char *realpath; char buf[PATH_MAX]; D_ENTER; - realpath = e_file_realpath(path); - if (!(m = get_model_from_realpath(realpath))) + + if (!v || !path || *path == 0) + D_RETURN; + + if (!(m = view_model_lookup(path))) { - D("Model for this dir doesnt exist, make a new one\n"); + D("Model for this dir doesn't exist, make a new one\n"); + m = e_view_model_new(); VM->models = evas_list_append(VM->models, m); e_view_model_set_dir(m, path); - snprintf(buf, PATH_MAX, "%s/.e_background.bg.db", realpath); + + snprintf(buf, PATH_MAX, "%s/.e_background.bg.db", m->dir); if (!e_file_exists(buf)) { if (is_desktop) @@ -93,6 +111,7 @@ e_view_machine_get_model(E_View *v, char *path, int is_desktop) e_strdup(m->bg_file, buf); m->is_desktop = is_desktop; } + if (m) { v->model = m; @@ -106,5 +125,6 @@ e_view_machine_get_model(E_View *v, char *path, int is_desktop) { /* FIXME error handling */ } + D_RETURN; } diff --git a/src/e_view_machine.h b/src/e_view_machine.h index a70670c5c..b4336d8f3 100644 --- a/src/e_view_machine.h +++ b/src/e_view_machine.h @@ -9,7 +9,7 @@ struct _e_view_machine }; typedef struct _e_view_machine E_View_Machine; -void e_view_machine_init(); +void e_view_machine_init(void); void e_view_machine_register_view(E_View *v); void e_view_machine_unregister_view(E_View *v); void e_view_machine_get_model(E_View *v, char *path, int is_desktop); diff --git a/src/e_view_model.c b/src/e_view_model.c index 9c308fd9c..b8f7f097b 100644 --- a/src/e_view_model.c +++ b/src/e_view_model.c @@ -22,7 +22,7 @@ static void e_view_model_set_default_background(E_View_Model *m); static void e_view_model_redraw_views(E_View_Model *m); void -e_view_model_init() +e_view_model_init(void) { D_ENTER; e_fs_add_event_handler(e_view_model_handle_fs); @@ -33,6 +33,9 @@ static void e_view_model_cleanup(E_View_Model *m) { D_ENTER; + + if (!m) + D_RETURN; efsd_stop_monitor(e_fs_get_connection(), m->dir, TRUE); if (m->restarter) @@ -47,7 +50,7 @@ e_view_model_cleanup(E_View_Model *m) } E_View_Model * -e_view_model_new () +e_view_model_new (void) { E_View_Model *m; @@ -71,13 +74,17 @@ e_view_model_redraw_views(E_View_Model *m) E_View *v; D_ENTER; + if (!m) + D_RETURN; + /* set the dirty flag of all views. the next time the idle * handler calls update_views, they'll be redrawn */ - for (l=m->views;l;l=l->next) + for (l = m->views; l; l=l->next) { v = l->data; v->changed = 1; } + D_RETURN; } @@ -86,15 +93,23 @@ e_view_model_set_default_background(E_View_Model *m) { char buf[PATH_MAX]; D_ENTER; + + if (!m) + D_RETURN; + IF_FREE(m->bg_file); + if (m->is_desktop) snprintf(buf, PATH_MAX, "%s/default.bg.db", e_config_get("backgrounds")); else snprintf(buf, PATH_MAX, "%s/view.bg.db", e_config_get("backgrounds")); + e_strdup(m->bg_file, buf); snprintf(buf, PATH_MAX, "background_reload:%s", m->dir); + ecore_add_event_timer(buf, 0.5, - e_view_model_bg_reload_timeout, 0, m); + e_view_model_bg_reload_timeout, 0, m); + D_RETURN; } @@ -129,12 +144,16 @@ e_view_model_set_dir(E_View_Model *m, char *dir) { D_ENTER; + if (!m) + D_RETURN; + /* stop monitoring old dir */ if ((m->dir) && (m->monitor_id)) { efsd_stop_monitor(e_fs_get_connection(), m->dir, TRUE); m->monitor_id = 0; } + IF_FREE(m->dir); m->dir = e_file_realpath(dir); @@ -160,6 +179,9 @@ e_view_model_handle_fs(EfsdEvent *ev) { D_ENTER; + if (!ev) + D_RETURN; + switch (ev->type) { case EFSD_EVENT_FILECHANGE: @@ -205,7 +227,7 @@ static void e_view_model_handle_efsd_event_reply_getfiletype(EfsdEvent *ev) { E_File *f; - char *file; + char *file = NULL; Evas_List l; E_View_Model *model; @@ -213,10 +235,12 @@ e_view_model_handle_efsd_event_reply_getfiletype(EfsdEvent *ev) char mime[PATH_MAX], base[PATH_MAX]; D_ENTER; - if (!ev->efsd_reply_event.errorcode == 0) - D_RETURN; + if (!ev) + D_RETURN; + + if (!ev->efsd_reply_event.errorcode == 0) + D_RETURN; - file = NULL; if ( (file = efsd_event_filename(ev)) ) { file = e_file_get_file(file); @@ -264,9 +288,14 @@ e_view_model_handle_efsd_event_reply_stat(EfsdEvent *ev) E_View_Model *m; E_File *f; Evas_List l; + D_ENTER; + + if (!ev) + D_RETURN; + if (!ev->efsd_reply_event.errorcode == 0) - D_RETURN; + D_RETURN; m = e_view_model_find_by_monitor_id(efsd_event_id(ev)); f = e_file_get_by_name(m->files, e_file_get_file(efsd_event_filename(ev))); @@ -286,6 +315,8 @@ e_view_model_handle_efsd_event_reply_stat(EfsdEvent *ev) e_icon_update_state(ic); e_icon_initial_show(ic); } + + D_RETURN; } static void @@ -295,9 +326,12 @@ e_view_model_handle_efsd_event_reply_readlink(EfsdEvent *ev) E_File *f; Evas_List l; D_ENTER; + + if (!ev) + D_RETURN; if (!ev->efsd_reply_event.errorcode == 0) - D_RETURN; + D_RETURN; m = e_view_model_find_by_monitor_id(efsd_event_id(ev)); f = e_file_get_by_name(m->files, e_file_get_file(efsd_event_filename(ev))); @@ -312,6 +346,8 @@ e_view_model_handle_efsd_event_reply_readlink(EfsdEvent *ev) e_icon_update_state(ic); e_icon_initial_show(ic); } + + D_RETURN; } static void @@ -320,6 +356,9 @@ e_view_model_handle_efsd_event_reply_getmeta(EfsdEvent *ev) Evas_List l; EfsdCmdId cmd; D_ENTER; + + if (!ev) + D_RETURN; cmd = efsd_event_id(ev); for (l=VM->views;l;l=l->next) @@ -417,12 +456,18 @@ e_view_model_handle_efsd_event_reply_getmeta(EfsdEvent *ev) e_border_remove_click_grab(b); } } + + D_RETURN; } static void e_view_model_handle_efsd_event_reply(EfsdEvent *ev) { D_ENTER; + + if (!ev) + D_RETURN; + switch (ev->efsd_reply_event.command.type) { case EFSD_CMD_REMOVE: @@ -557,10 +602,13 @@ e_view_model_file_deleted(int id, char *file) E_View_Model *m; D_ENTER; - if (!file || file[0] == '/') D_RETURN; + if (!file || file[0] == '/') + D_RETURN; + m = e_view_model_find_by_monitor_id(id); f = e_file_get_by_name(m->files, file); m->files = evas_list_remove(m->files, f); + if (!strcmp(file, ".e_background.bg.db")) { e_view_model_set_default_background(m); diff --git a/src/e_view_model.h b/src/e_view_model.h index 6b88c8a0f..417fc8eb6 100644 --- a/src/e_view_model.h +++ b/src/e_view_model.h @@ -23,7 +23,10 @@ typedef struct _E_View_Model E_View_Model; struct _E_View_Model { E_Object o; + + /* The realpath of the view's directory */ char *dir; + Evas_List files; Evas_Object obj_bg; @@ -34,7 +37,9 @@ struct _E_View_Model int monitor_id; + /* A list of all the views for which a model is sharing data */ Evas_List views; + int is_desktop; }; @@ -47,8 +52,8 @@ struct _E_View_Model */ void e_view_model_set_dir(E_View_Model *m, char *dir); -E_View_Model * e_view_model_new(); -void e_view_model_init(); +E_View_Model * e_view_model_new(void); +void e_view_model_init(void); E_View_Model * e_view_model_find_by_monitor_id(int id); diff --git a/src/focus.c b/src/focus.c index 064c8621a..8229a5794 100644 --- a/src/focus.c +++ b/src/focus.c @@ -1,5 +1,6 @@ #include "debug.h" #include "focus.h" +#include "icccm.h" #include "e.h" #include "util.h"