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