xdnd in efm

SVN revision: 20332
This commit is contained in:
codewarrior 2006-02-07 14:30:21 +00:00 committed by codewarrior
parent 2f0b93100c
commit efb3481bcb
1 changed files with 33 additions and 32 deletions

View File

@ -587,6 +587,7 @@ _e_fm_smart_add(Evas_Object *object)
sd->event_handlers = NULL;
sd->event_handlers = evas_list_append(sd->event_handlers,
ecore_event_handler_add(ECORE_X_EVENT_XDND_ENTER,
_e_fm_xdnd_enter_cb,
@ -614,7 +615,7 @@ _e_fm_smart_add(Evas_Object *object)
sd->event_handlers = evas_list_append(sd->event_handlers,
ecore_event_handler_add(ECORE_X_EVENT_XDND_FINISHED,
_e_fm_xdnd_finished_cb,
sd));
sd));
sd->monitor = NULL;
sd->position = 0.0;
@ -2417,31 +2418,41 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
else
{
int dx, dy;
dx = sd->drag.x - ev->cur.output.x;
dy = sd->drag.y - ev->cur.output.y;
if (((dx * dx) + (dy * dy)) > (100))
{
{
Evas_Object *o = NULL;
Evas_Coord x, y, w, h;
int cx, cy;
char *data;
char **drop_types;
drop_types = calloc(1, sizeof(char*));
drop_types[0] = strdup("text/uri-list");
data = calloc(PATH_MAX, sizeof(char));
snprintf(data, PATH_MAX * sizeof(char), "file://%s", icon->file->path);
ecore_evas_geometry_get(sd->win->ecore_evas, &cx, &cy, NULL, NULL);
evas_object_geometry_get(icon->icon_obj, &x, &y, &w, &h);
sd->drag.ecore_evas = ecore_evas_software_x11_new(0, 0, cx + x, cx + y, w, h);
sd->drag.dx = cx;
sd->drag.dy = cy;
if(!sd->drag.ecore_evas)
sd->drag.ecore_evas = ecore_evas_software_x11_new(NULL, 0, cx + x, cx + 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);
ecore_x_dnd_aware_set(sd->drag.win, 1);
ecore_evas_shaped_set(sd->drag.ecore_evas, 1);
ecore_evas_borderless_set(sd->drag.ecore_evas, 1);
ecore_evas_name_class_set(sd->drag.ecore_evas, "E", "_e_drag_window");
ecore_evas_title_set(sd->drag.ecore_evas, "E Drag");
sd->drag.image_object = e_fm_icon_add(sd->drag.evas);
e_fm_icon_file_set(sd->drag.image_object, icon->file);
@ -2455,20 +2466,16 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
evas_object_move(sd->drag.image_object, 0, 0);
evas_object_show(sd->drag.image_object);
e_fm_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
_e_fm_win_mouse_up_cb, sd);
e_fm_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,
_e_fm_win_mouse_move_cb, sd);
ecore_x_pointer_confine_grab(sd->drag.win);
ecore_x_keyboard_grab(sd->drag.win);
ecore_x_dnd_aware_set(sd->drag.win, 1);
ecore_x_mwm_borderless_set(sd->drag.win, 1);
ecore_x_dnd_types_set(sd->drag.win, drop_types, 1);
ecore_x_dnd_begin(sd->drag.win, data, PATH_MAX * sizeof(char));
evas_event_feed_mouse_up(sd->evas, 1, EVAS_BUTTON_NONE, ev->timestamp, NULL);
e_fm_mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,
_e_fm_win_mouse_move_cb, sd);
e_fm_mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
_e_fm_win_mouse_up_cb, sd);
sd->drag.start = 0;
}
}
@ -2476,19 +2483,18 @@ _e_fm_icon_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
}
static int
_e_fm_win_mouse_move_cb(void *data, int type, void *event)
_e_fm_win_mouse_move_cb(void *data, int type, void *event)
{
Ecore_X_Event_Mouse_Move *ev;
E_Fm_Smart_Data *sd;
printf("MOVE!!!\n");
sd = data;
ev = event;
ecore_evas_show(sd->drag.ecore_evas);
ecore_evas_move(sd->drag.ecore_evas, ev->x , ev->y );
printf("moving window to %d %d\n", ev->x , ev->y );
ecore_evas_move(sd->drag.ecore_evas, ev->x + sd->drag.dx, ev->y + sd->drag.dy);
if(!ecore_evas_visibility_get(sd->drag.ecore_evas))
ecore_evas_show(sd->drag.ecore_evas);
return 1;
}
@ -2499,14 +2505,9 @@ static int
E_Fm_Smart_Data *sd;
sd = data;
printf("UP!\n");
ecore_x_pointer_ungrab();
ecore_x_keyboard_ungrab();
ecore_x_dnd_drop();
ecore_event_handler_del(e_fm_mouse_up_handler);
e_fm_mouse_up_handler = NULL;
@ -2515,7 +2516,7 @@ static int
sd->drag.start = 0;
ecore_evas_free(sd->drag.ecore_evas);
ecore_evas_hide(sd->drag.ecore_evas);
return 1;
}
@ -3210,7 +3211,7 @@ _e_fm_xdnd_enter_cb(void *data, int type, void *event)
ev = event;
sd = data;
if (ev->win != sd->win->evas_win) return 1;
return 1;
}