ecore_evas_wayland: register the handler to detect the output transform change 11/127311/1
authorBoram Park <boram1288.park@samsung.com>
Fri, 17 Mar 2017 04:43:05 +0000 (13:43 +0900)
committerBoram Park <boram1288.park@samsung.com>
Thu, 27 Apr 2017 04:42:41 +0000 (13:42 +0900)
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

src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h
src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c

index 29627ef..ee43d1c 100755 (executable)
@@ -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)
 {
index 4df63c1..18a4a33 100644 (file)
@@ -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);
index 9f3fcaf..0897133 100755 (executable)
@@ -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);
index 9e37c08..bd40a33 100644 (file)
@@ -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);