forked from enlightenment/enlightenment
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:
parent
12fe3a8611
commit
706a10b1db
32
src/e_file.c
32
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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include "debug.h"
|
||||
#include "focus.h"
|
||||
#include "icccm.h"
|
||||
#include "e.h"
|
||||
#include "util.h"
|
||||
|
||||
|
|
Loading…
Reference in New Issue