Did a little codewalk through the view code -- added lots of

segfault protection, renamed get_model_from_realpath() to
view_model_lookup(). Moved the realpath call to view_model_lookup(),
this way we need not rely on the realpath being passed in.
All minor stuff, really.

One thing I noticed: e_view_machine_get_model() is in the wrong
place and should change its name -- it is not related to the view
machine and does not return anything. It should probably become

e_view_register_model()

and live in view.c.

Also, Raster hasn't replied yet to my question regarding
the need for the explicit -lc in Makefile.am. It works fine
here without it and apparently breaks FreeBSD build, so I
think we should remove it.

Fixed a warning in focus.c due to missing icccm.h.

Added "void" to function declarations that don't accept
parameters.


SVN revision: 5994
This commit is contained in:
cpk 2002-02-27 21:06:42 +00:00 committed by cpk
parent 12fe3a8611
commit 706a10b1db
6 changed files with 136 additions and 44 deletions

View File

@ -27,6 +27,9 @@ e_file_new(char *file)
E_File *f; E_File *f;
D_ENTER; D_ENTER;
if (!file || *file == 0)
D_RETURN_(NULL);
f = NEW(E_File, 1); f = NEW(E_File, 1);
e_object_init(E_OBJECT(f), e_object_init(E_OBJECT(f),
@ -47,8 +50,13 @@ e_file_get_by_name(Evas_List l, char *file)
{ {
Evas_List ll; Evas_List ll;
E_File *f; E_File *f;
D_ENTER; 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; f = (E_File*) ll->data;
@ -57,6 +65,7 @@ e_file_get_by_name(Evas_List l, char *file)
D_RETURN_(f); D_RETURN_(f);
} }
} }
D_RETURN_(NULL); D_RETURN_(NULL);
} }
@ -68,15 +77,20 @@ e_file_set_mime(E_File *f, char *base, char *mime)
char *p; char *p;
D_ENTER; D_ENTER;
if (!f || !base || !mime)
D_RETURN;
D("Setting mime: %40s: %s/%s\n", f->file, base, mime); D("Setting mime: %40s: %s/%s\n", f->file, base, mime);
if ( ((f->info.mime.base) && !(strcmp(f->info.mime.base, base))) if ( ((f->info.mime.base) && !(strcmp(f->info.mime.base, base)))
&&((f->info.mime.type) && !(strcmp(f->info.mime.type, mime)))) &&((f->info.mime.type) && !(strcmp(f->info.mime.type, mime))))
D_RETURN; D_RETURN;
if (f->info.mime.base) IF_FREE(f->info.mime.base);
free(f->info.mime.base); IF_FREE(f->info.mime.type);
if (f->info.mime.type)
free(f->info.mime.type);
f->info.mime.base = strdup(base); f->info.mime.base = strdup(base);
f->info.mime.type = strdup(mime); f->info.mime.type = strdup(mime);
@ -125,6 +139,9 @@ e_file_set_link(E_File *f, char *link)
{ {
D_ENTER; D_ENTER;
if (!f)
D_RETURN;
if ((!link) && (f->info.link)) if ((!link) && (f->info.link))
{ {
free(f->info.link); free(f->info.link);
@ -140,5 +157,6 @@ e_file_set_link(E_File *f, char *link)
/* effect changes here */ /* effect changes here */
} }
} }
D_RETURN; D_RETURN;
} }

View File

@ -9,12 +9,16 @@ void
e_view_machine_init() e_view_machine_init()
{ {
D_ENTER; D_ENTER;
/* FIXME make this a singleton */
VM= NEW(E_View_Model, 1); if (VM == NULL)
{
VM = NEW(E_View_Model, 1);
VM->views = NULL; VM->views = NULL;
VM->models = NULL; VM->models = NULL;
e_view_init(); e_view_init();
e_view_model_init(); e_view_model_init();
}
D_RETURN; D_RETURN;
} }
@ -41,44 +45,58 @@ e_view_machine_unregister_view(E_View *v)
static E_View_Model * static E_View_Model *
get_model_from_realpath(char *path) view_model_lookup(char *path)
{ {
E_View_Model *m; E_View_Model *m;
Evas_List l; Evas_List l;
char *realpath = NULL;
D_ENTER; D_ENTER;
if (path)
{ if (!path)
D_RETURN_(NULL);
realpath = e_file_realpath(path);
for (l=VM->models; l; l = l->next) for (l=VM->models; l; l = l->next)
{ {
m = l->data; m = l->data;
if (!strcmp(m->dir, path)) if (!strcmp(m->dir, realpath))
{ {
D("Model for this dir already exists\n"); D("Model for this dir already exists\n");
IF_FREE(realpath);
e_object_ref (E_OBJECT(m)); e_object_ref (E_OBJECT(m));
D_RETURN_(m); D_RETURN_(m);
} }
} }
}
IF_FREE(realpath);
D_RETURN_(NULL); D_RETURN_(NULL);
} }
void void
e_view_machine_get_model(E_View *v, char *path, int is_desktop) e_view_machine_get_model(E_View *v, char *path, int is_desktop)
{ {
E_View_Model *m = NULL; E_View_Model *m = NULL;
char *realpath;
char buf[PATH_MAX]; char buf[PATH_MAX];
D_ENTER; 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(); m = e_view_model_new();
VM->models = evas_list_append(VM->models, m); VM->models = evas_list_append(VM->models, m);
e_view_model_set_dir(m, path); 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 (!e_file_exists(buf))
{ {
if (is_desktop) 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); e_strdup(m->bg_file, buf);
m->is_desktop = is_desktop; m->is_desktop = is_desktop;
} }
if (m) if (m)
{ {
v->model = m; v->model = m;
@ -106,5 +125,6 @@ e_view_machine_get_model(E_View *v, char *path, int is_desktop)
{ {
/* FIXME error handling */ /* FIXME error handling */
} }
D_RETURN; D_RETURN;
} }

View File

@ -9,7 +9,7 @@ struct _e_view_machine
}; };
typedef struct _e_view_machine 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_register_view(E_View *v);
void e_view_machine_unregister_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); void e_view_machine_get_model(E_View *v, char *path, int is_desktop);

