diff --git a/data/themes/default_pager.edc b/data/themes/default_pager.edc index 487e954af..2f4fc04dc 100644 --- a/data/themes/default_pager.edc +++ b/data/themes/default_pager.edc @@ -62,6 +62,12 @@ group { group { name: "modules/pager/desk"; + data { + item: "drag" "0"; + } + script { + public active; + } parts { part { name: "clip"; @@ -133,6 +139,11 @@ group { inherit: "default" 0.0; color: 255 255 255 255; } + description { + state: "drag" 0.0; + inherit: "default" 0.0; + color: 255 255 255 164; + } } part { name: "items"; @@ -382,6 +393,48 @@ group { target: "sel"; target: "overlay"; } + program { + name: "set_active"; + signal: "active"; + source: ""; + script { + set_int(active, 1); + } + } + program { + name: "set_passive"; + signal: "passive"; + source: ""; + script { + set_int(active, 0); + } + } + program { + name: "drag_in"; + signal: "drag"; + source: "in"; + action: STATE_SET "drag" 0.0; + target: "overlay"; + } + program { + name: "drag_out"; + signal: "drag"; + source: "out"; + script { + if (get_int(active) == 1) + set_state(PART:"overlay", "active", 0.0); + else + set_state(PART:"overlay", "default", 0.0); + } + } + program { + name: "init"; + signal: "load"; + source: ""; + script { + set_int(active, 0); + } + } } } diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 4d4dae0cd..751c57969 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -62,7 +62,10 @@ 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_cb_drop(void *data, const char *type, void *drop); +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); +static void _pager_face_cb_drop(void *data, const char *type, void *drop); static int _pager_count; @@ -274,6 +277,7 @@ _pager_face_new(E_Zone *zone) { Pager_Face *face; Evas_Object *o; + Evas_Coord x, y, w, h; face = E_NEW(Pager_Face, 1); if (!face) return NULL; @@ -341,8 +345,17 @@ _pager_face_new(E_Zone *zone) edje_object_part_swallow(face->pager_object, "items", face->table_object); evas_object_show(o); + evas_object_resize(face->pager_object, 1000, 1000); + edje_object_calc_force(face->pager_object); + edje_object_part_geometry_get(face->pager_object, "items", &x, &y, &w, &h); + face->inset.l = x; + face->inset.r = 1000 - (x + w); + face->inset.t = y; + face->inset.b = 1000 - (y + h); + face->drop_handler = e_drop_handler_add(face, - NULL, NULL, NULL, _pager_cb_drop, + _pager_face_cb_enter, _pager_face_cb_move, + _pager_face_cb_leave, _pager_face_cb_drop, "enlightenment/border", face->fx, face->fy, face->fw, face->fh); @@ -1367,12 +1380,10 @@ _pager_desk_cb_intercept_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_C } static void -_pager_cb_drop(void *data, const char *type, void *event_info) +_pager_face_cb_enter(void *data, const char *type, void *event_info) { - E_Event_Dnd_Drop *ev; + E_Event_Dnd_Enter *ev; Pager_Face *face; - E_Desk *desk; - E_Border *bd; int x, y; double w, h; @@ -1385,6 +1396,73 @@ _pager_cb_drop(void *data, const char *type, void *event_info) x = (ev->x - face->fx) / w; y = (ev->y - face->fy) / h; +} + +static void +_pager_face_cb_move(void *data, const char *type, void *event_info) +{ + E_Event_Dnd_Move *ev; + Pager_Face *face; + Pager_Desk *pd; + int x, y; + double w, h; + Evas_List *l; + + ev = event_info; + face = data; + + w = (face->fw - (face->inset.l + face->inset.r)) / (double) face->xnum; + h = (face->fh - (face->inset.t + face->inset.b)) / (double) face->ynum; + + x = (ev->x - (face->fx + face->inset.l)) / w; + y = (ev->y - (face->fy + face->inset.t)) / h; + + for (l = face->desks; l; l = l->next) + { + pd = l->data; + if ((pd->xpos == x) && (pd->ypos == y)) + edje_object_signal_emit(pd->desk_object, "drag", "in"); + else + edje_object_signal_emit(pd->desk_object, "drag", "out"); + } +} + +static void +_pager_face_cb_leave(void *data, const char *type, void *event_info) +{ + E_Event_Dnd_Leave *ev; + Pager_Face *face; + Evas_List *l; + + ev = event_info; + face = data; + + for (l = face->desks; l; l = l->next) + { + Pager_Desk *pd; + pd = l->data; + edje_object_signal_emit(pd->desk_object, "drag", "out"); + } +} + +static void +_pager_face_cb_drop(void *data, const char *type, void *event_info) +{ + E_Event_Dnd_Drop *ev; + Pager_Face *face; + E_Desk *desk; + E_Border *bd; + int x, y; + double w, h; + + ev = event_info; + face = data; + + w = (face->fw - (face->inset.l + face->inset.r)) / (double) face->xnum; + h = (face->fh - (face->inset.t + face->inset.b)) / (double) face->ynum; + + x = (ev->x - (face->fx + face->inset.l)) / w; + y = (ev->y - (face->fy + face->inset.t)) / h; desk = e_desk_at_xy_get(face->zone, x, y); bd = ev->data; diff --git a/src/modules/pager/e_mod_main.h b/src/modules/pager/e_mod_main.h index 3d55e3542..73a5b2570 100644 --- a/src/modules/pager/e_mod_main.h +++ b/src/modules/pager/e_mod_main.h @@ -53,6 +53,9 @@ struct _Pager_Face Evas_Object *table_object; Evas_Coord fx, fy, fw, fh; + struct { + Evas_Coord l, r, t, b; + } inset; /* Current nr. of desktops */ int xnum, ynum; @@ -87,6 +90,7 @@ struct _Pager_Desk Evas_Object *desk_object; Evas_Object *layout_object; Evas_Object *event_object; + int xpos, ypos; int current : 1;