diff --git a/src/bin/e_config.c b/src/bin/e_config.c index 4489b8f95..e06515f2f 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -587,6 +587,8 @@ e_config_init(void) E_CONFIG_VAL(D, T, thumbscroll_momentum_threshhold, DOUBLE); E_CONFIG_VAL(D, T, thumbscroll_friction, DOUBLE); + E_CONFIG_VAL(D, T, hal_desktop, INT); + e_config = e_config_domain_load("e", _e_config_edd); if (e_config) { @@ -763,6 +765,7 @@ e_config_init(void) e_config->display_res_hz = 0; e_config->display_res_rotation = 0; + e_config->hal_desktop = 1; { E_Config_Module *em; diff --git a/src/bin/e_config.h b/src/bin/e_config.h index c8edfcd03..683b65054 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -286,6 +286,8 @@ struct _E_Config int thumbscroll_threshhold; double thumbscroll_momentum_threshhold; double thumbscroll_friction; + + int hal_desktop; }; struct _E_Config_Module diff --git a/src/bin/e_dnd.c b/src/bin/e_dnd.c index 1f757c301..c5d002b73 100644 --- a/src/bin/e_dnd.c +++ b/src/bin/e_dnd.c @@ -19,10 +19,11 @@ static void _e_drag_show(E_Drag *drag); static void _e_drag_hide(E_Drag *drag); static void _e_drag_move(E_Drag *drag, int x, int y); static void _e_drag_coords_update(E_Drop_Handler *h, int *dx, int *dy, int *dw, int *dh); +static Ecore_X_Window _e_drag_win_get(E_Drop_Handler *h, int xdnd); static int _e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win, int xdnd); static void _e_drag_win_show(E_Drop_Handler *h); static void _e_drag_win_hide(E_Drop_Handler *h); -static void _e_drag_update(Ecore_X_Window root, int x, int y); +static int _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action); static void _e_drag_end(Ecore_X_Window root, int x, int y); static void _e_drag_xdnd_end(Ecore_X_Window root, int x, int y); static void _e_drag_free(E_Drag *drag); @@ -62,6 +63,9 @@ static E_Drag *_drag_current = NULL; static XDnd *_xdnd = NULL; +static Evas_Hash *_drop_handlers_responsives; +static Ecore_X_Atom _action; + /* externally accessible functions */ EAPI int @@ -98,6 +102,8 @@ e_dnd_init(void) _event_handlers = evas_list_append(_event_handlers, ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY, _e_dnd_cb_event_dnd_selection, NULL)); + + _action = ECORE_X_ATOM_XDND_ACTION_PRIVATE; return 1; } @@ -128,6 +134,8 @@ e_dnd_shutdown(void) evas_list_free(_drop_handlers); _drop_handlers = NULL; + evas_hash_free(_drop_handlers_responsives); + return 1; } @@ -491,6 +499,36 @@ e_drag_idler_before(void) } } +EAPI void +e_drop_handler_responsive_set(E_Drop_Handler *handler) +{ + Ecore_X_Window hwin = _e_drag_win_get(handler, 1); + const char *wid = e_util_winid_str_get(hwin); + + _drop_handlers_responsives = evas_hash_add(_drop_handlers_responsives, wid, (void *)handler); +} + +EAPI int +e_drop_handler_responsive_get(E_Drop_Handler *handler) +{ + Ecore_X_Window hwin = _e_drag_win_get(handler, 1); + const char *wid = e_util_winid_str_get(hwin); + + return evas_hash_find(_drop_handlers_responsives, wid) == (void *)handler; +} + +EAPI void +e_drop_handler_action_set(Ecore_X_Atom action) +{ + _action = action; +} + +EAPI Ecore_X_Atom +e_drop_handler_action_get() +{ + return _action; +} + /* local subsystem functions */ static void @@ -574,8 +612,8 @@ _e_drag_coords_update(E_Drop_Handler *h, int *dx, int *dy, int *dw, int *dh) *dy += py; } -static int -_e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win, int xdnd) +static Ecore_X_Window +_e_drag_win_get(E_Drop_Handler *h, int xdnd) { Ecore_X_Window hwin = 0; @@ -608,6 +646,15 @@ _e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win, int xdnd) break; } } + + return hwin; +} + +static int +_e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win, int xdnd) +{ + Ecore_X_Window hwin = _e_drag_win_get(h, xdnd); + if (win == hwin) return 1; return 0; } @@ -660,8 +707,8 @@ _e_drag_win_hide(E_Drop_Handler *h) } } -static void -_e_drag_update(Ecore_X_Window root, int x, int y) +static int +_e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action) { Evas_List *l; E_Event_Dnd_Enter enter_ev; @@ -669,6 +716,7 @@ _e_drag_update(Ecore_X_Window root, int x, int y) E_Event_Dnd_Leave leave_ev; int dx, dy, dw, dh; Ecore_X_Window win, ignore_win[2]; + int responsive = 0; // double t1 = ecore_time_get(); //// if (_drag_current) @@ -702,12 +750,16 @@ _e_drag_update(Ecore_X_Window root, int x, int y) enter_ev.x = x - dx; enter_ev.y = y - dy; enter_ev.data = NULL; + enter_ev.action = action; move_ev.x = x - dx; move_ev.y = y - dy; + move_ev.action = action; leave_ev.x = x - dx; leave_ev.y = y - dy; if (E_INSIDE(x, y, dx, dy, dw, dh) && _e_drag_win_matches(h, win, 0)) { + if(e_drop_handler_responsive_get(h)) responsive = 1; + if (!h->entered) { _e_drag_win_show(h); @@ -750,12 +802,16 @@ _e_drag_update(Ecore_X_Window root, int x, int y) _e_drag_coords_update(h, &dx, &dy, &dw, &dh); enter_ev.x = x - dx; enter_ev.y = y - dy; + enter_ev.action = action; move_ev.x = x - dx; move_ev.y = y - dy; + move_ev.action = action; leave_ev.x = x - dx; leave_ev.y = y - dy; if (E_INSIDE(x, y, dx, dy, dw, dh) && _e_drag_win_matches(h, win, 1)) { + if(e_drop_handler_responsive_get(h)) responsive = 1; + if (!h->entered) { if (h->cb.enter) @@ -776,6 +832,10 @@ _e_drag_update(Ecore_X_Window root, int x, int y) } } } + + if(action == ECORE_X_ATOM_ATOM) responsive = 0; + + return responsive; // double t2 = ecore_time_get() - t1; //// // printf("DND UPDATE %3.7f\n", t2); //// } @@ -1009,7 +1069,7 @@ _e_dnd_cb_mouse_move(void *data, int type, void *event) ev = event; if (ev->win != _drag_win) return 1; - _e_drag_update(_drag_win_root, ev->x, ev->y); + _e_drag_update(_drag_win_root, ev->x, ev->y, ECORE_X_ATOM_ATOM); return 1; } @@ -1133,10 +1193,13 @@ _e_dnd_cb_event_dnd_position(void *data, int type, void *event) { Ecore_X_Event_Xdnd_Position *ev; Ecore_X_Rectangle rect; + Ecore_X_Action action; const char *id; + const char *description = NULL; Evas_List *l; int active; + int responsive; ev = event; // double t1 = ecore_time_get(); //// @@ -1153,6 +1216,8 @@ _e_dnd_cb_event_dnd_position(void *data, int type, void *event) rect.width = 0; rect.height = 0; + action = ev->action; + active = 0; for (l = _drop_handlers; l; l = l->next) { @@ -1171,8 +1236,15 @@ _e_dnd_cb_event_dnd_position(void *data, int type, void *event) } else { - _e_drag_update(ev->win, ev->position.x, ev->position.y); - ecore_x_dnd_send_status(1, 0, rect, ECORE_X_DND_ACTION_PRIVATE); + responsive = _e_drag_update(ev->win, ev->position.x, ev->position.y, ev->action); + if(responsive) + { + ecore_x_dnd_send_status(1, 0, rect, _action); + } + else + { + ecore_x_dnd_send_status(1, 0, rect, ECORE_X_ATOM_XDND_ACTION_PRIVATE); + } } // double t2 = ecore_time_get() - t1; //// // printf("DND POS EV 2 %3.7f\n", t2); //// diff --git a/src/bin/e_dnd.h b/src/bin/e_dnd.h index 365952388..069d0da12 100644 --- a/src/bin/e_dnd.h +++ b/src/bin/e_dnd.h @@ -84,11 +84,13 @@ struct _E_Event_Dnd_Enter { void *data; int x, y; + Ecore_X_Atom action; }; struct _E_Event_Dnd_Move { int x, y; + Ecore_X_Atom action; }; struct _E_Event_Dnd_Leave @@ -135,6 +137,10 @@ EAPI void e_drop_handler_geometry_set(E_Drop_Handler *handler, int x, int y, int EAPI int e_drop_inside(E_Drop_Handler *handler, int x, int y); EAPI void e_drop_handler_del(E_Drop_Handler *handler); EAPI int e_drop_xdnd_register_set(Ecore_X_Window win, int reg); +EAPI void e_drop_handler_responsive_set(E_Drop_Handler *handler); +EAPI int e_drop_handler_responsive_get(E_Drop_Handler *handler); +EAPI void e_drop_handler_action_set(Ecore_X_Atom action); +EAPI Ecore_X_Atom e_drop_handler_action_get(); #endif #endif diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index 561f687d1..c8b83811e 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -350,17 +350,20 @@ static void _e_fm2_client_spawn(void); static E_Fm2_Client *_e_fm2_client_get(void); static int _e_fm2_client_monitor_add(const char *path); static void _e_fm2_client_monitor_del(int id, const char *path); -static int _e_fm2_client_file_del(const char *path); +static int _e_fm_client_file_del(const char *args); static int _e_fm2_client_file_trash(const char *path); static int _e_fm2_client_file_mkdir(const char *path, const char *rel, int rel_to, int x, int y, int res_w, int res_h); -static int _e_fm2_client_file_move(const char *path, const char *dest, const char *rel, int rel_to, int x, int y, int res_w, int res_h); +static int _e_fm_client_file_move(const char *args); static int _e_fm2_client_file_symlink(const char *path, const char *dest, const char *rel, int rel_to, int x, int y, int res_w, int res_h); -static int _e_fm2_client_file_copy(const char *path, const char *dest, const char *rel, int rel_to, int x, int y, int res_w, int res_h); +static int _e_fm_client_file_copy(const char *args); static void _e_fm2_sel_rect_update(void *data); static inline void _e_fm2_context_menu_append(Evas_Object *obj, const char *path, Evas_List *l, E_Menu *mn, E_Fm2_Icon *ic); static int _e_fm2_context_list_sort(void *data1, void *data2); +static char *_e_fm_string_append_char(char *str, size_t *size, size_t *len, char c); +static char *_e_fm_string_append_quoted(char *str, size_t *size, size_t *len, const char *src); + static char *_e_fm2_meta_path = NULL; static Evas_Smart *_e_fm2_smart = NULL; static Evas_List *_e_fm2_list = NULL; @@ -982,6 +985,7 @@ e_fm2_window_object_set(Evas_Object *obj, E_Object *eobj) _e_fm2_cb_dnd_leave, _e_fm2_cb_dnd_drop, drop, 3, sd->x, sd->y, sd->w, sd->h); + e_drop_handler_responsive_set(sd->drop_handler); } EAPI void @@ -1622,28 +1626,13 @@ _e_fm2_client_monitor_add(const char *path) static void _e_fm2_client_monitor_del(int id, const char *path) { - E_Fm2_Client *cl; - - cl = _e_fm2_client_get(); - if (!cl) - { - _e_fm2_client_message_queue(E_IPC_DOMAIN_FM, E_FM_OP_MONITOR_END, - id, 0, 0, - (void *)path, strlen(path) + 1); - } - else - { - ecore_ipc_client_send(cl->cl, E_IPC_DOMAIN_FM, E_FM_OP_MONITOR_END, - id, 0, 0, - (void *)path, strlen(path) + 1); - cl->req++; - } + _e_fm_client_send(E_FM_OP_MONITOR_END, id, (void *)path, strlen(path) + 1); } static int -_e_fm2_client_file_del(const char *path) +_e_fm_client_file_del(const char *files) { - return _e_fm_client_send_new(E_FM_OP_REMOVE, (void *)path, strlen(path) + 1); + return _e_fm_client_send_new(E_FM_OP_REMOVE, (void *)files, strlen(files) + 1); } static int @@ -1672,43 +1661,9 @@ _e_fm2_client_file_mkdir(const char *path, const char *rel, int rel_to, int x, i } static int -_e_fm2_client_file_move(const char *path, const char *dest, const char *rel, int rel_to, int x, int y, int res_w, int res_h) +_e_fm_client_file_move(const char *args) { - char *d; - int l1, l2, l3, l; - - l1 = strlen(path); - l2 = strlen(dest); - l3 = strlen(rel); - l = l1 + 1 + l2 + 1 + l3 + 1 + (sizeof(int) * 3); - d = alloca(l); - strcpy(d, path); - strcpy(d + l1 + 1, dest); - strcpy(d + l1 + 1 + l2 + 1, rel); - memcpy(d + l1 + 1 + l2 + 1 + l3 + 1, &rel_to, sizeof(int)); - memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + sizeof(int), &x, sizeof(int)); - memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + (2 * sizeof(int)), &y, sizeof(int)); - - if ((x != -9999) && (y != -9999)) - { - E_Fm2_Custom_File *cf, cf0; - - cf = e_fm2_custom_file_get(dest); - if (!cf) - { - memset(&cf0, 0, sizeof(E_Fm2_Custom_File)); - cf = &cf0; - } - cf->geom.x = x; - cf->geom.y = y; - cf->geom.res_w = res_w; - cf->geom.res_h = res_h; - cf->geom.valid = 1; - e_fm2_custom_file_set(dest, cf); - e_fm2_custom_file_flush(); - } - - return _e_fm_client_send_new(E_FM_OP_MOVE, (void *)d, l); + return _e_fm_client_send_new(E_FM_OP_MOVE, (void *)args, strlen(args) + 1); } static int @@ -1753,43 +1708,9 @@ _e_fm2_client_file_symlink(const char *path, const char *dest, const char *rel, } static int -_e_fm2_client_file_copy(const char *path, const char *dest, const char *rel, int rel_to, int x, int y, int res_w, int res_h) +_e_fm_client_file_copy(const char *args) { - char *d; - int l1, l2, l3, l; - - l1 = strlen(path); - l2 = strlen(dest); - l3 = strlen(rel); - l = l1 + 1 + l2 + 1 + l3 + 1 + (sizeof(int) * 3); - d = alloca(l); - strcpy(d, path); - strcpy(d + l1 + 1, dest); - strcpy(d + l1 + 1 + l2 + 1, rel); - memcpy(d + l1 + 1 + l2 + 1 + l3 + 1, &rel_to, sizeof(int)); - memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + sizeof(int), &x, sizeof(int)); - memcpy(d + l1 + 1 + l2 + 1 + l3 + 1 + (2 * sizeof(int)), &y, sizeof(int)); - - if ((x != -9999) && (y != -9999)) - { - E_Fm2_Custom_File *cf, cf0; - - cf = e_fm2_custom_file_get(dest); - if (!cf) - { - memset(&cf0, 0, sizeof(E_Fm2_Custom_File)); - cf = &cf0; - } - cf->geom.x = x; - cf->geom.y = y; - cf->geom.res_w = res_w; - cf->geom.res_h = res_h; - cf->geom.valid = 1; - e_fm2_custom_file_set(dest, cf); - e_fm2_custom_file_flush(); - } - - return _e_fm_client_send_new(E_FM_OP_COPY, (void *)d, l); + return _e_fm_client_send_new(E_FM_OP_COPY, (void *)args, strlen(args) + 1); } EAPI int @@ -2130,6 +2051,7 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) if (s) e_fm2_hal_storage_add(s); } break; + case E_FM_OP_STORAGE_DEL:/*storage del*/ if ((e->data) && (e->size > 0)) { @@ -2151,6 +2073,7 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) if (v) e_fm2_hal_volume_add(v); } break; + case E_FM_OP_VOLUME_DEL:/*volume del*/ if ((e->data) && (e->size > 0)) { @@ -2175,6 +2098,7 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) if (v) e_fm2_hal_mount_add(v, mountpoint); } break; + case E_FM_OP_UNMOUNT_DONE:/*unmount done*/ if ((e->data) && (e->size > 1)) { @@ -2190,6 +2114,8 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) v->mount_point = NULL; } } + break; + case E_FM_OP_ERROR:/*error*/ printf("%s:%s(%d) Error from slave #%d: %s\n", __FILE__, __FUNCTION__, __LINE__, e->ref, e->data); _e_fm_error_dialog(e->ref, e->data); @@ -2208,14 +2134,24 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e) case E_FM_OP_PROGRESS:/*progress*/ { int percent, seconds; + size_t done, total; + char *src = NULL; + char *dst = NULL; + void *p = e->data; - if (!e->data || e->size != 2 * sizeof(int)) return; + if (!e->data) return; - percent = *(int *)e->data; - seconds = *(int *)(e->data + sizeof(int)); - printf("%s:%s(%d) Progress from slave #%d: %d%% done, %d seconds left.\n", __FILE__, __FUNCTION__, __LINE__, e->ref, percent, seconds); - break; +#define UP(value, type) (value) = *(type *)p; p += sizeof(type) + UP(percent, int); + UP(seconds, int); + UP(done, size_t); + UP(total, size_t); +#undef UP + src = p; + dst = p + strlen(src) + 1; + printf("%s:%s(%d) Progress from slave #%d:\n\t%d%% done,\n\t%d seconds left,\n\t%lu done,\n\t%lu total,\n\tsrc = %s,\n\tdst = %s.\n", __FILE__, __FUNCTION__, __LINE__, e->ref, percent, seconds, done, total, src, dst); } + break; default: break; @@ -2538,20 +2474,20 @@ _e_fm2_file_paste(void *data, E_Menu *m, E_Menu_Item *mi) E_Fm2_Smart_Data *sd; Evas_List *paths; const char *dirpath; + const char *filepath; + size_t length = 0; + size_t size = 0; + char *args = NULL; sd = data; if (!sd) return; + /* Convert URI list to a list of real paths. */ paths = _e_fm2_uri_path_list_get(_e_fm_file_buffer); - dirpath = e_fm2_real_path_get(sd->obj); while (paths) { - char *filepath; - const char *filename; - char buf[PATH_MAX]; - int protect = 0; - + /* Get file's full path. */ filepath = evas_list_data(paths); if (!filepath) { @@ -2559,30 +2495,38 @@ _e_fm2_file_paste(void *data, E_Menu *m, E_Menu_Item *mi) continue; } - filename = ecore_file_file_get(filepath); - snprintf(buf, sizeof(buf), "%s/%s", dirpath, filename); - protect = e_filereg_file_protected(filepath); - - if (protect) + /* Check if file is protected. */ + if (e_filereg_file_protected(filepath)) { evas_stringshare_del(filepath); paths = evas_list_remove_list(paths, paths); continue; } + + /* Put filepath into a string of args. + * If there are more files, put an additional space. + */ + args = _e_fm_string_append_quoted(args, &size, &length, filepath); + args = _e_fm_string_append_char(args, &size, &length, ' '); - if (_e_fm_file_buffer_copying) - { - _e_fm2_client_file_copy(filepath, buf, "", 0, - -9999, -9999, sd->w, sd->h); - } - else if (_e_fm_file_buffer_cutting) - { - _e_fm2_client_file_move(filepath, buf, "", 0, - -9999, -9999, sd->w, sd->h); - } evas_stringshare_del(filepath); paths = evas_list_remove_list(paths, paths); } + + /* Add destination to the arguments. */ + args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath); + + /* Roll the operation! */ + if(_e_fm_file_buffer_copying) + { + _e_fm_client_file_copy(args); + } + else + { + _e_fm_client_file_move(args); + } + + free(args); } static void @@ -3229,7 +3173,7 @@ _e_fm2_uri_escape(const char *path) dest[i] = *p; else { - snprintf(&(dest[i]), 4, "%%%02X", *p); + snprintf(&(dest[i]), 4, "%%%02X", (unsigned char)*p); i += 2; } } @@ -4560,6 +4504,7 @@ _e_fm2_cb_dnd_enter(void *data, const char *type, void *event) if (strcmp(type, "text/uri-list")) return; ev = (E_Event_Dnd_Enter *)event; printf("DND IN %i %i\n", ev->x, ev->y); + e_drop_handler_action_set(ev->action); } static void @@ -4575,6 +4520,7 @@ _e_fm2_cb_dnd_move(void *data, const char *type, void *event) if (strcmp(type, "text/uri-list")) return; ev = (E_Event_Dnd_Move *)event; printf("DND MOVE %i %i\n", ev->x, ev->y); + e_drop_handler_action_set(ev->action); for (l = sd->icons; l; l = l->next) /* FIXME: should only walk regions and skip non-visible ones */ { ic = l->data; @@ -4688,6 +4634,151 @@ _e_fm2_cb_dnd_leave(void *data, const char *type, void *event) _e_fm2_dnd_drop_all_hide(sd->obj); } +static void +_e_fm_file_reorder(const char *file, const char *dst, const char *relative, int after) +{ + unsigned int length = strlen(file) + 1 + strlen(dst) + 1 + strlen(relative) + 1 + sizeof(after); + void *data, *p; + + data = alloca(length); + if(!data) return; + + p = data; + +#define P(s) memcpy(p, s, strlen(s) + 1); p += strlen(s) + 1 + P(file); + P(dst); + P(relative); +#undef P + + memcpy(p, &after, sizeof(int)); + + _e_fm_client_send_new(E_FM_OP_REORDER, data, length); +} + +static void +_e_fm_icon_save_position(const char *file, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +{ + E_Fm2_Custom_File *cf, new; + + if(!file) return; + + cf = e_fm2_custom_file_get(file); + if(!cf) + { + memset(&new, 0, sizeof(E_Fm2_Custom_File)); + cf = &new; + } + + cf->geom.x = x; + cf->geom.y = y; + cf->geom.res_w = w; + cf->geom.res_h = h; + + cf->geom.valid = 1; + e_fm2_custom_file_set(file, cf); + e_fm2_custom_file_flush(); +} + +static void +_e_fm_drop_menu_copy_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + char *args = data; + + if(!data) return; + + _e_fm_client_file_copy(args); +} + +static void +_e_fm_drop_menu_move_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + char *args = data; + + if(!data) return; + + _e_fm_client_file_move(args); +} + +static void +_e_fm_drop_menu_abort_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + char *args = data; + + if(!data) return; +} + +static void +_e_fm_drop_menu_post_cb(void *data, E_Menu *m) +{ + char *args = data; + + if(!data) return; + + free(args); +} + +static void +_e_fm_drop_menu(char *args) +{ + E_Menu *menu = e_menu_new(); + E_Menu_Item *item = NULL; + E_Manager *man = NULL; + E_Container *con = NULL; + E_Zone *zone = NULL; + int x, y; + + if(!menu) return; + + item = e_menu_item_new(menu); + e_menu_item_label_set(item, _("Copy")); + e_menu_item_callback_set(item, _e_fm_drop_menu_copy_cb, args); + e_menu_item_icon_edje_set(item, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/copy"), + "e/fileman/default/button/copy"); + + item = e_menu_item_new(menu); + e_menu_item_label_set(item, _("Move")); + e_menu_item_callback_set(item, _e_fm_drop_menu_move_cb, args); + e_menu_item_icon_edje_set(item, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/move"), + "e/fileman/default/button/move"); + + item = e_menu_item_new(menu); + e_menu_item_label_set(item, _("Abort")); + e_menu_item_callback_set(item, _e_fm_drop_menu_abort_cb, args); + e_menu_item_icon_edje_set(item, + e_theme_edje_file_get("base/theme/fileman", + "e/fileman/default/button/abort"), + "e/fileman/default/button/abort"); + + man = e_manager_current_get(); + if (!man) + { + e_object_del(E_OBJECT(menu)); + return; + } + con = e_container_current_get(man); + if (!con) + { + e_object_del(E_OBJECT(menu)); + return; + } + ecore_x_pointer_xy_get(con->win, &x, &y); + zone = e_util_zone_current_get(man); + if (!zone) + { + e_object_del(E_OBJECT(menu)); + return; + } + e_menu_post_deactivate_callback_set(menu, _e_fm_drop_menu_post_cb, args); + e_menu_activate_mouse(menu, zone, + x, y, 1, 1, + E_MENU_POP_DIRECTION_DOWN, 0); +} + static void _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) { @@ -4699,6 +4790,11 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) const char *fp; Evas_Coord dx, dy, ox, oy, x, y; int adjust_icons = 0; + + char dirpath[PATH_MAX]; + char *args = NULL; + size_t size = 0; + size_t length = 0; sd = data; if (!type) return; @@ -4750,24 +4846,24 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) ic = il->data; fp = ll->data; if (!fp) continue; - snprintf(buf, sizeof(buf), "%s/%s", - sd->realpath, ecore_file_file_get(fp)); - printf("mv %s %s\n", (char *)fp, buf); + if ((ic) && (sd->config->view.mode == E_FM2_VIEW_MODE_CUSTOM_ICONS)) { /* dnd doesnt tell me all the co-ords of the icons being dragged so i can't place them accurately. * need to fix this. ev->data probably needs to become more compelx than a list of url's */ x = ev->x + (ic->x - ox) - ic->drag.x + sd->pos.x; - y = ev->y + (ic->y - oy) - ic->drag.y + sd->pos.y;//ic->y - oy - dy + ev->y + sd->pos.y; + y = ev->y + (ic->y - oy) - ic->drag.y + sd->pos.y; + if (x < 0) x = 0; if (y < 0) y = 0; + if (sd->config->view.fit_custom_pos) { if ((x + ic->w) > sd->w) x = (sd->w - ic->w); if ((y + ic->h) > sd->h) y = (sd->h - ic->h); } - _e_fm2_client_file_move(fp, buf, "", 0, x, y, sd->w, sd->h); + if (ic->sd == sd) { ic->x = x; @@ -4775,11 +4871,15 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) ic->saved_pos = 1; adjust_icons = 1; } + + snprintf(buf, sizeof(buf), "%s/%s", + sd->realpath, ecore_file_file_get(fp)); + _e_fm_icon_save_position(buf, x, y, sd->w, sd->h); } - else - { - _e_fm2_client_file_move(fp, buf, "", 0, -9999, -9999, sd->w, sd->h); - } + + args = _e_fm_string_append_quoted(args, &size, &length, fp); + args = _e_fm_string_append_char(args, &size, &length, ' '); + evas_stringshare_del(fp); } if (adjust_icons) @@ -4795,6 +4895,8 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) _e_fm2_obj_icons_place(sd); evas_object_smart_callback_call(sd->obj, "changed", NULL); } + + args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath); } else if (sd->drop_icon) /* inot or before/after an icon */ { @@ -4811,76 +4913,44 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) snprintf(buf, sizeof(buf), "%s/%s/%s", sd->realpath, sd->drop_icon->info.file, ecore_file_file_get(fp)); printf("mv %s %s\n", (char *)fp, buf); - _e_fm2_client_file_move(fp, buf, "", 0, -9999, -9999, sd->w, sd->h); + + args = _e_fm_string_append_quoted(args, &size, &length, fp); + args = _e_fm_string_append_char(args, &size, &length, ' '); + evas_stringshare_del(fp); } + + snprintf(dirpath, sizeof(dirpath), "%s/%s", sd->realpath, sd->drop_icon->info.file); + args = _e_fm_string_append_quoted(args, &size, &length, dirpath); } else { - if (sd->config->view.mode == E_FM2_VIEW_MODE_LIST) /* list */ + if (sd->config->view.mode == E_FM2_VIEW_MODE_LIST && sd->order_file) /* list */ { - if (sd->order_file) /* there is an order file */ + for (ll = fsel, il = isel; ll && il; ll = ll->next, il = il->next) { - if (sd->drop_after) + ic = il->data; + fp = ll->data; + if (!fp) continue; + snprintf(buf, sizeof(buf), "%s/%s", + sd->realpath, ecore_file_file_get(fp)); + if (sd->config->view.link_drop) { - for (ll = fsel, il = isel; ll && il; ll = ll->next, il = il->next) - { - ic = il->data; - fp = ll->data; - if (!fp) continue; - snprintf(buf, sizeof(buf), "%s/%s", - sd->realpath, ecore_file_file_get(fp)); - if (sd->config->view.link_drop) - { - printf("ln -s %s %s\n", (char *)fp, buf); - _e_fm2_client_file_symlink(buf, fp, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->h, sd->h); - } - else - { - printf("mv %s %s\n", (char *)fp, buf); - _e_fm2_client_file_move(fp, buf, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->w, sd->h); - } - evas_stringshare_del(fp); - } + printf("ln -s %s %s\n", (char *)fp, buf); + _e_fm2_client_file_symlink(buf, fp, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->h, sd->h); } else { - for (ll = fsel, il = isel; ll && il; ll = ll->next, il = il->next) - { - ic = il->data; - fp = ll->data; - if (!fp) continue; - snprintf(buf, sizeof(buf), "%s/%s", - sd->realpath, ecore_file_file_get(fp)); - if (sd->config->view.link_drop) - { - printf("ln -s %s %s\n", (char *)fp, buf); - _e_fm2_client_file_symlink(buf, fp, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->w, sd->h); - } - else - { - printf("mv %s %s\n", (char *)fp, buf); - _e_fm2_client_file_move(fp, buf, sd->drop_icon->info.file, sd->drop_after, -9999, -9999, sd->w, sd->h); - } - evas_stringshare_del(fp); - } - } - } - else /* no order file */ - { - for (ll = fsel, il = isel; ll && il; ll = ll->next, il = il->next) - { - ic = il->data; - fp = ll->data; - if (!fp) continue; - /* move the file into the subdir */ - snprintf(buf, sizeof(buf), "%s/%s", - sd->realpath, ecore_file_file_get(fp)); - printf("mv %s %s\n", (char *)fp, buf); - _e_fm2_client_file_move(fp, buf, "", 0, -9999, -9999, sd->w, sd->h); - evas_stringshare_del(fp); + args = _e_fm_string_append_quoted(args, &size, &length, fp); + args = _e_fm_string_append_char(args, &size, &length, ' '); } + + _e_fm_file_reorder(ecore_file_file_get(fp), sd->realpath, sd->drop_icon->info.file, sd->drop_after); + + evas_stringshare_del(fp); } + + args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath); } else { @@ -4889,17 +4959,32 @@ _e_fm2_cb_dnd_drop(void *data, const char *type, void *event) ic = il->data; fp = ll->data; if (!fp) continue; - /* move the file into the subdir */ - snprintf(buf, sizeof(buf), "%s/%s", - sd->realpath, ecore_file_file_get(fp)); - printf("mv %s %s\n", (char *)fp, buf); - _e_fm2_client_file_move(fp, buf, "", 0, -9999, -9999, sd->w, sd->h); + + args = _e_fm_string_append_quoted(args, &size, &length, fp); + args = _e_fm_string_append_char(args, &size, &length, ' '); + evas_stringshare_del(fp); } + args = _e_fm_string_append_quoted(args, &size, &length, sd->realpath); } } } + if(e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_COPY) + { + _e_fm_client_file_copy(args); + free(args); + } + else if(e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_MOVE) + { + _e_fm_client_file_move(args); + free(args); + } + else if(e_drop_handler_action_get() == ECORE_X_ATOM_XDND_ACTION_ASK) + { + _e_fm_drop_menu(args); + } + _e_fm2_dnd_drop_hide(sd->obj); _e_fm2_dnd_drop_all_hide(sd->obj); _e_fm2_list_walking++; @@ -6953,8 +7038,11 @@ static void _e_fm2_file_rename_yes_cb(char *text, void *data) { E_Fm2_Icon *ic; - char newpath[4096]; - char oldpath[4096]; + char oldpath[PATH_MAX]; + char newpath[PATH_MAX]; + char *args = NULL; + size_t size = 0; + size_t length = 0; ic = data; ic->entry_dialog = NULL; @@ -6963,7 +7051,13 @@ _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); if (e_filereg_file_protected(oldpath)) return; - _e_fm2_client_file_move(oldpath, newpath, "", 0, -9999, -9999, ic->sd->w, ic->sd->h); + + args = _e_fm_string_append_quoted(args, &size, &length, oldpath); + args = _e_fm_string_append_char(args, &size, &length, ' '); + args = _e_fm_string_append_quoted(args, &size, &length, newpath); + + _e_fm_client_file_move(args); + free(args); } } @@ -7266,11 +7360,63 @@ _e_fm2_file_delete_delete_cb(void *obj) ic->dialog = NULL; } +static char * +_e_fm_string_append_char(char *str, size_t *size, size_t *len, char c) +{ + if(str == NULL) + { + str = malloc(4096); + str[0] = '\x00'; + *size = 4096; + *len = 0; + } + + if(*len >= *size - 1) + { + *size += 1024; + str = realloc(str, *size); + } + + str[(*len)++] = c; + str[*len] = '\x00'; + + return str; +} + + +static char * +_e_fm_string_append_quoted(char *str, size_t *size, size_t *len, const char *src) +{ + str = _e_fm_string_append_char(str, size, len, '\''); + + while (*src) + { + if (*src == '\'') + { + str = _e_fm_string_append_char(str, size, len, '\''); + str = _e_fm_string_append_char(str, size, len, '\\'); + str = _e_fm_string_append_char(str, size, len, '\''); + str = _e_fm_string_append_char(str, size, len, '\''); + } + else + str = _e_fm_string_append_char(str, size, len, *src); + + src++; + } + + str = _e_fm_string_append_char(str, size, len, '\''); + + return str; +} + static void _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog) { E_Fm2_Icon *ic; - char buf[4096]; + char buf[PATH_MAX]; + char *files = NULL; + size_t size = 0; + size_t len = 0; Evas_List *sel, *l; E_Fm2_Icon_Info *ici; @@ -7286,18 +7432,23 @@ _e_fm2_file_delete_yes_cb(void *data, E_Dialog *dialog) ici = l->data; snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ici->file); if (e_filereg_file_protected(buf)) continue; - printf("rm -rf %s\n", buf); - _e_fm2_client_file_del(buf); + + files = _e_fm_string_append_quoted(files, &size, &len, buf); + if(l->next) files = _e_fm_string_append_char(files, &size, &len, ' '); } + evas_list_free(sel); } else { snprintf(buf, sizeof(buf), "%s/%s", ic->sd->realpath, ic->info.file); if (e_filereg_file_protected(buf)) return; - printf("rm -rf %s\n", buf); - _e_fm2_client_file_del(buf); + files = _e_fm_string_append_quoted(files, &size, &len, buf); } + + _e_fm_client_file_del(files); + + free(files); evas_object_smart_callback_call(ic->sd->obj, "files_deleted", NULL); } diff --git a/src/bin/e_fm_hal.c b/src/bin/e_fm_hal.c index 031de46a7..04557e08f 100644 --- a/src/bin/e_fm_hal.c +++ b/src/bin/e_fm_hal.c @@ -196,7 +196,7 @@ _e_fm2_volume_write(E_Volume *v) if (!v->storage) return; id = ecore_file_file_get(v->storage->udi); printf("vol write %s\n", id); - snprintf(buf, sizeof(buf), "%s/.e/e/fileman/favorites/|%s_%d.desktop", + snprintf(buf, sizeof(buf) - 1, "%s/.e/e/fileman/favorites/|%s_%d.desktop", e_user_homedir_get(), id, v->partition_number); f = fopen(buf, "w"); @@ -292,13 +292,17 @@ _e_fm2_volume_write(E_Volume *v) v->udi); fclose(f); - snprintf(buf2, sizeof(buf2), "%s/Desktop/|%s_%d.desktop", - e_user_homedir_get(), id, v->partition_number); - ecore_file_symlink(buf, buf2); + if(e_config->hal_desktop) + { + snprintf(buf2, sizeof(buf2) - 1, "%s/Desktop/|%s_%d.desktop", + e_user_homedir_get(), id, v->partition_number); + ecore_file_symlink(buf, buf2); + } /* FIXME: manipulate icon directly */ _e_fm2_file_force_update(buf); - _e_fm2_file_force_update(buf2); + //_e_fm2_file_force_update(buf2); + e_config; } } @@ -319,10 +323,14 @@ _e_fm2_volume_erase(E_Volume *v) e_user_homedir_get(), id, v->partition_number); ecore_file_unlink(buf); _e_fm2_file_force_update(buf); - snprintf(buf, sizeof(buf) - 1, "%s/.e/e/fileman/favorites/|%s_%d.desktop", - e_user_homedir_get(), id, v->partition_number); - ecore_file_unlink(buf); - _e_fm2_file_force_update(buf); + + if(e_config->hal_desktop) + { + snprintf(buf, sizeof(buf) - 1, "%s/.e/e/fileman/favorites/|%s_%d.desktop", + e_user_homedir_get(), id, v->partition_number); + ecore_file_unlink(buf); + _e_fm2_file_force_update(buf); + } } EAPI E_Volume * @@ -488,3 +496,62 @@ _e_fm2_hal_mount_timeout(E_Fm2_Mount *m) return 0; } +EAPI void +e_fm2_hal_show_desktop_icons(void) +{ + Evas_List *l; + E_Volume *v; + char buf[PATH_MAX] = {0}; + char buf2[PATH_MAX] = {0}; + const char *id; + + for(l = _e_vols; l; l = evas_list_next(l)) + { + v = evas_list_data(l); + + if(!v) continue; + if (!v->storage) continue; + + id = ecore_file_file_get(v->storage->udi); + + snprintf(buf, sizeof(buf) - 1, "%s/.e/e/fileman/favorites/|%s_%d.desktop", + e_user_homedir_get(), id, v->partition_number); + + snprintf(buf2, sizeof(buf2) - 1, "%s/Desktop/|%s_%d.desktop", + e_user_homedir_get(), id, v->partition_number); + + if(ecore_file_exists(buf) && !ecore_file_exists(buf2)) + { + ecore_file_symlink(buf, buf2); + _e_fm2_file_force_update(buf2); + } + } +} + +EAPI void +e_fm2_hal_hide_desktop_icons(void) +{ + Evas_List *l; + E_Volume *v; + char buf[PATH_MAX] = {0}; + const char *id; + + for(l = _e_vols; l; l = evas_list_next(l)) + { + v = evas_list_data(l); + + if(!v) continue; + if (!v->storage) continue; + + id = ecore_file_file_get(v->storage->udi); + + snprintf(buf, sizeof(buf) - 1, "%s/Desktop/|%s_%d.desktop", + e_user_homedir_get(), id, v->partition_number); + + if(ecore_file_exists(buf)) + { + ecore_file_unlink(buf); + _e_fm2_file_force_update(buf); + } + } +} diff --git a/src/bin/e_fm_hal.h b/src/bin/e_fm_hal.h index fc352f7b3..4691e7b8a 100644 --- a/src/bin/e_fm_hal.h +++ b/src/bin/e_fm_hal.h @@ -25,4 +25,7 @@ EAPI E_Fm2_Mount *e_fm2_hal_mount(E_Volume *v, void *data); EAPI void e_fm2_hal_unmount(E_Fm2_Mount *m); +EAPI void e_fm2_hal_show_desktop_icons(void); +EAPI void e_fm2_hal_hide_desktop_icons(void); + #endif diff --git a/src/bin/e_fm_main.c b/src/bin/e_fm_main.c index 05f55407d..07652ea00 100644 --- a/src/bin/e_fm_main.c +++ b/src/bin/e_fm_main.c @@ -140,7 +140,7 @@ static void _e_fm_handle_error_response(int id, E_Fm_Op_Type type); static int _e_client_send(int id, E_Fm_Op_Type type, void *data, int size); -static int _e_fm_slave_run(E_Fm_Op_Type type, const char *src, const char *dst, int id); +static int _e_fm_slave_run(E_Fm_Op_Type type, const char *args, int id); static E_Fm_Slave *_e_fm_slave_get(int id); static int _e_fm_slave_send(E_Fm_Slave *slave, E_Fm_Op_Type type, void *data, int size); static int _e_fm_slave_data_cb(void *data, int type, void *event); @@ -160,10 +160,10 @@ static void _e_file_mon_list_sync(E_Dir *ed); static int _e_cb_file_mon_list_idler(void *data); static int _e_cb_fop_trash_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_fm_reorder(const char *file, const char *dst, const char *relative, int after); static void _e_dir_del(E_Dir *ed); -static const char *_e_prepare_command(E_Fm_Op_Type type, const char *src, const char *dst); +static const char *_e_prepare_command(E_Fm_Op_Type type, const char *args); #ifdef HAVE_EDBUS @@ -1256,7 +1256,7 @@ _e_fm_mkdir_try(E_Fm_Task *task) } else { - _e_path_fix_order(task->src, task->rel, task->rel_to, task->x, task->y); + _e_fm_reorder(ecore_file_file_get(task->src), ecore_file_dir_get(task->src), task->rel, task->rel_to); _e_fm_task_remove(task); } } @@ -1315,6 +1315,7 @@ _e_fm_handle_error_response(int id, E_Fm_Op_Type type) } } + static int _e_ipc_cb_server_data(void *data, int type, void *event) { @@ -1322,7 +1323,6 @@ _e_ipc_cb_server_data(void *data, int type, void *event) e = event; if (e->major != 6/*E_IPC_DOMAIN_FM*/) return 1; - printf("EFM: %d\n", e->minor); switch (e->minor) { case E_FM_OP_MONITOR_START: /* monitor dir (and implicitly list) */ @@ -1332,12 +1332,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event) break; case E_FM_OP_MONITOR_END: /* monitor dir end */ { + printf("End listing directory: %s\n", e->data); _e_fm_monitor_end(e->ref, e->data); } break; case E_FM_OP_REMOVE: /* fop delete file/dir */ { - _e_fm_slave_run(E_FM_OP_REMOVE, (const char *)e->data, NULL, e->ref); + _e_fm_slave_run(E_FM_OP_REMOVE, (const char *)e->data, e->ref); } break; case E_FM_OP_TRASH: /* fop trash file/dir */ @@ -1356,32 +1357,12 @@ _e_ipc_cb_server_data(void *data, int type, void *event) break; case E_FM_OP_MOVE: /* fop mv file/dir */ { - const char *src, *dst, *rel; - int rel_to, x, y; - - src = e->data; - dst = src + strlen(src) + 1; - rel = dst + strlen(dst) + 1; - memcpy(&rel_to, rel + strlen(rel) + 1, sizeof(int)); - memcpy(&x, rel + strlen(rel) + 1 + sizeof(int), sizeof(int)); - memcpy(&y, rel + strlen(rel) + 1 + sizeof(int), sizeof(int)); - - _e_fm_slave_run(E_FM_OP_MOVE, src, dst, e->ref); + _e_fm_slave_run(E_FM_OP_MOVE, (const char *)e->data, e->ref); } break; case E_FM_OP_COPY: /* fop cp file/dir */ { - const char *src, *dst, *rel; - int rel_to, x, y; - - src = e->data; - dst = src + strlen(src) + 1; - rel = dst + strlen(dst) + 1; - memcpy(&rel_to, rel + strlen(rel) + 1, sizeof(int)); - memcpy(&x, rel + strlen(rel) + 1 + sizeof(int), sizeof(int)); - memcpy(&y, rel + strlen(rel) + 1 + sizeof(int), sizeof(int)); - - _e_fm_slave_run(E_FM_OP_COPY, src, dst, e->ref); + _e_fm_slave_run(E_FM_OP_COPY, (const char *)e->data, e->ref); } break; case E_FM_OP_MKDIR: /* fop mkdir */ @@ -1501,6 +1482,26 @@ _e_ipc_cb_server_data(void *data, int type, void *event) _e_fm_slave_send(_e_fm_slave_get(e->ref), e->minor, NULL, 0); } break; + case E_FM_OP_REORDER: + { + const char *file, *dst, *relative; + int after; + void *p = e->data; + + file = p; + p += strlen(file) + 1; + + dst = p; + p += strlen(dst) + 1; + + relative = p; + p += strlen(relative) + 1; + + after = *(int *)p; + + _e_fm_reorder(file, dst, relative, after); + } + break; default: break; } @@ -1523,7 +1524,7 @@ static int _e_client_send(int id, E_Fm_Op_Type type, void *data, int size) id, 0, 0, data, size); } -static int _e_fm_slave_run(E_Fm_Op_Type type, const char *src, const char *dst, int id) +static int _e_fm_slave_run(E_Fm_Op_Type type, const char *args, int id) { E_Fm_Slave *slave; const char *command; @@ -1533,7 +1534,7 @@ static int _e_fm_slave_run(E_Fm_Op_Type type, const char *src, const char *dst, if (!slave) return 0; - command = evas_stringshare_add(_e_prepare_command(type, src, dst)); + command = evas_stringshare_add(_e_prepare_command(type, args)); slave->id = id; slave->exe = ecore_exe_pipe_run(command, ECORE_EXE_PIPE_WRITE | ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_ERROR, slave ); @@ -2076,43 +2077,40 @@ _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) +_e_fm_reorder(const char *file, const char *dst, const char *relative, int after) { - char *d, buf[PATH_MAX]; - const char *f; - - if (!path) return; - if (!rel[0]) return; - f = ecore_file_file_get(path); - if (!f) return; - if (!strcmp(f, rel)) return; - d = ecore_file_dir_get(path); - if (!d) return; - snprintf(buf, sizeof(buf), "%s/.order", d); - if (ecore_file_exists(buf)) + char buffer[PATH_MAX]; + char order[PATH_MAX]; + + if(!file || !dst || !relative) return; + if(after != 0 && after != 1 && after != 2) return; + printf("%s:%s(%d) Reorder:\n\tfile = %s\n\tdst = %s\n\trelative = %s\n\tafter = %d\n", __FILE__, __FUNCTION__, __LINE__, file, dst, relative, after); + + snprintf(order, sizeof(order), "%s/.order", dst); + if(ecore_file_exists(order)) { - FILE *fh; + FILE *forder; Evas_List *files = NULL, *l; - fh = fopen(buf, "r"); - if (fh) + forder = fopen(order, "r"); + if (forder) { int len; /* inset files in order if the existed in file * list before */ - while (fgets(buf, sizeof(buf), fh)) + while (fgets(buffer, sizeof(buffer), forder)) { - len = strlen(buf); - if (len > 0) buf[len - 1] = 0; - files = evas_list_append(files, strdup(buf)); + len = strlen(buffer); + if (len > 0) buffer[len - 1] = 0; + files = evas_list_append(files, strdup(buffer)); } - fclose(fh); + fclose(forder); } /* remove dest file from .order - if there */ for (l = files; l; l = l->next) { - if (!strcmp(l->data, f)) + if (!strcmp(l->data, file)) { free(l->data); files = evas_list_remove_list(files, l); @@ -2122,38 +2120,37 @@ _e_path_fix_order(const char *path, const char *rel, int rel_to, int x, int y) /* now insert dest into list or replace entry */ for (l = files; l; l = l->next) { - if (!strcmp(l->data, rel)) + if (!strcmp(l->data, relative)) { - if (rel_to == 2) /* replace */ + if (after == 2) /* replace */ { free(l->data); - l->data = strdup(f); + l->data = strdup(file); } - else if (rel_to == 0) /* before */ + else if (after == 0) /* before */ { - files = evas_list_prepend_relative_list(files, strdup(f), l); + files = evas_list_prepend_relative_list(files, strdup(file), l); } - else if (rel_to == 1) /* after */ + else if (after == 1) /* after */ { - files = evas_list_append_relative_list(files, strdup(f), l); + files = evas_list_append_relative_list(files, strdup(file), l); } break; } } - snprintf(buf, sizeof(buf), "%s/.order", d); - fh = fopen(buf, "w"); - if (fh) + + forder = fopen(order, "w"); + if (forder) { while (files) { - fprintf(fh, "%s\n", (char *)files->data); + fprintf(forder, "%s\n", (char *)files->data); free(files->data); files = evas_list_remove_list(files, files); } - fclose(fh); + fclose(forder); } } - free(d); } static void @@ -2180,40 +2177,10 @@ _e_dir_del(E_Dir *ed) free(ed); } -static void _e_append_char(char **str, int *size, int c) +static const char *_e_prepare_command(E_Fm_Op_Type type, const char *args) { - **str = c; - (*str) ++; - *size++; -} - -static void _e_append_quoted(char **str, int *size, const char *src) -{ - while (*src) - { - if (*src == '\'') - { - _e_append_char(str, size, '\''); - _e_append_char(str, size, '\\'); - _e_append_char(str, size, '\''); - _e_append_char(str, size, '\''); - } - else - _e_append_char(str, size, *src); - - src++; - } -} -/* Returns a string like - * /usr/bin/englightement_op cp 'src' 'dst' - * ready to pass to ecore_exe_pipe_run() - */ - -static const char *_e_prepare_command(E_Fm_Op_Type type, const char *src, const char *dst) -{ - char buffer[PATH_MAX* 3 + 512]; - int length = 0; - char *buf = &buffer[0]; + char *buffer; + unsigned int length = 0; char command[3]; if (type == E_FM_OP_MOVE) @@ -2223,21 +2190,9 @@ static const char *_e_prepare_command(E_Fm_Op_Type type, const char *src, const else strcpy(command, "cp"); - length = snprintf(buf, sizeof(buffer), "%s/enlightenment_fm_op %s \'", e_prefix_bin_get(), command); - buf += length; + length = 256 + strlen(e_prefix_bin_get()) + strlen(args); + buffer = malloc(length); + length = snprintf(buffer, length, "%s/enlightenment_fm_op %s %s", e_prefix_bin_get(), command, args); - _e_append_quoted(&buf, &length, src); - _e_append_char(&buf, &length, '\''); - - if (dst) - { - _e_append_char(&buf, &length, ' '); - _e_append_char(&buf, &length, '\''); - _e_append_quoted(&buf, &length, dst); - _e_append_char(&buf, &length, '\''); - } - - _e_append_char(&buf, &length, '\x00'); - - return strdup(&buffer[0]); + return buffer; } diff --git a/src/bin/e_fm_op.c b/src/bin/e_fm_op.c index 88bd9ba26..9ef1b2e7d 100644 --- a/src/bin/e_fm_op.c +++ b/src/bin/e_fm_op.c @@ -34,7 +34,8 @@ static void _e_fm_op_task_free(void *t); static void _e_fm_op_remove_link_task(E_Fm_Op_Task *task); static int _e_fm_op_stdin_data(void *data, Ecore_Fd_Handler * fd_handler); - +static void _e_fm_op_set_up_idlers(); +static void _e_fm_op_delete_idler(int *mark); static int _e_fm_op_idler_handle_error(int *mark, Evas_List **queue, Evas_List **node, E_Fm_Op_Task *task); static int _e_fm_op_work_idler(void *data); @@ -42,7 +43,7 @@ static int _e_fm_op_scan_idler(void *data); static void _e_fm_op_send_error(E_Fm_Op_Task * task, E_Fm_Op_Type type, const char *fmt, ...); static void _e_fm_op_rollback(E_Fm_Op_Task * task); -static void _e_fm_op_update_progress(long long _plus_e_fm_op_done, long long _plus_e_fm_op_total); +static void _e_fm_op_update_progress(E_Fm_Op_Task *task, long long _plus_e_fm_op_done, long long _plus_e_fm_op_total); static void _e_fm_op_copy_stat_info(E_Fm_Op_Task *task); static int _e_fm_op_handle_overwrite(E_Fm_Op_Task *task); @@ -154,7 +155,7 @@ main(int argc, char **argv) { if (argc < 4) { - return 0; + goto quit; } if (type == E_FM_OP_MOVE) @@ -163,9 +164,9 @@ main(int argc, char **argv) _e_fm_op_separator = _e_fm_op_work_queue; } - if (argc > 4 && ecore_file_is_dir(argv[last])) + if (argc >= 4 && ecore_file_is_dir(argv[last])) { - if (argv[last][strlen(argv[last] - 1)] == '/') byte = ""; + if (argv[last][strlen(argv[last]) - 1] == '/') byte = ""; while (i < last) { @@ -185,7 +186,7 @@ main(int argc, char **argv) i++; } } - else + else if (argc == 4) { if (type == E_FM_OP_MOVE && rename(argv[2], argv[3]) == 0) goto quit; @@ -197,6 +198,10 @@ main(int argc, char **argv) _e_fm_op_scan_queue = evas_list_append(_e_fm_op_scan_queue, task); } + else + { + goto quit; + } } else if (type == E_FM_OP_REMOVE) { @@ -217,8 +222,7 @@ main(int argc, char **argv) } } - _e_fm_op_scan_idler_p = ecore_idler_add(_e_fm_op_scan_idler, NULL); - _e_fm_op_work_idler_p = ecore_idler_add(_e_fm_op_work_idler, NULL); + _e_fm_op_set_up_idlers(); ecore_main_loop_begin(); @@ -406,6 +410,7 @@ _e_fm_op_stdin_data(void *data, Ecore_Fd_Handler * fd_handler) case E_FM_OP_ERROR_RESPONSE_IGNORE_ALL: case E_FM_OP_ERROR_RESPONSE_RETRY: _e_fm_op_error_response = identity; + _e_fm_op_set_up_idlers(); break; case E_FM_OP_OVERWRITE_RESPONSE_NO: @@ -413,6 +418,7 @@ _e_fm_op_stdin_data(void *data, Ecore_Fd_Handler * fd_handler) case E_FM_OP_OVERWRITE_RESPONSE_YES: case E_FM_OP_OVERWRITE_RESPONSE_YES_ALL: _e_fm_op_overwrite_response = identity; + _e_fm_op_set_up_idlers(); E_FM_OP_DEBUG("Overwrite response set.\n"); break; } @@ -429,6 +435,15 @@ _e_fm_op_stdin_data(void *data, Ecore_Fd_Handler * fd_handler) return 1; } +static void _e_fm_op_set_up_idlers() +{ + if(!_e_fm_op_scan_idler_p) + _e_fm_op_scan_idler_p = ecore_idler_add(_e_fm_op_scan_idler, NULL); + + if(!_e_fm_op_work_idler_p) + _e_fm_op_work_idler_p = ecore_idler_add(_e_fm_op_work_idler, NULL); +} + #define _E_FM_OP_ERROR_SEND_SCAN(_task, _e_fm_op_error_type, _fmt, ...)\ do\ {\ @@ -449,6 +464,20 @@ _e_fm_op_stdin_data(void *data, Ecore_Fd_Handler * fd_handler) }\ while (0) +static void _e_fm_op_delete_idler(int *mark) +{ + if(mark == &_e_fm_op_work_error) + { + ecore_idler_del(_e_fm_op_work_idler_p); + _e_fm_op_work_idler_p = NULL; + } + else + { + ecore_idler_del(_e_fm_op_scan_idler_p); + _e_fm_op_scan_idler_p = NULL; + } +} + /* Code to deal with overwrites and errors in idlers. * Basically, it checks if we got a response. * Returns 1 if we did; otherwise checks it and does what needs to be done. @@ -466,6 +495,9 @@ static int _e_fm_op_idler_handle_error(int *mark, Evas_List **queue, Evas_List * } else { + /* No response yet. */ + /* So, delete this idler. It'll be added back when response is there. */ + _e_fm_op_delete_idler(mark); return 1; } } @@ -474,6 +506,8 @@ static int _e_fm_op_idler_handle_error(int *mark, Evas_List **queue, Evas_List * if (_e_fm_op_error_response == E_FM_OP_NONE) { /* No response yet. */ + /* So, delete this idler. It'll be added back when response is there. */ + _e_fm_op_delete_idler(mark); return 1; } else @@ -605,7 +639,6 @@ _e_fm_op_work_idler(void *data) return 0; } - return 1; } @@ -828,9 +861,9 @@ _e_fm_op_rollback(E_Fm_Op_Task * task) } if (task->type == E_FM_OP_COPY) - _e_fm_op_update_progress(-task->dst.done, -task->src.st.st_size); + _e_fm_op_update_progress(task, -task->dst.done, -task->src.st.st_size); else - _e_fm_op_update_progress(-REMOVECHUNKSIZE, -REMOVECHUNKSIZE); + _e_fm_op_update_progress(task, -REMOVECHUNKSIZE, -REMOVECHUNKSIZE); } /* Updates progress. @@ -844,7 +877,7 @@ _e_fm_op_rollback(E_Fm_Op_Task * task) */ static void -_e_fm_op_update_progress(long long _plus_e_fm_op_done, long long _plus_e_fm_op_total) +_e_fm_op_update_progress(E_Fm_Op_Task *task, long long _plus_e_fm_op_done, long long _plus_e_fm_op_total) { static int ppercent = -1; int percent; @@ -854,7 +887,13 @@ _e_fm_op_update_progress(long long _plus_e_fm_op_done, long long _plus_e_fm_op_t double eta = 0; static int peta = -1; - int data[5]; + static E_Fm_Op_Task *ptask = NULL; + + void *data; + void *p; + int magic = E_FM_OP_MAGIC; + int id = E_FM_OP_PROGRESS; + int size = 0; _e_fm_op_done += _plus_e_fm_op_done; _e_fm_op_total += _plus_e_fm_op_total; @@ -876,21 +915,42 @@ _e_fm_op_update_progress(long long _plus_e_fm_op_done, long long _plus_e_fm_op_t eta = (int) (eta + 0.5); } - if (percent != ppercent || eta != peta) + if (percent != ppercent || eta != peta || (task && task != ptask)) { ppercent = percent; peta = eta; + ptask = task; - data[0] = E_FM_OP_MAGIC; - data[1] = E_FM_OP_PROGRESS; - data[2] = 2*sizeof(int); - data[3] = percent; - data[4] = peta; + size = 2 * sizeof(int) + 2 * sizeof(size_t) + strlen(ptask->src.name) + 1 + strlen(ptask->dst.name) + 1; + data = malloc(3 * sizeof(int) + size); - write(STDOUT_FILENO, &data[0], 5*sizeof(int)); + if (!data) return; + p = data; + +#define P(value) memcpy(p, &(value), sizeof(int)); p += sizeof(int) + P(magic); + P(id); + P(size); + P(ppercent); + P(peta); +#undef P + +#define P(value) memcpy(p, &(value), sizeof(size_t)); p += sizeof(size_t) + P(ptask->dst.done); + P(ptask->src.st.st_size); +#undef P + +#define P(value) memcpy(p, value, strlen(value) + 1); p += strlen(value) + 1 + P(ptask->src.name); + P(ptask->dst.name); +#undef P + + write(STDOUT_FILENO, data, 3 * sizeof(int) + size); E_FM_OP_DEBUG("Time left: %d at %e\n", peta, ctime - stime); E_FM_OP_DEBUG("Progress %d. \n", percent); + + free(data); } } } @@ -1000,7 +1060,7 @@ _e_fm_op_copy_dir(E_Fm_Op_Task * task) } task->dst.done += task->src.st.st_size; - _e_fm_op_update_progress(task->src.st.st_size, 0); + _e_fm_op_update_progress(task, task->src.st.st_size, 0); /* Finish with this task. */ task->finished = 1; @@ -1033,7 +1093,7 @@ _e_fm_op_copy_link(E_Fm_Op_Task *task) } task->dst.done += task->src.st.st_size; - _e_fm_op_update_progress(task->src.st.st_size, 0); + _e_fm_op_update_progress(task, task->src.st.st_size, 0); _e_fm_op_copy_stat_info(task); @@ -1063,7 +1123,7 @@ _e_fm_op_copy_fifo(E_Fm_Op_Task *task) _e_fm_op_copy_stat_info(task); task->dst.done += task->src.st.st_size; - _e_fm_op_update_progress(task->src.st.st_size, 0); + _e_fm_op_update_progress(task, task->src.st.st_size, 0); task->finished = 1; @@ -1142,7 +1202,7 @@ _e_fm_op_copy_chunk(E_Fm_Op_Task *task) task->finished = 1; - _e_fm_op_update_progress(0, 0); + _e_fm_op_update_progress(task, 0, 0); return 1; } @@ -1155,7 +1215,7 @@ _e_fm_op_copy_chunk(E_Fm_Op_Task *task) } task->dst.done += dread; - _e_fm_op_update_progress(dwrite, 0); + _e_fm_op_update_progress(task, dwrite, 0); return 0; } @@ -1194,6 +1254,8 @@ _e_fm_op_copy_atom(E_Fm_Op_Task * task) if (!data || !data->to || !data->from) /* Did not touch the files yet. */ { + E_FM_OP_DEBUG("Copy: %s --> %s\n", task->src.name, task->dst.name); + if (_e_fm_op_abort) { /* We're marked for abortion. Don't do anything. @@ -1205,9 +1267,7 @@ _e_fm_op_copy_atom(E_Fm_Op_Task * task) if (_e_fm_op_handle_overwrite(task)) return 1; - E_FM_OP_DEBUG("Copy: %s --> %s\n", task->src.name, task->dst.name); - - if (S_ISDIR(task->src.st.st_mode)) + if (S_ISDIR(task->src.st.st_mode)) { if (_e_fm_op_copy_dir(task)) return 1; } @@ -1248,7 +1308,7 @@ _e_fm_op_scan_atom(E_Fm_Op_Task * task) if (task->type == E_FM_OP_COPY) { - _e_fm_op_update_progress(0, task->src.st.st_size); + _e_fm_op_update_progress(NULL, 0, task->src.st.st_size); ctask = _e_fm_op_task_new(); ctask->src.name = evas_stringshare_add(task->src.name); @@ -1261,7 +1321,7 @@ _e_fm_op_scan_atom(E_Fm_Op_Task * task) } else if (task->type == E_FM_OP_COPY_STAT_INFO) { - _e_fm_op_update_progress(0, REMOVECHUNKSIZE); + _e_fm_op_update_progress(NULL, 0, REMOVECHUNKSIZE); ctask = _e_fm_op_task_new(); ctask->src.name = evas_stringshare_add(task->src.name); @@ -1274,7 +1334,7 @@ _e_fm_op_scan_atom(E_Fm_Op_Task * task) } else if (task->type == E_FM_OP_REMOVE) { - _e_fm_op_update_progress(0, REMOVECHUNKSIZE); + _e_fm_op_update_progress(NULL, 0, REMOVECHUNKSIZE); rtask = _e_fm_op_task_new(); rtask->src.name = evas_stringshare_add(task->src.name); @@ -1289,7 +1349,7 @@ _e_fm_op_scan_atom(E_Fm_Op_Task * task) else if (task->type == E_FM_OP_MOVE) { /* Copy task. */ - _e_fm_op_update_progress(0, task->src.st.st_size); + _e_fm_op_update_progress(NULL, 0, task->src.st.st_size); ctask = _e_fm_op_task_new(); ctask->src.name = evas_stringshare_add(task->src.name); @@ -1301,7 +1361,7 @@ _e_fm_op_scan_atom(E_Fm_Op_Task * task) _e_fm_op_work_queue = evas_list_prepend(_e_fm_op_work_queue, ctask); /* Remove task. */ - _e_fm_op_update_progress(0, REMOVECHUNKSIZE); + _e_fm_op_update_progress(NULL, 0, REMOVECHUNKSIZE); rtask = _e_fm_op_task_new(); rtask->src.name = evas_stringshare_add(task->src.name); @@ -1337,7 +1397,7 @@ _e_fm_op_copy_stat_info_atom(E_Fm_Op_Task * task) task->finished = 1; task->dst.done += REMOVECHUNKSIZE; - _e_fm_op_update_progress(REMOVECHUNKSIZE, 0); + _e_fm_op_update_progress(task, REMOVECHUNKSIZE, 0); return 0; } @@ -1376,7 +1436,7 @@ _e_fm_op_remove_atom(E_Fm_Op_Task * task) } task->dst.done += REMOVECHUNKSIZE; - _e_fm_op_update_progress(REMOVECHUNKSIZE, 0); + _e_fm_op_update_progress(task, REMOVECHUNKSIZE, 0); task->finished = 1; diff --git a/src/bin/e_fm_op.h b/src/bin/e_fm_op.h index c6d9045e5..750b77561 100644 --- a/src/bin/e_fm_op.h +++ b/src/bin/e_fm_op.h @@ -47,7 +47,8 @@ typedef enum _E_Fm_Op_Type E_FM_OP_QUIT, E_FM_OP_SYMLINK, E_FM_OP_OK, - E_FM_OP_ERROR_RETRY_ABORT + E_FM_OP_ERROR_RETRY_ABORT, + E_FM_OP_REORDER } E_Fm_Op_Type; #endif diff --git a/src/modules/fileman/e_mod_config.c b/src/modules/fileman/e_mod_config.c index 901b98b5d..fe67e9505 100644 --- a/src/modules/fileman/e_mod_config.c +++ b/src/modules/fileman/e_mod_config.c @@ -58,6 +58,11 @@ struct _E_Config_Dialog_Data int fixed; } theme; + struct + { + int desktop; + } hal; + E_Config_Dialog *cfd; }; @@ -110,6 +115,7 @@ _fill_data(E_Config_Dialog_Data *cfdata) cfdata->icon.icon.h = fileman_config->icon.icon.h; cfdata->icon.extension.show = fileman_config->icon.extension.show; cfdata->list.sort.dirs.first = fileman_config->list.sort.dirs.first; + cfdata->hal.desktop = e_config->hal_desktop; } static void @@ -136,6 +142,16 @@ _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) fileman_config->list.sort.dirs.first = cfdata->list.sort.dirs.first; fileman_config->list.sort.dirs.last = !(cfdata->list.sort.dirs.first); + + e_config->hal_desktop = cfdata->hal.desktop; + if(e_config->hal_desktop) + { + e_fm2_hal_show_desktop_icons(); + } + else + { + e_fm2_hal_hide_desktop_icons(); + } e_config_save_queue(); @@ -197,6 +213,8 @@ _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) ob = e_widget_check_add(evas, _("Show Toolbar"), &(cfdata->view.show_toolbar)); e_widget_list_object_append(o, ob, 1, 1, 0.5); - + ob = e_widget_check_add(evas, _("Show HAL icons on desktop"), + &(cfdata->hal.desktop)); + e_widget_list_object_append(o, ob, 1, 1, 0.5); return o; }