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;
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;
}

View File

@ -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;
}

View File

@ -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);

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);
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);

View File

@ -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);

View File

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