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
28
src/e_file.c
28
src/e_file.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue