From 0745e46d122ad58a57507f6aef3242e75fe9cfaa Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Wed, 24 Apr 2013 15:21:44 -0300 Subject: [PATCH] ecore_evas/wayland: Add support for rotation on wayland_egl backend. Also move the common code for rotation_set from the shm engine to wayland_common. --- .../wayland/ecore_evas_wayland_common.c | 88 +++++++++++++++++ .../engines/wayland/ecore_evas_wayland_egl.c | 35 ++++++- .../wayland/ecore_evas_wayland_private.h | 1 + .../engines/wayland/ecore_evas_wayland_shm.c | 98 +------------------ .../evas/engines/wayland_egl/evas_engine.c | 5 +- 5 files changed, 130 insertions(+), 97 deletions(-) diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index 146d607263..805c3cf8c4 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -253,6 +253,94 @@ _ecore_evas_wl_common_cb_window_configure(void *data EINA_UNUSED, int type EINA_ return ECORE_CALLBACK_PASS_ON; } +void +_ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize) +{ + Ecore_Evas_Engine_Wl_Data *wdata; + int rot_dif; + + wdata = ee->engine.data; + + rot_dif = ee->rotation - rotation; + if (rot_dif < 0) rot_dif = -rot_dif; + + if (rot_dif != 180) + { + int minw, minh, maxw, maxh, basew, baseh, stepw, steph; + int ww, hh; + + if (!resize) + { + if (!ee->prop.fullscreen) + { + int fw, fh; + evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); + ecore_wl_window_resize(wdata->win, ee->h + fh, ee->w + fw, 0); + ecore_wl_window_update_size(wdata->win, ee->h + fh, ee->w + fw); + evas_output_size_set(ee->evas, ee->req.w + fw, ee->req.h + fh); + evas_output_viewport_set(ee->evas, 0, 0, ee->req.w + fw, ee->req.h + fh); + } + else + { + evas_output_size_set(ee->evas, ee->req.w, ee->req.h); + evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h); + if (ee->func.fn_resize) ee->func.fn_resize(ee); + } + if ((ee->rotation == 90) || (ee->rotation == 270)) + evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w); + else + evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h); + ww = ee->h; + hh = ee->w; + ee->w = ww; + ee->h = hh; + ee->req.w = ww; + ee->req.h = hh; + } + else + { + if ((rotation == 0) || (rotation == 180)) + { + evas_output_size_set(ee->evas, ee->w, ee->h); + evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); + } + else + { + evas_output_size_set(ee->evas, ee->h, ee->w); + evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); + } + if (ee->func.fn_resize) ee->func.fn_resize(ee); + if ((ee->rotation == 90) || (ee->rotation == 270)) + evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); + else + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + } + ecore_evas_size_min_get(ee, &minw, &minh); + ecore_evas_size_max_get(ee, &maxw, &maxh); + ecore_evas_size_base_get(ee, &basew, &baseh); + ecore_evas_size_step_get(ee, &stepw, &steph); + ee->rotation = rotation; + ecore_evas_size_min_set(ee, minh, minw); + ecore_evas_size_max_set(ee, maxh, maxw); + ecore_evas_size_base_set(ee, baseh, basew); + ecore_evas_size_step_set(ee, steph, stepw); + _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, + ecore_loop_time_get()); + } + else + { + ee->rotation = rotation; + _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, + ecore_loop_time_get()); + if (ee->func.fn_resize) ee->func.fn_resize(ee); + + if ((ee->rotation == 90) || (ee->rotation == 270)) + evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); + else + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + } +} + int _ecore_evas_wl_common_init(void) { diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c index cbad243525..fb8d19a223 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c @@ -15,6 +15,7 @@ static void _ecore_evas_wl_show(Ecore_Evas *ee); static void _ecore_evas_wl_hide(Ecore_Evas *ee); static void _ecore_evas_wl_alpha_set(Ecore_Evas *ee, int alpha); static void _ecore_evas_wl_transparent_set(Ecore_Evas *ee, int transparent); +static void _ecore_evas_wl_rotation_set(Ecore_Evas *ee, int rotation, int resize); static Ecore_Evas_Engine_Func _ecore_wl_engine_func = { @@ -37,7 +38,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = NULL, // managed_move _ecore_evas_wl_resize, NULL, // move_resize - NULL, // rotation_set + _ecore_evas_wl_rotation_set, NULL, // shaped_set _ecore_evas_wl_show, _ecore_evas_wl_hide, @@ -263,8 +264,16 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) orig_h = h; evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); - w += fw; - h += fh; + if ((ee->rotation == 90) || (ee->rotation == 270)) + { + w += fh; + h += fw; + } + else + { + w += fw; + h += fh; + } } if ((ee->w != w) || (ee->h != h)) @@ -313,6 +322,26 @@ _ecore_evas_wl_resize(Ecore_Evas *ee, int w, int h) } } +static void +_ecore_evas_wl_rotation_set(Ecore_Evas *ee, int rotation, int resize) +{ + Evas_Engine_Info_Wayland_Egl *einfo; + LOGFN(__FILE__, __LINE__, __FUNCTION__); + + if (ee->rotation == rotation) return; + + einfo = (Evas_Engine_Info_Wayland_Egl *)evas_engine_info_get(ee->evas); + if (!einfo) + return; + einfo->info.rotation = rotation; + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) + { + ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); + } + + _ecore_evas_wl_common_rotation_set(ee, rotation, resize); +} + static void _ecore_evas_wl_show(Ecore_Evas *ee) { diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h index 7ecb098fb5..df6957f338 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h @@ -68,6 +68,7 @@ void _ecore_evas_wl_common_screen_geometry_get(const Ecore_Evas *ee, int *x, int void _ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi); void _ecore_evas_wl_common_state_change(void *data); void _ecore_evas_wl_common_render_updates(void *data, Evas *evas, void *event); +void _ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize); Evas_Object * _ecore_evas_wl_common_frame_add(Evas *evas); void _ecore_evas_wl_common_frame_border_size_set(Evas_Object *obj, int fx, int fy, int fw, int fh); diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c index 01b50fa649..3070697acc 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c @@ -354,9 +354,6 @@ static void _ecore_evas_wl_rotation_set(Ecore_Evas *ee, int rotation, int resize) { Evas_Engine_Info_Wayland_Shm *einfo; - Ecore_Evas_Engine_Wl_Data *wdata; - int rot_dif; - LOGFN(__FILE__, __LINE__, __FUNCTION__); if (ee->rotation == rotation) return; @@ -365,97 +362,12 @@ _ecore_evas_wl_rotation_set(Ecore_Evas *ee, int rotation, int resize) if (!einfo) return; einfo->info.rotation = rotation; + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) + { + ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); + } - wdata = ee->engine.data; - - rot_dif = ee->rotation - rotation; - if (rot_dif < 0) rot_dif = -rot_dif; - - if (rot_dif != 180) - { - int minw, minh, maxw, maxh, basew, baseh, stepw, steph; - int ww, hh; - - if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) - { - ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); - } - - if (!resize) - { - // wdata->configure_coming = 1; - if (!ee->prop.fullscreen) - { - int fw, fh; - evas_output_framespace_get(ee->evas, NULL, NULL, &fw, &fh); - ecore_wl_window_resize(wdata->win, ee->h + fh, ee->w + fw, 0); - ecore_wl_window_update_size(wdata->win, ee->h + fh, ee->w + fw); - evas_output_size_set(ee->evas, ee->req.w + fw, ee->req.h + fh); - evas_output_viewport_set(ee->evas, 0, 0, ee->req.w + fw, ee->req.h + fh); - } - else - { - evas_output_size_set(ee->evas, ee->req.w, ee->req.h); - evas_output_viewport_set(ee->evas, 0, 0, ee->req.w, ee->req.h); - if (ee->func.fn_resize) ee->func.fn_resize(ee); - } - if ((ee->rotation == 90) || (ee->rotation == 270)) - evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.h, ee->req.w); - else - evas_damage_rectangle_add(ee->evas, 0, 0, ee->req.w, ee->req.h); - ww = ee->h; - hh = ee->w; - ee->w = ww; - ee->h = hh; - ee->req.w = ww; - ee->req.h = hh; - } - else - { - if ((rotation == 0) || (rotation == 180)) - { - evas_output_size_set(ee->evas, ee->w, ee->h); - evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); - } - else - { - evas_output_size_set(ee->evas, ee->h, ee->w); - evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); - } - if (ee->func.fn_resize) ee->func.fn_resize(ee); - if ((ee->rotation == 90) || (ee->rotation == 270)) - evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); - else - evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); - } - ecore_evas_size_min_get(ee, &minw, &minh); - ecore_evas_size_max_get(ee, &maxw, &maxh); - ecore_evas_size_base_get(ee, &basew, &baseh); - ecore_evas_size_step_get(ee, &stepw, &steph); - ee->rotation = rotation; - ecore_evas_size_min_set(ee, minh, minw); - ecore_evas_size_max_set(ee, maxh, maxw); - ecore_evas_size_base_set(ee, baseh, basew); - ecore_evas_size_step_set(ee, steph, stepw); - _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, - ecore_loop_time_get()); - } - else - { - if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) - { - ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); - } - ee->rotation = rotation; - // _ecore_evas_mouse_move_process(ee, ee->mouse.x, ee->mouse.y, - // ecore_x_current_time_get()); - if (ee->func.fn_resize) ee->func.fn_resize(ee); - - if ((ee->rotation == 90) || (ee->rotation == 270)) - evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); - else - evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); - } + _ecore_evas_wl_common_rotation_set(ee, rotation, resize); } static void diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c b/src/modules/evas/engines/wayland_egl/evas_engine.c index 776bdfb0bc..56cac55889 100644 --- a/src/modules/evas/engines/wayland_egl/evas_engine.c +++ b/src/modules/evas/engines/wayland_egl/evas_engine.c @@ -894,7 +894,10 @@ eng_output_resize(void *data, int w, int h) else dy = 0; - wl_egl_window_resize(re->win->win, w, h, dx, dy); + if ((re->win->rot == 90) || (re->win->rot == 270)) + wl_egl_window_resize(re->win->win, h, w, dy, dx); + else + wl_egl_window_resize(re->win->win, w, h, dx, dy); } evas_gl_common_context_resize(re->win->gl_context, w, h, re->win->rot);