ecore_evas/wayland: Add support for rotation on wayland_egl backend.
authorRafael Antognolli <rafael.antognolli@intel.com>
Wed, 24 Apr 2013 18:21:44 +0000 (15:21 -0300)
committerRafael Antognolli <rafael.antognolli@intel.com>
Wed, 24 Apr 2013 18:24:37 +0000 (15:24 -0300)
Also move the common code for rotation_set from the shm engine to
wayland_common.

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
src/modules/evas/engines/wayland_egl/evas_engine.c

index 146d607..805c3cf 100644 (file)
@@ -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)
 {
index cbad243..fb8d19a 100644 (file)
@@ -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)
 {
index 7ecb098..df6957f 100644 (file)
@@ -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);
index 01b50fa..3070697 100644 (file)
@@ -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
index 776bdfb..56cac55 100644 (file)
@@ -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);