From df56bb3761950053c708db6fa7e9287f6541246f Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 15 Oct 2006 08:37:07 +0000 Subject: [PATCH] added icon for .desktop file for e (for xsessions) fm2 now instant-updates on dnd and delete/rename/new dir fms also instant-updates on-disk file changes SVN revision: 26608 --- TODO | 9 + data/images/Makefile.am | 1 + data/images/enlightenment.png | Bin 0 -> 4455 bytes data/xsession/enlightenment.desktop.in | 1 + src/bin/e_fm.c | 690 ++++++++++++++++++------- src/bin/e_fm.h | 1 + 6 files changed, 513 insertions(+), 189 deletions(-) create mode 100644 data/images/enlightenment.png diff --git a/TODO b/TODO index df802762e..2ec20b2d7 100644 --- a/TODO +++ b/TODO @@ -8,6 +8,11 @@ Some of the things (in very short form) that need to be done to E17... BUGS / FIXES ------------------------------------------------------------------------------- +* BUG: on resolution (down to a lower res) change windows used to be shuffled + to a smaller size then reshuffled back to where they were when res goes up + again - but this seems to have broken. +* BUG: screen res popup with "are u sure u want to keep this res" doesnt center + itself (goes to top-left) sometimes. * BUG: smart placement seems to screw up if a shelf is at the top of the screen * BUG: e17 screen res diaolg doesnt work under xephyr - why? * BUG: "match this window only" doesnt fall back to other unused remembers @@ -20,6 +25,10 @@ Some of the things (in very short form) that need to be done to E17... ESSENTIAL FEATURES ------------------------------------------------------------------------------- +* fm2 needs a way to bypass thumb gen anim on just a unrealize/realize as well + as change state instantly if it already was selected +* fm2 needs right click menu for enable/disable .order file (will change the + behavior of a dir on dnd and all sorts of stuff) * fm2 needs way to replace or extend the right click menu (disable/enable rename/delete/refresh etc.) * fm2 needs a mime filter diff --git a/data/images/Makefile.am b/data/images/Makefile.am index c06f64dbf..ddb9886e0 100644 --- a/data/images/Makefile.am +++ b/data/images/Makefile.am @@ -1,6 +1,7 @@ MAINTAINERCLEANFILES = Makefile.in filesdir = $(datadir)/enlightenment/data/images files_DATA = \ +enlightenment.png \ test.png \ test.jpg \ test.edj diff --git a/data/images/enlightenment.png b/data/images/enlightenment.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6e0b4bc3a079fc37737e1e023ce1338dee955f GIT binary patch literal 4455 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 tO3*79Oh4info.file, file)) { sd->tmp.last_insert = NULL; - sd->iconlist_changed = 1; +// sd->iconlist_changed = 1; return; } } @@ -761,7 +800,7 @@ _e_fm2_file_add(Evas_Object *obj, char *file, int unique) if (!strcmp(ic->info.file, file)) { sd->tmp.last_insert = NULL; - sd->iconlist_changed = 1; +// sd->iconlist_changed = 1; return; } } @@ -770,22 +809,43 @@ _e_fm2_file_add(Evas_Object *obj, char *file, int unique) ic = _e_fm2_icon_new(sd, file); if (ic) { - /* respekt da ordah! */ - if (sd->order_file) - sd->queue = evas_list_append(sd->queue, ic); + if (!file_rel) + { + /* respekt da ordah! */ + if (sd->order_file) + sd->queue = evas_list_append(sd->queue, ic); + else + { + /* insertion sort it here to spread the sort load into idle time */ + for (l = sd->queue; l; l = l->next) + { + ic2 = l->data; + if (_e_fm2_cb_icon_sort(ic, ic2) < 0) + { + sd->queue = evas_list_prepend_relative_list(sd->queue, ic, l); + break; + } + } + if (!l) sd->queue = evas_list_append(sd->queue, ic); + } + } else { - /* insertion sort it here to spread the sort load into idle time */ - for (l = sd->queue; l; l = l->next) + for (l = sd->icons; l; l = l->next) { ic2 = l->data; - if (_e_fm2_cb_icon_sort(ic, ic2) < 0) + if (!strcmp(ic2->info.file, file_rel)) { - sd->queue = evas_list_prepend_relative_list(sd->queue, ic, l); + printf("ADD %s rel: %s after=%i\n", + ic->info.file, ic2->info.file, after); + if (after) + sd->icons = evas_list_append_relative(sd->icons, ic, ic2); + else + sd->icons = evas_list_prepend_relative(sd->icons, ic, ic2); break; } } - if (!l) sd->queue = evas_list_append(sd->queue, ic); + if (!l) sd->icons = evas_list_append(sd->icons, ic); } sd->tmp.last_insert = NULL; sd->iconlist_changed = 1; @@ -796,12 +856,23 @@ static void _e_fm2_file_del(Evas_Object *obj, char *file) { E_Fm2_Smart_Data *sd; + E_Fm2_Icon *ic; + Evas_List *l; sd = evas_object_smart_data_get(obj); if (!sd) return; - /* find icon of file and remove from unsorted or main list */ - /* FIXME: find and remove */ - sd->iconlist_changed = 1; + for (l = sd->icons; l; l = l->next) + { + ic = l->data; + if (!strcmp(ic->info.file, file)) + { + sd->icons = evas_list_remove_list(sd->icons, l); + if (ic->region) + ic->region->list = evas_list_remove(ic->region->list, ic); + _e_fm2_icon_free(ic); + return; + } + } } static void @@ -828,6 +899,8 @@ _e_fm2_scan_start(Evas_Object *obj) if ((sd->scan_idler) || (sd->scan_timer)) return; sd->order_file = 0; ecore_desktop_instrumentation_reset(); + if (sd->monitor.monitor) ecore_file_monitor_del(sd->monitor.monitor); + sd->monitor.monitor = ecore_file_monitor_add(sd->realpath, _e_fm2_cb_file_monitor, obj); sd->scan_idler = ecore_idler_add(_e_fm2_cb_scan_idler, obj); sd->scan_timer = ecore_timer_add(0.2, _e_fm2_cb_scan_timer, obj); edje_object_signal_emit(sd->overlay, "e,state,busy,start", "e"); @@ -883,6 +956,8 @@ _e_fm2_scan_stop(Evas_Object *obj) _e_fm2_queue_free(obj); _e_fm2_obj_icons_place(sd); ecore_desktop_instrumentation_print(); + + _e_fm2_live_process_begin(obj); } static void @@ -1334,36 +1409,73 @@ static E_Fm2_Icon * _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file) { E_Fm2_Icon *ic; + + /* create icon */ + ic = E_NEW(E_Fm2_Icon, 1); + ic->info.file = evas_stringshare_add(file); + ic->sd = sd; + if (!_e_fm2_icon_fill(ic)) + { + evas_stringshare_del(ic->info.file); + free(ic); + return NULL; + } + return ic; +} + +static void +_e_fm2_icon_unfill(E_Fm2_Icon *ic) +{ + if (ic->info.mime) evas_stringshare_del(ic->info.mime); + if (ic->info.label) evas_stringshare_del(ic->info.label); + if (ic->info.comment) evas_stringshare_del(ic->info.comment); + if (ic->info.generic) evas_stringshare_del(ic->info.generic); + if (ic->info.icon) evas_stringshare_del(ic->info.icon); + if (ic->info.link) evas_stringshare_del(ic->info.link); + if (ic->info.real_link) evas_stringshare_del(ic->info.real_link); + if (ic->info.pseudo_dir) evas_stringshare_del(ic->info.pseudo_dir); + ic->info.mime = NULL; + ic->info.label = NULL; + ic->info.comment = NULL; + ic->info.generic = NULL; + ic->info.icon = NULL; + ic->info.link = NULL; + ic->info.real_link = NULL; + ic->info.pseudo_dir = NULL; + ic->info.broken_link = 0; + ic->info.pseudo_link = 0; + ic->info.mount = 0; +} + +static int +_e_fm2_icon_fill(E_Fm2_Icon *ic) +{ Evas_Coord mw = 0, mh = 0; Evas_Object *obj, *obj2; char buf[4096], *lnk; const char *mime; - /* create icon */ - ic = E_NEW(E_Fm2_Icon, 1); - snprintf(buf, sizeof(buf), "%s/%s", sd->realpath, file); + snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); + lnk = ecore_file_readlink(buf); if (stat(buf, &(ic->info.statinfo)) == -1) { - if (sd->config->view.extra_file_source) - { - snprintf(buf, sizeof(buf), "%s/%s", sd->config->view.extra_file_source, file); - if (stat(buf, &(ic->info.statinfo)) == -1) - { - free(ic); - return NULL; - } - ic->info.pseudo_dir = evas_stringshare_add(sd->config->view.extra_file_source); - ic->info.pseudo_link = 1; - } + if (lnk) + ic->info.broken_link = 1; else { - free(ic); - return NULL; + if (ic->sd->config->view.extra_file_source) + { + snprintf(buf, sizeof(buf), "%s/%s", + ic->sd->config->view.extra_file_source, ic->info.file); + if (stat(buf, &(ic->info.statinfo)) == -1) + return 0; + ic->info.pseudo_dir = evas_stringshare_add(ic->sd->config->view.extra_file_source); + ic->info.pseudo_link = 1; + } + else + return 0; } } - ic->sd = sd; - ic->info.file = evas_stringshare_add(file); - lnk = ecore_file_readlink(buf); if (lnk) { if (lnk[0] == '/') @@ -1375,7 +1487,7 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file) { char *rp; - snprintf(buf, sizeof(buf), "%s/%s", sd->realpath, lnk); + snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, lnk); rp = ecore_file_realpath(buf); if (rp) { @@ -1393,11 +1505,12 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file) if (mime) ic->info.mime = evas_stringshare_add(mime); } - if ((e_util_glob_case_match(ic->info.file, "*.desktop")) || (e_util_glob_case_match(ic->info.file, "*.directory"))) + if ((e_util_glob_case_match(ic->info.file, "*.desktop")) || + (e_util_glob_case_match(ic->info.file, "*.directory"))) _e_fm2_icon_desktop_load(ic); - evas_event_freeze(evas_object_evas_get(sd->obj)); + evas_event_freeze(evas_object_evas_get(ic->sd->obj)); edje_freeze(); - switch (sd->config->view.mode) + switch (ic->sd->config->view.mode) { case E_FM2_VIEW_MODE_ICONS: case E_FM2_VIEW_MODE_GRID_ICONS: @@ -1420,53 +1533,53 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file) * fileman/scrollframe * */ - if ((!sd->config->icon.fixed.w) || (!sd->config->icon.fixed.h)) + if ((!ic->sd->config->icon.fixed.w) || (!ic->sd->config->icon.fixed.h)) { - obj = sd->tmp.obj; + obj = ic->sd->tmp.obj; if (!obj) { - obj = edje_object_add(evas_object_evas_get(sd->obj)); + obj = edje_object_add(evas_object_evas_get(ic->sd->obj)); e_theme_edje_object_set(obj, "base/theme/fileman", "e/fileman/icon/variable"); - sd->tmp.obj = obj; + ic->sd->tmp.obj = obj; } _e_fm2_icon_label_set(ic, obj); edje_object_size_min_calc(obj, &mw, &mh); } ic->w = mw; ic->h = mh; - if (sd->config->icon.fixed.w) ic->w = sd->config->icon.icon.w; - if (sd->config->icon.fixed.h) ic->h = sd->config->icon.icon.h; + if (ic->sd->config->icon.fixed.w) ic->w = ic->sd->config->icon.icon.w; + if (ic->sd->config->icon.fixed.h) ic->h = ic->sd->config->icon.icon.h; ic->min_w = mw; ic->min_h = mh; break; case E_FM2_VIEW_MODE_LIST: { - obj = sd->tmp.obj; + obj = ic->sd->tmp.obj; if (!obj) { - obj = edje_object_add(evas_object_evas_get(sd->obj)); - if (sd->config->icon.fixed.w) + obj = edje_object_add(evas_object_evas_get(ic->sd->obj)); + if (ic->sd->config->icon.fixed.w) e_theme_edje_object_set(obj, "base/theme/fileman", "e/fileman/list/fixed"); else e_theme_edje_object_set(obj, "base/theme/fileman", "e/fileman/list/variable"); - sd->tmp.obj = obj; + ic->sd->tmp.obj = obj; } _e_fm2_icon_label_set(ic, obj); - obj2 = sd->tmp.obj2; + obj2 = ic->sd->tmp.obj2; if (!obj2) { - obj2 = evas_object_rectangle_add(evas_object_evas_get(sd->obj)); - sd->tmp.obj2 = obj2; + obj2 = evas_object_rectangle_add(evas_object_evas_get(ic->sd->obj)); + ic->sd->tmp.obj2 = obj2; } - edje_extern_object_min_size_set(obj2, sd->config->icon.list.w, sd->config->icon.list.h); - edje_extern_object_max_size_set(obj2, sd->config->icon.list.w, sd->config->icon.list.h); + edje_extern_object_min_size_set(obj2, ic->sd->config->icon.list.w, ic->sd->config->icon.list.h); + edje_extern_object_max_size_set(obj2, ic->sd->config->icon.list.w, ic->sd->config->icon.list.h); edje_object_part_swallow(obj, "e.swallow.icon", obj2); edje_object_size_min_calc(obj, &mw, &mh); } - if (mw < sd->w) ic->w = sd->w; + if (mw < ic->sd->w) ic->w = ic->sd->w; else ic->w = mw; ic->h = mh; ic->min_w = mw; @@ -1476,8 +1589,8 @@ _e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file) break; } edje_thaw(); - evas_event_thaw(evas_object_evas_get(obj)); - return ic; + evas_event_thaw(evas_object_evas_get(ic->sd->obj)); + return 1; } static void @@ -2776,18 +2889,26 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) /* FIXME: error - file exists */ } else - ecore_file_mv(ll->data, buf); + { + if (ecore_file_mv(ll->data, buf)) + _e_fm2_live_file_add(sd->obj, + ecore_file_get_file(ll->data), + NULL, 0); + } } else { - snprintf(buf, sizeof(buf), "%s/.order", - sd->realpath); - f = fopen(buf, "a"); - if (f) - { - fprintf(f, "%s\n", ecore_file_get_file(ll->data)); - fclose(f); - } + _e_fm2_live_file_add(sd->obj, + ecore_file_get_file(ll->data), + NULL, 0); +// snprintf(buf, sizeof(buf), "%s/.order", +// sd->realpath); +// f = fopen(buf, "a"); +// if (f) +// { +// fprintf(f, "%s\n", ecore_file_get_file(ll->data)); +// fclose(f); +// } } } else @@ -2800,15 +2921,20 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) /* FIXME: error - file exists */ } else - ecore_file_mv(ll->data, buf); + { + if (ecore_file_mv(ll->data, buf)) + _e_fm2_live_file_add(sd->obj, + ecore_file_get_file(ll->data), + NULL, 0); + } } free(d); } } /* FIXME: disable refresh - modify icons in-place */ - refresh = 1; /* refresh src fm */ +// refresh = 1; /* refresh src fm */ /* FIXME: disable refresh - modify icons in-place */ - e_fm2_refresh(sd->obj); /* refresh dst fm */ +// e_fm2_refresh(sd->obj); /* refresh dst fm */ } else if (sd->drop_icon) /* inot or before/after an icon */ { @@ -2816,78 +2942,23 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) if (sd->drop_after == -1) /* put into subdir in icon */ { /* move file into dir that this icon is for */ - snprintf(buf, sizeof(buf), "%s/%s/.order", - sd->realpath, sd->drop_icon->info.file); - if (ecore_file_exists(buf)) + for (ll = fsel; ll; ll = ll->next) { - f = fopen(buf, "a"); - if (f) + /* move the file into the subdir */ + snprintf(buf, sizeof(buf), "%s/%s/%s", + sd->realpath, sd->drop_icon->info.file, ecore_file_get_file(ll->data)); + printf("mv %s %s\n", ll->data, buf); + if (ecore_file_exists(buf)) { - /* go through all files to drop */ - for (ll = fsel; ll; ll = ll->next) - { - fprintf(f, "%s\n", ecore_file_get_file(ll->data)); - d = ecore_file_get_dir(ll->data); - /* get the dir of each file */ - if (d) - { - /* if the file is not in the target dir */ - if (strcmp(d, sd->realpath)) - { - /* if the file is not apseudo-link */ - if (e_util_strcmp(sd->config->view.extra_file_source, d)) - { - /* move the file into the subdir */ - snprintf(buf, sizeof(buf), "%s/%s/%s", - sd->realpath, sd->drop_icon->info.file, ecore_file_get_file(ll->data)); - if (ecore_file_exists(buf)) - { - /* FIXME: error - file exists */ - } - else - ecore_file_mv(ll->data, buf); - } - } - else - { - /* file is in target dir - move into subdir */ - snprintf(buf, sizeof(buf), "%s/%s/%s", - sd->realpath, sd->drop_icon->info.file, ecore_file_get_file(ll->data)); - if (ecore_file_exists(buf)) - { - /* FIXME: error - file exists */ - } - else - ecore_file_mv(ll->data, buf); - } - free(d); - } - } - fclose(f); - } - } - else - { - printf("no .order\n"); - /* go through all files to drop */ - for (ll = fsel; ll; ll = ll->next) - { - /* move the file into the subdir */ - snprintf(buf, sizeof(buf), "%s/%s/%s", - sd->realpath, sd->drop_icon->info.file, ecore_file_get_file(ll->data)); - printf("mv %s %s\n", ll->data, buf); - if (ecore_file_exists(buf)) - { - /* FIXME: error - file exists */ - } - else - ecore_file_mv(ll->data, buf); + /* FIXME: error - file exists */ } + else + ecore_file_mv(ll->data, buf); } /* FIXME: disable refresh - modify icons in-place */ - refresh = 1; /* refresh src fm */ +// refresh = 1; /* refresh src fm */ /* FIXME: disable refresh - modify icons in-place */ - e_fm2_refresh(sd->obj); /* refresh dst fm */ +// e_fm2_refresh(sd->obj); /* refresh dst fm */ } else { @@ -2895,46 +2966,17 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) { if (sd->order_file) /* there is an order file */ { - /* write order file with all files up to drop_icon - * that are not being dragged, then insert list of - * dropped files, then everything after that is not - * being dragged then refresh view - */ - snprintf(buf, sizeof(buf), "%s/.order", sd->realpath); - f = fopen(buf, "w"); - if (f) - { - for (l = sd->icons; l; l = l->next) - { - ic = l->data; - if (!ic->drag.dnd) - { - if ((sd->drop_after == 0) && - (ic == sd->drop_icon)) - { - for (ll = fsel; ll; ll = ll->next) - fprintf(f, "%s\n", ecore_file_get_file(ll->data)); - fprintf(f, "%s\n", ic->info.file); - } - else if ((sd->drop_after == 1) && - (ic == sd->drop_icon)) - { - fprintf(f, "%s\n", ic->info.file); - for (ll = fsel; ll; ll = ll->next) - fprintf(f, "%s\n", ecore_file_get_file(ll->data)); - } - else - fprintf(f, "%s\n", ic->info.file); - } - } - fclose(f); - } for (ll = fsel; ll; ll = ll->next) { d = ecore_file_get_dir(ll->data); if (d) { - if (strcmp(d, sd->realpath)) + if (!strcmp(d, sd->realpath)) + { + printf("listrm %s\n", ecore_file_get_file(ll->data)); + _e_fm2_live_file_del(sd->obj, ecore_file_get_file(ll->data)); + } + else { snprintf(buf, sizeof(buf), "%s/%s", sd->realpath, ecore_file_get_file(ll->data)); @@ -2943,8 +2985,28 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) free(d); } } + if (sd->drop_after == 0) + { + for (ll = evas_list_last(fsel); ll; ll = ll->prev) + { + printf("listadd %s, before %s\n", ecore_file_get_file(ll->data), sd->drop_icon->info.file); + _e_fm2_live_file_add(sd->obj, + ecore_file_get_file(ll->data), + sd->drop_icon->info.file, 0); + } + } + else + { + for (ll = fsel; ll; ll = ll->next) + { + printf("listadd %s, after %s\n", ecore_file_get_file(ll->data), sd->drop_icon->info.file); + _e_fm2_live_file_add(sd->obj, + ecore_file_get_file(ll->data), + sd->drop_icon->info.file, 1); + } + } /* FIXME: disable refresh - modify icons in-place */ - e_fm2_refresh(sd->obj); /* refresh dst fm */ +// e_fm2_refresh(sd->obj); /* refresh dst fm */ } else /* no order file */ { @@ -2960,12 +3022,17 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) /* FIXME: error - file exists */ } else - ecore_file_mv(ll->data, buf); + { + if (ecore_file_mv(ll->data, buf)) + _e_fm2_live_file_add(sd->obj, + ecore_file_get_file(ll->data), + NULL, 0); + } } /* FIXME: disable refresh - modify icons in-place */ - refresh = 1; /* refresh src fm */ +// refresh = 1; /* refresh src fm */ /* FIXME: disable refresh - modify icons in-place */ - e_fm2_refresh(sd->obj); /* refresh dst fm */ +// e_fm2_refresh(sd->obj); /* refresh dst fm */ } } } @@ -2974,7 +3041,8 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) _e_fm2_dnd_drop_all_hide(sd->obj); /* FIXME: disable refresh */ for (l = _e_fm2_list; l; l = l->next) - _e_fm2_dnd_finish(l->data, refresh); +// _e_fm2_dnd_finish(l->data, refresh); + _e_fm2_dnd_finish(l->data, 0); } /* FIXME: prototype */ @@ -3712,7 +3780,7 @@ _e_fm2_cb_scan_idler(void *data) { len = strlen(buf); if ((len > 0) && (buf[len - 1] == '\n')) buf[len - 1] = 0; - _e_fm2_file_add(data, buf, 0); + _e_fm2_file_add(data, buf, 0, NULL, 0); } } else if (sd->dir) @@ -3723,7 +3791,7 @@ _e_fm2_cb_scan_idler(void *data) if ((!strcmp(dp->d_name, ".")) || (!strcmp(dp->d_name, ".."))) return 1; /* skip dotfiles if we're not showing hidden files */ if (dp->d_name[0] == '.' && !sd->show_hidden_files) return 1; - _e_fm2_file_add(data, dp->d_name, sd->order_file); + _e_fm2_file_add(data, dp->d_name, sd->order_file, NULL, 0); } return 1; @@ -3873,6 +3941,12 @@ _e_fm2_smart_del(Evas_Object *obj) sd = evas_object_smart_data_get(obj); if (!sd) return; + if (sd->monitor.monitor) + { + ecore_file_monitor_del(sd->monitor.monitor); + sd->monitor.monitor = NULL; + } + _e_fm2_live_process_end(obj); _e_fm2_scan_stop(obj); _e_fm2_queue_free(obj); _e_fm2_regions_free(obj); @@ -4384,6 +4458,7 @@ _e_fm2_new_directory_yes_cb(char *text, void *data) e_dialog_show(dialog); return; } +/* if (sd->order_file) { FILE *f; @@ -4396,9 +4471,11 @@ _e_fm2_new_directory_yes_cb(char *text, void *data) fclose(f); } } + */ + _e_fm2_live_file_add(sd->obj, text, NULL, 0); /* FIXME: disable refresh - modify icons in-place */ - if (sd->refresh_job) ecore_job_del(sd->refresh_job); - sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, sd->obj); +// if (sd->refresh_job) ecore_job_del(sd->refresh_job); +// sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, sd->obj); } } @@ -4472,9 +4549,6 @@ _e_fm2_file_rename_yes_cb(char *text, void *data) snprintf(oldpath, sizeof(oldpath), "%s/%s", ic->sd->realpath, ic->info.file); snprintf(newpath, sizeof(newpath), "%s/%s", ic->sd->realpath, text); } - evas_stringshare_del(ic->info.file); - ic->info.file = evas_stringshare_add(text); - if (!ecore_file_mv(oldpath, newpath)) { man = e_manager_current_get(); @@ -4494,11 +4568,14 @@ _e_fm2_file_rename_yes_cb(char *text, void *data) e_dialog_show(dialog); return; } - if (ic->sd->order_file) _e_fm2_order_file_rewrite(ic->sd->obj); - + _e_fm2_live_file_del(ic->sd->obj, ic->info.file); + _e_fm2_live_file_add(ic->sd->obj, text, NULL, 0); +// evas_stringshare_del(ic->info.file); +// ic->info.file = evas_stringshare_add(text); +// if (ic->sd->order_file) _e_fm2_order_file_rewrite(ic->sd->obj); /* FIXME: disable refresh - modify icons in-place */ - if (ic->sd->refresh_job) ecore_job_del(ic->sd->refresh_job); - ic->sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, ic->sd->obj); +// if (ic->sd->refresh_job) ecore_job_del(ic->sd->refresh_job); +// ic->sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, ic->sd->obj); } } @@ -4615,6 +4692,7 @@ _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog) } } else ici->deleted = 1; + _e_fm2_live_file_del(ic->sd->obj, ici->file); } } evas_list_free(sel); @@ -4649,13 +4727,14 @@ _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog) return; } } + _e_fm2_live_file_del(ic->sd->obj, ic->info.file); ic->info.deleted = 1; } - if (ic->sd->order_file) _e_fm2_order_file_rewrite(ic->sd->obj); +// if (ic->sd->order_file) _e_fm2_order_file_rewrite(ic->sd->obj); /* FIXME: disable refresh - modify icons in-place */ - if (ic->sd->refresh_job) ecore_job_del(ic->sd->refresh_job); - ic->sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, ic->sd->obj); +// if (ic->sd->refresh_job) ecore_job_del(ic->sd->refresh_job); +// ic->sd->refresh_job = ecore_job_add(_e_fm2_refresh_job_cb, ic->sd->obj); evas_object_smart_callback_call(ic->sd->obj, "files_deleted", NULL); } @@ -4680,3 +4759,236 @@ _e_fm2_refresh_job_cb(void *data) e_fm2_refresh(data); sd->refresh_job = NULL; } + + + + +static void +_e_fm2_live_file_add(Evas_Object *obj, char *file, char *file_rel, int after) +{ + E_Fm2_Smart_Data *sd; + E_Fm2_Action *a; + + sd = evas_object_smart_data_get(obj); + if (!sd) return; + a = E_NEW(E_Fm2_Action, 1); + if (!a) return; + sd->live.actions = evas_list_append(sd->live.actions, a); + a->type = FILE_ADD; + a->file = evas_stringshare_add(file); + if (file_rel) a->file2 = evas_stringshare_add(file_rel); + a->flags = after; + _e_fm2_live_process_begin(obj); +} + +static void +_e_fm2_live_file_del(Evas_Object *obj, char *file) +{ + E_Fm2_Smart_Data *sd; + E_Fm2_Action *a; + + sd = evas_object_smart_data_get(obj); + if (!sd) return; + a = E_NEW(E_Fm2_Action, 1); + if (!a) return; + sd->live.actions = evas_list_append(sd->live.actions, a); + a->type = FILE_DEL; + a->file = evas_stringshare_add(file); + _e_fm2_live_process_begin(obj); +} + +static void +_e_fm2_live_file_changed(Evas_Object *obj, char *file) +{ + E_Fm2_Smart_Data *sd; + E_Fm2_Action *a; + + sd = evas_object_smart_data_get(obj); + if (!sd) return; + a = E_NEW(E_Fm2_Action, 1); + if (!a) return; + sd->live.actions = evas_list_append(sd->live.actions, a); + a->type = FILE_CHANGE; + a->file = evas_stringshare_add(file); + _e_fm2_live_process_begin(obj); +} + +static void +_e_fm2_live_process_begin(Evas_Object *obj) +{ + E_Fm2_Smart_Data *sd; + + sd = evas_object_smart_data_get(obj); + if ((sd->order) || (sd->dir)) return; + if (!sd->live.actions) return; + if ((sd->live.idler) || (sd->live.timer) || + (sd->scan_idler) || (sd->scan_timer)) return; + sd->live.idler = ecore_idler_add(_e_fm2_cb_live_idler, obj); + sd->live.timer = ecore_timer_add(0.2, _e_fm2_cb_live_timer, obj); +} + +static void +_e_fm2_live_process_end(Evas_Object *obj) +{ + E_Fm2_Smart_Data *sd; + E_Fm2_Action *a; + + sd = evas_object_smart_data_get(obj); + while (sd->live.actions) + { + a = sd->live.actions->data; + sd->live.actions = evas_list_remove_list(sd->live.actions, sd->live.actions); + if (a->file) evas_stringshare_del(a->file); + if (a->file2) evas_stringshare_del(a->file2); + free(a); + } + if (sd->live.idler) + { + ecore_idler_del(sd->live.idler); + sd->live.idler = NULL; + } + if (sd->live.timer) + { + ecore_timer_del(sd->live.timer); + sd->live.timer = NULL; + } +} + +static void +_e_fm2_live_process(Evas_Object *obj) +{ + E_Fm2_Smart_Data *sd; + E_Fm2_Action *a; + Evas_List *l; + E_Fm2_Icon *ic; + + sd = evas_object_smart_data_get(obj); + if (!sd->live.actions) return; + a = sd->live.actions->data; + sd->live.actions = evas_list_remove_list(sd->live.actions, sd->live.actions); + switch (a->type) + { + case FILE_ADD: + /* new file to sort in place */ + _e_fm2_file_add(obj, a->file, 1, a->file2, a->flags); + break; + case FILE_DEL: + _e_fm2_file_del(obj, a->file); + sd->live.deletions = 1; + break; + case FILE_CHANGE: + for (l = sd->icons; l; l = l->next) + { + ic = l->data; + if (!strcmp(ic->info.file, a->file)) + { + int realized; + + realized = ic->realized; + if (realized) _e_fm2_icon_unrealize(ic); + _e_fm2_icon_unfill(ic); + _e_fm2_icon_fill(ic); + if (realized) _e_fm2_icon_realize(ic); + break; + } + } + break; + default: + break; + } + if (a->file) evas_stringshare_del(a->file); + if (a->file2) evas_stringshare_del(a->file2); + free(a); +} + +static int +_e_fm2_cb_live_idler(void *data) +{ + E_Fm2_Smart_Data *sd; + double t; + + sd = evas_object_smart_data_get(data); + t = ecore_time_get(); + do + { + if (!sd->live.actions) break; + _e_fm2_live_process(data); + } + while ((ecore_time_get() - t) > 0.02); + if (sd->live.actions) return 1; + _e_fm2_live_process_end(data); + _e_fm2_cb_live_timer(data); + if (sd->order_file) _e_fm2_order_file_rewrite(data); + return 0; +} + +static int +_e_fm2_cb_live_timer(void *data) +{ + E_Fm2_Smart_Data *sd; + + sd = evas_object_smart_data_get(data); + if (!sd) return 0; + if (sd->queue) _e_fm2_queue_process(data); + else if (sd->iconlist_changed) + { + if (sd->resize_job) ecore_job_del(sd->resize_job); + sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, sd->obj); + } + else + { + if (sd->live.deletions) + { + sd->iconlist_changed = 1; + if (sd->resize_job) ecore_job_del(sd->resize_job); + sd->resize_job = ecore_job_add(_e_fm2_cb_resize_job, sd->obj); + } + } + sd->live.deletions = 0; + sd->live.timer = NULL; + if ((!sd->queue) && (!sd->live.idler)) return 0; + sd->live.timer = ecore_timer_add(0.2, _e_fm2_cb_live_timer, data); + return 0; +} + +static void +_e_fm2_cb_file_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path) +{ + E_Fm2_Smart_Data *sd; + char *file; + Evas_List *l; + E_Fm2_Icon *ic; + + sd = evas_object_smart_data_get(data); + if (!sd) return; + file = (char *)ecore_file_get_file(path); + if (!strcmp(file, ".order")) + { + /* FIXME: for now, ignore, BUT later load up .order - compare with icon + * order in list and fi they differ - use new .order */ + } + else + { + if ((event == ECORE_FILE_EVENT_CREATED_FILE) || + (event == ECORE_FILE_EVENT_CREATED_DIRECTORY)) + { + _e_fm2_live_file_add(sd->obj, file, NULL, 0); + printf("FADD %s\n", file); + } + else if ((event == ECORE_FILE_EVENT_DELETED_FILE) || + (event == ECORE_FILE_EVENT_DELETED_DIRECTORY)) + { + _e_fm2_live_file_del(sd->obj, file); + printf("FDEL %s\n", file); + } + else if (event == ECORE_FILE_EVENT_MODIFIED) + { + _e_fm2_live_file_changed(sd->obj, file); + printf("FMOD %s\n", file); + } + else if (event == ECORE_FILE_EVENT_DELETED_SELF) + { + evas_object_smart_callback_call(sd->obj, "dir_deleted", NULL); + } + } +} diff --git a/src/bin/e_fm.h b/src/bin/e_fm.h index 95f80f3ec..996e72d5f 100644 --- a/src/bin/e_fm.h +++ b/src/bin/e_fm.h @@ -100,6 +100,7 @@ struct _E_Fm2_Icon_Info unsigned char mount : 1; unsigned char pseudo_link : 1; unsigned char deleted : 1; + unsigned char broken_link : 1; }; EAPI int e_fm2_init(void);