From bc3e814ab76bd72d56dc67acf88adcfb12259ff4 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 17 Mar 2017 13:43:05 +0900 Subject: [PATCH] ecore_evas_wayland: register the handler to detect the output transform change Moreover, I added output_rotation to ee becuase ee->rotation is already used as the window rotation value. It can't include the output rotation value. ee should be able to distinguish between the window rotation value and the output rotation value because ee have to hide the output rotation information from the clients. Change-Id: I432babf0859f8795766e3f6ac0673641e54c03a3 --- .../engines/wayland/ecore_evas_wayland_common.c | 35 ++++++++++++++++++++++ .../engines/wayland/ecore_evas_wayland_egl.c | 2 ++ .../engines/wayland/ecore_evas_wayland_private.h | 4 +++ .../engines/wayland/ecore_evas_wayland_shm.c | 2 ++ 4 files changed, 43 insertions(+) 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 29627ef..ee43d1c 100755 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -422,6 +422,25 @@ _ecore_evas_wl_common_cb_window_rotate(void *data EINA_UNUSED, int type EINA_UNU return ECORE_CALLBACK_PASS_ON; } +static Eina_Bool +_ecore_evas_wl_common_cb_output_transform(void *data, int type EINA_UNUSED, void *event) +{ + Ecore_Evas *ee = data; + Ecore_Wl_Event_Output_Transform *ev = event; + Ecore_Evas_Engine_Wl_Data *wdata; + Ecore_Wl_Output *output; + + if (!ee) return ECORE_CALLBACK_PASS_ON; + if (!(wdata = ee->engine.data)) return ECORE_CALLBACK_PASS_ON; + + output = ecore_wl_window_output_find(wdata->win); + if (output != ev->output) return ECORE_CALLBACK_PASS_ON; + + /* do something */ + + return ECORE_CALLBACK_PASS_ON; +} + static void _rotation_do(Ecore_Evas *ee, int rotation, int resize) { @@ -755,6 +774,8 @@ _ecore_evas_wl_common_free(Ecore_Evas *ee) if (!ee) return; wdata = ee->engine.data; + if (wdata->output_transform_hdl) + ecore_event_handler_del(wdata->output_transform_hdl); if (wdata->anim_callback) wl_callback_destroy(wdata->anim_callback); if (wdata->win) ecore_wl_window_free(wdata->win); @@ -2100,6 +2121,20 @@ _ecore_evas_wayland_resize(Ecore_Evas *ee, int location) } } +void +_ecore_evas_wl_common_output_transform_register(Ecore_Evas *ee) +{ + Ecore_Evas_Engine_Wl_Data *wdata; + + if (!ee) return; + if (!(wdata = ee->engine.data)) return; + if (wdata->output_transform_hdl) return; + + wdata->output_transform_hdl = + ecore_event_handler_add(ECORE_WL_EVENT_OUTPUT_TRANSFORM, + _ecore_evas_wl_common_cb_output_transform, ee); +} + static void _ecore_evas_wayland_alpha_do(Ecore_Evas *ee, int alpha) { 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 4df63c1..18a4a33 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 @@ -225,6 +225,8 @@ ecore_evas_wayland_egl_options_new_internal(const char *disp_name, unsigned int ECORE_WL_WINDOW_BUFFER_TYPE_EGL_WINDOW); ee->prop.window = ecore_wl_window_id_get(wdata->win); + _ecore_evas_wl_common_output_transform_register(ee); + if (wdata->win) ecore_wl_window_rotation_changed_callback_set (wdata->win, ee, _ecore_evas_wl_common_wm_rot_cb_angle_changed); 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 9f3fcaf..0897133 100755 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h @@ -48,6 +48,9 @@ struct _Ecore_Evas_Engine_Wl_Data unsigned char below : 1; } state; struct wl_callback *anim_callback; + + Ecore_Event_Handler *output_transform_hdl; + short output_rotation; }; Ecore_Evas_Interface_Wayland *_ecore_evas_wl_interface_new(void); @@ -89,6 +92,7 @@ void _ecore_evas_wl_common_post_render(Ecore_Evas *ee); int _ecore_evas_wl_common_render(Ecore_Evas *ee); void _ecore_evas_wl_common_screen_geometry_get(const Ecore_Evas *ee, int *x, int *y, int *w, int *h); void _ecore_evas_wl_common_screen_dpi_get(const Ecore_Evas *ee, int *xdpi, int *ydpi); +void _ecore_evas_wl_common_output_transform_register(Ecore_Evas *ee); void _ecore_evas_wl_common_render_flush_pre(void *data, Evas *evas EINA_UNUSED, void *event); void _ecore_evas_wl_common_render_flush_post(void *data, Evas *evas EINA_UNUSED, void *event); void _ecore_evas_wl_common_render_updates(void *data, Evas *evas, void *event); 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 9e37c08..bd40a33 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 @@ -226,6 +226,8 @@ ecore_evas_wayland_shm_new_internal(const char *disp_name, unsigned int parent, ECORE_WL_WINDOW_BUFFER_TYPE_SHM); ee->prop.window = ecore_wl_window_id_get(wdata->win); + _ecore_evas_wl_common_output_transform_register(ee); + if (wdata->win) ecore_wl_window_rotation_changed_callback_set (wdata->win, ee, _ecore_evas_wl_common_wm_rot_cb_angle_changed); -- 2.7.4