From 5744b944d65ac45917ccfb40cfef4160c7787550 Mon Sep 17 00:00:00 2001 From: Till Adam Date: Mon, 25 Feb 2002 18:09:13 +0000 Subject: [PATCH] ok folks, here goes. The multiple view stuff as discussed in lenght. I've managed to get metadata back up, views save their geometry on close. I'll start getting the documentation back in sync and commenting some more. Could anyone willing to clean up/fix either the iconbar dnd stuff and/or the regular dnd stuff please announce it, so we dont start duplicating work. Thanks. SVN revision: 5977 --- src/Makefile.am | 3 + src/config.c | 2 +- src/desktops.c | 9 +- src/e_file.c | 144 +++++ src/e_file.h | 30 + src/e_view_machine.c | 108 ++++ src/e_view_machine.h | 16 + src/e_view_model.c | 666 ++++++++++++++++++++ src/e_view_model.h | 49 ++ src/epplet.c | 1 - src/file.c | 2 +- src/file.h | 3 + src/globals.c | 5 +- src/globals.h | 4 +- src/iconbar.c | 145 +---- src/icons.c | 177 ++---- src/icons.h | 17 +- src/main.c | 4 +- src/resist.c | 1 - src/view.c | 1373 +++++++++++++----------------------------- src/view.h | 60 +- 21 files changed, 1537 insertions(+), 1282 deletions(-) create mode 100644 src/e_file.c create mode 100644 src/e_file.h create mode 100644 src/e_view_machine.c create mode 100644 src/e_view_machine.h create mode 100644 src/e_view_model.c create mode 100644 src/e_view_model.h diff --git a/src/Makefile.am b/src/Makefile.am index f15284970..61e06fab5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -84,6 +84,9 @@ enlightenment_SOURCES = \ text.h text.c \ util.h util.c \ view.h view.c \ + e_file.h e_file.c \ + e_view_model.h e_view_model.c \ + e_view_machine.h e_view_machine.c \ e.h enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ @efsd_libs@ @ebg_libs@ @ferite_libs@ -lm -lc $(INTLLIBS) diff --git a/src/config.c b/src/config.c index 1c7c0489b..404828a47 100644 --- a/src/config.c +++ b/src/config.c @@ -281,7 +281,7 @@ e_config_load(char *file, char *prefix, E_Config_Base_Type *type) for (l = type->nodes; l; l = l->next) { E_Config_Node *node; - + node = l->data; switch (node->type) diff --git a/src/desktops.c b/src/desktops.c index 76a8cb6c3..7cdae52a4 100644 --- a/src/desktops.c +++ b/src/desktops.c @@ -7,6 +7,7 @@ #include "icccm.h" #include "util.h" #include "object.h" +#include "e_view_machine.h" static Evas_List desktops = NULL; static Window e_base_win = 0; @@ -196,7 +197,6 @@ e_desktops_init_file_display(E_Desktop *desk) v->size.w = desk->real.w; v->size.h = desk->real.h; v->options.back_pixmap = 1; - v->is_desktop = 1; desk->view = v; /* fixme: later */ @@ -204,11 +204,10 @@ e_desktops_init_file_display(E_Desktop *desk) /* e_strdup(v->dir, "/dev"); */ /* e_strdup(v->dir, e_file_home()); */ snprintf(buf, PATH_MAX, "%s/desktop/default", e_config_user_dir()); - e_strdup(v->dir, buf); - - e_view_bg_load(v); - + + e_view_set_dir(v, buf, 1); e_view_realize(v); + e_view_populate(v); ecore_window_hint_set_borderless(v->win.base); ecore_window_hint_set_sticky(v->win.base, 1); diff --git a/src/e_file.c b/src/e_file.c new file mode 100644 index 000000000..e3150a195 --- /dev/null +++ b/src/e_file.c @@ -0,0 +1,144 @@ +#include "debug.h" +#include "e_file.h" +#include "file.h" +#include "util.h" + +static void e_file_cleanup (E_File *f); + +static void +e_file_cleanup(E_File *f) +{ + D_ENTER; + + IF_FREE(f->info.icon); + IF_FREE(f->info.link) + IF_FREE(f->info.custom_icon); + IF_FREE(f->info.mime.base); + IF_FREE(f->info.mime.type); + IF_FREE(f->file); + e_object_cleanup(E_OBJECT(f)); + + D_RETURN; +} + +E_File * +e_file_new(char *file) +{ + E_File *f; + D_ENTER; + + f = NEW(E_File, 1); + + e_object_init(E_OBJECT(f), + (E_Cleanup_Func) e_file_cleanup); + + f->info.icon = NULL; + f->info.link = NULL; + f->info.custom_icon = NULL; + f->info.mime.base = NULL; + f->info.mime.type = NULL; + f->file = strdup(file); + + D_RETURN_(f); +} + +E_File * +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) + { + f = (E_File*) ll->data; + + if (!strcmp(file, f->file)) + { + D_RETURN_(f); + } + } + D_RETURN_(NULL); +} + +void +e_file_set_mime(E_File *f, char *base, char *mime) +{ + char icon[PATH_MAX]; + char type[PATH_MAX]; + char *p; + + D_ENTER; + 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; + + 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); + + + /* effect changes here */ +/* + * if (f->info.custom_icon) + * { + * if (f->info.icon) + * free(f->info.icon); + * f->info.icon = strdup(f->info.custom_icon); + * evas_set_image_file(f->view->evas, f->obj.icon, f->info.custom_icon); + * e_view_queue_resort(f->view); + * D_RETURN; + * } + */ + + /* find an icon */ + strcpy(type, f->info.mime.type); + p=type; + do + { + snprintf(icon, PATH_MAX, "%s/data/icons/%s/%s.db", + PACKAGE_DATA_DIR, f->info.mime.base, type); + p = strrchr(type, '/'); + if (p) *p = 0; + } + while (p && !e_file_exists(icon)); + + /* fallback to base type icon */ + if (!e_file_exists(icon)) + snprintf(icon, PATH_MAX, "%s/data/icons/%s/default.db", + PACKAGE_DATA_DIR, f->info.mime.base); + /* still no luck fall back to default */ + if (!e_file_exists(icon)) + snprintf(icon, PATH_MAX, "%s/data/icons/unknown/default.db", + PACKAGE_DATA_DIR); + + f->info.icon = strdup(icon); + + D_RETURN; +} + +void +e_file_set_link(E_File *f, char *link) +{ + D_ENTER; + + if ((!link) && (f->info.link)) + { + free(f->info.link); + f->info.link = NULL; + /* effect changes here */ + } + else if (link) + { + if ((f->info.link) && (!strcmp(f->info.link, link))) + { + free(f->info.link); + f->info.link = strdup(link); + /* effect changes here */ + } + } + D_RETURN; +} diff --git a/src/e_file.h b/src/e_file.h new file mode 100644 index 000000000..c477bbf11 --- /dev/null +++ b/src/e_file.h @@ -0,0 +1,30 @@ +#ifndef E_EFILE_H +#define E_EFILE_H +#include "object.h" +#include + +typedef struct _E_File E_File; +struct _E_File +{ + E_Object o; + + char *file; + struct stat stat; + + struct { + char *icon; + char *custom_icon; + char *link; + struct { + char *base; + char *type; + } mime; + } info; +}; + +E_File *e_file_new(char *file); +E_File *e_file_get_by_name(Evas_List l, char *file); +void e_file_set_mime(E_File *f, char *base, char *mime); +void e_file_set_link(E_File *f, char *link); + +#endif diff --git a/src/e_view_machine.c b/src/e_view_machine.c new file mode 100644 index 000000000..86412de6e --- /dev/null +++ b/src/e_view_machine.c @@ -0,0 +1,108 @@ +#include +#include "e_view_machine.h" +#include "e_view_model.h" +#include "util.h" +#include "globals.h" +#include "file.h" + +void +e_view_machine_init() +{ + D_ENTER; + /* FIXME make this a singleton */ + VM= NEW(E_View_Model, 1); + e_view_init(); + e_view_model_init(); + D_RETURN; +} + +void +e_view_machine_register_view(E_View *v) +{ + D_ENTER; + /* Add view to the list of views */ + VM->views = evas_list_append(VM->views, v); + D_RETURN; +} + +void +e_view_machine_unregister_view(E_View *v) +{ + D_ENTER; + /* Remove the view from the global list of views + * and from the list of its model. */ + VM->views = evas_list_remove(VM->views, v); + v->model->views = evas_list_remove(v->model->views, v); + e_object_unref (E_OBJECT(v->model)); + D_RETURN; +} + + +static E_View_Model * +get_model_from_realpath(char *path) +{ + E_View_Model *m; + Evas_List l; + + D_ENTER; + if (path) + { + for (l=VM->models; l; l = l->next) + { + m = l->data; + if (!strcmp(m->dir, path)) + { + D("Model for this dir already exists\n"); + e_object_ref (E_OBJECT(m)); + D_RETURN_(m); + } + } + } + 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))) + { + D("Model for this dir doesnt 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); + if (!e_file_exists(buf)) + { + if (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); + m->is_desktop = is_desktop; + } + if (m) + { + v->model = m; + v->model->views = evas_list_append(v->model->views, v); + /* FIXME do a real naming scheme here */ + snprintf(buf, PATH_MAX, "%s:%d", v->model->dir, e_object_get_usecount(E_OBJECT(v->model))); + e_strdup(v->name, buf); + D("assigned name to view: %s\n",v->name); + } + else + { + /* FIXME error handling */ + } + D_RETURN; +} diff --git a/src/e_view_machine.h b/src/e_view_machine.h new file mode 100644 index 000000000..a70670c5c --- /dev/null +++ b/src/e_view_machine.h @@ -0,0 +1,16 @@ +#ifndef E_VIEW_MACHINE_H +#define E_VIEW_MACHINE_H +#include +#include "view.h" +struct _e_view_machine +{ + Evas_List views; + Evas_List models; +}; +typedef struct _e_view_machine E_View_Machine; + +void e_view_machine_init(); +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); +#endif diff --git a/src/e_view_model.c b/src/e_view_model.c new file mode 100644 index 000000000..7325bc032 --- /dev/null +++ b/src/e_view_model.c @@ -0,0 +1,666 @@ +#include "file.h" +#include "e_view_model.h" +#include "e_view_machine.h" +#include "view.h" +#include "icons.h" +#include "util.h" +#include "libefsd.h" +#include "e_file.h" +#include "globals.h" + +static void e_view_model_handle_fs_restart(void *data); +static void e_view_model_handle_fs(EfsdEvent *ev); +static void e_view_model_handle_efsd_event_reply (EfsdEvent *ev); +static void e_view_model_handle_efsd_event_reply_stat (EfsdEvent *ev); +static void e_view_model_handle_efsd_event_reply_readlink (EfsdEvent *ev); +static void e_view_model_handle_efsd_event_reply_getfiletype (EfsdEvent *ev); +static void e_view_model_handle_efsd_event_reply_getmeta (EfsdEvent *ev); + +static void e_view_model_cleanup(E_View_Model *m); +static void e_view_model_bg_reload_timeout(int val, void *data); +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() +{ + D_ENTER; + e_fs_add_event_handler(e_view_model_handle_fs); + D_RETURN; +} + +static void +e_view_model_cleanup(E_View_Model *m) +{ + D_ENTER; + + efsd_stop_monitor(e_fs_get_connection(), m->dir, TRUE); + if (m->restarter) + e_fs_del_restart_handler(m->restarter); + + m->restarter = NULL; + VM->models = evas_list_remove(VM->models, m); + + e_object_cleanup(E_OBJECT(m)); + + D_RETURN; +} + +E_View_Model * +e_view_model_new () +{ + E_View_Model *m; + + D_ENTER; + + m = NEW (E_View_Model, 1); + ZERO(m, E_View_Model, 1); + m->dir = NULL; + m->views = NULL; + + e_object_init(E_OBJECT(m), + (E_Cleanup_Func) e_view_model_cleanup); + + D_RETURN_(m); +} + +static void +e_view_model_redraw_views(E_View_Model *m) +{ + Evas_List l; + E_View *v; + D_ENTER; + + /* 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) + { + v = l->data; + v->changed = 1; + } + D_RETURN; +} + +static void +e_view_model_set_default_background(E_View_Model *m) +{ + char buf[PATH_MAX]; + D_ENTER; + 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); + D_RETURN; +} + +static void +e_view_model_handle_fs_restart(void *data) +{ + E_View_Model *m; + + D_ENTER; + m = data; + D("e_view_model_handle_fs_restart\n"); + if (e_fs_get_connection()) + { + EfsdOptions *ops; + /* FIXME restart with metadata pending for views */ + + ops = efsd_ops(3, + efsd_op_get_stat(), + efsd_op_get_filetype(), + efsd_op_list_all()); + m->monitor_id = efsd_start_monitor(e_fs_get_connection(), m->dir, + ops, TRUE); + + } + D("restarted monitor id (connection = %p), %i for %s\n", e_fs_get_connection(), m->monitor_id, m->dir); + + D_RETURN; +} + +void +e_view_model_set_dir(E_View_Model *m, char *dir) +{ + D_ENTER; + + /* 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); + + /* start monitoring new dir */ + m->restarter = e_fs_add_restart_handler(e_view_model_handle_fs_restart, m); + if (e_fs_get_connection()) + { + EfsdOptions *ops; + + ops = efsd_ops(3, + efsd_op_get_stat(), + efsd_op_get_filetype(), + efsd_op_list_all()); + m->monitor_id = efsd_start_monitor(e_fs_get_connection(), m->dir, + ops, TRUE); + D("monitor id for %s = %i\n", m->dir, m->monitor_id); + } + D_RETURN; +} + +static void +e_view_model_handle_fs(EfsdEvent *ev) +{ + D_ENTER; + + switch (ev->type) + { + case EFSD_EVENT_FILECHANGE: + switch (ev->efsd_filechange_event.changetype) + { + case EFSD_FILE_CREATED: + e_view_model_file_added(ev->efsd_filechange_event.id, + ev->efsd_filechange_event.file); + break; + case EFSD_FILE_EXISTS: + e_view_model_file_added(ev->efsd_filechange_event.id, + ev->efsd_filechange_event.file); + break; + case EFSD_FILE_DELETED: + e_view_model_file_deleted(ev->efsd_filechange_event.id, + ev->efsd_filechange_event.file); + break; + case EFSD_FILE_CHANGED: + e_view_model_file_changed(ev->efsd_filechange_event.id, + ev->efsd_filechange_event.file); + break; + case EFSD_FILE_MOVED: + e_view_model_file_moved(ev->efsd_filechange_event.id, + ev->efsd_filechange_event.file); + break; + case EFSD_FILE_END_EXISTS: + break; + default: + break; + } + break; + case EFSD_EVENT_REPLY: + e_view_model_handle_efsd_event_reply (ev); + break; + default: + break; + } + D_RETURN; +} + + +static void +e_view_model_handle_efsd_event_reply_getfiletype(EfsdEvent *ev) +{ + E_File *f; + char *file; + Evas_List l; + E_View_Model *model; + + char *m, *p; + char mime[PATH_MAX], base[PATH_MAX]; + D_ENTER; + + if (!ev->efsd_reply_event.errorcode == 0) + D_RETURN; + + file = NULL; + if ( (file = efsd_event_filename(ev)) ) + { + file = e_file_get_file(file); + } + model = e_view_model_find_by_monitor_id(efsd_event_id(ev)); + + f = e_file_get_by_name(model->files, file); + /* if its not in the list we care about, its filetype is meaningless */ + if(!f) + D_RETURN; + + m = ev->efsd_reply_event.data; + p = strchr(m, '/'); + if (p) + { + strcpy(base, m); + strcpy(mime, p + 1); + p = strchr(base, '/'); + *p = 0; + } + else + { + strcpy(base, m); + strcpy(mime, "unknown"); + } + e_file_set_mime(f, base, mime); + + for (l=model->views;l;l=l->next) + { + E_View *v = (E_View *)l->data; + E_Icon *ic = e_icon_find_by_file(v, f->file); + /* Try to update the GUI. + It's just a try because we need to have the file's stat + info as well. --cK. + */ + e_icon_update_state(ic); + e_icon_initial_show(ic); + } + D_RETURN; +} + +static void +e_view_model_handle_efsd_event_reply_stat(EfsdEvent *ev) +{ + E_View_Model *m; + E_File *f; + Evas_List l; + D_ENTER; + if (!ev->efsd_reply_event.errorcode == 0) + 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))); + /* if its not in the list we care about, return */ + if(!f) + D_RETURN; + + /* When everything went okay and we can find a model, + set the file stat data for the file and try to update the gui. + It's just a try because we need to have received the filetype + info too. --cK. */ + f->stat = *((struct stat*)efsd_event_data(ev)); + for (l=m->views;l;l=l->next) + { + E_View *v = (E_View *)l->data; + E_Icon *ic = e_icon_find_by_file(v, f->file); + e_icon_update_state(ic); + e_icon_initial_show(ic); + } +} + +static void +e_view_model_handle_efsd_event_reply_readlink(EfsdEvent *ev) +{ + E_View_Model *m; + E_File *f; + Evas_List l; + D_ENTER; + + if (!ev->efsd_reply_event.errorcode == 0) + 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))); + if (f) + { + e_file_set_link(f, (char*)efsd_event_data(ev)); + } + for (l=m->views;l;l=l->next) + { + E_View *v = (E_View *)l->data; + E_Icon *ic = e_icon_find_by_file(v, f->file); + e_icon_update_state(ic); + e_icon_initial_show(ic); + } +} + +static void +e_view_model_handle_efsd_event_reply_getmeta(EfsdEvent *ev) +{ + Evas_List l; + EfsdCmdId cmd; + D_ENTER; + + cmd = efsd_event_id(ev); + for (l=VM->views;l;l=l->next) + { + E_View *v; + v = l->data; + /* ignore metadata for desktops */ + if(v->model->is_desktop) continue; + if (v->geom_get.x == cmd) + { + v->geom_get.x = 0; + if (efsd_metadata_get_type(ev) == EFSD_INT) + { + if (ev->efsd_reply_event.errorcode == 0) + efsd_metadata_get_int(ev, &(v->location.x)); + else + v->location.x = 0; + } + } + else if (v->geom_get.y == cmd) + { + v->geom_get.y = 0; + if (efsd_metadata_get_type(ev) == EFSD_INT) + { + if (ev->efsd_reply_event.errorcode == 0) + efsd_metadata_get_int(ev, &(v->location.y)); + else + v->location.y = 0; + + } + } + else if (v->geom_get.w == cmd) + { + v->geom_get.w = 0; + if (efsd_metadata_get_type(ev) == EFSD_INT) + { + if (ev->efsd_reply_event.errorcode == 0) + efsd_metadata_get_int(ev, &(v->size.w)); + else + v->size.w = 400; + } + } + else if (v->geom_get.h == cmd) + { + v->geom_get.h = 0; + if (ev->efsd_reply_event.errorcode == 0) + { + if (ev->efsd_reply_event.errorcode == 0) + efsd_metadata_get_int(ev, &(v->size.h)); + else + v->size.h = 400; + } + } + /* FIXME currently, the bg info is not set via metadata */ +/* + * else if (v->getbg == cmd) + * { + * v->getbg = 0; + * if (efsd_metadata_get_type(ev) == EFSD_STRING) + * { + * if (ev->efsd_reply_event.errorcode == 0) + * { + * char buf[PATH_MAX]; + * + * IF_FREE(v->model->bg_file); + * e_strdup(v->model->bg_file, efsd_metadata_get_str(ev)); + * snprintf(buf, PATH_MAX, "background_reload:%s", v->model->dir); + * ecore_add_event_timer(buf, 0.5, e_view_model_bg_reload_timeout, 0, v->model); + * } + * else + * e_view_model_set_default_background(v->model); + * } + * } + */ + ecore_window_move(v->win.base, v->location.x, v->location.y); + ecore_window_resize(v->win.base, v->size.w, v->size.h); + v->size.force = 1; + + /* We have received all metadata we need, display the view */ + if ((!v->geom_get.x) && + (!v->geom_get.y) && + (!v->geom_get.w) && + (!v->geom_get.h) && + (v->geom_get.busy)) + { + E_Border *b; + + v->geom_get.busy = 0; + if (v->bg) + e_bg_resize(v->bg, v->size.w, v->size.h); + if (v->options.back_pixmap) e_view_update(v); + b = e_border_adopt(v->win.base, 1); + b->client.internal = 1; + e_border_remove_click_grab(b); + } + } +} + +static void +e_view_model_handle_efsd_event_reply(EfsdEvent *ev) +{ + D_ENTER; + switch (ev->efsd_reply_event.command.type) + { + case EFSD_CMD_REMOVE: + break; + case EFSD_CMD_MOVE: + break; + case EFSD_CMD_SYMLINK: + break; + case EFSD_CMD_LISTDIR: + break; + case EFSD_CMD_MAKEDIR: + break; + case EFSD_CMD_CHMOD: + break; + case EFSD_CMD_GETFILETYPE: + e_view_model_handle_efsd_event_reply_getfiletype(ev); + break; + case EFSD_CMD_STAT: + e_view_model_handle_efsd_event_reply_stat(ev); + break; + case EFSD_CMD_READLINK: + e_view_model_handle_efsd_event_reply_readlink(ev); + break; + case EFSD_CMD_CLOSE: + break; + case EFSD_CMD_SETMETA: + break; + case EFSD_CMD_GETMETA: + e_view_model_handle_efsd_event_reply_getmeta(ev); + break; + case EFSD_CMD_STARTMON_DIR: + break; + case EFSD_CMD_STARTMON_FILE: + break; + case EFSD_CMD_STOPMON_DIR: + break; + case EFSD_CMD_STOPMON_FILE: + break; + default: + break; + } + D_RETURN; +} +static void +e_view_model_ib_reload_timeout(int val, void *data) +{ + Evas_List l; + E_View *v; + E_View_Model *m; + + D_ENTER; + m = data; + + for (l=m->views;l;l=l->next) + { + v = (E_View*) l->data; + e_view_ib_reload(v); + } + D_RETURN; + UN(val); +} + +static void +e_view_model_bg_reload_timeout(int val, void *data) +{ + Evas_List l; + E_View *v; + E_View_Model *m; + + D_ENTER; + m = data; + + for (l=m->views;l;l=l->next) + { + v = (E_View*) l->data; + e_view_bg_reload(v); + } + D_RETURN; + UN(val); +} + +void +e_view_model_file_added(int id, char *file) +{ + Evas_List l; + E_View_Model *m; + E_View *v; + E_File *f; + char buf[PATH_MAX]; + + D_ENTER; + + /* if we get a path - ignore it - its not a file in the dir */ + if (!file || file[0] == '/') D_RETURN; + m = e_view_model_find_by_monitor_id(id); + + if (!strcmp(file, ".e_background.bg.db")) + { + IF_FREE(m->bg_file); + snprintf(buf, PATH_MAX, "%s/%s", m->dir, file); + 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); + } + else if ((!strcmp (".e_iconbar.db", file)) || + (!strcmp (".e_iconbar.bits.db", file))) + { + snprintf(buf, PATH_MAX, "iconbar_reload:%s", m->dir); + ecore_add_event_timer(buf, 0.5, + e_view_model_ib_reload_timeout, 0, m); + } + else if (file[0] != '.') + { + f = e_file_new(file); + m->files = evas_list_append(m->files, f); + /* tell all views for this dir about the new file */ + for (l= m->views;l ;l = l->next) + { + v = l->data; + e_view_file_add(v, f); + } + } + D_RETURN; +} + +void +e_view_model_file_deleted(int id, char *file) +{ + Evas_List l; + E_File *f; + E_View_Model *m; + D_ENTER; + + 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); + } + else if ((!strcmp (".e_iconbar.db", file)) || + (!strcmp (".e_iconbar.bits.db", file))) + { + for (l=m->views;l;l=l->next) + { + E_View *v = (E_View*) l->data; + e_object_unref(E_OBJECT(v->iconbar)); + v->iconbar = NULL; + } + } + else if(file[0] != '.') + { + for (l=m->views;l;l=l->next) + { + E_View *v = (E_View*) l->data; + e_view_file_delete(v, f); + } + } + D_RETURN; +} + +void +e_view_model_file_changed(int id, char *file) +{ + Evas_List l; + E_View_Model *m; + E_File *f; + E_View *v; + char buf[PATH_MAX]; + + D_ENTER; + + if (!file || file[0] == '/') D_RETURN; + m = e_view_model_find_by_monitor_id(id); + f = e_file_get_by_name(m->files, file); + if (!strcmp(file, ".e_background.bg.db")) + { + IF_FREE(m->bg_file); + snprintf(buf, PATH_MAX, "%s/%s", m->dir, file); + 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); + } + else if ((!strcmp (".e_iconbar.db", file)) || + (!strcmp (".e_iconbar.bits.db", file))) + { + snprintf(buf, PATH_MAX, "iconbar_reload:%s", m->dir); + ecore_add_event_timer(buf, 0.5, + e_view_model_ib_reload_timeout, 0, m); + } + else if (file[0] != '.') + { + for (l= m->views;l ;l = l->next) + { + v = l->data; + e_view_file_changed(v, f); + } + } + D_RETURN; +} + +void +e_view_model_file_moved(int id, char *file) +{ + Evas_List l; + E_View_Model *m; + + D_ENTER; + + if (!file || file[0] == '/') D_RETURN; + m = e_view_model_find_by_monitor_id(id); + for (l=m->views;l;l=l->next) + { + E_View *v = (E_View*) l->data; + E_Icon *ic; + + ic = e_icon_find_by_file(v, file); + if (ic) + { + } + } + D_RETURN; +} + +E_View_Model * +e_view_model_find_by_monitor_id(int id) +{ + E_View_Model *m; + Evas_List l; + D_ENTER; + + for (l = VM->models; l; l = l->next) + { + m = l->data; + if (m->monitor_id == id) + D_RETURN_(m);; + } + D_RETURN_(NULL); +} diff --git a/src/e_view_model.h b/src/e_view_model.h new file mode 100644 index 000000000..50858254e --- /dev/null +++ b/src/e_view_model.h @@ -0,0 +1,49 @@ +#ifndef E_VIEW_MODEL_H +#define E_VIEW_MODEL_H + +#include "fs.h" +#include "iconbar.h" +#include + +#ifndef E_VIEW_TYPEDEF +#define E_VIEW_TYPEDEF +typedef struct _E_View E_View; +#endif + +#ifndef E_ICON_TYPEDEF +#define E_ICON_TYPEDEF +typedef struct _E_Icon E_Icon; +#endif + +#ifndef E_VIEW_MODEL_TYPEDEF +#define E_VIEW_MODEL_TYPEDEF +typedef struct _E_View_Model E_View_Model; +#endif + +struct _E_View_Model +{ + E_Object o; + char *dir; + Evas_List files; + + Evas_Object obj_bg; + + char *bg_file; + + E_FS_Restarter *restarter; + + int monitor_id; + + Evas_List views; + int is_desktop; +}; + +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_find_by_monitor_id(int id); +void e_view_model_file_added(int id, char *file); +void e_view_model_file_deleted(int id, char *file); +void e_view_model_file_changed(int id, char *file); +void e_view_model_file_moved(int id, char *file); +#endif diff --git a/src/epplet.c b/src/epplet.c index 5270a81c2..154dfc7be 100644 --- a/src/epplet.c +++ b/src/epplet.c @@ -1,6 +1,5 @@ #include "debug.h" #include "epplet.h" -#include "globals.h" #include "file.h" #include "observer.h" #include "desktops.h" diff --git a/src/file.c b/src/file.c index 7d1bb3651..c96fc04ae 100644 --- a/src/file.c +++ b/src/file.c @@ -104,7 +104,7 @@ e_file_get_file(char *path) result++; else result = path; - + D_RETURN_(result); } diff --git a/src/file.h b/src/file.h index 4bb4c141a..b4f0ea258 100644 --- a/src/file.h +++ b/src/file.h @@ -1,5 +1,8 @@ #ifndef E_FILE_H #define E_FILE_H +#include +#include +#include time_t e_file_mod_time(char *file); int e_file_exists(char *file); diff --git a/src/globals.c b/src/globals.c index dee20df7d..2f167b14b 100644 --- a/src/globals.c +++ b/src/globals.c @@ -1,7 +1,8 @@ #include #include - +#include "view.h" +#include "e_view_machine.h" Ecore_Event_Key_Modifiers multi_select_mod = ECORE_EVENT_KEY_MODIFIER_SHIFT; Ecore_Event_Key_Modifiers range_select_mod = ECORE_EVENT_KEY_MODIFIER_CTRL; -Evas_List views = NULL; +E_View_Machine *VM = NULL; diff --git a/src/globals.h b/src/globals.h index 14492f23a..4a0f6a209 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1,8 +1,6 @@ #ifndef E_GLOBALS_H #define E_GLOBALS_H - extern Ecore_Event_Key_Modifiers multi_select_mod; extern Ecore_Event_Key_Modifiers range_select_mod; -extern Evas_List views; - +extern E_View_Machine *VM; #endif diff --git a/src/iconbar.c b/src/iconbar.c index b059b92df..d2ab5d6b7 100644 --- a/src/iconbar.c +++ b/src/iconbar.c @@ -18,7 +18,6 @@ static void e_ib_bit_down_cb (void *data, Ebits_Object o, char *class, int bt, static void e_ib_bit_up_cb (void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh); -static void ib_reload_timeout (int val, void *data); static void ib_scroll_timeout (int val, void *data); static void ib_timeout (int val, void *data); static void ib_cancel_launch_timeout (int val, void *data); @@ -165,9 +164,9 @@ e_iconbar_cleanup (E_Iconbar * ib) if ((ib->view) && (ib->view->evas) && (ib->clip)) evas_del_object (ib->view->evas, ib->clip); /* delete any timers intended to work on this iconbar */ - snprintf (buf, PATH_MAX, "iconbar_reload:%s", ib->view->dir); + snprintf (buf, PATH_MAX, "iconbar_reload:%s", ib->view->name); ecore_del_event_timer (buf); - snprintf (buf, PATH_MAX, "iconbar_scroll:%s", ib->view->dir); + snprintf (buf, PATH_MAX, "iconbar_scroll:%s", ib->view->name); ecore_del_event_timer (buf); /* call the destructor of the base class */ @@ -237,7 +236,7 @@ e_iconbar_new (E_View * v) /* first we want to load the iconbar data itself - ie the config info */ /* for what icons we have and what they execute */ - snprintf (buf, PATH_MAX, "%s/.e_iconbar.db", v->dir); + snprintf (buf, PATH_MAX, "%s/.e_iconbar.db", v->model->dir); /* use the config system to simply load up the db and start making */ /* structs and lists and stuff for us... we told it how to in init */ ib = e_config_load (buf, "", cf_iconbar); @@ -284,7 +283,7 @@ e_iconbar_new (E_View * v) /* now we need to load up a bits file that tells us where in the view the */ /* iconbar is meant to go. same place. just a slightly different name */ - snprintf (buf, PATH_MAX, "%s/.e_iconbar.bits.db", v->dir); + snprintf (buf, PATH_MAX, "%s/.e_iconbar.bits.db", v->model->dir); ib->bit = ebits_load (buf); /* we didn't find one? */ if (!ib->bit) @@ -392,7 +391,7 @@ e_iconbar_realize (E_Iconbar * ib) /* the path of the key to the image memebr - that is actually */ /* a lump of image data inlined in the iconbar db - so the icons */ /* themselves follow the iconbar wherever it goes */ - snprintf (buf, PATH_MAX, "%s/.e_iconbar.db:%s", ib->view->dir, + snprintf (buf, PATH_MAX, "%s/.e_iconbar.db:%s", ib->view->model->dir, ic->image_path); /* add the icon image object */ ic->image = evas_add_image_from_file (ib->view->evas, buf); @@ -654,43 +653,6 @@ e_iconbar_fix (E_Iconbar * ib) D_RETURN; } -/** - * e_iconbar_file_add - Adds a file to a view - * @v: The view in which a file is added - * @file: Name of the added file - * - * This function is called from the - * view code whenever a file is added to a view. The iconbar code here - * determines if the file add is of interest - * and if it is, in 0.5 secs will do a "reload - */ -void -e_iconbar_file_add (E_View * v, char *file) -{ - D_ENTER; - - /* is the file of interest ? */ - if ((!strcmp (".e_iconbar.db", file)) || - (!strcmp (".e_iconbar.bits.db", file))) - { - char buf[PATH_MAX]; - - /* unique timer name */ - snprintf (buf, PATH_MAX, "iconbar_reload:%s", v->dir); - /* if we've scrolled or changed icons since. save */ - if (v->iconbar - && (v->iconbar->has_been_scrolled || v->iconbar->changed)) - { - e_iconbar_save_out_final (v->iconbar); - } - - /* in 0.5 secs call our timout handler */ - ecore_add_event_timer (buf, 0.5, ib_reload_timeout, 0, v); - } - - D_RETURN; -} - /** * e_iconbar_file_delete - Function to remove a file from an iconbox. * @v: The view in which a file is removed @@ -719,37 +681,6 @@ e_iconbar_file_delete (E_View * v, char *file) D_RETURN; } -/** - * e_iconbar_file_change - File change update function - * @v: The view in which a file changes - * @file: Name of the changed file - * - * This function gets called whenever a file changes in a view - */ -void -e_iconbar_file_change (E_View * v, char *file) -{ - D_ENTER; - - /* is the file that changed of interest */ - if ((!strcmp (".e_iconbar.db", file)) || - (!strcmp (".e_iconbar.bits.db", file))) - { - char buf[PATH_MAX]; - - /* unique timer name */ - snprintf (buf, PATH_MAX, "iconbar_reload:%s", v->dir); - /* if we've scrolled since. save */ - if (v->iconbar - && (v->iconbar->has_been_scrolled || v->iconbar->changed)) - e_iconbar_save_out_final (v->iconbar); - /* in 0.5 secs call the realod timeout */ - ecore_add_event_timer (buf, 0.5, ib_reload_timeout, 0, v); - } - - D_RETURN; -} - /** * e_iconbar_save_out_final - save out final state of iconbar back to disk * @ib: The iconbar @@ -766,11 +697,10 @@ e_iconbar_save_out_final (E_Iconbar * ib) if (ib->view) { E_DB_File *edb; - Imlib_Image im; Evas_List l; int i; - snprintf (buf, PATH_MAX, "%s/.e_iconbar.db", ib->view->dir); + snprintf (buf, PATH_MAX, "%s/.e_iconbar.db", ib->view->model->dir); D ("%s\n", buf); if (ib->changed) @@ -801,7 +731,7 @@ e_iconbar_save_out_final (E_Iconbar * ib) snprintf (buf2, PATH_MAX, "%s/.e_iconbar.db:/icons/%i/image", - ib->view->dir, i); + ib->view->model->dir, i); D ("save image\n"); imlib_save_image (buf2); } @@ -866,43 +796,6 @@ e_iconbar_handle_launch_id (Window win, void *data) /* static (internal to iconbar use only) callbacks */ -/* reload timeout. called whenevr iconbar special files changed/added to */ -/* a view */ -static void -ib_reload_timeout (int val, void *data) -{ - E_View *v; - - D_ENTER; - - /* get our view pointer */ - v = (E_View *) data; -/* - D ("check if jsut saved:\n"); - if (v->iconbar->just_saved) - { - D ("just saved\n"); - v->iconbar->just_saved = 0; - D_RETURN; - } - */ - /* if we have an iconbar.. well nuke it */ - if (e_object_unref (E_OBJECT (v->iconbar)) == 0) - v->iconbar = NULL; - - /* try load a new iconbar */ - if (!v->iconbar) - v->iconbar = e_iconbar_new (v); - - /* if the iconbar loaded and theres an evas - we're realized */ - /* so realize the iconbar */ - if ((v->iconbar) && (v->evas)) - e_iconbar_realize (v->iconbar); - - D_RETURN; - UN (val); -} - /* scroll timeout. called to continuously scroll when arrow button down */ static void ib_scroll_timeout (int val, void *data) @@ -915,7 +808,7 @@ ib_scroll_timeout (int val, void *data) /* get our iconbar pointer */ ib = (E_Iconbar *) data; - snprintf (buf, PATH_MAX, "iconbar_scroll:%s", ib->view->dir); + snprintf (buf, PATH_MAX, "iconbar_scroll:%s", ib->view->name); if (val == 0) ecore_del_event_timer (buf); else @@ -975,7 +868,7 @@ ib_timeout (int val, void *data) /* figure out its path */ snprintf (buf, PATH_MAX, "%s/.e_iconbar.db:%s", - ic->iconbar->view->dir, ic->image_path); + ic->iconbar->view->model->dir, ic->image_path); /* add it */ ic->hi.image = evas_add_image_from_file (ic->iconbar->view->evas, buf); @@ -989,7 +882,7 @@ ib_timeout (int val, void *data) /* start at 0 */ val = 0; } - /* what tame is it ? */ + /* what time is it ? */ t = ecore_get_time (); if (ic->launch_id) { @@ -1312,7 +1205,7 @@ ib_mouse_in (void *data, Evas _e, Evas_Object _o, int _b, int _x, int _y) char buf[PATH_MAX]; /* come up with a unique name for it */ - snprintf (buf, PATH_MAX, "iconbar:%s/%s", ic->iconbar->view->dir, + snprintf (buf, PATH_MAX, "iconbar:%s/%s", ic->iconbar->view->name, ic->image_path); e_strdup (ic->hi.timer, buf); /* call the timeout */ @@ -1650,7 +1543,7 @@ e_iconbar_icon_move (E_Iconbar_Icon *ic, int x, int y) ic->iconbar->changed = 1; e_iconbar_save_out_final(ic->iconbar); /* ic->iconbar->just_saved = 0;*/ - ib_reload_timeout(0, ic->iconbar->view); + e_view_ib_reload(ic->iconbar->view); } D_RETURN; @@ -1669,7 +1562,8 @@ e_iconbar_dnd_add_files (E_View *v, E_View *source, int num_files, D_ENTER; - D("add files: %s\n", source->dir); +#if 0 + D("add files: %s\n", source->model->dir); for (i = 0; i < num_files; i++) { char *file = e_file_get_file(strdup(dnd_files[i])); @@ -1681,7 +1575,6 @@ e_iconbar_dnd_add_files (E_View *v, E_View *source, int num_files, if (!strcmp(ic->info.mime.base, "db")) { /* if its an icon db, set the icon */ -#if 0 D("db!\n"); for (l = v->iconbar->icons; l; l = l->next) { @@ -1699,7 +1592,7 @@ e_iconbar_dnd_add_files (E_View *v, E_View *source, int num_files, v->iconbar->dnd.y < ibic->current.y + ibic->current.h ) { D("over icon: %s\n", ibic->exec); - snprintf(buf, PATH_MAX, "%s/%s:/icon/normal", ic->view->dir, ic->file); + snprintf(buf, PATH_MAX, "%s/%s:/icon/normal", ic->view->model->dir, ic->file); D("set icon: %s\n", buf); ibic->imlib_image = imlib_load_image(buf); @@ -1711,7 +1604,6 @@ e_iconbar_dnd_add_files (E_View *v, E_View *source, int num_files, } } break; -#endif } else if (e_file_can_exec (&ic->stat)) { @@ -1743,14 +1635,14 @@ e_iconbar_dnd_add_files (E_View *v, E_View *source, int num_files, else D("EEEEEEEEEEEEK: how the hell did this happen?"); - D("x: %i, v-dir: %s, ib-dir: %s\n", ibic->iconbar->icon_area.x, v->dir, ibic->iconbar->view->dir); + D("x: %f, v-dir: %s, ib-dir: %s\n", ibic->iconbar->icon_area.x, v->model->dir, ibic->iconbar->view->model->dir); - if (!ic->info.icon) D_RETURN_(NULL); + if (!ic->info.icon) D_RETURN; snprintf(buf, PATH_MAX, "%s:/icon/normal", ic->info.icon); ibic->image = evas_add_image_from_file (v->evas, buf); ibic->imlib_image = imlib_load_image (buf); ibic->image_path = strdup (ic->info.icon); - snprintf(buf, PATH_MAX, "%s/%s", ic->view->dir, ic->file); + snprintf(buf, PATH_MAX, "%s/%s", ic->view->model->dir, ic->file); ibic->exec = strdup(buf); evas_set_clip (v->evas, ibic->image, v->iconbar->clip); @@ -1774,6 +1666,7 @@ e_iconbar_dnd_add_files (E_View *v, E_View *source, int num_files, e_iconbar_icon_move(ibic, v->iconbar->dnd.x, v->iconbar->dnd.y); } +#endif } diff --git a/src/icons.c b/src/icons.c index 3a4fea1b5..17f289c58 100644 --- a/src/icons.c +++ b/src/icons.c @@ -1,10 +1,13 @@ #include "view.h" #include "icons.h" #include "debug.h" -#include "globals.h" #include "cursors.h" #include "file.h" #include "util.h" +#include "e_view_model.h" +#include "e_file.h" +#include "e_view_machine.h" +#include "globals.h" static void e_icon_down_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); static void e_icon_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); @@ -174,14 +177,13 @@ e_icon_move_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) E_Icon *ic; Ecore_Event *ev; Ecore_Event_Mouse_Move *e; - +#if 0 D_ENTER; ev = e_view_get_current_event(); if (!ev) D_RETURN; - e = ev->event; ic = _data; @@ -207,7 +209,7 @@ e_icon_move_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) y = 999999999; xx = -999999999; yy = -999999999; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; Evas_List ll; @@ -282,7 +284,7 @@ e_icon_move_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) imlib_context_set_cliprect(0, 0, 0, 0); imlib_context_set_angle(0); - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; Evas_List ll; @@ -403,7 +405,7 @@ e_icon_move_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) ecore_pointer_xy_get(&x, &y); ecore_window_dnd_handle_motion( ic->view->win.base, x, y, 1); } - +#endif D_RETURN; UN(_e); UN(_o); @@ -464,8 +466,8 @@ e_icon_find_by_file(E_View *view, char *file) E_Icon *ic; ic = l->data; - if ((ic) && (ic->file) && (file) && (!strcmp(ic->file, file))) - D_RETURN_(ic); + if ((ic) && (ic->file->file) && (file) && (!strcmp(ic->file->file, file))) + D_RETURN_(ic); } D_RETURN_(NULL); } @@ -475,7 +477,6 @@ e_icon_show(E_Icon *ic) { D_ENTER; - if (ic->state.visible) D_RETURN; ic->state.visible = 1; if (!ic->obj.event1) @@ -577,7 +578,7 @@ e_icon_apply_xy(E_Icon *ic) { D_ENTER; - /* threse calc icon extents for: */ + /* these calc icon extents for: */ /* [I] */ /* Ig */ /* [txt] */ @@ -653,7 +654,8 @@ e_icon_apply_xy(E_Icon *ic) if ((ic->geom.x != ic->prev_geom.x) || (ic->geom.y != ic->prev_geom.y)) { ic->q.write_xy = 1; - e_view_queue_icon_xy_record(ic->view); + /* FIXME */ + //e_view_queue_icon_xy_record(ic->view); } if (ic->geom.x != ic->prev_geom.x) ic->view->extents.valid = 0; else if (ic->geom.y != ic->prev_geom.y) ic->view->extents.valid = 0; @@ -675,12 +677,12 @@ e_icon_check_permissions(E_Icon *ic) { D_ENTER; - if (!ic || !ic->info.mime.base || ic->stat.st_ino == 0) + if (!ic || !ic->file->info.mime.base || ic->file->stat.st_ino == 0) D_RETURN; - if (!strcmp(ic->info.mime.base, "dir")) + if (!strcmp(ic->file->info.mime.base, "dir")) { - if (e_file_can_exec(&ic->stat)) + if (e_file_can_exec(&ic->file->stat)) evas_set_color(ic->view->evas, ic->obj.icon, 255, 255, 255, 255); else evas_set_color(ic->view->evas, ic->obj.icon, 128, 128, 128, 128); @@ -694,11 +696,12 @@ void e_icon_initial_show(E_Icon *ic) { D_ENTER; - + /* check if we have enuf info and we havent been shown yet */ - if (!ic->info.icon) D_RETURN; - if (ic->state.visible) D_RETURN; - + if ( !ic->file->info.icon || !ic->obj.icon + || ic->state.visible) + D_RETURN; + /* first. lets figure out the size of the icon */ evas_get_image_size(ic->view->evas, ic->obj.icon, &(ic->geom.icon.w), &(ic->geom.icon.h)); @@ -724,130 +727,30 @@ e_icon_initial_show(E_Icon *ic) D_RETURN; } -void -e_icon_set_mime(E_Icon *ic, char *base, char *mime) -{ - int diff = 0; - - D_ENTER; - - if (!ic->info.mime.base) diff = 1; - if (!ic->info.mime.type) diff = 1; - if ((ic->info.mime.base) && (strcmp(ic->info.mime.base, base))) diff = 1; - if ((ic->info.mime.type) && (strcmp(ic->info.mime.base, mime))) diff = 1; - if (!diff) D_RETURN; - if (ic->info.mime.base) free(ic->info.mime.base); - if (ic->info.mime.type) free(ic->info.mime.type); - ic->info.mime.base = NULL; - ic->info.mime.type = NULL; - ic->info.mime.base = strdup(base); - ic->info.mime.type = strdup(mime); - - D("%40s: %s/%s\n", ic->file, base, mime); - - /* effect changes here */ - if (ic->info.custom_icon) - { - if (ic->info.icon) free(ic->info.icon); - ic->info.icon = NULL; - ic->info.icon = strdup(ic->info.custom_icon); - evas_set_image_file(ic->view->evas, ic->obj.icon, ic->info.custom_icon); - e_view_queue_resort(ic->view); - D_RETURN; - } - /* find an icon */ - { - char icon[PATH_MAX]; - char type[PATH_MAX]; - char *p; - int done = 0; - - strcpy(type, ic->info.mime.type); - for (p = type; *p; p++) - { - if (*p == '/') *p = '-'; - } - do - { - snprintf(icon, PATH_MAX, "%s/data/icons/%s/%s.db", PACKAGE_DATA_DIR, - ic->info.mime.base, type); - if (e_file_exists(icon)) - { - done = 1; - break; - } - p = strrchr(type, '-'); - if (p) *p = 0; - } - while (p); - if (!done) - { - if (!e_file_exists(icon)) - { - snprintf(icon, PATH_MAX, "%s/data/icons/%s/default.db", PACKAGE_DATA_DIR, - ic->info.mime.base); - if (!e_file_exists(icon)) - snprintf(icon, PATH_MAX, "%s/data/icons/unknown/default.db", PACKAGE_DATA_DIR); - } - } - ic->info.icon = strdup(icon); - } - - e_icon_update_state(ic); - - D_RETURN; -} - -void -e_icon_set_link(E_Icon *ic, char *link) -{ - D_ENTER; - - if ((!link) && (ic->info.link)) - { - free(ic->info.link); - ic->info.link = NULL; - /* effect changes here */ - } - else if (link) - { - if ((ic->info.link) && (!strcmp(ic->info.link, link))) - { - free(ic->info.link); - ic->info.link = strdup(link); - /* effect changes here */ - } - } - - D_RETURN; -} - - void e_icon_update_state(E_Icon *ic) { char icon[PATH_MAX]; int iw, ih; int gw, gh; - D_ENTER; - - if (!ic->info.icon) + + if (!ic->file->info.icon) { - D("EEEEEEEEEEK %s has no icon\n", ic->file); + D("EEEEEEEEEEK %s has no icon\n", ic->file->file); D_RETURN; } if (ic->state.clicked) { - snprintf(icon, PATH_MAX, "%s:/icon/clicked", ic->info.icon); + snprintf(icon, PATH_MAX, "%s:/icon/clicked", ic->file->info.icon); } else if (ic->state.selected) { - snprintf(icon, PATH_MAX, "%s:/icon/selected", ic->info.icon); + snprintf(icon, PATH_MAX, "%s:/icon/selected", ic->file->info.icon); } else { - snprintf(icon, PATH_MAX, "%s:/icon/normal", ic->info.icon); + snprintf(icon, PATH_MAX, "%s:/icon/normal", ic->file->info.icon); } if ((ic->state.selected) && (!ic->obj.sel.under.icon) && @@ -899,8 +802,12 @@ e_icon_update_state(E_Icon *ic) ic->obj.sel.over.icon = NULL; ic->obj.sel.over.text = NULL; } + /* This relies on the obj.icon having been allocated in view_file_add. + * Maybe it would be better to allocate here, the first + * time the icon is set? -- till */ evas_set_image_file(ic->view->evas, ic->obj.icon, icon); - evas_get_image_size(ic->view->evas, ic->obj.icon, &iw, &ih); + evas_get_image_size(ic->view->evas, ic->obj.icon, &iw, &ih); + e_icon_check_permissions(ic); gw = ic->geom.icon.w; gh = ic->geom.icon.h; e_icon_apply_xy(ic); @@ -956,27 +863,29 @@ void e_icon_exec(E_Icon *ic) { D_ENTER; - - if (!strcmp(ic->info.mime.base, "dir") && - e_file_can_exec(&ic->stat)) + + if (!strcmp(ic->file->info.mime.base, "dir") && + e_file_can_exec(&ic->file->stat)) { E_View *v; + E_Border *b; char buf[PATH_MAX]; - + v = e_view_new(); v->size.w = 400; v->size.h = 300; v->options.back_pixmap = 0; - snprintf(buf, PATH_MAX, "%s/%s", ic->view->dir, ic->file); + snprintf(buf, PATH_MAX, "%s/%s", ic->view->model->dir, ic->file->file); D("new dir >%s<\n", buf); - v->dir = strdup(buf); - e_view_bg_load(v); + e_view_set_dir(v, buf, 0); e_view_realize(v); - ecore_window_set_title(v->win.base, ic->file); + e_view_populate(v); + + e_view_bg_reload(v); + ecore_window_set_title(v->win.base, ic->file->file); ecore_window_set_name_class(v->win.base, "FileView", "E"); ecore_window_set_min_size(v->win.base, 8, 8); } - e_icon_deselect(ic); D_RETURN; diff --git a/src/icons.h b/src/icons.h index 023fe7490..70aba61d7 100644 --- a/src/icons.h +++ b/src/icons.h @@ -1,6 +1,7 @@ #ifndef E_ICONS_H #define E_ICONS_H +#include "e_file.h" #include "view.h" #include "text.h" @@ -17,22 +18,10 @@ typedef struct _E_View E_View; struct _E_Icon { E_Object o; - - char *file; - struct stat stat; - + + E_File *file; E_View *view; - struct { - char *icon; - char *custom_icon; - char *link; - struct { - char *base; - char *type; - } mime; - } info; - struct { Evas_Object icon; Evas_Object event1; diff --git a/src/main.c b/src/main.c index 31df98caa..047f75bae 100644 --- a/src/main.c +++ b/src/main.c @@ -15,6 +15,7 @@ #include "place.h" #include "iconbar.h" #include "util.h" +#include "e_view_machine.h" #ifdef USE_FERITE # include "e_ferite.h" @@ -140,12 +141,13 @@ main(int argc, char **argv) ecore_ungrab(); /* Initialization for the various modules: */ + e_fs_init(); e_desktops_init(); e_border_init(); e_action_init(); e_menu_init(); - e_view_init(); + e_view_machine_init(); e_entry_init(); e_keys_init(); e_guides_init(); diff --git a/src/resist.c b/src/resist.c index d73a46e97..8a54857b8 100644 --- a/src/resist.c +++ b/src/resist.c @@ -49,7 +49,6 @@ rects = evas_list_append(rects, r); \ /* here if need be - ie xinerama middle between screens and panels etc. */ { - E_View *v; if (b->desk->view->iconbar) evas_list_append(rects, e_iconbar_get_resist_rect(b->desk->view->iconbar)); } diff --git a/src/view.c b/src/view.c index 36d7dbb15..ac31f24c7 100644 --- a/src/view.c +++ b/src/view.c @@ -10,9 +10,12 @@ #include "fs.h" #include "file.h" #include "util.h" -#include "globals.h" #include "icons.h" #include "epplet.h" +#include "e_view_model.h" +#include "e_view_machine.h" +#include "e_file.h" +#include "globals.h" static Ecore_Event *current_ev = NULL; @@ -49,15 +52,12 @@ static void e_dnd_drop(Ecore_Event * ev); static void e_dnd_drop_request(Ecore_Event * ev); static void e_dnd_drop_request_free(void); static void e_dnd_handle_drop( E_View *v ); -static void e_view_handle_fs(EfsdEvent *ev); -static void e_view_handle_fs_restart(void *data); static void e_view_resort_timeout(int val, void *data); static int e_view_restart_alphabetical_qsort_cb(const void *data1, const void *data2); static void e_view_geometry_record_timeout(int val, void *data); static void e_view_scrollbar_v_change_cb(void *_data, E_Scrollbar *sb, double val); static void e_view_scrollbar_h_change_cb(void *_data, E_Scrollbar *sb, double val); static void e_view_write_icon_xy_timeout(int val, void *data); -static void e_view_bg_reload_timeout(int val, void *data); static void e_view_write_icon_xy_timeout(int val, void *data) @@ -80,9 +80,10 @@ e_view_write_icon_xy_timeout(int val, void *data) char buf[PATH_MAX]; ic->q.write_xy = 0; - snprintf(buf, PATH_MAX, "%s/%s", ic->view->dir, ic->file); + /* FIXME */ + snprintf(buf, PATH_MAX, "%s/%s", ic->view->model->dir, ic->file->file); - D("write meta xy for icon for file %s\n", ic->file); + D("write meta xy for icon for file %s\n", ic->file->file); efsd_set_metadata_int(e_fs_get_connection(), "/pos/x", buf, ic->geom.x); @@ -94,7 +95,7 @@ e_view_write_icon_xy_timeout(int val, void *data) { char name[PATH_MAX]; - snprintf(name, PATH_MAX, "icon_xy_record.%s", v->dir); + snprintf(name, PATH_MAX, "icon_xy_record.%s", v->model->dir); ecore_add_event_timer(name, 0.01, e_view_write_icon_xy_timeout, 0, v); D_RETURN; } @@ -311,7 +312,7 @@ e_bg_down_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) E_View *v; D_ENTER; - + if (!current_ev) D_RETURN; ev = current_ev->event; v = _data; @@ -538,7 +539,7 @@ e_view_deselect_all(void) D_ENTER; - for (ll = views; ll; ll = ll->next) + for (ll = VM->views; ll; ll = ll->next) { Evas_List l; E_View *v; @@ -563,7 +564,7 @@ e_view_deselect_all_except(E_Icon *not_ic) D_ENTER; - for (ll = views; ll; ll = ll->next) + for (ll = VM->views; ll; ll = ll->next) { Evas_List l; E_View *v; @@ -792,10 +793,10 @@ e_idle(void *data) D_ENTER; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; - + v = l->data; e_view_update(v); } @@ -817,22 +818,23 @@ e_view_geometry_record(E_View *v) ecore_window_get_frame_size(v->win.base, &left, NULL, &top, NULL); efsd_set_metadata_int(e_fs_get_connection(), - "/view/x", v->dir, + "/view/x", v->model->dir, v->location.x - left); efsd_set_metadata_int(e_fs_get_connection(), - "/view/y", v->dir, + "/view/y", v->model->dir, v->location.y - top); efsd_set_metadata_int(e_fs_get_connection(), - "/view/w", v->dir, + "/view/w", v->model->dir, v->size.w); efsd_set_metadata_int(e_fs_get_connection(), - "/view/h", v->dir, + "/view/h", v->model->dir, v->size.h); } D_RETURN; } + static void e_view_geometry_record_timeout(int val, void *data) { @@ -854,12 +856,13 @@ e_view_queue_geometry_record(E_View *v) D_ENTER; - snprintf(name, PATH_MAX, "geometry_record.%s", v->dir); + snprintf(name, PATH_MAX, "geometry_record.%s", v->model->dir); ecore_add_event_timer(name, 0.10, e_view_geometry_record_timeout, 0, v); D_RETURN; } + void e_view_queue_icon_xy_record(E_View *v) { @@ -867,7 +870,7 @@ e_view_queue_icon_xy_record(E_View *v) D_ENTER; - snprintf(name, PATH_MAX, "icon_xy_record.%s", v->dir); + snprintf(name, PATH_MAX, "icon_xy_record.%s", v->model->dir); ecore_add_event_timer(name, 0.10, e_view_write_icon_xy_timeout, 0, v); D_RETURN; @@ -881,9 +884,9 @@ e_configure(Ecore_Event * ev) Evas_List l; D_ENTER; - + e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -891,7 +894,7 @@ e_configure(Ecore_Event * ev) if (e->win == v->win.base) { /* win, root, x, y, w, h, wm_generated */ - D("configure for view %s\n", v->dir); + D("Configure for view: %s\n", v->name); if (e->wm_generated) { D("wm generated %i %i, %ix%i\n", e->x, e->y, e->w, e->h); @@ -900,7 +903,8 @@ e_configure(Ecore_Event * ev) D("new spot!\n"); v->location.x = e->x; v->location.y = e->y; - e_view_queue_geometry_record(v); + /* FIXME */ + //e_view_queue_geometry_record(v); } } D("size %ix%i\n", e->w, e->h); @@ -928,12 +932,12 @@ e_configure(Ecore_Event * ev) evas_set_output_size(v->evas, v->size.w, v->size.h); e_view_scroll_to(v, v->scroll.x, v->scroll.y); e_view_arrange(v); - e_view_queue_geometry_record(v); + /* FIXME */ + //e_view_queue_geometry_record(v); e_scrollbar_move(v->scrollbar.v, v->size.w - v->scrollbar.v->w, 0); e_scrollbar_resize(v->scrollbar.v, v->scrollbar.v->w, v->size.h - v->scrollbar.h->h); e_scrollbar_move(v->scrollbar.h, 0, v->size.h - v->scrollbar.h->h); e_scrollbar_resize(v->scrollbar.h, v->size.w - v->scrollbar.v->w, v->scrollbar.h->h); - if (v->iconbar) e_iconbar_fix(v->iconbar); } } } @@ -950,7 +954,7 @@ e_property(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -972,7 +976,7 @@ e_unmap(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -994,7 +998,7 @@ e_visibility(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1016,7 +1020,7 @@ e_focus_in(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1038,7 +1042,7 @@ e_focus_out(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1060,7 +1064,7 @@ e_delete(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1099,7 +1103,7 @@ e_dnd_status(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1140,7 +1144,7 @@ e_wheel(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1162,7 +1166,7 @@ e_key_down(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1215,7 +1219,7 @@ e_key_up(Ecore_Event * ev) e = ev->event; D_RETURN; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1235,7 +1239,7 @@ e_mouse_down(Ecore_Event * ev) e = ev->event; current_ev = ev; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1268,7 +1272,7 @@ e_mouse_up(Ecore_Event * ev) e = ev->event; current_ev = ev; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1295,7 +1299,7 @@ e_mouse_move(Ecore_Event * ev) e = ev->event; current_ev = ev; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1322,14 +1326,14 @@ e_mouse_in(Ecore_Event * ev) e = ev->event; current_ev = ev; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; v = l->data; if (e->win == v->win.main) - { - if (v->is_desktop) + { + if (v->model->is_desktop) { evas_event_enter(v->evas); } @@ -1352,7 +1356,7 @@ e_mouse_out(Ecore_Event * ev) e = ev->event; current_ev = ev; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1378,7 +1382,7 @@ e_window_expose(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1395,66 +1399,6 @@ e_window_expose(Ecore_Event * ev) D_RETURN; } -static void -e_view_handle_fs_restart(void *data) -{ - E_View *v; - Evas_List icons = NULL, l; - - D_ENTER; - - v = data; - - D("e_view_handle_fs_restart\n"); - for (l = v->icons; l; l = l->next) - { - icons = evas_list_prepend(icons, l->data); - } - if (icons) - { - for (l = icons; l; l = l->next) - { - E_Icon *i; - - i = l->data; - e_view_file_deleted(v->monitor_id, i->file); - } - evas_list_free(icons); - } - if (e_fs_get_connection()) - { - if (v->geom_get.busy) - { - v->geom_get.x = efsd_get_metadata(e_fs_get_connection(), - "/view/x", v->dir, EFSD_INT); - v->geom_get.y = efsd_get_metadata(e_fs_get_connection(), - "/view/y", v->dir, EFSD_INT); - v->geom_get.w = efsd_get_metadata(e_fs_get_connection(), - "/view/w", v->dir, EFSD_INT); - v->geom_get.h = efsd_get_metadata(e_fs_get_connection(), - "/view/h", v->dir, EFSD_INT); - v->getbg = efsd_get_metadata(e_fs_get_connection(), - "/view/background", v->dir, EFSD_STRING); - } - { - EfsdOptions *ops; - - ops = efsd_ops(3, - efsd_op_get_stat(), - efsd_op_get_filetype(), - efsd_op_list_all()); - v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir, - ops, TRUE); - - } - v->is_listing = 1; - } - D("restarted monitor id (connection = %p), %i for %s\n", e_fs_get_connection(), v->monitor_id, v->dir); - v->is_listing = 1; - - D_RETURN; -} - Ecore_Event * e_view_get_current_event(void) { @@ -1467,7 +1411,7 @@ int e_view_filter_file(E_View *v, char *file) { D_ENTER; - + if (file[0] == '.') D_RETURN_(0); @@ -1487,7 +1431,7 @@ e_view_restart_alphabetical_qsort_cb(const void *data1, const void *data2) ic = *((E_Icon **)data1); ic2 = *((E_Icon **)data2); - D_RETURN_(strcmp(ic->file, ic2->file)); + D_RETURN_(strcmp(ic->file->file, ic2->file->file)); } void @@ -1526,7 +1470,7 @@ e_view_arrange(E_View *v) double sv, sr, sm; D_ENTER; - + x = v->spacing.window.l; y = v->spacing.window.t; @@ -1607,157 +1551,20 @@ e_view_queue_resort(E_View *v) if (v->have_resort_queued) D_RETURN; v->have_resort_queued = 1; - snprintf(name, PATH_MAX, "resort_timer.%s", v->dir); + snprintf(name, PATH_MAX, "resort_timer.%s", v->name); ecore_add_event_timer(name, 1.0, e_view_resort_timeout, 0, v); D_RETURN; } - -void -e_view_file_added(int id, char *file) -{ - E_View *v; - - D_ENTER; - - /* if we get a path - ignore it - its not a file in the dir */ - if (!file) D_RETURN; - /* D("FILE ADD: %s\n", file);*/ - if (file[0] == '/') D_RETURN; - v = e_view_find_by_monitor_id(id); - if (!v) D_RETURN; - e_iconbar_file_add(v, file); - e_view_bg_add(v, file); - /* filter files here */ - if (!e_view_filter_file(v, file)) D_RETURN; - if (!e_icon_find_by_file(v, file)) - { - E_Icon *ic; - - ic = e_icon_new(); - ic->view = v; - ic->file = strdup(file); - ic->changed = 1; - ic->obj.icon = evas_add_image_from_file(ic->view->evas, NULL); - ic->obj.text = e_text_new(ic->view->evas, ic->file, "filename"); - v->icons = evas_list_append(v->icons, ic); - v->extents.valid = 0; - } - - D_RETURN; -} - -void -e_view_file_deleted(int id, char *file) -{ - E_View *v; - - D_ENTER; - - if (!file) D_RETURN; - if (file[0] == '/') D_RETURN; - v = e_view_find_by_monitor_id(id); - if (!v) D_RETURN; - e_iconbar_file_delete(v, file); - e_view_bg_del(v, file); - { - E_Icon *ic; - - ic = e_icon_find_by_file(v, file); - if (ic) - { - e_icon_hide(ic); - e_object_unref(E_OBJECT(ic)); - v->icons = evas_list_remove(v->icons, ic); - v->changed = 1; - v->extents.valid = 0; - e_view_queue_resort(v); - } - } - - D_RETURN; -} - -void -e_view_file_changed(int id, char *file) -{ - E_View *v; - - D_ENTER; - - D("file changed!!!\n"); - if (!file) D_RETURN; - if (file[0] == '/') D_RETURN; - v = e_view_find_by_monitor_id(id); - if (!v) D_RETURN; - e_iconbar_file_change(v, file); - e_view_bg_change(v, file); - { - E_Icon *ic; - - ic = e_icon_find_by_file(v, file); - if (ic) - { - } - } - - D_RETURN; -} - -void -e_view_file_moved(int id, char *file) -{ - E_View *v; - - D_ENTER; - - /* never gets called ? */ - if (!file) D_RETURN; - D(".!WOW!. e_view_file_moved(%i, %s);\n", id, file); - if (file[0] == '/') D_RETURN; - v = e_view_find_by_monitor_id(id); - if (!v) D_RETURN; - - { - E_Icon *ic; - - ic = e_icon_find_by_file(v, file); - if (ic) - { - } - } - - D_RETURN; -} - -E_View * -e_view_find_by_monitor_id(int id) -{ - Evas_List l; - - D_ENTER; - - for (l = views; l; l = l->next) - { - E_View *v; - - v = l->data; - if (v->monitor_id == id) - D_RETURN_(v); - } - - D_RETURN_(NULL); -} - E_View * e_view_find_by_window(Window win) { Evas_List l; D_ENTER; - - for (l = views; l; l = l->next) + + for (l = VM->views; l; l = l->next) { E_View *v; @@ -1774,11 +1581,11 @@ e_view_close_all(void) { D_ENTER; - while (views) + while (VM->views) { E_View *v; - v = views->data; + v = VM->views->data; e_object_unref(E_OBJECT(v)); } @@ -1789,36 +1596,29 @@ static void e_view_cleanup(E_View *v) { char name[PATH_MAX]; - D_ENTER; + /* write geometry to metadata. This is done directly and + * not via a timeout, because we will destroy the object after this.*/ + e_view_geometry_record(v); + e_view_machine_unregister_view(v); + if (v->iconbar) - { - e_iconbar_save_out_final(v->iconbar); - e_object_unref(E_OBJECT(v->iconbar)); - } + { + e_iconbar_save_out_final(v->iconbar); + e_object_unref(E_OBJECT(v->iconbar)); + } if (v->scrollbar.h) e_object_unref(E_OBJECT(v->scrollbar.h)); if (v->scrollbar.v) e_object_unref(E_OBJECT(v->scrollbar.v)); - - snprintf(name, PATH_MAX, "resort_timer.%s", v->dir); - ecore_del_event_timer(name); - snprintf(name, PATH_MAX, "geometry_record.%s", v->dir); - ecore_del_event_timer(name); - snprintf(name, PATH_MAX, "icon_xy_record.%s", v->dir); - ecore_del_event_timer(name); - - views = evas_list_remove(views, v); - efsd_stop_monitor(e_fs_get_connection(), v->dir, TRUE); - if (v->restarter) - e_fs_del_restart_handler(v->restarter); - v->restarter = NULL; ecore_window_destroy(v->win.base); - /* FIXME: clean up the rest!!! this leaks ... */ + snprintf(name, PATH_MAX, "resort_timer.%s", v->name); + ecore_del_event_timer(name); + /* FIXME: clean up the rest!!! this leaks ... */ + /* Call the destructor of the base class */ e_object_cleanup(E_OBJECT(v)); - D_RETURN; } @@ -1875,8 +1675,8 @@ _member.r = _r; _member.g = _g; _member.b = _b; _member.a = _a; v->spacing.icon.g = 7; v->spacing.icon.b = 7; + e_view_machine_register_view(v); - views = evas_list_append(views, v); D_RETURN_(v); } @@ -1891,48 +1691,25 @@ e_view_set_background(E_View *v) } void -e_view_set_dir(E_View *v, char *dir) +e_view_set_dir(E_View *v, char *dir, int is_desktop) { D_ENTER; - - /* stop monitoring old dir */ - if ((v->dir) && (v->monitor_id)) - { - efsd_stop_monitor(e_fs_get_connection(), v->dir, TRUE); - v->monitor_id = 0; - } - IF_FREE(v->dir); - v->dir = e_file_realpath(dir); - /* start monitoring new dir */ - v->restarter = e_fs_add_restart_handler(e_view_handle_fs_restart, v); - if (e_fs_get_connection()) - { - v->geom_get.x = efsd_get_metadata(e_fs_get_connection(), - "/view/x", v->dir, EFSD_INT); - v->geom_get.y = efsd_get_metadata(e_fs_get_connection(), - "/view/y", v->dir, EFSD_INT); - v->geom_get.w = efsd_get_metadata(e_fs_get_connection(), - "/view/w", v->dir, EFSD_INT); - v->geom_get.h = efsd_get_metadata(e_fs_get_connection(), - "/view/h", v->dir, EFSD_INT); - v->getbg = efsd_get_metadata(e_fs_get_connection(), - "/view/background", v->dir, EFSD_STRING); - v->geom_get.busy = 1; - { - EfsdOptions *ops; - - ops = efsd_ops(3, - efsd_op_get_stat(), - efsd_op_get_filetype(), - efsd_op_list_all()); - v->monitor_id = efsd_start_monitor(e_fs_get_connection(), v->dir, - ops, TRUE); - } - D("monitor id for %s = %i\n", v->dir, v->monitor_id); - v->is_listing = 1; - v->changed = 1; - } - + e_view_machine_get_model(v, dir, is_desktop); + /* Request metadata via efsd */ + v->geom_get.x = efsd_get_metadata(e_fs_get_connection(), + "/view/x", v->model->dir, EFSD_INT); + v->geom_get.y = efsd_get_metadata(e_fs_get_connection(), + "/view/y", v->model->dir, EFSD_INT); + v->geom_get.w = efsd_get_metadata(e_fs_get_connection(), + "/view/w", v->model->dir, EFSD_INT); + v->geom_get.h = efsd_get_metadata(e_fs_get_connection(), + "/view/h", v->model->dir, EFSD_INT); + /* FIXME currently, we dont use this anyway */ +/* + * v->getbg = efsd_get_metadata(e_fs_get_connection(), + * "/view/background", v->model->dir, EFSD_STRING); + */ + v->geom_get.busy = 1; D_RETURN; } @@ -1943,9 +1720,8 @@ e_view_realize(E_View *v) int font_cache = 1024 * 1024; int image_cache = 8192 * 1024; char *font_dir; - + D_ENTER; - if (v->evas) D_RETURN; v->win.base = ecore_window_new(0, v->location.x, v->location.y, @@ -2019,67 +1795,85 @@ e_view_realize(E_View *v) ecore_window_show(v->win.main); - { - char *dir; - - dir = v->dir; - v->dir = NULL; - e_view_set_dir(v, dir); - IF_FREE(dir); - } - if (!v->iconbar) v->iconbar = e_iconbar_new(v); if (v->iconbar) { e_iconbar_realize(v->iconbar); e_iconbar_set_view_window_spacing(v->iconbar); } - + + e_view_bg_reload(v); e_epplet_load_from_layout(v); v->changed = 1; - D_RETURN; } +void +e_view_populate(E_View *v) +{ + Evas_List l; + /* populate with icons for all files in the dir we are monitoring. + * This has to be called _after_ view_realize because + * view_add_file needs the evas to be intialized */ + for (l=v->model->files;l;l=l->next) + { + E_File *f = (E_File*) l->data; + E_Icon *ic; + e_view_file_add(v, f); + /* try to show the icons for the file. If this is not the first for + * the dir this will succeed because filetype and stat info have + * already been received. If not, it'll be shown when those arrive. */ + ic = e_icon_find_by_file(v, f->file); + if (ic) + { + e_icon_update_state(ic); + e_icon_initial_show(ic); + } + } +} + void e_view_update(E_View *v) { Evas_List l; D_ENTER; - - if (v->changed) - { - if(v->drag.icon_hide) - { - for (l = v->icons; l; l = l->next) - { - E_Icon *ic; - - ic = l->data; - e_icon_hide_delete_pending(ic); - } - v->drag.icon_hide = 0; - v_dnd_source = v; - } - if(v->drag.icon_show) - { - for (l = v->icons; l; l = l->next) - { - E_Icon *ic; - - ic = l->data; - e_icon_show_delete_end(ic, dnd_pending_mode); - } - dnd_pending_mode = E_DND_NONE; - v->drag.icon_show = 0; - } - if (v->drag.update) - { - ecore_window_move(v->drag.win, v->drag.x, v->drag.y); - v->drag.update = 0; - } - } + + /* FIXME find all places where setting the dirty flag is needed */ +/* + * if (!v->changed) + * D_RETURN; + */ + + if(v->drag.icon_hide) + { + for (l = v->icons; l; l = l->next) + { + E_Icon *ic; + + ic = l->data; + e_icon_hide_delete_pending(ic); + } + v->drag.icon_hide = 0; + v_dnd_source = v; + } + if(v->drag.icon_show) + { + for (l = v->icons; l; l = l->next) + { + E_Icon *ic; + + ic = l->data; + e_icon_show_delete_end(ic, dnd_pending_mode); + } + dnd_pending_mode = E_DND_NONE; + v->drag.icon_show = 0; + } + if (v->drag.update) + { + ecore_window_move(v->drag.win, v->drag.x, v->drag.y); + v->drag.update = 0; + } if (v->options.back_pixmap) { Imlib_Updates up; @@ -2103,503 +1897,149 @@ e_view_update(E_View *v) } else evas_render(v->evas); + v->changed = 0; D_RETURN; } - -static void -e_view_handle_fs(EfsdEvent *ev) +void +e_view_file_add(E_View *v, E_File *f) { D_ENTER; - - switch (ev->type) - { - case EFSD_EVENT_FILECHANGE: - switch (ev->efsd_filechange_event.changetype) - { - case EFSD_FILE_CREATED: -/* D("EFSD_FILE_CREATED: %i %s\n", - ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); -*/ e_view_file_added(ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); - break; - case EFSD_FILE_EXISTS: - /* D("EFSD_FILE_EXISTS: %i %s\n", - ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); */ - e_view_file_added(ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); - break; - case EFSD_FILE_DELETED: -/* D("EFSD_FILE_DELETED: %i %s\n", - ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); -*/ e_view_file_deleted(ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); - break; - case EFSD_FILE_CHANGED: -/* D("EFSD_CHANGE_CHANGED: %i %s\n", - ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); -*/ e_view_file_changed(ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); - break; - case EFSD_FILE_MOVED: -/* D("EFSD_CHANGE_MOVED: %i %s\n", - ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); -*/ e_view_file_moved(ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); - break; - case EFSD_FILE_END_EXISTS: - { - E_View *v; - - v = e_view_find_by_monitor_id(efsd_event_id(ev)); - if (v) v->is_listing = 0; -/* D("EFSD_CHANGE_END_EXISTS: %i %s\n", - ev->efsd_filechange_event.id, - ev->efsd_filechange_event.file); -*/ } - break; - default: - break; - } - break; - case EFSD_EVENT_REPLY: - switch (ev->efsd_reply_event.command.type) - { - case EFSD_CMD_REMOVE: - break; - case EFSD_CMD_MOVE: - break; - case EFSD_CMD_SYMLINK: - break; - case EFSD_CMD_LISTDIR: - break; - case EFSD_CMD_MAKEDIR: - break; - case EFSD_CMD_CHMOD: - break; - case EFSD_CMD_GETFILETYPE: - /* D("Getmime event %i\n", - ev->efsd_reply_event.command.efsd_file_cmd.id); */ - if (ev->efsd_reply_event.errorcode == 0) - { - E_Icon *ic; - E_View *v; - char *file; - - file = NULL; - if ( (file = efsd_event_filename(ev)) ) - { - file = e_file_get_file(file); - } - v = e_view_find_by_monitor_id(efsd_event_id(ev)); - if ((v) && (file)) - { - ic = e_icon_find_by_file(v, file); - if ((ic) && - (ev->efsd_reply_event.data)) - { - char *m, *p; - char mime[PATH_MAX], base[PATH_MAX]; - - m = ev->efsd_reply_event.data; - p = strchr(m, '/'); - if (p) - { - strcpy(base, m); - strcpy(mime, p + 1); - p = strchr(base, '/'); - *p = 0; - } - else - { - strcpy(base, m); - strcpy(mime, "unknown"); - } -/* D("MIME: %s\n", m); -*/ e_icon_set_mime(ic, base, mime); + if (!e_icon_find_by_file(v, f->file)) + { + E_Icon *ic; - /* Try to update the GUI according to the file permissions. - It's just a try because we need to have the file's stat - info as well. --cK. - */ - e_icon_check_permissions(ic); - e_icon_initial_show(ic); - } - } - } - break; - case EFSD_CMD_STAT: - /* D("Stat event %i on %s\n", - efsd_reply_id(ev), efsd_reply_filename(ev)); */ - - /* When everything went okay and we can find a view and an icon, - set the file stat data for the icon. Then try to check the - permissions and possibly update the gui. It's just a try - because we need to have received the filetype info too. --cK. - */ - if (ev->efsd_reply_event.errorcode == 0) - { - E_Icon *ic; - E_View *v; - - v = e_view_find_by_monitor_id(efsd_event_id(ev)); - - if (v) - { - ic = e_icon_find_by_file(v, e_file_get_file(efsd_event_filename(ev))); - - if (ic) - { - ic->stat = *((struct stat*)efsd_event_data(ev)); - e_icon_check_permissions(ic); - } - } - } - break; - case EFSD_CMD_READLINK: - if (ev->efsd_reply_event.errorcode == 0) - { - E_Icon *ic; - E_View *v; - - char *file; - - file = NULL; - if ( (file = efsd_event_filename(ev)) ) - { - file = e_file_get_file(file); - } - v = e_view_find_by_monitor_id(efsd_event_id(ev)); - if ((v) && (file)) - { - ic = e_icon_find_by_file(v, file); - if ((ic) && - (ev->efsd_reply_event.data)) - e_icon_set_link(ic, (char*)efsd_event_data(ev)); - e_icon_initial_show(ic); - } - } - break; - case EFSD_CMD_CLOSE: - break; - case EFSD_CMD_SETMETA: - break; - case EFSD_CMD_GETMETA: - /* D("Getmeta event %i\n", - efsd_reply_id(ev));*/ - { - Evas_List l; - EfsdCmdId cmd; - - cmd = efsd_event_id(ev); - for (l = views; l; l = l->next) - { - E_View *v; - int ok; - - ok = 0; - v = l->data; - if (v->is_desktop) continue; - if (v->geom_get.x == cmd) - { - v->geom_get.x = 0; - if (efsd_metadata_get_type(ev) == EFSD_INT) - { - if (ev->efsd_reply_event.errorcode == 0) - { - if (efsd_metadata_get_int(ev, - &(v->location.x))) - { - ecore_window_move(v->win.base, - v->location.x, - v->location.y); - ecore_window_set_xy_hints(v->win.base, - v->location.x, - v->location.y); - } - } - } - ok = 1; - } - else if (v->geom_get.y == cmd) - { - v->geom_get.y = 0; - if (efsd_metadata_get_type(ev) == EFSD_INT) - { - if (ev->efsd_reply_event.errorcode == 0) - { - if (efsd_metadata_get_int(ev, - &(v->location.y))) - { - ecore_window_move(v->win.base, - v->location.x, - v->location.y); - ecore_window_set_xy_hints(v->win.base, - v->location.x, - v->location.y); - } - } - } - ok = 1; - } - else if (v->geom_get.w == cmd) - { - v->geom_get.w = 0; - if (efsd_metadata_get_type(ev) == EFSD_INT) - { - if (ev->efsd_reply_event.errorcode == 0) - { - if (efsd_metadata_get_int(ev, - &(v->size.w))) - { - ecore_window_resize(v->win.base, - v->size.w, - v->size.h); - v->size.force = 1; - } - } - } - ok = 1; - } - else if (v->geom_get.h == cmd) - { - v->geom_get.h = 0; - if (efsd_metadata_get_type(ev) == EFSD_INT) - { - if (ev->efsd_reply_event.errorcode == 0) - { - if (efsd_metadata_get_int(ev, - &(v->size.h))) - { - ecore_window_resize(v->win.base, - v->size.w, - v->size.h); - v->size.force = 1; - } - } - } - ok = 1; - } - else if (v->getbg == cmd) - { - v->getbg = 0; - if (efsd_metadata_get_type(ev) == EFSD_STRING) - { - if (ev->efsd_reply_event.errorcode == 0) - { - char buf[PATH_MAX]; - - IF_FREE(v->bg_file); - e_strdup(v->bg_file, efsd_metadata_get_str(ev)); - snprintf(buf, PATH_MAX, "background_reload:%s", v->dir); - ecore_add_event_timer(buf, 0.5, e_view_bg_reload_timeout, 0, v); - } - } - } - if (ok) - { - if ((!v->geom_get.x) && - (!v->geom_get.y) && - (!v->geom_get.w) && - (!v->geom_get.h) && - (v->geom_get.busy)) - { - E_Border *b; - - v->geom_get.busy = 0; - if (v->bg) - e_bg_resize(v->bg, v->size.w, v->size.h); - if (v->options.back_pixmap) e_view_update(v); - b = e_border_adopt(v->win.base, 1); - b->client.internal = 1; - e_border_remove_click_grab(b); - } - D_RETURN; - } - } - } - break; - case EFSD_CMD_STARTMON_DIR: -/* D("Startmon event %i\n", - ev->efsd_reply_event.command.efsd_file_cmd.id); -*/ break; - case EFSD_CMD_STARTMON_FILE: -/* D("Startmon file event %i\n", - ev->efsd_reply_event.command.efsd_file_cmd.id); -*/ break; - case EFSD_CMD_STOPMON_DIR: - break; - case EFSD_CMD_STOPMON_FILE: - break; - default: - break; - } - break; - default: - break; - } + ic = e_icon_new(); + ic->view = v; + ic->file = f; + ic->changed = 1; + /* this basically allocates the obj.icon struct. Its image will be + * set later in icon_update_state */ + ic->obj.icon = evas_add_image_from_file(ic->view->evas, NULL); + ic->obj.text = e_text_new(ic->view->evas, f->file, "filename"); + v->icons = evas_list_append(v->icons, ic); + v->extents.valid = 0; + } + e_view_queue_resort(v); + v->changed = 1; D_RETURN; } void -e_view_bg_load(E_View *v) +e_view_file_changed(E_View *v, E_File *f) +{ + E_Icon *ic; + D_ENTER; + + ic = e_icon_find_by_file(v, f->file); + if (ic) + { + } + D_RETURN; +} + +void +e_view_file_delete(E_View *v, E_File *f) +{ + E_Icon *ic; + D_ENTER; + + e_iconbar_file_delete(v, f->file); + + ic = e_icon_find_by_file(v, f->file); + if (ic) + { + e_icon_hide(ic); + e_object_unref(E_OBJECT(ic)); + v->icons = evas_list_remove(v->icons, ic); + v->changed = 1; + v->extents.valid = 0; + e_view_queue_resort(v); + } + D_RETURN; +} + +void +e_view_ib_reload (E_View *v) +{ + D_ENTER; + + /* + D ("check if jsut saved:\n"); + if (v->iconbar->just_saved) + { + D ("just saved\n"); + v->iconbar->just_saved = 0; + D_RETURN; + } + */ + /* if we have an iconbar.. well nuke it */ + if (e_object_unref (E_OBJECT (v->iconbar)) == 0) + v->iconbar = NULL; + + /* try load a new iconbar */ + if (!v->iconbar) + v->iconbar = e_iconbar_new (v); + + /* if the iconbar loaded and theres an evas - we're realized */ + /* so realize the iconbar */ + if ((v->iconbar) && (v->evas)) + e_iconbar_realize (v->iconbar); + + D_RETURN; +} + +void +e_view_bg_reload(E_View *v) { E_Background bg; - char buf[PATH_MAX]; - + + /* This should only be called if the background did really + * change in the underlying model. We dont check again + * here. */ D_ENTER; - - if (!v->prev_bg_file) - { - e_strdup(v->prev_bg_file, "/"); - } - if (!v->bg_file) - { - e_strdup(v->bg_file, ""); - } - else - { - /* relative path for bg_file ? */ - if ((v->bg_file[0] != '/')) - { - snprintf(buf, PATH_MAX, "%s/%s", v->dir, v->bg_file); - FREE(v->bg_file); - e_strdup(v->bg_file, buf); - } - } - bg = e_bg_load(v->bg_file); - if (!bg) - { - snprintf(buf, PATH_MAX, "%s/.e_background.bg.db", v->dir); - FREE(v->bg_file); - e_strdup(v->bg_file, buf); - bg = e_bg_load(v->bg_file); - if (!bg) - { - if (v->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")); - FREE(v->bg_file); - e_strdup(v->bg_file, buf); - bg = e_bg_load(v->bg_file); - } - } - if (bg) - { - v->bg = bg; - v->bg_mod = e_file_mod_time(v->bg_file); - if (v->evas) - { - e_bg_add_to_evas(v->bg, v->evas); - e_bg_set_scroll(v->bg, v->scroll.x, v->scroll.y); - e_bg_set_layer(v->bg, 100); - e_bg_resize(v->bg, v->size.w, v->size.h); - - e_bg_callback_add(v->bg, CALLBACK_MOUSE_UP, e_bg_up_cb, v); - e_bg_callback_add(v->bg, CALLBACK_MOUSE_DOWN, e_bg_down_cb, v); - e_bg_callback_add(v->bg, CALLBACK_MOUSE_MOVE, e_bg_move_cb, v); - - e_bg_show(v->bg); - } - } - - IF_FREE(v->prev_bg_file); - e_strdup(v->prev_bg_file, v->bg_file); - - D_RETURN; -} - -static void -e_view_bg_reload_timeout(int val, void *data) -{ - E_View *v; - - D_ENTER; - - v = data; - if (!strcmp(v->prev_bg_file, v->bg_file)) - { - time_t new_mod; - - new_mod = e_file_mod_time(v->bg_file); - if (new_mod == v->bg_mod) - { - D("abort bg reload - same damn file\n"); - D_RETURN; - } - } + if (v->bg) - { - int size; - - e_bg_free(v->bg); - v->bg = NULL; - if (v->evas) - { - size = evas_get_image_cache(v->evas); - evas_set_image_cache(v->evas, 0); - evas_set_image_cache(v->evas, size); - } - e_db_flush(); - } - - e_view_bg_load(v); + { + int size; - D_RETURN; - UN(val); -} + e_bg_free(v->bg); + v->bg = NULL; + if (v->evas) + { + size = evas_get_image_cache(v->evas); + evas_set_image_cache(v->evas, 0); + evas_set_image_cache(v->evas, size); + } + e_db_flush(); + } + + bg = e_bg_load(v->model->bg_file); + + if (bg) + { + v->bg = bg; + if (v->evas) + { + e_bg_add_to_evas(v->bg, v->evas); + e_bg_set_scroll(v->bg, v->scroll.x, v->scroll.y); + e_bg_set_layer(v->bg, 100); + e_bg_resize(v->bg, v->size.w, v->size.h); -void -e_view_bg_change(E_View *v, char *file) -{ - char buf[PATH_MAX]; - - D_ENTER; - - if (!(!strcmp(file, ".e_background.bg.db"))) return; - snprintf(buf, PATH_MAX, "background_reload:%s", v->dir); - ecore_add_event_timer(buf, 0.5, e_view_bg_reload_timeout, 0, v); + e_bg_callback_add(v->bg, CALLBACK_MOUSE_UP, e_bg_up_cb, v); + e_bg_callback_add(v->bg, CALLBACK_MOUSE_DOWN, e_bg_down_cb, v); + e_bg_callback_add(v->bg, CALLBACK_MOUSE_MOVE, e_bg_move_cb, v); + e_bg_show(v->bg); + } + } D_RETURN; } -void -e_view_bg_add(E_View *v, char *file) -{ - char buf[PATH_MAX]; - - D_ENTER; - - if (!(!strcmp(file, ".e_background.bg.db"))) return; - snprintf(buf, PATH_MAX, "%s/%s", v->dir, file); - if (!strcmp(buf, v->bg_file)) D_RETURN; - IF_FREE(v->bg_file); - e_strdup(v->bg_file, ""); - snprintf(buf, PATH_MAX, "background_reload:%s", v->dir); - ecore_add_event_timer(buf, 0.5, e_view_bg_reload_timeout, 0, v); - - D_RETURN; -} - -void -e_view_bg_del(E_View *v, char *file) -{ - D_ENTER; - - e_view_bg_change(v, file); - - D_RETURN; -} void e_view_init(void) @@ -2632,7 +2072,6 @@ e_view_init(void) ecore_event_filter_handler_add(ECORE_EVENT_DND_DROP_REQUEST, e_dnd_drop_request); ecore_event_filter_idle_handler_add(e_idle, NULL); - e_fs_add_event_handler(e_view_handle_fs); D_RETURN; } @@ -2656,10 +2095,15 @@ e_dnd_data_request(Ecore_Event * ev) * Atom destination_atom; * } Ecore_Event_Dnd_Data_Request; */ - Evas_List l; + Evas_List l; + E_View *v; + Evas_List ll; + char *data = NULL; D_ENTER; - + /* Me, my null, and an extra for the end '/r/n'... */ + e_strdup(data, ""); + /* Need hostname for URL (file://hostname/...) */ /* nooo nooo noo - never encode host names in url's - * file:/path/blah is local only - secondly.. why encode @@ -2680,154 +2124,151 @@ e_dnd_data_request(Ecore_Event * ev) * } */ e = ev->event; - for (l = views; l; l = l->next) - { - E_View *v; - Evas_List ll; - char *data = NULL; + for (l = VM->views; l; l = l->next) + { + v = l->data; + if (e->win == v->win.base) + break; + } - /* Me, my null, and an extra for the end '/r/n'... */ - e_strdup(data, ""); + if (e->uri_list) + { + int first = 1; - v = l->data; - if (e->win == v->win.base) - { - if (e->uri_list) - { - int first = 1; - - for (ll = v->icons; ll; ll = ll->next) - { - E_Icon *ic; - - ic = ll->data; - if (ic->state.selected) - { - char buf[PATH_MAX]; - - if (first) - { - snprintf(buf, PATH_MAX, "file:%s/%s", v->dir, ic->file); - first = 0; - } - else - snprintf(buf, PATH_MAX, "\r\nfile:%s/%s", v->dir, ic->file); - REALLOC(data, char, strlen(data) + strlen(buf) + 1); - strcat(data, buf); - } - } - ecore_dnd_send_data(e->source_win, e->win, - data, strlen(data) + 1, - e->destination_atom, - DND_TYPE_URI_LIST); - } - else if (e->plain_text) - { - int first = 1; - - for (ll = v->icons; ll; ll = ll->next) - { - E_Icon *ic; - - ic = ll->data; - if (ic->state.selected) - { - char buf[PATH_MAX]; - - if (first) - { - snprintf(buf, PATH_MAX, "%s/%s\n", v->dir, ic->file); - first = 0; - } - else - snprintf(buf, PATH_MAX, "\n%s/%s", v->dir, ic->file); - REALLOC(data, char, strlen(data) + strlen(buf) + 1); - strcat(data, buf); - } - } - ecore_dnd_send_data(e->source_win, e->win, - data, strlen(data) + 1, - e->destination_atom, - DND_TYPE_PLAIN_TEXT); - } - else /* if (e->moz_url)*/ - { - FREE(data); - data = NULL; - - for (ll = v->icons; ll; ll = ll->next) - { - E_Icon *ic; - - ic = ll->data; - if (ic->state.selected) - { - char buf[16384]; - - snprintf(buf, PATH_MAX, "file:%s/%s", v->dir, ic->file); - data = strdup(buf); - break; - } - } - if (data) - { - ecore_dnd_send_data(e->source_win, e->win, - data, strlen(data) + 1, - e->destination_atom, - DND_TYPE_NETSCAPE_URL); - } - } - IF_FREE(data); - D_RETURN; - } - } + for (ll = v->icons; ll; ll = ll->next) + { + E_Icon *ic; + + ic = ll->data; + if (ic->state.selected) + { + char buf[PATH_MAX]; + + if (first) + { + /*FIXME */ + snprintf(buf, PATH_MAX, "file:%s/%s", v->model->dir, ic->file->file); + first = 0; + } + else + /* FIXME */ + snprintf(buf, PATH_MAX, "\r\nfile:%s/%s", v->model->dir, ic->file->file); + REALLOC(data, char, strlen(data) + strlen(buf) + 1); + strcat(data, buf); + } + } + ecore_dnd_send_data(e->source_win, e->win, + data, strlen(data) + 1, + e->destination_atom, + DND_TYPE_URI_LIST); + } + else if (e->plain_text) + { + int first = 1; + + for (ll = v->icons; ll; ll = ll->next) + { + E_Icon *ic; + + ic = ll->data; + if (ic->state.selected) + { + char buf[PATH_MAX]; + + if (first) + { + /*FIXME */ + snprintf(buf, PATH_MAX, "%s/%s\n", v->model->dir, ic->file->file); + first = 0; + } + else + /*FIXME */ + snprintf(buf, PATH_MAX, "\n%s/%s", v->model->dir, ic->file->file); + REALLOC(data, char, strlen(data) + strlen(buf) + 1); + strcat(data, buf); + } + } + ecore_dnd_send_data(e->source_win, e->win, + data, strlen(data) + 1, + e->destination_atom, + DND_TYPE_PLAIN_TEXT); + } + else /* if (e->moz_url)*/ + { + FREE(data); + data = NULL; + + for (ll = v->icons; ll; ll = ll->next) + { + E_Icon *ic; + + ic = ll->data; + if (ic->state.selected) + { + char buf[16384]; + + /* FIXME */ + snprintf(buf, PATH_MAX, "file:%s/%s", v->model->dir, ic->file->file); + data = strdup(buf); + break; + } + } + if (data) + { + ecore_dnd_send_data(e->source_win, e->win, + data, strlen(data) + 1, + e->destination_atom, + DND_TYPE_NETSCAPE_URL); + } + } + IF_FREE(data); D_RETURN; } -static void + static void e_dnd_drop_end(Ecore_Event * ev) { - Ecore_Event_Dnd_Drop_End *e; - /* + Ecore_Event_Dnd_Drop_End *e; + /* * typedef struct _ecore_event_dnd_drop_end * { * Window win, root, source_win; * } Ecore_Event_Dnd_Drop_End; */ Evas_List l; - - D_ENTER; - - e = ev->event; - for (l = views; l; l = l->next) - { - E_View *v; - - v = l->data; - if (e->win == v->win.base) - { - if(v_dnd_source) - { - if(dnd_pending_mode != E_DND_DELETED && - dnd_pending_mode != E_DND_COPIED ) - { - dnd_pending_mode = E_DND_COPIED; - } - if( v_dnd_source->drag.matching_drop_attempt ) - { - v_dnd_source->drag.matching_drop_attempt = 0; - dnd_pending_mode = E_DND_COPIED; - } - v_dnd_source->changed = 1; - v_dnd_source->drag.icon_show = 1; - } - e_dnd_drop_request_free(); - D_RETURN; - } - } + D_ENTER; + + e = ev->event; + for (l = VM->views; l; l = l->next) + { + E_View *v; + + v = l->data; + if (e->win == v->win.base) + { + if(v_dnd_source) + { + if(dnd_pending_mode != E_DND_DELETED && + dnd_pending_mode != E_DND_COPIED ) + { + dnd_pending_mode = E_DND_COPIED; + } + if( v_dnd_source->drag.matching_drop_attempt ) + { + v_dnd_source->drag.matching_drop_attempt = 0; + dnd_pending_mode = E_DND_COPIED; + } + v_dnd_source->changed = 1; + v_dnd_source->drag.icon_show = 1; + } + + e_dnd_drop_request_free(); + D_RETURN; + } + } D_RETURN; } @@ -2849,7 +2290,7 @@ e_dnd_drop_position(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -2902,7 +2343,7 @@ e_dnd_drop(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -2944,7 +2385,7 @@ e_dnd_drop_request(Ecore_Event * ev) D_ENTER; e = ev->event; - for (l = views; l; l = l->next) + for (l = VM->views; l; l = l->next) { E_View *v; @@ -3034,7 +2475,7 @@ e_dnd_handle_drop( E_View *v ) if ( dnd_files[out] ) FREE( dnd_files[out] ); - dnd_files[out++] = strdup( v->dir ); + dnd_files[out++] = strdup( v->model->dir ); switch( dnd_pending_mode ) { diff --git a/src/view.h b/src/view.h index b808198c5..58471cb23 100644 --- a/src/view.h +++ b/src/view.h @@ -7,6 +7,8 @@ #include "fs.h" #include "iconbar.h" #include "object.h" +#include "e_view_model.h" +#include "e_file.h" #ifndef E_VIEW_TYPEDEF #define E_VIEW_TYPEDEF @@ -23,6 +25,12 @@ typedef struct _E_Icon E_Icon; typedef struct _E_Iconbar E_Iconbar; #endif +#ifndef E_VIEW_MODEL_TYPEDEF +#define E_VIEW_MODEL_TYPEDEF +typedef struct _E_View_Model E_View_Model; +#endif + + typedef enum { E_DND_NONE, E_DND_COPY, @@ -37,8 +45,10 @@ typedef enum { struct _E_View { E_Object o; + + char * name; - char *dir; + E_View_Model *model; struct { Evas_Render_Method render_method; @@ -135,38 +145,32 @@ struct _E_View int valid; double x1, x2, y1, y2; } extents; - + + E_Background bg; + + struct { EfsdCmdId x, y, w, h; int busy; } geom_get; - EfsdCmdId getbg; - - Evas_Object obj_bg; - - char *bg_file; - char *prev_bg_file; - time_t bg_mod; - E_Background bg; + + EfsdCmdId getbg; + struct { E_Scrollbar *h, *v; } scrollbar; int is_listing; - int monitor_id; - - E_FS_Restarter *restarter; + + E_Iconbar *iconbar; Evas_List icons; - int is_desktop; int have_resort_queued; int changed; - E_Iconbar *iconbar; - Evas_List epplet_contexts; Ebits_Object epplet_layout; }; @@ -198,15 +202,9 @@ void e_view_get_position_percentage(E_View *v, double *vx, double *vy); void e_view_resort_alphabetical(E_View *v); void e_view_arrange(E_View *v); void e_view_resort(E_View *v); -void e_view_geometry_record(E_View *v); void e_view_queue_geometry_record(E_View *v); void e_view_queue_icon_xy_record(E_View *v); void e_view_queue_resort(E_View *v); -void e_view_file_added(int id, char *file); -void e_view_file_deleted(int id, char *file); -void e_view_file_changed(int id, char *file); -void e_view_file_moved(int id, char *file); -E_View *e_view_find_by_monitor_id(int id); E_View *e_view_find_by_window(Window win); /** @@ -229,7 +227,14 @@ void e_view_set_background(E_View *v); * directory, it also requests monitoring of the files in * the directory @dir from efsd. */ -void e_view_set_dir(E_View *v, char *dir); +void e_view_set_dir(E_View *v, char *dir, int is_desktop); + +/** + * e_view_populate - Draws icons for all files in view + * @v The view to populate + */ + +void e_view_populate(E_View *v); /** * e_view_realize - Initializes a view's graphics and content @@ -243,11 +248,12 @@ void e_view_realize(E_View *v); void e_view_update(E_View *v); -void e_view_bg_load(E_View *v); +void e_view_bg_reload(E_View *v); +void e_view_ib_reload(E_View *v); -void e_view_bg_change(E_View *v, char *file); -void e_view_bg_add(E_View *v, char *file); -void e_view_bg_del(E_View *v, char *file); +void e_view_file_add(E_View *v, E_File *file); +void e_view_file_changed(E_View *v, E_File *file); +void e_view_file_delete(E_View *v, E_File *file); void e_view_close_all(void);