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 000000000..7c6e0b4bc Binary files /dev/null and b/data/images/enlightenment.png differ diff --git a/data/xsession/enlightenment.desktop.in b/data/xsession/enlightenment.desktop.in index 03fad55a3..45ac012b9 100644 --- a/data/xsession/enlightenment.desktop.in +++ b/data/xsession/enlightenment.desktop.in @@ -3,5 +3,6 @@ Encoding=UTF-8 Name=Enlightenment Comment=Log in using Enlightenment (Version @VERSION@) Type=XSession +Icon=@prefix@/share/enlightenment/data/images/enlightenment.png Exec=@prefix@/bin/enlightenment_start TryExec=@prefix@/bin/enlightenment_start diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index f03905b2e..6a6b365c6 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -8,7 +8,7 @@ /* FIXME: display symlinks in icons somehow */ /* FIXME: bug: drag multiple files doesnt display all files being dragged only 1 icon shown to be dragged (instead of at least a group) */ -/* FIXME: need a mapping of mimietype to actions to do on the file +/* FIXME: need a mapping of mimetype to actions to do on the file * (e actions like import as wallpaper etc. as well as execute app * X on the file based on what mimetypes the app handles) */ /* FIXME: use edje messages & embryo for scrolling of bg's */ @@ -20,9 +20,17 @@ * custom frames or icons yet */ +typedef enum +{ + FILE_ADD, + FILE_DEL, + FILE_CHANGE +} E_Fm2_Action_Type; + typedef struct _E_Fm2_Smart_Data E_Fm2_Smart_Data; typedef struct _E_Fm2_Region E_Fm2_Region; typedef struct _E_Fm2_Icon E_Fm2_Icon; +typedef struct _E_Fm2_Action E_Fm2_Action; struct _E_Fm2_Smart_Data { @@ -80,6 +88,17 @@ struct _E_Fm2_Smart_Data int iter; } tmp; + struct { + Evas_List *actions; + Ecore_Idler *idler; + Ecore_Timer *timer; + unsigned char deletions : 1; + } live; + + struct { + Ecore_File_Monitor *monitor; + } monitor; + struct { char *buf; } typebuf; @@ -130,8 +149,16 @@ struct _E_Fm2_Icon unsigned char down_sel : 1; }; +struct _E_Fm2_Action +{ + E_Fm2_Action_Type type; + char *file; + char *file2; + int flags; +}; + static const char *_e_fm2_dev_path_map(const char *dev, const char *path); -static void _e_fm2_file_add(Evas_Object *obj, char *file, int unique); +static void _e_fm2_file_add(Evas_Object *obj, char *file, int unique, char *file_rel, int after); static void _e_fm2_file_del(Evas_Object *obj, char *file); static void _e_fm2_scan_start(Evas_Object *obj); static void _e_fm2_scan_stop(Evas_Object *obj); @@ -145,6 +172,8 @@ static void _e_fm2_regions_eval(Evas_Object *obj); static void _e_fm2_config_free(E_Fm2_Config *cfg); static E_Fm2_Icon *_e_fm2_icon_new(E_Fm2_Smart_Data *sd, char *file); +static void _e_fm2_icon_unfill(E_Fm2_Icon *ic); +static int _e_fm2_icon_fill(E_Fm2_Icon *ic); static void _e_fm2_icon_free(E_Fm2_Icon *ic); static void _e_fm2_icon_realize(E_Fm2_Icon *ic); static void _e_fm2_icon_unrealize(E_Fm2_Icon *ic); @@ -233,6 +262,16 @@ static void _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog); static void _e_fm2_file_delete_no_cb(void *data, E_Dialog *dialog); static void _e_fm2_refresh_job_cb(void *data); +static void _e_fm2_live_file_add(Evas_Object *obj, char *file, char *file_rel, int after); +static void _e_fm2_live_file_del(Evas_Object *obj, char *file); +static void _e_fm2_live_file_changed(Evas_Object *obj, char *file); +static void _e_fm2_live_process_begin(Evas_Object *obj); +static void _e_fm2_live_process_end(Evas_Object *obj); +static void _e_fm2_live_process(Evas_Object *obj); +static int _e_fm2_cb_live_idler(void *data); +static int _e_fm2_cb_live_timer(void *data); +static void _e_fm2_cb_file_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path); + static char *_e_fm2_meta_path = NULL; static Evas_Smart *_e_fm2_smart = NULL; static Evas_List *_e_fm2_list = NULL; @@ -734,7 +773,7 @@ _e_fm2_dev_path_map(const char *dev, const char *path) } static void -_e_fm2_file_add(Evas_Object *obj, char *file, int unique) +_e_fm2_file_add(Evas_Object *obj, char *file, int unique, char *file_rel, int after) { E_Fm2_Smart_Data *sd; E_Fm2_Icon *ic, *ic2; @@ -751,7 +790,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; } } @@ -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);