diff --git a/TODO b/TODO index 4fdf1fbd4..4c1af5f41 100644 --- a/TODO +++ b/TODO @@ -28,11 +28,6 @@ Some of the things (in very short form) that need to be done to E17... instead of in a straight line * exebuf on other zones doesn't allow mouse to work properly (only zone/screen 0 works properly) -* sometimes file monitoring for file changes, adds, deletes on a dir stops - working all of a sudden - unknown what causes it and why right now. -* e_apps wont pick up changes in favorite menu dirs made by the applications - config dialog after a while (i think once u get 1 app in it stops listening). - possibly the same bug as above with e_fm... * Need global unique identifier for gadcons, so that their config will move with them from one shelf to another. ]]] @@ -43,26 +38,42 @@ Some of the things (in very short form) that need to be done to E17... ------------------------------------------------------------------------------- * fm2 fwin windows need to use icon for that dir on window -* create a good app repository where the user can get applications from to ibar -* fm2 needs its fops to become async (in slave process and ipc to it) -* fm2 needs its file listing/stat()ing etc. to go into slave proc -* fm2 needs a right-click file properties dialog +* fm2 needs to use different theme elements for desktop +* fm2 theme needs to not suck +* fm2 custom icon view mode needs to have cleanup,align etc. +* fm2 custom icon view mode initial placement needs tome fixing +* fm2 fwin needs options for view mode +* fm2 needs a way to specify a multiplier, explicit size or "use original icon" + config per icon and per dir +* fm2 needs to fix its custom file info +* fm2 should remember scroll pos per dir +* fwin should have option to display full path +* fm2 thumbnails - should display an icon while generating thumb +* fm2 needs to be able to handle signals from the fm fwin theme wallpaper and +overlay - to exec or do things (eg go to parent) +* fm2 needs option to scale custom pos for icons (eg desktop) +* fm2 on desktop needs option to turn off and select which dir on which zone +* fm2 needs to show icons again if drag was aborted +* fm2 needs to handle dnd of e apps too +* fm2 slave needs to rate limit file changes/adds/dels +* need a default desktop file setup +* fm2 needs to auto-scroll if dnd hovers on edge of fm2 for a while +* fm2 needs spring-loaded folder opens +* fm2 needs to be able to specify dir customisations other than magic dot file +* fm2 needs to move, rename, delete etc. custom info correctly so it mimicks +the fs +* fm2 needs rubber band select in icon mode * fm2 needs to display symlink info on files somehow * fm2 needs to display more than 1 file being dragged (if more than 1 is being dragged) * fm2 needs a way of mapping a internal e actions to do (like add as wallpaper etc.) -* fm2 needs a way to use custom icons per dir/file * 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 to not unrealize then re-realize on resort/arraneg - keep objects around. * fm2 needs a mime/extension/glob filter -* fm2 will pop up tonnes of error dialogs if u try delete a lot of files in a - tree you can't delete - fix to make this a dialog with a log etc. * dnd needs to do xdnd properly. -* fm2 needs icon views (auto-arrange, snap to grid and free placement), for - fwin windows and the desktop * language packs: need to have a tool to load/setup a language pack (which means .mo compiled files from a .po, an optional font and a config file that specifies the locale and font) and then install the font(s) either as a user @@ -137,7 +148,6 @@ Some of the things (in very short form) that need to be done to E17... that overlay the screen * pager should be able to be configured to control more than the current zone (select which zone they control) -* icons for all config panel items * icons for most mime types ]]] diff --git a/data/themes/default_fileman.edc b/data/themes/default_fileman.edc index 6e5d3b9a3..0d116b60a 100644 --- a/data/themes/default_fileman.edc +++ b/data/themes/default_fileman.edc @@ -6000,6 +6000,727 @@ group { } } +group { + name: "e/fileman/scrollframe/desktop"; + parts { +/* + part { + name: "bg"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + } + */ + part { + name: "clipper"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { +// to: "bg"; + } + rel2 { +// to: "bg"; + } + } + } + part { + name: "e.swallow.content"; + clip_to: "clipper"; + type: SWALLOW; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel2 { + relative: 0.0 0.0; + offset: -1 -1; + to_x: "sb_vbar"; + to_y: "sb_hbar"; + } + } + } + part { + name: "conf_over"; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { +// to: "bg"; + offset: -5 -5; + } + rel2 { +// to: "bg"; + offset: 4 4; + } + image { + normal: "e17_ibar_over_v.png"; + border: 13 13 13 13; + middle: 0; + } + fill { + smooth : 0; + } + } + } + part { + name: "sb_vbar"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + min: 16 16; + align: 1.0 0.0; + rel1 { +// to: "bg"; + relative: 1.0 0.0; + offset: -1 0; + } + rel2 { +// to: "bg"; + relative: 1.0 0.0; + offset: -1 -1; + to_y: "sb_hbar"; + } + } + description { + state: "hidden" 0.0; + visible: 0; + max: 0 99999; + rel1 { +// to: "bg"; + relative: 1.0 0.0; + offset: 0 0; + } + rel2 { +// to: "bg"; + relative: 1.0 0.0; + offset: 0 -1; + to_y: "sb_hbar"; + } + } + } + part { + name: "sb_vbar_base"; + type: RECT; + clip_to: "sb_vbar"; + mouse_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { + relative: 0.0 1.0; + offset: 0 0; + to: "sb_vbar_a1"; + } + rel2 { + relative: 1.0 0.0; + offset: -1 -1; + to: "sb_vbar_a2"; + } + } + } + part { + name: "sb_vbar_runner"; + clip_to: "sb_vbar"; + mouse_events: 0; + description { + state: "default" 0.0; + max: 2 99999; + rel1 { + to: "sb_vbar_base"; + } + rel2 { + to: "sb_vbar_base"; + } + image { + normal: "e17_sb_runnerv.png"; + border: 0 0 4 4; + } + fill { + smooth: 0; + } + } + } + part { + name: "sb_vbar_p1"; + type: RECT; + clip_to: "sb_vbar"; + mouse_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { + relative: 0.0 1.0; + offset: 0 0; + to: "sb_vbar_a1"; + } + rel2 { + relative: 1.0 0.0; + offset: -1 -1; + to: "e.dragable.vbar"; + } + } + } + part { + name: "sb_vbar_p2"; + type: RECT; + clip_to: "sb_vbar"; + mouse_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { + relative: 0.0 1.0; + offset: 0 0; + to: "e.dragable.vbar"; + } + rel2 { + relative: 1.0 0.0; + offset: -1 -1; + to: "sb_vbar_a2"; + } + } + } + part { + name: "e.dragable.vbar"; + clip_to: "sb_vbar"; + mouse_events: 1; + dragable { + x: 0 0 0; + y: 1 1 0; + confine: "sb_vbar_base"; + } + description { + state: "default" 0.0; + min: 16 16; + rel1 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_vbar_base"; + } + rel2 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_vbar_base"; + } + image { + normal: "e17_sb_barv1.png"; + border: 5 5 5 5; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "e17_sb_barv2.png"; + } + } + } + part { + name: "vbar_bar_thumb"; + clip_to: "sb_vbar"; + mouse_events: 0; + description { + state: "default" 0.0; + max: 8 8; + min: 8 8; + rel1 { + to: "e.dragable.vbar"; + } + rel2 { + to: "e.dragable.vbar"; + } + image { + normal: "e17_scrollbar_vdrag_thumb.png"; + } + } + } + part { + name: "sb_vbar_a1"; + type: IMAGE; + mouse_events: 1; + clip_to: "sb_vbar"; + description { + state: "default" 0.0; + align: 0.5 0.0; + aspect: 1.0 1.0; + aspect_preference: HORIZONTAL; + rel1 { + to: "sb_vbar"; + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + to: "sb_vbar"; + relative: 1.0 0.0; + offset: -1 0; + } + image { + normal: "e17_sb_btu1.png"; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "e17_sb_btu2.png"; + } + } + } + part { + name: "sb_vbar_a2"; + type: IMAGE; + mouse_events: 1; + clip_to: "sb_vbar"; + description { + state: "default" 0.0; + align: 0.5 1.0; + aspect: 1.0 1.0; + aspect_preference: HORIZONTAL; + rel1 { + to: "sb_vbar"; + relative: 0.0 1.0; + offset: 0 -1; + } + rel2 { + to: "sb_vbar"; + relative: 1.0 1.0; + offset: -1 -1; + } + image { + normal: "e17_sb_btd1.png"; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "e17_sb_btd2.png"; + } + } + } + part { + name: "sb_hbar"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + min: 16 16; + align: 0.0 1.0; + rel1 { +// to: "bg"; + relative: 0.0 1.0; + offset: 0 -1; + } + rel2 { +// to: "bg"; + relative: 0.0 1.0; + offset: -1 -1; + to_x: "sb_vbar"; + } + } + description { + state: "hidden" 0.0; + visible: 0; + rel1 { +// to: "bg"; + relative: 0.0 1.0; + offset: 0 0; + } + rel2 { +// to: "bg"; + relative: 0.0 1.0; + offset: -1 0; + to_x: "sb_vbar"; + } + } + } + part { + name: "sb_hbar_base"; + type: RECT; + clip_to: "sb_hbar"; + mouse_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { + relative: 1.0 0.0; + offset: 0 0; + to: "sb_hbar_a1"; + } + rel2 { + relative: 0.0 1.0; + offset: -1 -1; + to: "sb_hbar_a2"; + } + } + } + part { + name: "sb_hbar_runner"; + clip_to: "sb_hbar"; + mouse_events: 0; + description { + state: "default" 0.0; + max: 99999 2; + rel1 { + to: "sb_hbar_base"; + } + rel2 { + to: "sb_hbar_base"; + } + image { + normal: "e17_sb_runnerh.png"; + border: 4 4 0 0; + } + fill { + smooth: 0; + } + } + } + part { + name: "sb_hbar_p1"; + type: RECT; + clip_to: "sb_hbar"; + mouse_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { + relative: 1.0 0.0; + offset: 0 0; + to: "sb_hbar_a1"; + } + rel2 { + relative: 0.0 1.0; + offset: -1 -1; + to: "e.dragable.hbar"; + } + } + } + part { + name: "sb_hbar_p2"; + type: RECT; + clip_to: "sb_hbar"; + mouse_events: 1; + description { + state: "default" 0.0; + color: 0 0 0 0; + rel1 { + relative: 1.0 0.0; + offset: 0 0; + to: "e.dragable.hbar"; + } + rel2 { + relative: 0.0 1.0; + offset: -1 -1; + to: "sb_hbar_a2"; + } + } + } + part { + name: "e.dragable.hbar"; + clip_to: "sb_hbar"; + mouse_events: 1; + dragable { + x: 1 1 0; + y: 0 0 0; + confine: "sb_hbar_base"; + } + description { + state: "default" 0.0; + min: 16 16; + rel1 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_hbar_base"; + } + rel2 { + relative: 0.5 0.5; + offset: 0 0; + to: "sb_hbar_base"; + } + image { + normal: "e17_sb_barh1.png"; + border: 5 5 5 5; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "e17_sb_barh2.png"; + } + } + } + part { + name: "hbar_bar_thumb"; + clip_to: "sb_hbar"; + mouse_events: 0; + description { + state: "default" 0.0; + max: 8 8; + min: 8 8; + rel1 { + to: "e.dragable.hbar"; + } + rel2 { + to: "e.dragable.hbar"; + } + image { + normal: "e17_scrollbar_hdrag_thumb.png"; + } + } + } + part { + name: "sb_hbar_a1"; + type: IMAGE; + mouse_events: 1; + clip_to: "sb_hbar"; + description { + state: "default" 0.0; + align: 0.0 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + rel1 { + to: "sb_hbar"; + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + to: "sb_hbar"; + relative: 0.0 1.0; + offset: 0 -1; + } + image { + normal: "e17_sb_btl1.png"; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "e17_sb_btl2.png"; + } + } + } + part { + name: "sb_hbar_a2"; + type: IMAGE; + mouse_events: 1; + clip_to: "sb_hbar"; + description { + state: "default" 0.0; + align: 1.0 0.5; + aspect: 1.0 1.0; + aspect_preference: VERTICAL; + rel1 { + to: "sb_hbar"; + relative: 1.0 0.0; + offset: -1 0; + } + rel2 { + to: "sb_hbar"; + relative: 1.0 1.0; + offset: -1 -1; + } + image { + normal: "e17_sb_btr1.png"; + } + } + description { + state: "clicked" 0.0; + inherit: "default" 0.0; + image { + normal: "e17_sb_btr2.png"; + } + } + } + part { + name: "e.swallow.overlay"; + type: SWALLOW; + mouse_events: 0; + description { + state: "default" 0.0; + } + } + } + programs { + program { + name: "sb_vbar_show"; + signal: "e,action,show,vbar"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "sb_vbar"; + } + program { + name: "sb_vbar_hide"; + signal: "e,action,hide,vbar"; + source: "e"; + action: STATE_SET "hidden" 0.0; + target: "sb_vbar"; + } + program { + name: "sb_hbar_show"; + signal: "e,action,show,hbar"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "sb_hbar"; + } + program { + name: "sb_hbar_hide"; + signal: "e,action,hide,hbar"; + source: "e"; + action: STATE_SET "hidden" 0.0; + target: "sb_hbar"; + } + + program { + name: "sb_vbar_a1_down"; + signal: "mouse,down,1"; + source: "sb_vbar_a1"; + action: STATE_SET "clicked" 0.0; + target: "sb_vbar_a1"; + } + program { + name: "sb_vbar_a1_down2"; + signal: "mouse,down,1"; + source: "sb_vbar_a1"; + action: DRAG_VAL_STEP 0.0 -1.0; + target: "e.dragable.vbar"; + } + program { + name: "sb_vbar_a1_up"; + signal: "mouse,up,1"; + source: "sb_vbar_a1"; + action: STATE_SET "default" 0.0; + target: "sb_vbar_a1"; + } + program { + name: "sb_vbar_a2_down"; + signal: "mouse,down,1"; + source: "sb_vbar_a2"; + action: STATE_SET "clicked" 0.0; + target: "sb_vbar_a2"; + } + program { + name: "sb_vbar_a2_down2"; + signal: "mouse,down,1"; + source: "sb_vbar_a2"; + action: DRAG_VAL_STEP 0.0 1.0; + target: "e.dragable.vbar"; + } + program { + name: "sb_vbar_a2_up"; + signal: "mouse,up,1"; + source: "sb_vbar_a2"; + action: STATE_SET "default" 0.0; + target: "sb_vbar_a2"; + } + program { + name: "sb_vbar_p1_down"; + signal: "mouse,down,1"; + source: "sb_vbar_p1"; + action: DRAG_VAL_PAGE 0.0 -1.0; + target: "e.dragable.vbar"; + } + program { + name: "sb_vbar_p2_down"; + signal: "mouse,down,1"; + source: "sb_vbar_p2"; + action: DRAG_VAL_PAGE 0.0 1.0; + target: "e.dragable.vbar"; + } + program { + name: "sb_vbar_down"; + signal: "mouse,down,1"; + source: "e.dragable.vbar"; + action: STATE_SET "clicked" 0.0; + target: "e.dragable.vbar"; + } + program { + name: "sb_vbar_up"; + signal: "mouse,up,1"; + source: "e.dragable.vbar"; + action: STATE_SET "default" 0.0; + target: "e.dragable.vbar"; + } + program { + name: "sb_hbar_a1_down"; + signal: "mouse,down,1"; + source: "sb_hbar_a1"; + action: STATE_SET "clicked" 0.0; + target: "sb_hbar_a1"; + } + program { + name: "sb_hbar_a1_down2"; + signal: "mouse,down,1"; + source: "sb_hbar_a1"; + action: DRAG_VAL_STEP -1.0 0.0; + target: "e.dragable.hbar"; + } + program { + name: "sb_hbar_a1_up"; + signal: "mouse,up,1"; + source: "sb_hbar_a1"; + action: STATE_SET "default" 0.0; + target: "sb_hbar_a1"; + } + program { + name: "sb_hbar_a2_down"; + signal: "mouse,down,1"; + source: "sb_hbar_a2"; + action: STATE_SET "clicked" 0.0; + target: "sb_hbar_a2"; + } + program { + name: "sb_hbar_a2_down2"; + signal: "mouse,down,1"; + source: "sb_hbar_a2"; + action: DRAG_VAL_STEP 1.0 0.0; + target: "e.dragable.hbar"; + } + program { + name: "sb_hbar_a2_up"; + signal: "mouse,up,1"; + source: "sb_hbar_a2"; + action: STATE_SET "default" 0.0; + target: "sb_hbar_a2"; + } + program { + name: "sb_hbar_p1_down"; + signal: "mouse,down,1"; + source: "sb_hbar_p1"; + action: DRAG_VAL_PAGE -1.0 0.0; + target: "e.dragable.hbar"; + } + program { + name: "sb_hbar_p2_down"; + signal: "mouse,down,1"; + source: "sb_hbar_p2"; + action: DRAG_VAL_PAGE 1.0 0.0; + target: "e.dragable.hbar"; + } + program { + name: "sb_hbar_down"; + signal: "mouse,down,1"; + source: "e.dragable.hbar"; + action: STATE_SET "clicked" 0.0; + target: "e.dragable.hbar"; + } + program { + name: "sb_hbar_up"; + signal: "mouse,up,1"; + source: "e.dragable.hbar"; + action: STATE_SET "default" 0.0; + target: "e.dragable.hbar"; + } + } +} + diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index f777710ad..27c3214a8 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -526,6 +526,12 @@ e_fm2_custom_theme_set(Evas_Object *obj, const char *path) sd->custom_theme = evas_stringshare_add(path); else sd->custom_theme = NULL; + _e_fm2_theme_edje_object_set(sd, sd->drop, "base/theme/fileman", + "e/fileman/list/drop_between"); + _e_fm2_theme_edje_object_set(sd, sd->drop_in, "base/theme/fileman", + "e/fileman/list/drop_in"); + _e_fm2_theme_edje_object_set(sd, sd->overlay, "base/theme/fileman", + "e/fileman/overlay"); } EAPI void @@ -1890,10 +1896,12 @@ _e_fm2_dev_path_map(const char *dev, const char *path) if (!strcmp(path, "/")) { PRT("%s/Desktop", s); + ecore_file_mkpath(buf); } else { PRT("%s/Desktop-%s", s, path); + ecore_file_mkpath(buf); } } else if (CMP("dvd") || CMP("dvd-*")) { @@ -6502,7 +6510,6 @@ _e_fm2_theme_edje_object_set(E_Fm2_Smart_Data *sd, Evas_Object *o, const char *c { if (sd->custom_theme) { - /* FIXME: need a way of caching what elements are and are not in the custom theme */ if (edje_object_file_set(o, sd->custom_theme, group)) return 1; } if (sd->custom_theme) diff --git a/src/bin/e_fm_main.c b/src/bin/e_fm_main.c index 8f7523603..77ef78dc4 100644 --- a/src/bin/e_fm_main.c +++ b/src/bin/e_fm_main.c @@ -36,9 +36,11 @@ #define DEF_SYNC_NUM 8 #define DEF_ROUND_TRIP 0.05 #define DEF_ROUND_TRIP_TOLERANCE 0.01 +#define DEF_MOD_BACKOFF 0.2 typedef struct _E_Dir E_Dir; typedef struct _E_Fop E_Fop; +typedef struct _E_Mod E_Mod; struct _E_Dir { @@ -53,6 +55,9 @@ struct _E_Dir int sync; double sync_time; int sync_num; + Evas_List *recent_mods; + Ecore_Timer *recent_clean; + unsigned char cleaning : 1; }; struct _E_Fop @@ -69,6 +74,16 @@ struct _E_Fop void *data; }; +struct _E_Mod +{ + const char *path; + double timestamp; + unsigned char add : 1; + unsigned char del : 1; + unsigned char mod : 1; + unsigned char done : 1; +}; + /* local subsystem functions */ static int _e_ipc_init(void); static int _e_ipc_cb_server_add(void *data, int type, void *event); @@ -76,12 +91,13 @@ static int _e_ipc_cb_server_del(void *data, int type, void *event); static int _e_ipc_cb_server_data(void *data, int type, void *event); static void _e_cb_file_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path); +static int _e_cb_recent_clean(void *data); -static void _e_file_add_mod(int id, const char *path, int op, int listing); -static void _e_file_add(int id, const char *path, int listing); -static void _e_file_del(int id, const char *path); -static void _e_file_mod(int id, const char *path); -static void _e_file_mon_dir_del(int id, const char *path); +static void _e_file_add_mod(E_Dir *ed, const char *path, int op, int listing); +static void _e_file_add(E_Dir *ed, const char *path, int listing); +static void _e_file_del(E_Dir *ed, const char *path); +static void _e_file_mod(E_Dir *ed, const char *path); +static void _e_file_mon_dir_del(E_Dir *ed, const char *path); static void _e_file_mon_list_sync(E_Dir *ed); static int _e_cb_file_mon_list_idler(void *data); @@ -91,6 +107,7 @@ static int _e_cb_fop_mv_idler(void *data); static int _e_cb_fop_cp_idler(void *data); static char *_e_str_list_remove(Evas_List **list, char *str); static void _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y); +static void _e_dir_del(E_Dir *ed); /* local subsystem globals */ static Ecore_Ipc_Server *_e_ipc_server = NULL; @@ -224,9 +241,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event) dir = opendir(e->data); if (!dir) { + E_Dir ted; + /* we can't open the dir - tell E the dir is deleted as * we can't look in it */ - _e_file_mon_dir_del(e->ref, e->data); + memset(&ted, 0, sizeof(E_Dir)); + ted.id = e->ref; + _e_file_mon_dir_del(&ted, e->data); } else { @@ -244,13 +265,11 @@ _e_ipc_cb_server_data(void *data, int type, void *event) { /* if no previous monitoring dir exists - this one * becomes the master monitor enty */ - printf("MON %s\n", ed->dir); ed->mon = ecore_file_monitor_add(ed->dir, _e_cb_file_monitor, ed); ed->mon_ref = 1; } else { - printf("REF ORIG\n"); /* an existing monitor exists - ref it up */ ed->mon_real = ped; ped->mon_ref++; @@ -296,6 +315,7 @@ _e_ipc_cb_server_data(void *data, int type, void *event) files = f2; } } + ed->fq = files; /* FIXME: if .order file- load it, sort all items int it * that are in files then just append whatever is left in * alphabetical order @@ -314,14 +334,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event) else snprintf(buf, sizeof(buf), "%s/.order", (char *)e->data); if (evas_list_count(files) == 1) - _e_file_add(ed->id, buf, 2); + _e_file_add(ed, buf, 2); else - _e_file_add(ed->id, buf, 1); + _e_file_add(ed, buf, 1); } /* send empty file - indicate empty dir */ - if (!files) _e_file_add(ed->id, "", 2); + if (!files) _e_file_add(ed, "", 2); /* and in an idler - list files, statting them etc. */ - ed->fq = files; ed->idler = ecore_idler_add(_e_cb_file_mon_list_idler, ed); ed->sync_num = DEF_SYNC_NUM; } @@ -343,56 +362,24 @@ _e_ipc_cb_server_data(void *data, int type, void *event) * real one */ if (ed->mon_real) { - printf("UNREF ORIG\n"); /* unref original monitor node */ ed->mon_real->mon_ref--; if (ed->mon_real->mon_ref == 0) { - printf("FREE ORIG\n"); /* original is at 0 ref - free it */ - evas_stringshare_del(ed->mon_real->dir); - if (ed->mon_real->idler) - ecore_idler_del(ed->mon_real->idler); - while (ed->mon_real->fq) - { - free(ed->mon_real->fq->data); - ed->mon_real->fq = evas_list_remove_list(ed->mon_real->fq, ed->mon_real->fq); - } - free(ed->mon_real); + _e_dir_del(ed->mon_real); ed->mon_real = NULL; } - printf("FREE THIS\n"); /* free this node */ - evas_stringshare_del(ed->dir); - if (ed->idler) ecore_idler_del(ed->idler); - while (ed->fq) - { - free(ed->fq->data); - ed->fq = evas_list_remove_list(ed->fq, ed->fq); - } - free(ed); + _e_dir_del(ed); } /* this is a core monitoring node - remove ref */ else { - printf("UNREF\n"); ed->mon_ref--; /* we are the last ref - free */ - if (ed->mon_ref == 0) - { - printf("UNMON %s\n", ed->dir); - ecore_file_monitor_del(ed->mon); - evas_stringshare_del(ed->dir); - if (ed->idler) ecore_idler_del(ed->idler); - while (ed->fq) - { - free(ed->fq->data); - ed->fq = evas_list_remove_list(ed->fq, ed->fq); - } - free(ed); - } + if (ed->mon_ref == 0) _e_dir_del(ed); } - printf("REMOVE FROM LIST\n"); /* remove from dirs list anyway */ _e_dirs = evas_list_remove_list(_e_dirs, l); break; @@ -593,17 +580,13 @@ _e_cb_file_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, c if ((event == ECORE_FILE_EVENT_CREATED_FILE) || (event == ECORE_FILE_EVENT_CREATED_DIRECTORY)) { - printf("CREATE %s\n", path); rp = ecore_file_realpath(dir); for (l = _e_dirs; l; l = l->next) { ed = l->data; drp = ecore_file_realpath(ed->dir); if (!strcmp(rp, drp)) - { - printf("file add %s\n", path); - _e_file_add(ed->id, path, 0); - } + _e_file_add(ed, path, 0); free(drp); } free(rp); @@ -611,14 +594,13 @@ _e_cb_file_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, c else if ((event == ECORE_FILE_EVENT_DELETED_FILE) || (event == ECORE_FILE_EVENT_DELETED_DIRECTORY)) { - printf("DEL %s\n", path); rp = ecore_file_realpath(dir); for (l = _e_dirs; l; l = l->next) { ed = l->data; drp = ecore_file_realpath(ed->dir); if (!strcmp(rp, drp)) - _e_file_del(ed->id, path); + _e_file_del(ed, path); } free(rp); } @@ -630,7 +612,7 @@ _e_cb_file_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, c ed = l->data; drp = ecore_file_realpath(ed->dir); if (!strcmp(rp, drp)) - _e_file_mod(ed->id, path); + _e_file_mod(ed, path); } free(rp); } @@ -642,15 +624,46 @@ _e_cb_file_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, c ed = l->data; drp = ecore_file_realpath(ed->dir); if (!strcmp(rp, drp)) - _e_file_mon_dir_del(ed->id, path); + _e_file_mon_dir_del(ed, path); } free(rp); } free(dir); } +static int +_e_cb_recent_clean(void *data) +{ + E_Dir *ed; + Evas_List *l, *pl; + E_Mod *m; + double t_now; + + ed = data; + ed->cleaning = 1; + t_now = ecore_time_get(); + for (l = ed->recent_mods; l;) + { + m = l->data; + pl = l; + l = l->next; + if ((m->mod) && ((t_now - m->timestamp) >= DEF_MOD_BACKOFF)) + { + ed->recent_mods = evas_list_remove_list(ed->recent_mods, pl); + if (!m->done) _e_file_add_mod(ed, m->path, 5, 0); + evas_stringshare_del(m->path); + free(m); + } + } + ed->cleaning = 0; + if (ed->recent_mods) return 1; + ed->recent_clean = NULL; + return 0; +} + + static void -_e_file_add_mod(int id, const char *path, int op, int listing) +_e_file_add_mod(E_Dir *ed, const char *path, int op, int listing) { struct stat st; char *lnk = NULL, *rlnk = NULL; @@ -661,7 +674,46 @@ _e_file_add_mod(int id, const char *path, int op, int listing) * * stat_info[stat size] + broken_link[1] + path[n]\0 + lnk[n]\0 + rlnk[n]\0 */ [sizeof(struct stat) + 1 + 4096 + 4096 + 4096]; - + + /* FIXME: handle BACKOFF */ + if ((!listing) && (op == 5) && (!ed->cleaning)) /* 5 == mod */ + { + Evas_List *l; + E_Mod *m; + double t_now; + int skip = 0; + + t_now = ecore_time_get(); + for (l = ed->recent_mods; l; l = l->next) + { + m = l->data; + if ((m->mod) && (!strcmp(m->path, path))) + { + if ((t_now - m->timestamp) < DEF_MOD_BACKOFF) + { + m->done = 0; + skip = 1; + } + } + } + if (!skip) + { + m = calloc(1, sizeof(E_Mod)); + m->path = evas_stringshare_add(path); + m->mod = 1; + m->done = 1; + m->timestamp = t_now; + ed->recent_mods = evas_list_append(ed->recent_mods, m); + } + if ((!ed->recent_clean) && (ed->recent_mods)) + ed->recent_clean = ecore_timer_add(DEF_MOD_BACKOFF, _e_cb_recent_clean, ed); + if (skip) + { +// printf("SKIP MOD %s %3.3f\n", path, t_now); + return; + } + } +// printf("MOD %s %3.3f\n", path, ecore_time_get()); lnk = ecore_file_readlink(path); if (stat(path, &st) == -1) { @@ -694,40 +746,50 @@ _e_file_add_mod(int id, const char *path, int op, int listing) p += strlen(rlnk) + 1; bsz = p - buf; - ecore_ipc_server_send(_e_ipc_server, 6/*E_IPC_DOMAIN_FM*/, op, 0, id, + ecore_ipc_server_send(_e_ipc_server, 6/*E_IPC_DOMAIN_FM*/, op, 0, ed->id, listing, buf, bsz); if (lnk) free(lnk); if (rlnk) free(rlnk); } static void -_e_file_add(int id, const char *path, int listing) +_e_file_add(E_Dir *ed, const char *path, int listing) { - _e_file_add_mod(id, path, 3, listing);/*file add*/ + if (!listing) + { + /* FIXME: handle BACKOFF */ + } + _e_file_add_mod(ed, path, 3, listing);/*file add*/ } static void -_e_file_del(int id, const char *path) +_e_file_del(E_Dir *ed, const char *path) { + { + /* FIXME: handle BACKOFF */ + } ecore_ipc_server_send(_e_ipc_server, 6/*E_IPC_DOMAIN_FM*/, 4/*file del*/, - 0, id, 0, (void *)path, strlen(path) + 1); + 0, ed->id, 0, (void *)path, strlen(path) + 1); } static void -_e_file_mod(int id, const char *path) +_e_file_mod(E_Dir *ed, const char *path) { - _e_file_add_mod(id, path, 5, 0);/*file change*/ + { + /* FIXME: handle BACKOFF */ + } + _e_file_add_mod(ed, path, 5, 0);/*file change*/ } static void -_e_file_mon_dir_del(int id, const char *path) +_e_file_mon_dir_del(E_Dir *ed, const char *path) { ecore_ipc_server_send(_e_ipc_server, 6/*E_IPC_DOMAIN_FM*/, 6/*mon dir del*/, - 0, id, 0, (void *)path, strlen(path) + 1); + 0, ed->id, 0, (void *)path, strlen(path) + 1); } static void @@ -764,9 +826,9 @@ _e_cb_file_mon_list_idler(void *data) if ((!ed->fq->next) || ((!strcmp(ed->fq->next->data, ".order")) && (!ed->fq->next->next))) - _e_file_add(ed->id, buf, 2); + _e_file_add(ed, buf, 2); else - _e_file_add(ed->id, buf, 1); + _e_file_add(ed, buf, 1); } free(file); ed->fq = evas_list_remove_list(ed->fq, ed->fq); @@ -1158,14 +1220,12 @@ _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y) if (!strcmp(f, rel)) return; d = ecore_file_get_dir(path); if (!d) return; - printf("_e_path_fix_order(%s, %s, %i, %i, %i)\n", path, rel, rel_to, x, y); snprintf(buf, sizeof(buf), "%s/.order", d); if (ecore_file_exists(buf)) { FILE *fh; Evas_List *files = NULL, *l; - printf(".order exists\n"); fh = fopen(buf, "r"); if (fh) { @@ -1186,7 +1246,6 @@ _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y) { if (!strcmp(l->data, f)) { - printf("REMOVE\n"); free(l->data); files = evas_list_remove_list(files, l); break; @@ -1197,7 +1256,6 @@ _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y) { if (!strcmp(l->data, rel)) { - printf("INSERT %s\n", (char *)l->data); if (rel_to == 2) /* replace */ { free(l->data); @@ -1220,7 +1278,6 @@ _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y) { while (files) { - printf("W %s\n", (char *)files->data); fprintf(fh, "%s\n", (char *)files->data); free(files->data); files = evas_list_remove_list(files, files); @@ -1230,3 +1287,27 @@ _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y) } free(d); } + +static void +_e_dir_del(E_Dir *ed) +{ + evas_stringshare_del(ed->dir); + if (ed->idler) ecore_idler_del(ed->idler); + if (ed->recent_clean) + ecore_timer_del(ed->recent_clean); + while (ed->recent_mods) + { + E_Mod *m; + + m = ed->recent_mods->data; + evas_stringshare_del(m->path); + free(m); + ed->recent_mods = evas_list_remove_list(ed->recent_mods, ed->recent_mods); + } + while (ed->fq) + { + free(ed->fq->data); + ed->fq = evas_list_remove_list(ed->fq, ed->fq); + } + free(ed); +} diff --git a/src/bin/e_fwin.c b/src/bin/e_fwin.c index e8605cf04..1ecc19f0b 100644 --- a/src/bin/e_fwin.c +++ b/src/bin/e_fwin.c @@ -225,16 +225,6 @@ e_fwin_zone_new(E_Zone *zone, const char *dev, const char *path) if (!fwin) return NULL; fwin->zone = zone; fwins = evas_list_append(fwins, fwin); -/* - e_win_resize_callback_set(fwin->win, _e_fwin_cb_resize); - fwin->win->data = fwin; - - o = edje_object_add(e_win_evas_get(fwin->win)); - e_theme_edje_object_set(o, "base/theme/fileman", - "e/fileman/window/main"); - evas_object_show(o); - fwin->bg_obj = o; -*/ o = e_fm2_add(zone->container->bg_evas); fwin->fm_obj = o; @@ -294,7 +284,7 @@ e_fwin_zone_new(E_Zone *zone, const char *dev, const char *path) * to specify the .edj files to get the list and icon theme stuff from */ e_scrollframe_custom_theme_set(o, "base/theme/fileman", - "e/fileman/scrollframe/default"); + "e/fileman/scrollframe/desktop"); evas_object_data_set(fwin->fm_obj, "fwin", fwin); e_scrollframe_extern_pan_set(o, fwin->fm_obj, _e_fwin_pan_set, @@ -307,39 +297,17 @@ e_fwin_zone_new(E_Zone *zone, const char *dev, const char *path) evas_object_resize(fwin->scrollframe_obj, fwin->zone->w, fwin->zone->h); evas_object_show(o); -/* - o = edje_object_add(e_win_evas_get(fwin->win)); - edje_object_part_swallow(fwin->bg_obj, "e.swallow.bg", o); - evas_object_pass_events_set(o, 1); - fwin->under_obj = o; - - o = edje_object_add(e_win_evas_get(fwin->win)); - edje_object_part_swallow(e_scrollframe_edje_object_get(fwin->scrollframe_obj), "e.swallow.overlay", o); - evas_object_pass_events_set(o, 1); - fwin->over_obj = o; - */ - e_fm2_window_object_set(fwin->fm_obj, E_OBJECT(fwin->zone)); evas_object_focus_set(fwin->fm_obj, 1); e_fm2_path_set(fwin->fm_obj, dev, path); -/* - snprintf(buf, sizeof(buf), "_fwin::/%s", e_fm2_real_path_get(fwin->fm_obj)); - e_win_name_class_set(fwin->win, "E", buf); - */ file = ecore_file_get_file(e_fm2_real_path_get(fwin->fm_obj)); if (file) snprintf(buf, sizeof(buf), "%s", file); else snprintf(buf, sizeof(buf), "%s", e_fm2_real_path_get(fwin->fm_obj)); -/* - e_win_title_set(fwin->win, buf); - e_win_size_min_set(fwin->win, 24, 24); - e_win_resize(fwin->win, 280, 200); - e_win_show(fwin->win); - */ return fwin; } diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index 90f0cb253..71225e283 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -656,10 +656,22 @@ _e_zone_free(E_Zone *zone) free(zone); } +static void +_e_zone_cb_fwin_del(void *obj) +{ + E_Zone *zone; + + zone = (E_Zone *)e_object_data_get(E_OBJECT(obj)); + if (!zone) return; + zone->bg_fwin = NULL; +} + static void _e_zone_fm_add(E_Zone *zone, const char *dev, const char *path) { zone->bg_fwin = e_fwin_zone_new(zone, dev, path); + e_object_data_set(E_OBJECT(zone->bg_fwin), zone); + e_object_del_attach_func_set(E_OBJECT(zone->bg_fwin), _e_zone_cb_fwin_del); } static void