Enlightenment CVS committal
Author : mekius
Project : e17
Module : apps/e
Dir : e17/apps/e/src/bin
Modified Files:
e_config.c e_config.h e_dnd.c e_dnd.h e_fm.c e_fm_hal.c
e_fm_hal.h e_fm_main.c e_fm_op.c e_fm_op.h
Log Message:
Patches from ptomaine.
* Fix for URI escpaing.
* Add the ability for EFM to recognize different drop actions from other FMs.
The reverse soon to come :)
* Add option to disable HAL device icons on the desktop.
* Performing an operation on multiple files will now be done in a single slave
process instead of many.
More to come before and after GSOC :) If you see him in the channel, give him
a high five because he's finally helped pull EFM out of the crapper :P
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_config.c,v
retrieving revision 1.287
retrieving revision 1.288
diff -u -3 -r1.287 -r1.288
--- e_config.c 1 Aug 2008 06:24:18 -0000 1.287
+++ e_config.c 11 Aug 2008 02:13:21 -0000 1.288
@@ -587,6 +587,8 @@
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->display_res_hz = 0;
e_config->display_res_rotation = 0;
+ e_config->hal_desktop = 1;
{
E_Config_Module *em;
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_config.h,v
retrieving revision 1.170
retrieving revision 1.171
diff -u -3 -r1.170 -r1.171
--- e_config.h 19 May 2008 04:37:34 -0000 1.170
+++ e_config.h 11 Aug 2008 02:13:22 -0000 1.171
@@ -286,6 +286,8 @@
int thumbscroll_threshhold;
double thumbscroll_momentum_threshhold;
double thumbscroll_friction;
+
+ int hal_desktop;
};
struct _E_Config_Module
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_dnd.c,v
retrieving revision 1.78
retrieving revision 1.79
diff -u -3 -r1.78 -r1.79
--- e_dnd.c 24 Jun 2008 20:13:34 -0000 1.78
+++ e_dnd.c 11 Aug 2008 02:13:22 -0000 1.79
@@ -19,10 +19,11 @@
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 XDnd *_xdnd = NULL;
+static Evas_Hash *_drop_handlers_responsives;
+static Ecore_X_Atom _action;
+
/* externally accessible functions */
EAPI int
@@ -98,6 +102,8 @@
_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 @@
evas_list_free(_drop_handlers);
_drop_handlers = NULL;
+ evas_hash_free(_drop_handlers_responsives);
+
return 1;
}
@@ -491,6 +499,36 @@
}
}
+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 @@
*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 @@
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 @@
}
}
-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_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 @@
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_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 @@
}
}
}
+
+ 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 @@
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 @@
{
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 @@
rect.width = 0;
rect.height = 0;
+ action = ev->action;
+
active = 0;
for (l = _drop_handlers; l; l = l->next)
{
@@ -1171,8 +1236,15 @@
}
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); ////
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_dnd.h,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -3 -r1.31 -r1.32
--- e_dnd.h 5 Oct 2007 12:11:55 -0000 1.31
+++ e_dnd.h 11 Aug 2008 02:13:22 -0000 1.32
@@ -84,11 +84,13 @@
{
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 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
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm.c,v
retrieving revision 1.246
retrieving revision 1.247
diff -u -3 -r1.246 -r1.247
--- e_fm.c 26 Jul 2008 13:15:57 -0000 1.246
+++ e_fm.c 11 Aug 2008 02:13:22 -0000 1.247
@@ -350,17 +350,20 @@
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_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 @@
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 @@
}
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
case E_FM_OP_PROGRESS:/*progress*/
{
int percent, seconds;
-
- if (!e->data || e->size != 2 * sizeof(int)) 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;
+ size_t done, total;
+ char *src = NULL;
+ char *dst = NULL;
+ void *p = e->data;
+
+ if (!e->data) return;
+
+#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_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 @@
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 @@
dest[i] = *p;
else
{
- snprintf(&(dest[i]), 4, "%%%02X", *p);
+ snprintf(&(dest[i]), 4, "%%%02X", (unsigned char)*p);
i += 2;
}
}
@@ -4560,6 +4504,7 @@
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 @@
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;
@@ -4689,6 +4635,151 @@
}
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)
{
E_Fm2_Smart_Data *sd;
@@ -4699,6 +4790,11 @@
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 @@
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 @@
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_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 @@
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 @@
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 @@
_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 @@
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 @@
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 @@
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);
}
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_hal.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- e_fm_hal.c 28 Mar 2008 20:53:26 -0000 1.7
+++ e_fm_hal.c 11 Aug 2008 02:13:22 -0000 1.8
@@ -196,7 +196,7 @@
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 @@
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_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 @@
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);
+ }
+ }
+}
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_hal.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -3 -r1.1 -r1.2
--- e_fm_hal.h 22 Oct 2007 08:10:29 -0000 1.1
+++ e_fm_hal.h 11 Aug 2008 02:13:22 -0000 1.2
@@ -25,4 +25,7 @@
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
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_main.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -3 -r1.43 -r1.44
--- e_fm_main.c 26 Jul 2008 13:15:57 -0000 1.43
+++ e_fm_main.c 11 Aug 2008 02:13:22 -0000 1.44
@@ -140,7 +140,7 @@
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 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 @@
}
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 @@
}
}
+
static int
_e_ipc_cb_server_data(void *data, int type, void *event)
{
@@ -1322,7 +1323,6 @@
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 @@
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 @@
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_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 @@
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 @@
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 @@
}
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 @@
/* 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 @@
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 @@
else
strcpy(command, "cp");
- length = snprintf(buf, sizeof(buffer), "%s/enlightenment_fm_op %s \'",
e_prefix_bin_get(), command);
- buf += length;
-
- _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');
+ 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);
- return strdup(&buffer[0]);
+ return buffer;
}
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_op.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- e_fm_op.c 26 Jul 2008 13:15:57 -0000 1.3
+++ e_fm_op.c 11 Aug 2008 02:13:22 -0000 1.4
@@ -34,7 +34,8 @@
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 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 @@
{
if (argc < 4)
{
- return 0;
+ goto quit;
}
if (type == E_FM_OP_MOVE)
@@ -163,9 +164,9 @@
_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 @@
i++;
}
}
- else
+ else if (argc == 4)
{
if (type == E_FM_OP_MOVE && rename(argv[2], argv[3]) == 0)
goto quit;
@@ -197,6 +198,10 @@
_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 @@
}
}
- _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 @@
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 @@
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 @@
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 @@
}\
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 @@
}
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 @@
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 @@
return 0;
}
-
return 1;
}
@@ -828,9 +861,9 @@
}
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 @@
*/
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 @@
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 @@
eta = (int) (eta + 0.5);
}
- if (percent != ppercent || eta != peta)
+ if (percent != ppercent || eta != peta || (task && task != ptask))
{
ppercent = percent;
peta = eta;
+ ptask = task;
+
+ size = 2 * sizeof(int) + 2 * sizeof(size_t) +
strlen(ptask->src.name) + 1 + strlen(ptask->dst.name) + 1;
+ data = malloc(3 * sizeof(int) + size);
- data[0] = E_FM_OP_MAGIC;
- data[1] = E_FM_OP_PROGRESS;
- data[2] = 2*sizeof(int);
- data[3] = percent;
- data[4] = peta;
+ if (!data) return;
+ p = data;
- write(STDOUT_FILENO, &data[0], 5*sizeof(int));
+#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 @@
}
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 @@
}
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_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 @@
task->finished = 1;
- _e_fm_op_update_progress(0, 0);
+ _e_fm_op_update_progress(task, 0, 0);
return 1;
}
@@ -1155,7 +1215,7 @@
}
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 @@
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 @@
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 @@
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 @@
}
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 @@
}
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 @@
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_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 @@
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 @@
}
task->dst.done += REMOVECHUNKSIZE;
- _e_fm_op_update_progress(REMOVECHUNKSIZE, 0);
+ _e_fm_op_update_progress(task, REMOVECHUNKSIZE, 0);
task->finished = 1;
===================================================================
RCS file: /cvs/e/e17/apps/e/src/bin/e_fm_op.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- e_fm_op.h 26 Jul 2008 13:15:57 -0000 1.2
+++ e_fm_op.h 11 Aug 2008 02:13:22 -0000 1.3
@@ -47,7 +47,8 @@
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
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
enlightenment-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs