Demo: added transform protocol for transform(rotator) mode 22/45422/2 accepted/tizen/mobile/20150806.065733 accepted/tizen/tv/20150806.065742 accepted/tizen/wearable/20150806.065756 submit/tizen/20150806.024618
authorMinJeong Kim <minjjj.kim@samsung.com>
Thu, 6 Aug 2015 02:19:34 +0000 (11:19 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Thu, 6 Aug 2015 02:34:34 +0000 (19:34 -0700)
Change-Id: I473569f40201202cd859dad5188960090c7f3d2d

configure.ac
packaging/enlightenment.spec
src/bin/e_comp_wl.c
src/bin/e_comp_wl.h
src/modules/wl_desktop_shell/e_scaler.c

index 32488021346a527779a69936cb79adc60bc7c625..409a98b48f50a813022be8e013a420850f222599 100644 (file)
@@ -838,7 +838,7 @@ AC_MSG_CHECKING([whether wayland EGL support is enabled])
 AC_MSG_RESULT([${e_cv_want_wayland_egl}])
 
 if test "x${e_cv_want_wayland_only}" != "xno" || test "x${e_cv_want_wayland_clients}" != "xno";then
-  PKG_CHECK_MODULES([WAYLAND], [ecore-wayland wayland-server >= 1.7.0 xkbcommon uuid xdg-shell-server scaler-server screenshooter-server screenshooter-client tizen-extension-server],
+  PKG_CHECK_MODULES([WAYLAND], [ecore-wayland wayland-server >= 1.7.0 xkbcommon uuid xdg-shell-server scaler-server transform-server screenshooter-server screenshooter-client tizen-extension-server],
     [
       have_wayland=yes
       AC_DEFINE_UNQUOTED([HAVE_WAYLAND],[1],[enable wayland support])
index 6a86d7ad5f557748a57b13520d7e28eab0015e13..e64f930a0eb917ddc589549ea913f37c04c404b1 100644 (file)
@@ -46,6 +46,7 @@ BuildRequires:  pkgconfig(ecore-x)
 BuildRequires:  pkgconfig(wayland-server)
 BuildRequires:  pkgconfig(xdg-shell-server)
 BuildRequires:  pkgconfig(scaler-server)
+BuildRequires:  pkgconfig(transform-server)
 BuildRequires:  pkgconfig(screenshooter-server)
 BuildRequires:  pkgconfig(screenshooter-client)
 BuildRequires:  pkgconfig(tizen-extension-server)
index fb9e2db3a8ee1c342a80ef652493b8484c083305..0fb2089b2f42731ac29a9b8ec1589387c9a21f7c 100644 (file)
@@ -25,6 +25,57 @@ static Eina_List *handlers = NULL;
 static double _last_event_time = 0.0;
 
 /* local functions */
+static void
+_e_comp_wl_transform_set(E_Client *ec)
+{
+   int nx, ny, nw, nh;
+   int sx, sy, dx, dy;
+   int mx, my;
+   static int transform_degree = 0;
+   Evas_Map *map;
+
+   mx = ec->client.x + ec->client.w/2;
+   my = ec->client.y + ec->client.h/2;
+
+   sx = ec->comp_data->transform.sx;
+   sy = ec->comp_data->transform.sy;
+   dx = ec->comp_data->transform.dx;
+   dy = ec->comp_data->transform.dy;
+
+   map = evas_map_new(4);
+   evas_map_util_points_populate_from_geometry(map,
+                                               ec->client.x, ec->client.y,
+                                               ec->comp_data->width_from_viewport,
+                                               ec->comp_data->height_from_viewport,
+                                               0);
+
+   transform_degree += 30;
+   transform_degree %= 360;
+   evas_map_util_rotate(map, transform_degree, mx, my);
+
+   evas_object_map_set(ec->frame, map);
+   evas_object_map_enable_set(ec->frame, map? EINA_TRUE: EINA_FALSE);
+
+   evas_map_point_coord_get(map, 0,
+                            &ec->comp_data->transform.maps[0].x,
+                            &ec->comp_data->transform.maps[0].y,
+                            &ec->comp_data->transform.maps[0].z);
+   evas_map_point_coord_get(map, 1,
+                            &ec->comp_data->transform.maps[1].x,
+                            &ec->comp_data->transform.maps[1].y,
+                            &ec->comp_data->transform.maps[1].z);
+   evas_map_point_coord_get(map, 2,
+                            &ec->comp_data->transform.maps[2].x,
+                            &ec->comp_data->transform.maps[2].y,
+                            &ec->comp_data->transform.maps[2].z);
+   evas_map_point_coord_get(map, 3,
+                            &ec->comp_data->transform.maps[3].x,
+                            &ec->comp_data->transform.maps[3].y,
+                            &ec->comp_data->transform.maps[3].z);
+
+   evas_map_free(map);
+}
+
 static void
 _e_comp_wl_focus_down_set(E_Client *ec)
 {
@@ -389,6 +440,7 @@ _e_comp_wl_evas_cb_mouse_in(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj
    if (e_object_is_del(E_OBJECT(ec))) return;
 
    if (!ec->comp_data->surface) return;
+   if (ec->comp_data->transform.start) return;
 
    wc = wl_resource_get_client(ec->comp_data->surface);
    serial = wl_display_next_serial(ec->comp->wl_comp_data->wl.disp);
@@ -425,6 +477,7 @@ _e_comp_wl_evas_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
    if (e_object_is_del(E_OBJECT(ec))) return;
 
    if (!ec->comp_data->surface) return;
+   if (ec->comp_data->transform.start) return;
 
    wc = wl_resource_get_client(ec->comp_data->surface);
    serial = wl_display_next_serial(ec->comp->wl_comp_data->wl.disp);
@@ -455,6 +508,14 @@ _e_comp_wl_evas_cb_mouse_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *o
    if (e_object_is_del(E_OBJECT(ec))) return;
    if (e_client_util_ignored_get(ec)) return;
    if (!ec->comp_data->surface) return;
+   if (ec->comp_data->transform.start) return;
+   if (ec->comp_data->transform.enabled &&
+       E_INSIDE(wl_fixed_to_int(ec->comp->wl_comp_data->ptr.x),
+                wl_fixed_to_int(ec->comp->wl_comp_data->ptr.y),
+                ec->client.x + ec->client.w - 40,
+                ec->client.y + ec->client.h - 40,
+                40, 40))
+     DBG("TRANSFORM this area for transform!!");
 
    wc = wl_resource_get_client(ec->comp_data->surface);
    EINA_LIST_FOREACH(ec->comp->wl_comp_data->ptr.resources, l, res)
@@ -499,6 +560,45 @@ _e_comp_wl_evas_handle_mouse_button(E_Client *ec, uint32_t timestamp, uint32_t b
 
    if (!ec->comp_data->surface) return EINA_FALSE;
 
+   if (ec->comp_data->transform.enabled)
+     {
+        DBG("TRANSFORM enabled state:%s", state==WL_POINTER_BUTTON_STATE_PRESSED?"pressed":"released");
+        DBG("TRANSFORM is inside of %d,%d (%dx%d)??", ec->client.x + ec->client.w - 40, ec->client.y + ec->client.h - 40, 40, 40);
+        if (state == WL_POINTER_BUTTON_STATE_PRESSED)
+          {
+             if (E_INSIDE(wl_fixed_to_int(ec->comp->wl_comp_data->ptr.x),
+                          wl_fixed_to_int(ec->comp->wl_comp_data->ptr.y),
+                          ec->client.x + ec->client.w - 40,
+                          ec->client.y + ec->client.h - 40,
+                          40, 40))
+               {
+                  ec->comp_data->transform.start = 1;
+                  ec->comp_data->transform.sx = wl_fixed_to_int(ec->comp->wl_comp_data->ptr.x);
+                  ec->comp_data->transform.sy = wl_fixed_to_int(ec->comp->wl_comp_data->ptr.y);
+
+                  DBG("TRANSFORM start %d,%d",
+                      ec->comp_data->transform.sx, ec->comp_data->transform.sy);
+                  return EINA_FALSE;
+               }
+             else
+               ec->comp_data->transform.start = 0;
+          }
+        else if (state == WL_POINTER_BUTTON_STATE_RELEASED)
+          {
+             if (ec->comp_data->transform.start)
+               {
+                  ec->comp_data->transform.dx = wl_fixed_to_int(ec->comp->wl_comp_data->ptr.x);
+                  ec->comp_data->transform.dy = wl_fixed_to_int(ec->comp->wl_comp_data->ptr.y);
+
+                  DBG("TRANSFORM end %d,%d",
+                      ec->comp_data->transform.dx, ec->comp_data->transform.dy);
+                  _e_comp_wl_transform_set(ec);
+                  ec->comp_data->transform.start = 0;
+                  return EINA_FALSE;
+               }
+          }
+     }
+
    wc = wl_resource_get_client(ec->comp_data->surface);
    serial = wl_display_next_serial(ec->comp->wl_comp_data->wl.disp);
 
index 4d13fe6ddb39889156bb8da388be2df3b8230259..f01d2392945022a201b906928b393411d7cdc770 100644 (file)
@@ -312,6 +312,19 @@ struct _E_Comp_Wl_Client_Data
         E_Comp_Wl_Buffer_Viewport buffer_viewport;
      } scaler;
 
+   struct
+     {
+        Eina_Bool enabled : 1;
+        Eina_Bool start : 1;
+        int sx, sy;
+        int dx, dy;
+
+        struct
+          {
+             int x, y, z;
+          } maps[4];
+     } transform;
+
    /* before applying viewport */
    int width_from_buffer;
    int height_from_buffer;
index e34e70c0efd09f0efdd8913cc0aec620bc3c36e3..196ecbc274524480becb50106ee4a8a356a4488b 100644 (file)
@@ -2,6 +2,7 @@
 #define E_COMP_WL
 #include "e.h"
 #include <scaler-server-protocol.h>
+#include <transform-server-protocol.h>
 
 static void
 _e_viewport_destroy(struct wl_resource *resource)
@@ -205,6 +206,109 @@ _e_scaler_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32
    wl_resource_set_implementation(res, &_e_scaler_interface, NULL, NULL);
 }
 
+static void
+_e_rotator_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
+{
+   E_Pixmap *ep;
+   E_Client *ec;
+   E_Comp_Client_Data *cdata = NULL;
+
+   if ((ep = wl_resource_get_user_data(resource)))
+     {
+        if ((ec = e_pixmap_client_get(ep)))
+          {
+             if ((cdata = ec->comp_data))
+               cdata->transform.enabled = EINA_FALSE;
+          }
+     }
+
+     wl_resource_destroy(resource);
+}
+
+static void
+_e_rotator_cb_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
+{
+   E_Pixmap *ep;
+   E_Client *ec;
+   E_Comp_Client_Data *cdata = NULL;
+
+   if (!(ep = wl_resource_get_user_data(resource))) return;
+   if (!(ec = e_pixmap_client_get(ep))) return;
+   if (!(cdata = ec->comp_data)) return;
+
+   cdata->transform.enabled = EINA_TRUE;
+
+   DBG("SET ROTATOR");
+}
+
+static void
+_e_rotator_cb_unset(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
+{
+   E_Pixmap *ep;
+   E_Client *ec;
+   E_Comp_Client_Data *cdata = NULL;
+
+   if (!(ep = wl_resource_get_user_data(resource))) return;
+   if (!(ec = e_pixmap_client_get(ep))) return;
+   if (!(cdata = ec->comp_data)) return;
+
+   cdata->transform.enabled = EINA_FALSE;
+   DBG("UNSET ROTATOR");
+}
+
+static const struct wl_rotator_interface _e_rotator_interface =
+{
+   _e_rotator_cb_destroy,
+   _e_rotator_cb_set,
+   _e_rotator_cb_unset,
+};
+
+static void
+_e_transform_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
+{
+   wl_resource_destroy(resource);
+}
+
+static void
+_e_transform_cb_get_rotator(struct wl_client *client EINA_UNUSED, struct wl_resource *transform, uint32_t id, struct wl_resource *surface_resource)
+{
+   int version = wl_resource_get_version(transform);
+   E_Pixmap *ep;
+   struct wl_resource *res;
+
+   if (!(ep = wl_resource_get_user_data(surface_resource))) return;
+
+   res = wl_resource_create(client, &wl_rotator_interface, version, id);
+   if (res == NULL)
+     {
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   wl_resource_set_implementation(res, &_e_rotator_interface, ep, NULL);
+}
+
+static const struct wl_transform_interface _e_transform_interface =
+{
+   _e_transform_cb_destroy,
+   _e_transform_cb_get_rotator
+};
+
+static void
+_e_transform_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+   struct wl_resource *res;
+
+   if (!(res = wl_resource_create(client, &wl_transform_interface, version, id)))
+     {
+        ERR("Could not create transform resource: %m");
+        wl_client_post_no_memory(client);
+        return;
+     }
+
+   wl_resource_set_implementation(res, &_e_transform_interface, NULL, NULL);
+}
+
 Eina_Bool
 e_scaler_init(void)
 {
@@ -222,5 +326,12 @@ e_scaler_init(void)
         return EINA_FALSE;
      }
 
+   if (!wl_global_create(cdata->wl.disp, &wl_transform_interface, 1,
+                         cdata, _e_transform_cb_bind))
+     {
+        ERR("Could not add transform to wayland globals: %m");
+        return EINA_FALSE;
+     }
+
    return EINA_TRUE;
 }