forked from enlightenment/enlightenment
the start of pager window dnd. currently only lets you move windows from one desktop to another.
SVN revision: 16672
This commit is contained in:
parent
8f058f3991
commit
0bef9c6f52
|
@ -64,6 +64,14 @@ static void _pager_desk_cb_mouse_move(void *data, Evas *e, Evas_Object *o
|
|||
static void _pager_desk_cb_intercept_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
|
||||
static void _pager_desk_cb_intercept_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
|
||||
|
||||
static void _pager_window_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static void _pager_window_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static void _pager_window_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static void _pager_window_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static void _pager_window_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
|
||||
static void _pager_window_cb_drag_finished(E_Drag *drag, int dropped);
|
||||
|
||||
static void _pager_face_cb_enter(void *data, const char *type, void *drop);
|
||||
static void _pager_face_cb_move(void *data, const char *type, void *drop);
|
||||
static void _pager_face_cb_leave(void *data, const char *type, void *drop);
|
||||
|
@ -526,6 +534,12 @@ _pager_face_new(Pager *pager, E_Zone *zone, Evas *evas)
|
|||
"enlightenment/border",
|
||||
face->fx, face->fy, face->fw, face->fh);
|
||||
|
||||
face->drop_handler = e_drop_handler_add(face,
|
||||
_pager_face_cb_enter, _pager_face_cb_move,
|
||||
_pager_face_cb_leave, _pager_face_cb_drop,
|
||||
"enlightenment/pager_win",
|
||||
face->fx, face->fy, face->fw, face->fh);
|
||||
|
||||
face->gmc = e_gadman_client_new(zone->container->gadman);
|
||||
_pager_face_zone_set(face, zone);
|
||||
|
||||
|
@ -785,6 +799,7 @@ _pager_window_new(Pager_Desk *pd, E_Border *border)
|
|||
e_theme_edje_object_set(o, "base/theme/modules/pager",
|
||||
"modules/pager/window");
|
||||
if (visible) evas_object_show(o);
|
||||
|
||||
e_layout_pack(pd->layout_object, pw->window_object);
|
||||
e_layout_child_raise(pw->window_object);
|
||||
o = e_border_icon_add(border, pd->face->evas);
|
||||
|
@ -795,6 +810,23 @@ _pager_window_new(Pager_Desk *pd, E_Border *border)
|
|||
edje_object_part_swallow(pw->window_object, "icon", o);
|
||||
}
|
||||
|
||||
/* add an event object */
|
||||
|
||||
o = evas_object_rectangle_add(pd->face->evas);
|
||||
pw->event_object = o;
|
||||
evas_object_layer_set(o, 2);
|
||||
evas_object_repeat_events_set(o, 1);
|
||||
evas_object_color_set(o, 0, 0, 0, 0);
|
||||
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_IN, _pager_window_cb_mouse_in, pw);
|
||||
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_OUT, _pager_window_cb_mouse_out, pw);
|
||||
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _pager_window_cb_mouse_down, pw);
|
||||
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _pager_window_cb_mouse_up, pw);
|
||||
evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _pager_window_cb_mouse_move, pw);
|
||||
evas_object_show(o);
|
||||
e_layout_pack(pd->layout_object, pw->event_object);
|
||||
e_layout_child_raise(pw->event_object);
|
||||
|
||||
|
||||
_pager_window_move(pd->face, pw);
|
||||
return pw;
|
||||
}
|
||||
|
@ -817,6 +849,12 @@ _pager_window_move(Pager_Face *face, Pager_Win *pw)
|
|||
e_layout_child_resize(pw->window_object,
|
||||
pw->border->w,
|
||||
pw->border->h);
|
||||
e_layout_child_move(pw->event_object,
|
||||
pw->border->x - pw->desk->desk->zone->x,
|
||||
pw->border->y - pw->desk->desk->zone->y);
|
||||
e_layout_child_resize(pw->event_object,
|
||||
pw->border->w,
|
||||
pw->border->h);
|
||||
}
|
||||
|
||||
static Pager_Win *
|
||||
|
@ -1242,11 +1280,13 @@ _pager_cb_event_border_desk_set(void *data, int type, void *event)
|
|||
/* remove it from whatever desk it was on */
|
||||
pw->desk->wins = evas_list_remove(pw->desk->wins, pw);
|
||||
e_layout_unpack(pw->window_object);
|
||||
e_layout_unpack(pw->event_object);
|
||||
|
||||
/* add it to the one its MEANT to be on */
|
||||
pw->desk = pd;
|
||||
pd->wins = evas_list_append(pd->wins, pw);
|
||||
e_layout_pack(pd->layout_object, pw->window_object);
|
||||
e_layout_pack(pd->layout_object, pw->event_object);
|
||||
e_layout_child_raise(pw->window_object);
|
||||
_pager_window_move(face, pw);
|
||||
}
|
||||
|
@ -1312,16 +1352,28 @@ _pager_cb_event_border_stack(void *data, int type, void *event)
|
|||
if (ev->type == E_STACKING_ABOVE)
|
||||
{
|
||||
if (pw2)
|
||||
{
|
||||
e_layout_child_raise_above(pw->window_object, pw2->window_object);
|
||||
e_layout_child_raise_above(pw->event_object, pw2->event_object);
|
||||
}
|
||||
else
|
||||
{
|
||||
e_layout_child_raise(pw->window_object);
|
||||
e_layout_child_raise(pw->event_object);
|
||||
}
|
||||
}
|
||||
else if (ev->type == E_STACKING_BELOW)
|
||||
{
|
||||
if (pw2)
|
||||
{
|
||||
e_layout_child_lower_below(pw->window_object, pw2->window_object);
|
||||
e_layout_child_lower_below(pw->event_object, pw2->event_object);
|
||||
}
|
||||
else
|
||||
{
|
||||
e_layout_child_lower(pw->window_object);
|
||||
e_layout_child_lower(pw->event_object);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1695,10 +1747,6 @@ _pager_desk_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_inf
|
|||
E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
|
||||
e_util_container_fake_mouse_up_all_later(pd->face->zone->container);
|
||||
}
|
||||
else if (ev->button == 1)
|
||||
{
|
||||
e_desk_show(pd->desk);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1709,6 +1757,11 @@ _pager_desk_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
|||
|
||||
ev = event_info;
|
||||
desk = data;
|
||||
|
||||
if ((ev->button == 1) && !(desk->face->dragging))
|
||||
{
|
||||
e_desk_show(desk->desk);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1743,6 +1796,153 @@ _pager_desk_cb_intercept_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_C
|
|||
evas_object_resize(desk->event_object, w, h);
|
||||
}
|
||||
|
||||
|
||||
/*****/
|
||||
|
||||
static void
|
||||
_pager_window_cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_In *ev;
|
||||
Pager_Win *pw;
|
||||
|
||||
ev = event_info;
|
||||
pw = data;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
_pager_window_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_Out *ev;
|
||||
Pager_Win *pw;
|
||||
|
||||
ev = event_info;
|
||||
pw = data;
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
_pager_window_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_Down *ev;
|
||||
Pager_Win *pw;
|
||||
|
||||
ev = event_info;
|
||||
pw = data;
|
||||
if (!pw) return;
|
||||
|
||||
/* make this configurable */
|
||||
if ((ev->button == 1))
|
||||
{
|
||||
printf("DN: %d\n", pw);
|
||||
pw->drag.start = 1;
|
||||
pw->drag.x = -1;
|
||||
pw->drag.y = -1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_pager_window_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_Up *ev;
|
||||
Pager_Win *pw;
|
||||
|
||||
ev = event_info;
|
||||
pw = data;
|
||||
if (!pw) return;
|
||||
|
||||
printf("UP: %d\n", pw);
|
||||
pw->drag.start = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
_pager_window_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
|
||||
{
|
||||
Evas_Event_Mouse_Move *ev;
|
||||
Pager_Win *pw;
|
||||
|
||||
ev = event_info;
|
||||
pw = data;
|
||||
|
||||
if (!pw) return;
|
||||
if (pw->drag.start)
|
||||
{
|
||||
printf("DRAG: %d\n", pw);
|
||||
if ((pw->drag.x == -1) && (pw->drag.y == -1))
|
||||
{
|
||||
pw->drag.x = ev->cur.output.x;
|
||||
pw->drag.y = ev->cur.output.y;
|
||||
}
|
||||
else
|
||||
{
|
||||
int dx, dy;
|
||||
|
||||
dx = pw->drag.x - ev->cur.output.x;
|
||||
dy = pw->drag.y - ev->cur.output.y;
|
||||
if (((dx * dx) + (dy * dy)) >
|
||||
(e_config->drag_resist * e_config->drag_resist))
|
||||
{
|
||||
/* start drag! */
|
||||
|
||||
if (pw->window_object)
|
||||
{
|
||||
E_Drag *drag;
|
||||
Evas_Object *o, *oo;
|
||||
Evas_Coord x, y, w, h;
|
||||
const char *file, *part;
|
||||
|
||||
evas_object_geometry_get(pw->window_object,
|
||||
&x, &y, &w, &h);
|
||||
|
||||
drag = e_drag_new(pw->desk->face->zone->container,
|
||||
x,
|
||||
y, "enlightenment/pager_win",
|
||||
pw, _pager_window_cb_drag_finished);
|
||||
|
||||
o = edje_object_add(drag->evas);
|
||||
edje_object_file_get(pw->window_object, &file, &part);
|
||||
edje_object_file_set(o, file, part);
|
||||
oo = o;
|
||||
|
||||
o = edje_object_add(drag->evas);
|
||||
edje_object_file_get(pw->icon_object, &file, &part);
|
||||
edje_object_file_set(o, file, part);
|
||||
edje_object_part_swallow(oo, "icon", o);
|
||||
|
||||
e_drag_object_set(drag, oo);
|
||||
|
||||
e_drag_resize(drag, w, h);
|
||||
e_drag_start(drag, pw->drag.x, pw->drag.y);
|
||||
|
||||
/* this prevents the desk from switching on drags */
|
||||
pw->desk->face->dragging = 1;
|
||||
evas_event_feed_mouse_up(pw->desk->face->evas, 1,
|
||||
EVAS_BUTTON_NONE, ecore_time_get(), NULL);
|
||||
}
|
||||
pw->drag.start = 0;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_pager_window_cb_drag_finished(E_Drag *drag, int dropped)
|
||||
{
|
||||
Pager_Win *pw;
|
||||
|
||||
pw = drag->data;
|
||||
|
||||
if (pw && pw->desk && pw->desk->face)
|
||||
{
|
||||
pw->desk->face->dragging = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*****/
|
||||
|
||||
static void
|
||||
_pager_face_cb_enter(void *data, const char *type, void *event_info)
|
||||
{
|
||||
|
@ -1830,7 +2030,20 @@ _pager_face_cb_drop(void *data, const char *type, void *event_info)
|
|||
y = (ev->y - (face->fy + face->inset.t)) / h;
|
||||
|
||||
desk = e_desk_at_xy_get(face->zone, x, y);
|
||||
|
||||
|
||||
if (!strcmp(type, "enlightenment/pager_win"))
|
||||
{
|
||||
bd = ((Pager_Win *)(ev->data))->border;
|
||||
}
|
||||
else if (!strcmp(type, "enlightenment/border"))
|
||||
{
|
||||
bd = ev->data;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ((bd) && (desk))
|
||||
{
|
||||
|
|
|
@ -97,6 +97,8 @@ struct _Pager_Face
|
|||
E_Drop_Handler *drop_handler;
|
||||
|
||||
Pager_Popup *current_popup;
|
||||
|
||||
unsigned char dragging:1;
|
||||
};
|
||||
|
||||
struct _Pager_Desk
|
||||
|
@ -121,6 +123,12 @@ struct _Pager_Win
|
|||
|
||||
Evas_Object *window_object;
|
||||
Evas_Object *icon_object;
|
||||
Evas_Object *event_object;
|
||||
|
||||
struct {
|
||||
unsigned char start : 1;
|
||||
int x, y;
|
||||
} drag;
|
||||
};
|
||||
|
||||
struct _Pager_Popup
|
||||
|
|
Loading…
Reference in New Issue