diff --git a/src/bin/e_border.c b/src/bin/e_border.c index db9f28497..df5e73b32 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -45,6 +45,8 @@ static int _e_border_cb_window_move_resize_request(void *data, int ev_type, void static int _e_border_cb_desktop_change(void *data, int ev_type, void *ev); static int _e_border_cb_sync_alarm(void *data, int ev_type, void *ev); +static int _e_border_cb_zone_desk_flip(void *data, int ev_type, void *ev); + static void _e_border_cb_signal_move_start(void *data, Evas_Object *obj, const char *emission, const char *source); static void _e_border_cb_signal_move_stop(void *data, Evas_Object *obj, const char *emission, const char *source); static void _e_border_cb_signal_resize_tl_start(void *data, Evas_Object *obj, const char *emission, const char *source); @@ -102,7 +104,6 @@ static void _e_border_event_border_stick_free(void *data, void *ev); static void _e_border_event_border_unstick_free(void *data, void *ev); static void _e_border_zone_update(E_Border *bd); -static void _e_border_desk_update(E_Border *bd); static void _e_border_resize_begin(E_Border *bd); static void _e_border_resize_end(E_Border *bd); @@ -176,6 +177,8 @@ e_border_init(void) handlers = evas_list_append(handlers, ecore_event_handler_add(ECORE_X_EVENT_SYNC_ALARM, _e_border_cb_sync_alarm, NULL)); ecore_x_passive_grab_replay_func_set(_e_border_cb_grab_replay, NULL); + handlers = evas_list_append(handlers, ecore_event_handler_add(E_EVENT_ZONE_DESK_FLIP, _e_border_cb_zone_desk_flip, NULL)); + E_EVENT_BORDER_ADD = ecore_event_type_new(); E_EVENT_BORDER_REMOVE = ecore_event_type_new(); E_EVENT_BORDER_DESK_SET = ecore_event_type_new(); @@ -192,7 +195,7 @@ e_border_init(void) E_EVENT_BORDER_LOWER = ecore_event_type_new(); E_EVENT_BORDER_ICON_CHANGE = ecore_event_type_new(); - focus_fix_timer = ecore_timer_add(0.1, _e_border_cb_focus_fix, NULL); + //focus_fix_timer = ecore_timer_add(0.1, _e_border_cb_focus_fix, NULL); return 1; } @@ -208,7 +211,7 @@ e_border_shutdown(void) handlers = evas_list_remove_list(handlers, handlers); ecore_event_handler_del(h); } - ecore_timer_del(focus_fix_timer); + //ecore_timer_del(focus_fix_timer); focus_fix_timer = NULL; return 1; } @@ -611,7 +614,6 @@ e_border_move(E_Border *bd, int x, int y) bd->client.h); _e_border_move_update(bd); _e_border_zone_update(bd); - _e_border_desk_update(bd); ev = calloc(1, sizeof(E_Event_Border_Move)); ev->border = bd; e_object_ref(E_OBJECT(bd)); @@ -2407,6 +2409,39 @@ _e_border_cb_sync_alarm(void *data, int ev_type, void *ev) return 1; } +/* FIXME: + * Using '2' is bad, may change in zone flip code. + * Calculate pos from e->x and e->y + */ +static int +_e_border_cb_zone_desk_flip(void *data, int ev_type, void *ev) +{ + E_Event_Zone_Desk_Flip *e; + + e = ev; + if ((!move) || (move->desk != e->prev)) return 1; + + e_border_desk_set(move, e->current); + e_border_show(move); + switch (e->direction) + { + case E_DIRECTION_UP: + e_border_move(move, move->x, move->y + (move->zone->h - 2)); + break; + case E_DIRECTION_RIGHT: + e_border_move(move, move->x - (move->zone->w - 2), move->y); + break; + case E_DIRECTION_DOWN: + e_border_move(move, move->x, move->y - (move->zone->h - 2)); + break; + case E_DIRECTION_LEFT: + e_border_move(move, move->x + (move->zone->w - 2), move->y); + break; + } + + return 1; +} + static void _e_border_cb_signal_move_start(void *data, Evas_Object *obj, const char *emission, const char *source) { @@ -4711,12 +4746,6 @@ _e_border_zone_update(E_Border *bd) } } -static void -_e_border_desk_update(E_Border *bd) -{ - e_border_desk_set(bd, e_desk_current_get(bd->zone)); -} - static void _e_border_resize_begin(E_Border *bd) { diff --git a/src/bin/e_zone.c b/src/bin/e_zone.c index e3d331341..0ad5aa5b5 100644 --- a/src/bin/e_zone.c +++ b/src/bin/e_zone.c @@ -18,8 +18,10 @@ static int _e_zone_cb_mouse_out(void *data, int type, void *event); static int _e_zone_cb_timer(void *data); static int _e_zone_cb_desk_show(void *data, int type, void *event); static void _e_zone_update_flip(E_Zone *zone); +static void _e_zone_event_zone_desk_flip_free(void *data, void *ev); int E_EVENT_ZONE_DESK_COUNT_SET = 0; +int E_EVENT_ZONE_DESK_FLIP = 0; #define E_ZONE_FLIP_UP(zone) ((zone)->desk_y_current > 0) #define E_ZONE_FLIP_RIGHT(zone) (((zone)->desk_x_current + 1) < (zone)->desk_x_count) @@ -30,6 +32,7 @@ int e_zone_init(void) { E_EVENT_ZONE_DESK_COUNT_SET = ecore_event_type_new(); + E_EVENT_ZONE_DESK_FLIP = ecore_event_type_new(); return 1; } @@ -715,23 +718,23 @@ static int _e_zone_cb_timer(void *data) { E_Zone *zone; - E_Desk *desk; + E_Desk *prev = NULL, *current = NULL; int x, y; zone = data; ecore_x_pointer_xy_get(zone->container->win, &x, &y); + prev = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current); switch (zone->flip.direction) { case E_DIRECTION_UP: if (E_ZONE_FLIP_UP(zone)) { - desk = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current - 1); - if (desk) + current = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current - 1); + if (current) { - e_desk_show(desk); - /* FIXME: move border after warp */ + e_desk_show(current); ecore_x_pointer_warp(zone->container->win, x, zone->h - 2); } } @@ -739,11 +742,10 @@ _e_zone_cb_timer(void *data) case E_DIRECTION_RIGHT: if (E_ZONE_FLIP_RIGHT(zone)) { - desk = e_desk_at_xy_get(zone, zone->desk_x_current + 1, zone->desk_y_current); - if (desk) + current = e_desk_at_xy_get(zone, zone->desk_x_current + 1, zone->desk_y_current); + if (current) { - e_desk_show(desk); - /* FIXME: move border after warp */ + e_desk_show(current); ecore_x_pointer_warp(zone->container->win, 2, y); } } @@ -751,11 +753,10 @@ _e_zone_cb_timer(void *data) case E_DIRECTION_DOWN: if (E_ZONE_FLIP_DOWN(zone)) { - desk = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current + 1); - if (desk) + current = e_desk_at_xy_get(zone, zone->desk_x_current, zone->desk_y_current + 1); + if (current) { - e_desk_show(desk); - /* FIXME: move border after warp */ + e_desk_show(current); ecore_x_pointer_warp(zone->container->win, x, 2); } } @@ -763,11 +764,10 @@ _e_zone_cb_timer(void *data) case E_DIRECTION_LEFT: if (E_ZONE_FLIP_LEFT(zone)) { - desk = e_desk_at_xy_get(zone, zone->desk_x_current - 1, zone->desk_y_current); - if (desk) + current = e_desk_at_xy_get(zone, zone->desk_x_current - 1, zone->desk_y_current); + if (current) { - e_desk_show(desk); - /* FIXME: move border after warp */ + e_desk_show(current); ecore_x_pointer_warp(zone->container->win, zone->w - 2, y); } } @@ -776,6 +776,24 @@ _e_zone_cb_timer(void *data) zone->flip.timer = NULL; + if (current) + { + E_Event_Zone_Desk_Flip *ev; + + ev = E_NEW(E_Event_Zone_Desk_Flip, 1); + if (!ev) return 0; + + ev->x = x; + ev->y = y; + ev->direction = zone->flip.direction; + ev->prev = prev; + if (ev->prev) e_object_ref(E_OBJECT(ev->prev)); + ev->current = current; + e_object_ref(E_OBJECT(ev->current)); + + ecore_event_add(E_EVENT_ZONE_DESK_FLIP, ev, _e_zone_event_zone_desk_flip_free, NULL); + } + return 0; } @@ -842,3 +860,14 @@ _e_zone_update_flip(E_Zone *zone) ecore_x_window_hide(zone->flip.bottom); } } + +static void +_e_zone_event_zone_desk_flip_free(void *data, void *ev) +{ + E_Event_Zone_Desk_Flip *e; + + e = ev; + if (e->prev) e_object_unref(E_OBJECT(e->prev)); + e_object_unref(E_OBJECT(e->current)); + free(e); +} diff --git a/src/bin/e_zone.h b/src/bin/e_zone.h index ad384a81d..943172b65 100644 --- a/src/bin/e_zone.h +++ b/src/bin/e_zone.h @@ -6,6 +6,7 @@ typedef struct _E_Zone E_Zone; typedef struct _E_Event_Zone_Desk_Count_Set E_Event_Zone_Desk_Count_Set; +typedef struct _E_Event_Zone_Desk_Flip E_Event_Zone_Desk_Flip; #else #ifndef E_ZONE_H @@ -49,6 +50,13 @@ struct _E_Event_Zone_Desk_Count_Set E_Zone *zone; }; +struct _E_Event_Zone_Desk_Flip +{ + int x, y; + E_Direction direction; + E_Desk *prev, *current; +}; + EAPI int e_zone_init(void); EAPI int e_zone_shutdown(void); EAPI E_Zone *e_zone_new(E_Container *con, int num, int x, int y, int w, int h); @@ -69,6 +77,7 @@ EAPI void e_zone_desk_linear_flip_to(E_Zone *zone, int x); EAPI int e_zone_app_exec(E_Zone *zone, E_App *a); extern EAPI int E_EVENT_ZONE_DESK_COUNT_SET; +extern EAPI int E_EVENT_ZONE_DESK_FLIP; #endif #endif