View File

@ -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); static void e_view_model_redraw_views(E_View_Model *m);
void void
e_view_model_init() e_view_model_init(void)
{ {
D_ENTER; D_ENTER;
e_fs_add_event_handler(e_view_model_handle_fs); e_fs_add_event_handler(e_view_model_handle_fs);
@ -34,6 +34,9 @@ e_view_model_cleanup(E_View_Model *m)
{ {
D_ENTER; D_ENTER;
if (!m)
D_RETURN;
efsd_stop_monitor(e_fs_get_connection(), m->dir, TRUE); efsd_stop_monitor(e_fs_get_connection(), m->dir, TRUE);
if (m->restarter) if (m->restarter)
e_fs_del_restart_handler(m->restarter); e_fs_del_restart_handler(m->restarter);
@ -47,7 +50,7 @@ e_view_model_cleanup(E_View_Model *m)
} }
E_View_Model * E_View_Model *
e_view_model_new () e_view_model_new (void)
{ {
E_View_Model *m; E_View_Model *m;
@ -71,13 +74,17 @@ e_view_model_redraw_views(E_View_Model *m)
E_View *v; E_View *v;
D_ENTER; D_ENTER;
if (!m)
D_RETURN;
/* set the dirty flag of all views. the next time the idle /* set the dirty flag of all views. the next time the idle
* handler calls update_views, they'll be redrawn */ * 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 = l->data;
v->changed = 1; v->changed = 1;
} }
D_RETURN; D_RETURN;
} }
@ -86,15 +93,23 @@ e_view_model_set_default_background(E_View_Model *m)
{ {
char buf[PATH_MAX]; char buf[PATH_MAX];
D_ENTER; D_ENTER;
if (!m)
D_RETURN;
IF_FREE(m->bg_file); IF_FREE(m->bg_file);
if (m->is_desktop) if (m->is_desktop)
snprintf(buf, PATH_MAX, "%s/default.bg.db", e_config_get("backgrounds")); snprintf(buf, PATH_MAX, "%s/default.bg.db", e_config_get("backgrounds"));
else else
snprintf(buf, PATH_MAX, "%s/view.bg.db", e_config_get("backgrounds")); snprintf(buf, PATH_MAX, "%s/view.bg.db", e_config_get("backgrounds"));
e_strdup(m->bg_file, buf); e_strdup(m->bg_file, buf);
snprintf(buf, PATH_MAX, "background_reload:%s", m->dir); snprintf(buf, PATH_MAX, "background_reload:%s", m->dir);
ecore_add_event_timer(buf, 0.5, 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; D_RETURN;
} }
@ -129,12 +144,16 @@ e_view_model_set_dir(E_View_Model *m, char *dir)
{ {
D_ENTER; D_ENTER;
if (!m)
D_RETURN;
/* stop monitoring old dir */ /* stop monitoring old dir */
if ((m->dir) && (m->monitor_id)) if ((m->dir) && (m->monitor_id))
{ {
efsd_stop_monitor(e_fs_get_connection(), m->dir, TRUE); efsd_stop_monitor(e_fs_get_connection(), m->dir, TRUE);
m->monitor_id = 0; m->monitor_id = 0;
} }
IF_FREE(m->dir); IF_FREE(m->dir);
m->dir = e_file_realpath(dir); m->dir = e_file_realpath(dir);
@ -160,6 +179,9 @@ e_view_model_handle_fs(EfsdEvent *ev)
{ {
D_ENTER; D_ENTER;
if (!ev)
D_RETURN;
switch (ev->type) switch (ev->type)
{ {
case EFSD_EVENT_FILECHANGE: case EFSD_EVENT_FILECHANGE:
@ -205,7 +227,7 @@ static void
e_view_model_handle_efsd_event_reply_getfiletype(EfsdEvent *ev) e_view_model_handle_efsd_event_reply_getfiletype(EfsdEvent *ev)
{ {
E_File *f; E_File *f;
char *file; char *file = NULL;
Evas_List l; Evas_List l;
E_View_Model *model; 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]; char mime[PATH_MAX], base[PATH_MAX];
D_ENTER; D_ENTER;
if (!ev)
D_RETURN;
if (!ev->efsd_reply_event.errorcode == 0) if (!ev->efsd_reply_event.errorcode == 0)
D_RETURN; D_RETURN;
file = NULL;
if ( (file = efsd_event_filename(ev)) ) if ( (file = efsd_event_filename(ev)) )
{ {
file = e_file_get_file(file); file = e_file_get_file(file);
@ -264,7 +288,12 @@ e_view_model_handle_efsd_event_reply_stat(EfsdEvent *ev)
E_View_Model *m; E_View_Model *m;
E_File *f; E_File *f;
Evas_List l; Evas_List l;
D_ENTER; D_ENTER;
if (!ev)
D_RETURN;
if (!ev->efsd_reply_event.errorcode == 0) if (!ev->efsd_reply_event.errorcode == 0)
D_RETURN; D_RETURN;
@ -286,6 +315,8 @@ e_view_model_handle_efsd_event_reply_stat(EfsdEvent *ev)
e_icon_update_state(ic); e_icon_update_state(ic);
e_icon_initial_show(ic); e_icon_initial_show(ic);
} }
D_RETURN;
} }
static void static void
@ -296,6 +327,9 @@ e_view_model_handle_efsd_event_reply_readlink(EfsdEvent *ev)
Evas_List l; Evas_List l;
D_ENTER; D_ENTER;
if (!ev)
D_RETURN;
if (!ev->efsd_reply_event.errorcode == 0) if (!ev->efsd_reply_event.errorcode == 0)
D_RETURN; D_RETURN;
@ -312,6 +346,8 @@ e_view_model_handle_efsd_event_reply_readlink(EfsdEvent *ev)
e_icon_update_state(ic); e_icon_update_state(ic);
e_icon_initial_show(ic); e_icon_initial_show(ic);
} }
D_RETURN;
} }
static void static void
@ -321,6 +357,9 @@ e_view_model_handle_efsd_event_reply_getmeta(EfsdEvent *ev)
EfsdCmdId cmd; EfsdCmdId cmd;
D_ENTER; D_ENTER;
if (!ev)
D_RETURN;
cmd = efsd_event_id(ev); cmd = efsd_event_id(ev);
for (l=VM->views;l;l=l->next) 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); e_border_remove_click_grab(b);
} }
} }
D_RETURN;
} }
static void static void
e_view_model_handle_efsd_event_reply(EfsdEvent *ev) e_view_model_handle_efsd_event_reply(EfsdEvent *ev)
{ {
D_ENTER; D_ENTER;
if (!ev)
D_RETURN;
switch (ev->efsd_reply_event.command.type) switch (ev->efsd_reply_event.command.type)
{ {
case EFSD_CMD_REMOVE: case EFSD_CMD_REMOVE:
@ -557,10 +602,13 @@ e_view_model_file_deleted(int id, char *file)
E_View_Model *m; E_View_Model *m;
D_ENTER; D_ENTER;
if (!file || file[0] == '/') D_RETURN; if (!file || file[0] == '/')
D_RETURN;
m = e_view_model_find_by_monitor_id(id); m = e_view_model_find_by_monitor_id(id);
f = e_file_get_by_name(m->files, file); f = e_file_get_by_name(m->files, file);
m->files = evas_list_remove(m->files, f); m->files = evas_list_remove(m->files, f);
if (!strcmp(file, ".e_background.bg.db")) if (!strcmp(file, ".e_background.bg.db"))
{ {
e_view_model_set_default_background(m); e_view_model_set_default_background(m);

View File

@ -23,7 +23,10 @@ typedef struct _E_View_Model E_View_Model;
struct _E_View_Model struct _E_View_Model
{ {
E_Object o; E_Object o;
/* The realpath of the view's directory */
char *dir; char *dir;
Evas_List files; Evas_List files;
Evas_Object obj_bg; Evas_Object obj_bg;
@ -34,7 +37,9 @@ struct _E_View_Model
int monitor_id; int monitor_id;
/* A list of all the views for which a model is sharing data */
Evas_List views; Evas_List views;
int is_desktop; int is_desktop;
}; };
@ -47,8 +52,8 @@ struct _E_View_Model
*/ */
void e_view_model_set_dir(E_View_Model *m, char *dir); void e_view_model_set_dir(E_View_Model *m, char *dir);
E_View_Model * e_view_model_new(); E_View_Model * e_view_model_new(void);
void e_view_model_init(); void e_view_model_init(void);
E_View_Model * e_view_model_find_by_monitor_id(int id); E_View_Model * e_view_model_find_by_monitor_id(int id);

View File

@ -1,5 +1,6 @@
#include "debug.h" #include "debug.h"
#include "focus.h" #include "focus.h"
#include "icccm.h"
#include "e.h" #include "e.h"
#include "util.h" #include "util.h"