forked from enlightenment/enlightenment
efm:
- two more states for the fileman edje, hover - unhover - implemented hover functions when dragging - relative actions / default relative action in place (not working yet) - there is SERIOUS BUG when using multiple windows of efm, when dragging or using the band on 2+ windows for the first time segvs, i think this was also before my changes. - still there are lots of things to be coded, dont expect to work cleanly yet SVN revision: 20511
This commit is contained in:
parent
cafd068c2c
commit
8510d3dcf1
|
@ -1129,6 +1129,11 @@ group {
|
|||
inherit: "default" 0.0;
|
||||
color: 10 10 10 30;
|
||||
}
|
||||
description {
|
||||
state: "hover" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
color: 10 10 10 30;
|
||||
}
|
||||
}
|
||||
part {
|
||||
name: "icon_box";
|
||||
|
@ -1264,6 +1269,24 @@ group {
|
|||
target: "icon_title";
|
||||
target: "icon_overlay";
|
||||
}
|
||||
program {
|
||||
name: "hover";
|
||||
signal: "hover";
|
||||
source: "";
|
||||
action: STATE_SET "hover" 0.0;
|
||||
transition: LINEAR 0.2;
|
||||
target: "icon_title";
|
||||
target: "icon_overlay";
|
||||
}
|
||||
program {
|
||||
name: "unhover";
|
||||
signal: "unhover";
|
||||
source: "";
|
||||
action: STATE_SET "default" 0.0;
|
||||
transition: LINEAR 0.2;
|
||||
target: "icon_title";
|
||||
target: "icon_overlay";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -349,7 +349,7 @@ e_fm_mime_action_call(E_Fm_Smart_Data *sd, E_Fm_Mime_Action *action)
|
|||
}
|
||||
else
|
||||
{
|
||||
command = _e_fm_mime_string_tokenizer(sd->operation.files,sd->operation.dir,action->cmd);
|
||||
command = _e_fm_mime_string_tokenizer(sd->operation.files,sd->operation.hover,action->cmd);
|
||||
printf("going to execute %s\n", command);
|
||||
exe = ecore_exe_run(command, NULL);
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ struct _E_Fm_Mime_Entry
|
|||
int level; /* the level on the three for easy search/comparsion */
|
||||
E_Fm_Mime_Entry *parent;
|
||||
E_Fm_Mime_Action *action_default; /* the default action also exists on the actions list */
|
||||
E_Fm_Mime_Action *action_default_relative;
|
||||
Evas_List *actions;
|
||||
/* the autodetect features */
|
||||
char *suffix;
|
||||
|
|
|
@ -3,6 +3,16 @@
|
|||
*/
|
||||
#include "e.h"
|
||||
|
||||
/* mouse use
|
||||
* =========
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* TODO:
|
||||
*
|
||||
* - if we resize efm while we're generating files, we crash
|
||||
|
@ -2125,6 +2135,7 @@ _e_fm_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
evas_object_hide(sd->selection.band.obj);
|
||||
sd->selection.band.files = evas_list_free(sd->selection.band.files);
|
||||
}
|
||||
printf("mouse up on the window\n");
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2151,57 +2162,11 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
icon->sd->operation.files = NULL;
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
icon->sd->operation.dir = icon->sd->dir;
|
||||
icon->sd->operation.hover = NULL;
|
||||
icon->sd->operation.files = evas_list_append(icon->sd->operation.files, icon->file);
|
||||
icon->sd->operation.mime = icon->file->mime;
|
||||
e_fm_mime_action_default_call(icon->sd);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
if (icon->file->type == E_FM_FILE_TYPE_DIRECTORY && (ev->flags == EVAS_BUTTON_DOUBLE_CLICK))
|
||||
{
|
||||
char *fullname;
|
||||
|
||||
if(icon->sd->win)
|
||||
icon->sd->drag.start = 0;
|
||||
|
||||
if (!strcmp(icon->file->name, ".")) return; /* this case cant happen!? */
|
||||
|
||||
if (!strcmp(icon->file->name, ".."))
|
||||
{
|
||||
fullname = _e_fm_dir_pop(icon->sd->dir);
|
||||
}
|
||||
else
|
||||
{
|
||||
fullname = strdup(icon->file->path);
|
||||
}
|
||||
|
||||
/* FIXME: we need to fix this, uber hack alert */
|
||||
if (fullname)
|
||||
{
|
||||
if (icon->sd->win)
|
||||
e_win_title_set(icon->sd->win, fullname);
|
||||
_e_fm_dir_set(icon->sd, fullname);
|
||||
free(fullname);
|
||||
}
|
||||
}
|
||||
else if (icon->file->type == E_FM_FILE_TYPE_FILE && (ev->flags == EVAS_BUTTON_DOUBLE_CLICK))
|
||||
{
|
||||
if(icon->sd->win)
|
||||
icon->sd->drag.start = 0;
|
||||
|
||||
if(icon->sd->is_selector)
|
||||
{
|
||||
_e_fm_selector_send_file(icon);
|
||||
return;
|
||||
}
|
||||
|
||||
/*if ((!e_fm_file_assoc_exec(icon->file)) &&
|
||||
(e_fm_file_can_exec(icon->file)))
|
||||
e_fm_file_exec(icon->file);*/
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
if(icon->sd->is_selector && icon->file->type == E_FM_FILE_TYPE_FILE)
|
||||
|
@ -2213,8 +2178,8 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
|
||||
evas_object_geometry_get(icon->icon_obj, &x, &y, NULL, NULL);
|
||||
|
||||
icon->sd->drag.start = 1;
|
||||
icon->sd->drag.doing = 0;
|
||||
icon->sd->drag.status = E_FILEMAN_DRAG_START;
|
||||
icon->sd->drag.button = E_FILEMAN_DRAG_PRIMARY;
|
||||
icon->sd->drag.x = ev->canvas.x;
|
||||
icon->sd->drag.y = ev->canvas.y;
|
||||
icon->sd->drag.icon_obj = icon;
|
||||
|
@ -2235,8 +2200,8 @@ _e_fm_icon_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
|
||||
evas_object_geometry_get(icon->icon_obj, &x, &y, NULL, NULL);
|
||||
|
||||
icon->sd->drag.start = 1;
|
||||
icon->sd->drag.doing = 0;
|
||||
icon->sd->drag.status = E_FILEMAN_DRAG_START;
|
||||
icon->sd->drag.button = E_FILEMAN_DRAG_SECONDARY;
|
||||
icon->sd->drag.x = ev->canvas.x;
|
||||
icon->sd->drag.y = ev->canvas.y;
|
||||
icon->sd->drag.icon_obj = icon;
|
||||
|
@ -2260,7 +2225,7 @@ _e_fm_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
|
||||
ev = event_info;
|
||||
icon = data;
|
||||
|
||||
|
||||
if(!strcmp(edje_object_part_state_get(icon->sd->edje_obj, "typebuffer", NULL), "shown"))
|
||||
{
|
||||
E_Fm_Icon *i;
|
||||
|
@ -2274,72 +2239,95 @@ _e_fm_icon_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
edje_object_signal_emit(icon->sd->edje_obj, "default", "");
|
||||
}
|
||||
|
||||
if(icon->sd->win)
|
||||
icon->sd->drag.start = 0;
|
||||
|
||||
switch(ev->button)
|
||||
{
|
||||
|
||||
/* selection */
|
||||
case 1:
|
||||
/* the xdnd_drop will handle this case */
|
||||
if(icon->sd->drag.doing)
|
||||
break;
|
||||
|
||||
/* if we arent doing a drag its a simple mouse out */
|
||||
if (!icon->state.selected)
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_del(icon);
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
}
|
||||
}
|
||||
/* selection */
|
||||
if(icon->sd->drag.status == E_FILEMAN_DRAG_START)
|
||||
{
|
||||
if (!icon->state.selected)
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_del(icon);
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
}
|
||||
}
|
||||
icon->sd->drag.status = E_FILEMAN_DRAG_NONE;
|
||||
}
|
||||
else if(icon->sd->drag.status == E_FILEMAN_DRAG_DOING)
|
||||
{
|
||||
icon->sd->drag.button = E_FILEMAN_DRAG_PRIMARY;
|
||||
}
|
||||
/* relative action */
|
||||
else if(icon->sd->drag.status == E_FILEMAN_DRAG_DONE)
|
||||
{
|
||||
printf("call the default relative action\n");
|
||||
}
|
||||
break;
|
||||
/* action / context */
|
||||
|
||||
case 3:
|
||||
/* the xdnd_drop will handle this case */
|
||||
if(icon->sd->drag.doing)
|
||||
break;
|
||||
|
||||
/* Free file list before recreating */
|
||||
while (icon->sd->operation.files)
|
||||
{
|
||||
E_Fm_File *file;
|
||||
/* action menu */
|
||||
if(icon->sd->drag.status == E_FILEMAN_DRAG_START)
|
||||
{
|
||||
if (!icon->state.selected)
|
||||
{
|
||||
if (evas_key_modifier_is_set(evas_key_modifier_get(icon->sd->evas), "Control"))
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
else
|
||||
{
|
||||
_e_fm_selections_clear(icon->sd);
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
}
|
||||
}
|
||||
/* Free file list before recreating */
|
||||
while (icon->sd->operation.files)
|
||||
{
|
||||
E_Fm_File *file;
|
||||
|
||||
file = icon->sd->operation.files->data;
|
||||
icon->sd->operation.files = evas_list_remove_list(
|
||||
file = icon->sd->operation.files->data;
|
||||
icon->sd->operation.files = evas_list_remove_list(
|
||||
icon->sd->operation.files, icon->sd->operation.files);
|
||||
/*
|
||||
* FIXME: should this be freed, it looks like we just need to free the list here?
|
||||
* e_object_del(E_OBJECT(file));
|
||||
*/
|
||||
}
|
||||
|
||||
/* set the operation files equal to the selected icons */
|
||||
for(l = icon->sd->selection.icons; l; l = l->next)
|
||||
}
|
||||
/* set the operation files equal to the selected icons */
|
||||
for(l = icon->sd->selection.icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon *ic;
|
||||
ic = (E_Fm_Icon *)l->data;
|
||||
icon->sd->operation.files = evas_list_append(icon->sd->operation.files, ic->file);
|
||||
}
|
||||
/* get the overall mime entry for the selected files */
|
||||
icon->sd->operation.hover = NULL;
|
||||
icon->sd->operation.mime = e_fm_mime_get_from_list(icon->sd->operation.files);
|
||||
icon->sd->drag.status = E_FILEMAN_DRAG_NONE;
|
||||
_e_fm_menu_action_display(icon->sd, ev->output.x, ev->output.y, ev->timestamp);
|
||||
}
|
||||
else if(icon->sd->drag.status == E_FILEMAN_DRAG_DOING)
|
||||
{
|
||||
icon->sd->drag.button = E_FILEMAN_DRAG_SECONDARY;
|
||||
}
|
||||
/* context menu */
|
||||
else if(icon->sd->drag.status == E_FILEMAN_DRAG_DONE)
|
||||
{
|
||||
E_Fm_Icon *ic;
|
||||
|
||||
ic = (E_Fm_Icon *)l->data;
|
||||
icon->sd->operation.files = evas_list_append(icon->sd->operation.files, ic->file);
|
||||
printf("popping up the context menu\n");
|
||||
//_e_fm_menu_context_display(icon->sd, ev->output.x, ev->output.y, ev->timestamp);
|
||||
}
|
||||
/* get the overall mime entry for the selected files */
|
||||
icon->sd->operation.dir = icon->sd->dir;
|
||||
icon->sd->operation.mime = e_fm_mime_get_from_list(icon->sd->operation.files);
|
||||
_e_fm_menu_action_display(icon->sd, ev->output.x, ev->output.y, ev->timestamp);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -2381,12 +2369,14 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
ev = event_info;
|
||||
sd = data;
|
||||
|
||||
|
||||
//printf("icon mouse move\n");
|
||||
if(sd->win)
|
||||
icon = sd->drag.icon_obj;
|
||||
|
||||
if (!icon) return;
|
||||
|
||||
if (sd->drag.start && sd->win)
|
||||
if ((sd->drag.status == E_FILEMAN_DRAG_START) && sd->win)
|
||||
{
|
||||
if ((sd->drag.x == -1) && (sd->drag.y == -1))
|
||||
{
|
||||
|
@ -2412,9 +2402,8 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
char *tmp;
|
||||
char **drop_types = NULL;
|
||||
|
||||
|
||||
icon->sd->drag.doing = 1;
|
||||
|
||||
|
||||
//printf("creating a new fake window\n");
|
||||
_e_fm_selections_add(icon, evas_list_find_list(icon->sd->icons, icon));
|
||||
|
||||
data = calloc(PATH_MAX, sizeof(char));
|
||||
|
@ -2422,8 +2411,7 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
drop_types = calloc(1,sizeof(char*));
|
||||
drop_types[0] = strdup("text/uri-list");
|
||||
|
||||
|
||||
|
||||
|
||||
/* send the dragged signal to all the selected icons */
|
||||
for(l = sd->selection.icons, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
|
@ -2457,6 +2445,7 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
sd->drag.ecore_evas = ecore_evas_software_x11_new(NULL, 0, cx + x, cy + y, w, h);
|
||||
sd->drag.evas = ecore_evas_get(sd->drag.ecore_evas);
|
||||
sd->drag.win = ecore_evas_software_x11_window_get(sd->drag.ecore_evas);
|
||||
sd->drag.status = E_FILEMAN_DRAG_DOING;
|
||||
|
||||
ecore_evas_shaped_set(sd->drag.ecore_evas, 1);
|
||||
ecore_evas_borderless_set(sd->drag.ecore_evas, 1);
|
||||
|
@ -2481,9 +2470,6 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
|
|||
ecore_x_dnd_types_set(sd->drag.win, drop_types, 1);
|
||||
ecore_x_dnd_begin(sd->drag.win, data, PATH_MAX * sizeof(char));
|
||||
|
||||
sd->drag.start = 0;
|
||||
|
||||
|
||||
e_fm_drag_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,
|
||||
_e_fm_drag_mouse_move_cb, sd);
|
||||
|
||||
|
@ -2504,7 +2490,8 @@ _e_fm_icon_autoscroll_cb (void *data)
|
|||
|
||||
sd = data;
|
||||
|
||||
/*if(sd->autoscroll.direction & E_FILEMAN_AUTOSCROLL_UP)
|
||||
#if 0
|
||||
if(sd->autoscroll.direction & E_FILEMAN_AUTOSCROLL_UP)
|
||||
{
|
||||
sd->child.y -= sd->autoscroll.timer_int;
|
||||
if(sd->child.y < 0) sd->child.y = 0;
|
||||
|
@ -2536,7 +2523,7 @@ _e_fm_icon_autoscroll_cb (void *data)
|
|||
evas_object_move(sd->layout, sd->x - sd->child.x, sd->y - sd->child.y);
|
||||
e_icon_canvas_xy_thaw(sd->layout);
|
||||
evas_object_smart_callback_call(sd->object, "changed", NULL);*/
|
||||
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3262,6 +3249,9 @@ static int
|
|||
_e_fm_xdnd_enter_cb(void *data, int type, void *event)
|
||||
{
|
||||
Ecore_X_Event_Xdnd_Enter *ev;
|
||||
Evas *e;
|
||||
Evas_Object *eo;
|
||||
Evas_Smart *s;
|
||||
E_Fm_Smart_Data *sd;
|
||||
|
||||
ev = event;
|
||||
|
@ -3269,19 +3259,6 @@ _e_fm_xdnd_enter_cb(void *data, int type, void *event)
|
|||
|
||||
if (ev->win != sd->win->evas_win) return 1;
|
||||
|
||||
|
||||
if (ev->win == sd->win->evas_win)
|
||||
{
|
||||
if(sd->drag.doing)
|
||||
{
|
||||
//e_fm_icon_signal_emit(icon->icon_obj, "default", "");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* split the data from the drop and
|
||||
* create E_Fm_Files for all the uris */
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3296,13 +3273,30 @@ _e_fm_xdnd_leave_cb(void *data, int type, void *event)
|
|||
|
||||
if (ev->win != sd->win->evas_win) return 1;
|
||||
|
||||
|
||||
#if 0
|
||||
/* in we leaved an efm window with autoscroll disable it*/
|
||||
if(sd->autoscroll.timer)
|
||||
{
|
||||
ecore_timer_del(sd->autoscroll.timer);
|
||||
sd->autoscroll.timer = NULL;
|
||||
}
|
||||
#endif
|
||||
/* if we left any icon hover unhover it */
|
||||
{
|
||||
Evas_List *l;
|
||||
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon *icon;
|
||||
|
||||
icon = l->data;
|
||||
if(!icon->icon_obj)
|
||||
continue;
|
||||
if(icon->state.hover)
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "unhover", "");
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3325,6 +3319,8 @@ _e_fm_xdnd_position_cb(void *data, int type, void *event)
|
|||
Ecore_X_Event_Xdnd_Position *ev;
|
||||
E_Fm_Smart_Data *sd;
|
||||
Ecore_X_Rectangle rect;
|
||||
int x,y;
|
||||
int dx,dy,dw,dh;
|
||||
|
||||
ev = event;
|
||||
sd = data;
|
||||
|
@ -3334,22 +3330,22 @@ _e_fm_xdnd_position_cb(void *data, int type, void *event)
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* autoscroll */
|
||||
ecore_evas_geometry_get(sd->win->ecore_evas, &dx, &dy, &dw, &dh);
|
||||
|
||||
//printf("pointer: %d %d, window: %d %d %d %d\n", ev->position.x, ev->position.y, dx,dy,dw,dh);
|
||||
x = ev->position.x - dx;
|
||||
y = ev->position.y - dy;
|
||||
|
||||
#if 0
|
||||
{
|
||||
/* autoscroll */
|
||||
/* look to set up the direction of the autoscroll
|
||||
* add timer callbacks for automatic scroll in case the mouse is over
|
||||
* that region, the threshold region to scroll is the 20% of the
|
||||
* window size */
|
||||
|
||||
int dx,dy,dw,dh;
|
||||
int rw,rh;
|
||||
int x,y;
|
||||
|
||||
ecore_evas_geometry_get(sd->win->ecore_evas, &dx, &dy, &dw, &dh);
|
||||
|
||||
x = ev->position.x - dx;
|
||||
y = ev->position.y - dy;
|
||||
|
||||
|
||||
rw = dw * 0.2;
|
||||
rh = dh * 0.2;
|
||||
|
||||
|
@ -3386,6 +3382,46 @@ _e_fm_xdnd_position_cb(void *data, int type, void *event)
|
|||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* hover */
|
||||
{
|
||||
Evas_List *l;
|
||||
/* check the position of every icon and compare the coords
|
||||
* until we find an icon below
|
||||
*/
|
||||
sd->operation.hover = NULL;
|
||||
for (l = sd->icons; l; l = l->next)
|
||||
{
|
||||
E_Fm_Icon *icon;
|
||||
Evas_Coord xx, yy, ww, hh;
|
||||
|
||||
icon = l->data;
|
||||
if(!icon->icon_obj)
|
||||
continue;
|
||||
evas_object_geometry_get(icon->icon_obj, &xx, &yy, &ww, &hh);
|
||||
if (E_INTERSECTS(x, y, 1, 1, xx, yy, ww, hh))
|
||||
{
|
||||
icon->state.hover = 1;
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "hover", "");
|
||||
sd->operation.hover = icon->file;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if the icon is outside the pointer and is hilighted
|
||||
* unhilight it */
|
||||
if(icon->state.hover)
|
||||
{
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "unhover", "");
|
||||
icon->state.hover = 0;
|
||||
}
|
||||
if(icon->state.selected)
|
||||
e_fm_icon_signal_emit(icon->icon_obj, "clicked", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.width = 0;
|
||||
|
@ -3404,20 +3440,29 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event)
|
|||
Evas_List *l;
|
||||
int dx, dy, dw, dh;
|
||||
int x,y;
|
||||
static E_Fm_Drag_Button button;
|
||||
|
||||
ev = event;
|
||||
sd = data;
|
||||
|
||||
if (ev->win != sd->win->evas_win)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* we will receive this callback for every efm window, even if the drop isnt done
|
||||
* on this window
|
||||
*/
|
||||
if (ev->win != sd->win->evas_win)
|
||||
{
|
||||
/* this event will be the first we have, the source window.
|
||||
* store the button that started the drag
|
||||
*/
|
||||
if(sd->drag.status == E_FILEMAN_DRAG_DOING)
|
||||
{
|
||||
//printf("inside drop saving the correct button %d\n", sd->drag.button);
|
||||
button = sd->drag.button;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
ecore_evas_geometry_get(sd->win->ecore_evas, &dx, &dy, &dw, &dh);
|
||||
if(sd->drag.doing)
|
||||
if(sd->drag.status == E_FILEMAN_DRAG_DOING)
|
||||
{
|
||||
/* send the dropped signal to all the selected icons
|
||||
* move the selected icons relative to the cursor that
|
||||
|
@ -3440,31 +3485,33 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event)
|
|||
iy += y;
|
||||
e_icon_canvas_child_move(ic->icon_obj,ix,iy);
|
||||
e_fm_icon_signal_emit(ic->icon_obj, "dropped", "");
|
||||
}
|
||||
/*if(sd->meta)
|
||||
{
|
||||
Evas_List *l;
|
||||
for(l = sd->meta->icons; l; l = l->next)
|
||||
|
||||
if(sd->meta)
|
||||
{
|
||||
E_Fm_Icon_Metadata *m;
|
||||
|
||||
m = l->data;
|
||||
if(!strcmp(m->name, sd->drag.icon_obj->file->name))
|
||||
Evas_List *l;
|
||||
for(l = sd->meta->files; l; l = l->next)
|
||||
{
|
||||
m->x = x;
|
||||
m->y = y;
|
||||
break;
|
||||
E_Fm_Icon_Metadata *m;
|
||||
|
||||
m = l->data;
|
||||
if(!strcmp(m->name, sd->drag.icon_obj->file->name))
|
||||
{
|
||||
/* FIXME here we need the position relative to the canvas
|
||||
* not the window */
|
||||
//m->x = ix;
|
||||
//m->y = iy;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
sd->drag.doing = 0;
|
||||
sd->drag.start = 0;
|
||||
}
|
||||
/* if we drop over another efm window */
|
||||
else
|
||||
{
|
||||
printf("outside drop\n");
|
||||
//printf("outside drop setting the correct button %d\n", button);
|
||||
sd->drag.button = button;
|
||||
}
|
||||
|
||||
/* if we drop on an auto scrollable area, delete the timer */
|
||||
|
@ -3473,9 +3520,7 @@ _e_fm_xdnd_drop_cb(void *data, int type, void *event)
|
|||
ecore_timer_del(sd->autoscroll.timer);
|
||||
sd->autoscroll.timer = NULL;
|
||||
}
|
||||
|
||||
ecore_x_selection_xdnd_request(sd->win->evas_win, "text/uri-list");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3489,23 +3534,43 @@ _e_fm_xdnd_selection_cb(void *data, int type, void *event)
|
|||
|
||||
ev = event;
|
||||
sd = data;
|
||||
|
||||
if (ev->win != sd->win->evas_win) return 1;
|
||||
|
||||
files = ev->data;
|
||||
|
||||
/* FIXME: Add this file to the current files */
|
||||
for (i = 0; i < files->num_files; i++)
|
||||
|
||||
switch(ev->selection)
|
||||
{
|
||||
char new_file[PATH_MAX];
|
||||
case ECORE_X_SELECTION_XDND:
|
||||
if(!strcmp(ev->target, "text/uri-list"))
|
||||
{
|
||||
int i;
|
||||
int remove = 7; /* 7 = file:// */
|
||||
files = ev->data;
|
||||
if(files->num_files < 1)
|
||||
break;
|
||||
|
||||
/* FIXME clean in a better way the list */
|
||||
sd->operation.files = NULL;
|
||||
i = 0;
|
||||
do
|
||||
{
|
||||
E_Fm_File *f;
|
||||
|
||||
snprintf(new_file, PATH_MAX, "%s/%s", sd->dir,
|
||||
ecore_file_get_file(files->files[i]));
|
||||
ecore_file_cp(strstr(files->files[i], "/"), new_file);
|
||||
f = e_fm_file_new(files->files[i] + remove);
|
||||
sd->operation.files = evas_list_append(sd->operation.files,f);
|
||||
i++;
|
||||
remove = 0;
|
||||
} while(i < files->num_files);
|
||||
|
||||
sd->operation.mime = e_fm_mime_get_from_list(sd->operation.files);
|
||||
sd->drag.status = E_FILEMAN_DRAG_DONE;
|
||||
_e_fm_fake_mouse_up_later(sd->win->evas,sd->drag.button);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
ecore_x_dnd_send_finished();
|
||||
_e_fm_redraw(sd);
|
||||
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -3716,6 +3781,7 @@ _e_fm_dir_meta_save(E_Fm_Smart_Data *sd)
|
|||
ret = eet_data_write(ef, _e_fm_dir_meta_edd, "metadata", sd->meta, 1);
|
||||
eet_close(ef);
|
||||
free(hash);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -3739,9 +3805,8 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns
|
|||
E_Menu *mn,*mo;
|
||||
E_Menu_Item *mi;
|
||||
int x, y, w, h;
|
||||
E_Fm_Assoc_App *assoc;
|
||||
|
||||
Evas_List *l,*actions,*mimes = NULL;
|
||||
Evas_List *l;
|
||||
E_Fm_Mime_Action *action;
|
||||
E_Fm_Mime_Action *default_action;
|
||||
E_Fm_Mime_Entry *mime;
|
||||
|
@ -3757,64 +3822,10 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns
|
|||
|
||||
mn = e_menu_new();
|
||||
e_menu_category_set(mn,"fileman/action");
|
||||
e_menu_category_data_set("fileman/action",sd->selection.icons);
|
||||
e_menu_category_data_set("fileman/action",sd);
|
||||
|
||||
mi = NULL;
|
||||
|
||||
#if 0
|
||||
if((mo = evas_hash_find(sd->mime_menu_hash,icon->file->mime)) == NULL)
|
||||
{
|
||||
/*- Arrange -*/
|
||||
mo = e_menu_new();
|
||||
for (l = icon->sd->conf.main->apps; l; l = l->next)
|
||||
{
|
||||
assoc = l->data;
|
||||
if (e_fm_file_has_mime(icon->file, assoc->mime))
|
||||
{
|
||||
mi = e_menu_item_new(mo);
|
||||
e_menu_item_label_set(mi, _(assoc->app));
|
||||
e_menu_item_radio_set(mi, 1);
|
||||
e_menu_item_radio_group_set(mi, 2);
|
||||
|
||||
/*
|
||||
if (!((assoc->app->icon_class) &&
|
||||
(e_util_menu_item_edje_icon_list_set(mi, assoc->app->icon_class))))
|
||||
e_menu_item_icon_edje_set(mi, assoc->app->path, "item");
|
||||
*/
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
|
||||
}
|
||||
assoc = NULL;
|
||||
}
|
||||
if(mi)
|
||||
{
|
||||
icon->sd->mime_menu_hash = evas_hash_add(icon->sd->mime_menu_hash,strdup(icon->file->mime), mo);
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_submenu_set(mi, mo);
|
||||
e_menu_item_label_set(mi, _("Open with"));
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Open with"));
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
e_menu_item_submenu_set(mi, mo);
|
||||
}
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _("Open"));
|
||||
e_menu_item_callback_set(mi, _e_fm_file_menu_open, icon);
|
||||
e_menu_item_icon_edje_set(mi,
|
||||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),
|
||||
"fileman/button/open");
|
||||
#endif
|
||||
|
||||
mime = sd->operation.mime;
|
||||
printf("mime for selection %s\n", mime->name);
|
||||
|
@ -3838,7 +3849,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns
|
|||
e_menu_item_label_set(mi, _(action->label));
|
||||
e_menu_item_callback_set(mi, _e_fm_menu_actions, sd);
|
||||
e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/properties"),"fileman/button/properties");
|
||||
"fileman/button/open"),"fileman/button/open");
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
|
@ -3851,6 +3862,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns
|
|||
mime = sd->operation.mime;
|
||||
do
|
||||
{
|
||||
Evas_List *actions;
|
||||
printf("mime %s\n", mime->name);
|
||||
actions = mime->actions;
|
||||
for(l = actions; l; l = l->next)
|
||||
|
@ -3867,7 +3879,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns
|
|||
e_menu_item_label_set(mi, _(action->label));
|
||||
e_menu_item_callback_set(mi, _e_fm_menu_actions, sd);
|
||||
e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/properties"),"fileman/button/properties");
|
||||
"fileman/button/open"),"fileman/button/open");
|
||||
|
||||
}
|
||||
mime = mime->parent;
|
||||
|
@ -3923,7 +3935,7 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns
|
|||
(char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/properties"),
|
||||
"fileman/button/properties");
|
||||
//icon->menu = mn;
|
||||
//sd->selection.icon->menu = mn;
|
||||
|
||||
if (!sd->win) return;
|
||||
|
||||
|
@ -3933,14 +3945,104 @@ _e_fm_menu_action_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, uns
|
|||
|
||||
}
|
||||
|
||||
/* displays the context menu for a list of @files on the coordinate
|
||||
* @dx, @dy relative to the sd window
|
||||
/* displays the context menu on the coordinate
|
||||
* @dx, @dy relative to the @sd window
|
||||
*/
|
||||
static void
|
||||
_e_fm_menu_context_display(E_Fm_Smart_Data *sd, Evas_Coord dx, Evas_Coord dy, unsigned int timestamp)
|
||||
{
|
||||
E_Menu *mn,*mo;
|
||||
E_Menu_Item *mi;
|
||||
|
||||
;
|
||||
int x, y, w, h;
|
||||
int multiple = 0;
|
||||
Evas_List *l;
|
||||
|
||||
E_Fm_Mime_Entry *mime;
|
||||
E_Fm_Mime_Action *action;
|
||||
E_Fm_Mime_Action *default_action;
|
||||
|
||||
/* if we dont have any selection, how do we get here ? */
|
||||
if(!sd->selection.icons)
|
||||
return;
|
||||
/* to know if the action can be performed on multiple files */
|
||||
if(sd->operation.files->next)
|
||||
multiple = 1;
|
||||
|
||||
mn = e_menu_new();
|
||||
e_menu_category_set(mn,"fileman/action");
|
||||
e_menu_category_data_set("fileman/action",sd);
|
||||
|
||||
mi = NULL;
|
||||
|
||||
mime = sd->operation.mime;
|
||||
printf("mime for selection %s\n", mime->name);
|
||||
/* the default relative action */
|
||||
do
|
||||
{
|
||||
action = mime->action_default_relative;
|
||||
|
||||
if(!action)
|
||||
{
|
||||
mime = mime->parent;
|
||||
continue;
|
||||
}
|
||||
if(!action->multiple && multiple)
|
||||
{
|
||||
mime = mime->parent;
|
||||
continue;
|
||||
}
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _(action->label));
|
||||
e_menu_item_callback_set(mi, _e_fm_menu_actions, sd);
|
||||
e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),"fileman/button/open");
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_separator_set(mi, 1);
|
||||
|
||||
default_action = action;
|
||||
break;
|
||||
|
||||
} while(mime);
|
||||
|
||||
/* the other relative actions */
|
||||
mime = sd->operation.mime;
|
||||
do
|
||||
{
|
||||
Evas_List *actions;
|
||||
|
||||
printf("mime %s\n", mime->name);
|
||||
actions = mime->actions;
|
||||
for(l = actions; l; l = l->next)
|
||||
{
|
||||
|
||||
action = (E_Fm_Mime_Action*)l->data;
|
||||
/* if its not relative skip it */
|
||||
if(!action->relative)
|
||||
continue;
|
||||
if(!action->multiple && multiple)
|
||||
continue;
|
||||
/* if its the same as the default one, skip it */
|
||||
if(action == default_action)
|
||||
continue;
|
||||
|
||||
mi = e_menu_item_new(mn);
|
||||
e_menu_item_label_set(mi, _(action->label));
|
||||
e_menu_item_callback_set(mi, _e_fm_menu_actions, sd);
|
||||
e_menu_item_icon_edje_set(mi, (char *)e_theme_edje_file_get("base/theme/fileman",
|
||||
"fileman/button/open"),"fileman/button/open");
|
||||
|
||||
}
|
||||
mime = mime->parent;
|
||||
} while(mime);
|
||||
|
||||
if (!sd->win) return;
|
||||
|
||||
ecore_evas_geometry_get(sd->win->ecore_evas, &x, &y, &w, &h);
|
||||
e_menu_activate_mouse(mn, sd->win->border->zone,x + dx, y + dy, 1, 1,
|
||||
E_MENU_POP_DIRECTION_DOWN, timestamp);
|
||||
}
|
||||
|
||||
/* callback when a mime action is clicked on the actions menu */
|
||||
|
|
|
@ -9,13 +9,16 @@ typedef struct _E_Fm_Icon_CFData E_Fm_Icon_CFData;
|
|||
typedef struct _E_Fm_Config E_Fm_Config;
|
||||
typedef struct _E_Fm_Dir_Metadata E_Fm_Dir_Metadata;
|
||||
typedef struct _E_Fm_Fake_Mouse_Up_Info E_Fm_Fake_Mouse_Up_Info;
|
||||
typedef enum _E_Fm_Arrange E_Fm_Arrange;
|
||||
typedef enum _E_Fm_State E_Fm_State;
|
||||
typedef enum _E_Fm_Autoscroll E_Fm_Autoscroll;
|
||||
typedef struct _E_Event_Fm_Reconfigure E_Event_Fm_Reconfigure;
|
||||
typedef struct _E_Event_Fm_Directory_Change E_Event_Fm_Directory_Change;
|
||||
typedef struct _E_Fm_Assoc_App E_Fm_Assoc_App;
|
||||
|
||||
typedef enum _E_Fm_Arrange E_Fm_Arrange;
|
||||
typedef enum _E_Fm_State E_Fm_State;
|
||||
typedef enum _E_Fm_Autoscroll E_Fm_Autoscroll;
|
||||
typedef enum _E_Fm_Drag_Status E_Fm_Drag_Status;
|
||||
typedef enum _E_Fm_Drag_Button E_Fm_Drag_Button;
|
||||
|
||||
#else
|
||||
#ifndef E_FM_SMART_H
|
||||
#define E_FM_SMART_H
|
||||
|
@ -46,7 +49,8 @@ struct _E_Fm_Icon
|
|||
|
||||
struct {
|
||||
unsigned char selected : 1;
|
||||
unsigned char visible : 1;
|
||||
unsigned char hover : 1;
|
||||
unsigned char visible : 1; /* FIXME what was it for?to stop comparing icon_obj to NULL */
|
||||
}
|
||||
state;
|
||||
|
||||
|
@ -72,15 +76,15 @@ struct _E_Fm_Icon_CFData
|
|||
enum _E_Fm_Arrange
|
||||
{
|
||||
E_FILEMAN_CANVAS_ARRANGE_NAME = 0,
|
||||
E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1,
|
||||
E_FILEMAN_CANVAS_ARRANGE_SIZE = 2,
|
||||
E_FILEMAN_CANVAS_ARRANGE_MODTIME = 1,
|
||||
E_FILEMAN_CANVAS_ARRANGE_SIZE = 2,
|
||||
};
|
||||
|
||||
enum _E_Fm_State
|
||||
{
|
||||
E_FILEMAN_STATE_IDLE = 0,
|
||||
E_FILEMAN_STATE_TYPEBUFFER = 1,
|
||||
E_FILEMAN_STATE_RENAME = 2,
|
||||
E_FILEMAN_STATE_TYPEBUFFER = 1,
|
||||
E_FILEMAN_STATE_RENAME = 2,
|
||||
};
|
||||
|
||||
enum _E_Fm_Autoscroll
|
||||
|
@ -92,6 +96,23 @@ enum _E_Fm_Autoscroll
|
|||
E_FILEMAN_AUTOSCROLL_RIGHT = 8,
|
||||
};
|
||||
|
||||
enum _E_Fm_Drag_Status
|
||||
{
|
||||
E_FILEMAN_DRAG_NONE = 0, /* to not create the drag window on every mouse move */
|
||||
E_FILEMAN_DRAG_START = 1, /* to create the fake window and identify the fileman sd
|
||||
that does the drag */
|
||||
E_FILEMAN_DRAG_DOING = 2, /* to know when to launch the context menu/call default
|
||||
relative action */
|
||||
E_FILEMAN_DRAG_DONE = 3, /* the mouse up event is *before* the xdnd selection,
|
||||
we need this */
|
||||
};
|
||||
|
||||
enum _E_Fm_Drag_Button
|
||||
{
|
||||
E_FILEMAN_DRAG_PRIMARY = 1,
|
||||
E_FILEMAN_DRAG_SECONDARY = 3,
|
||||
};
|
||||
|
||||
struct _E_Fm_Fake_Mouse_Up_Info
|
||||
{
|
||||
Evas *canvas;
|
||||
|
@ -141,8 +162,8 @@ struct _E_Fm_Smart_Data
|
|||
Evas_Coord x, y, w, h;
|
||||
|
||||
struct {
|
||||
unsigned char start : 1;
|
||||
unsigned char doing : 1;
|
||||
E_Fm_Drag_Status status;
|
||||
E_Fm_Drag_Button button;
|
||||
int x, y; /* the position of the pointer's x,y, relative to the canvas */
|
||||
int dx, dy; /* the difference from the icon's x,y and the pointer's x,y */
|
||||
Ecore_Evas *ecore_evas;
|
||||
|
@ -192,7 +213,7 @@ struct _E_Fm_Smart_Data
|
|||
|
||||
struct {
|
||||
Evas_List *files; /* list of E_Fm_Files */
|
||||
E_Fm_File *dir; /* the file of the relative directory for operations */
|
||||
E_Fm_File *hover; /* the file of the relative directory for operations */
|
||||
E_Fm_Mime_Entry *mime; /* overall mime for all the icons we are going to operate wirh */
|
||||
}
|
||||
operation; /* the operating files, for wich we are going to make actions
|
||||
|
|
Loading…
Reference in New Issue