redesign the cursor rendering 57/83457/3 accepted/tizen/common/20160811.150224 accepted/tizen/ivi/20160811.085952 accepted/tizen/mobile/20160811.085900 accepted/tizen/tv/20160811.085914 accepted/tizen/wearable/20160811.085932 submit/tizen/20160811.072522
authorSooChan Lim <sc1.lim@samsung.com>
Tue, 19 Jul 2016 10:19:24 +0000 (19:19 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 11 Aug 2016 05:41:33 +0000 (14:41 +0900)
1. remove the use of the ecore_evas_cursor apis in enlightenment
2. redesign the e_pointer. all pointer control is managed by e_pointer.
3. The cursor ec will be composited by the compositor. That is,
   the compositor composites the cursor ec as the source image.

Change-Id: Id637fce95de893fb012b839096cdf99733bc35b7

src/bin/e_actions.c
src/bin/e_client.c
src/bin/e_comp.c
src/bin/e_comp_object.c
src/bin/e_comp_screen.c
src/bin/e_comp_wl.c
src/bin/e_comp_wl_input.c
src/bin/e_main.c
src/bin/e_pointer.c
src/bin/e_pointer.h

index 42a2ed1..df555fb 100644 (file)
@@ -1592,7 +1592,7 @@ ACT_FN_GO(pointer_resize_push, )
         if ((ec->lock_user_size) || (ec->shaded) || (ec->shading) ||
             (ec->fullscreen) || ((ec->maximized) && (!e_config->allow_manip)))
           return;
-        e_pointer_type_push(e_comp->pointer, ec, params);
+        ERR("pointer_resize_push Not Supported.");
      }
 }
 
@@ -1608,7 +1608,7 @@ ACT_FN_GO(pointer_resize_pop, )
         if ((ec->lock_user_size) || (ec->shaded) || (ec->shading) ||
             (ec->fullscreen) || ((ec->maximized) && (!e_config->allow_manip)))
           return;
-        e_pointer_type_pop(e_comp->pointer, ec, params);
+        ERR("pointer_resize_push Not Supported.");
      }
 }
 
index dc6f26b..40994db 100644 (file)
@@ -842,7 +842,6 @@ _e_client_del(E_Client *ec)
           ec->cur_mouse_action->func.end(E_OBJECT(ec), "");
      }
    if (action_client == ec) _e_client_action_finish();
-   e_pointer_type_pop(e_comp->pointer, ec, NULL);
 
    if (warp_client == ec)
      {
@@ -1083,7 +1082,6 @@ _e_client_move_end(E_Client *ec)
         //client_grabbed = 0;
      //}
    _e_client_action_input_win_del();
-   e_pointer_mode_pop(ec, E_POINTER_MOVE);
    ec->moving = 0;
    _e_client_hook_call(E_CLIENT_HOOK_MOVE_END, ec);
 
@@ -1303,7 +1301,6 @@ static int
 _e_client_resize_end(E_Client *ec)
 {
    _e_client_action_input_win_del();
-   e_pointer_mode_pop(ec, ec->resize_mode);
    ec->resize_mode = E_POINTER_RESIZE_NONE;
 
    /* If this border was maximized, we need to unset Maximized state or
@@ -1637,7 +1634,6 @@ _e_client_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
         E_FREE_FUNC(ec->cur_mouse_action, e_object_unref);
      }
    if (action_client == ec) _e_client_action_finish();
-   e_pointer_type_pop(e_comp->pointer, ec, NULL);
 
    if (!ec->hidden)
      {
@@ -5169,7 +5165,6 @@ e_client_act_move_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev)
 
    _e_client_action_init(ec);
    e_zone_edge_disable();
-   e_pointer_mode_push(ec, E_POINTER_MOVE);
 }
 
 E_API void
@@ -5251,7 +5246,6 @@ e_client_act_resize_begin(E_Client *ec, E_Binding_Event_Mouse_Button *ev)
    if (!e_client_resize_begin(ec))
      return;
    _e_client_action_init(ec);
-   e_pointer_mode_push(ec, ec->resize_mode);
 }
 
 E_API void
@@ -5331,114 +5325,13 @@ e_client_ping(E_Client *ec)
                                       _e_client_cb_ping_poller, ec);
 }
 
-static void
-_e_client_map_transform(int width, int height, uint32_t transform,
-                         int sx, int sy, int *dx, int *dy)
-{
-   switch (transform)
-     {
-      case WL_OUTPUT_TRANSFORM_NORMAL:
-      default:
-        *dx = sx, *dy = sy;
-        break;
-      case WL_OUTPUT_TRANSFORM_90:
-        *dx = height - sy, *dy = sx;
-        break;
-      case WL_OUTPUT_TRANSFORM_180:
-        *dx = width - sx, *dy = height - sy;
-        break;
-      case WL_OUTPUT_TRANSFORM_270:
-        *dx = sy, *dy = width - sx;
-        break;
-     }
-}
-
 ////////////////////////////////////////////
 E_API void
 e_client_cursor_map_apply(E_Client *ec, int rotation, int x, int y)
 {
-   Evas_Map *map;
-   int x1, y1, x2, y2, dx, dy;
-   int32_t width, height;
-   int cursor_w, cursor_h;
-   uint32_t transform;
-   int rot_x = x, rot_y = y;
-   int zone_w = ec->zone->w;
-   int zone_h = ec->zone->h;
-   double awh = ((double)zone_w / (double)zone_h);
-   double ahw = ((double)zone_h / (double)zone_w);
-
-   if ((rotation == 0) || (rotation % 90 != 0) || (rotation / 90 > 3))
-     {
-        evas_object_map_set(ec->frame, NULL);
-        evas_object_map_enable_set(ec->frame, EINA_FALSE);
-        evas_object_move(ec->frame, x, y);
-
-        return;
-     }
-
-   evas_object_geometry_get(ec->frame, NULL, NULL, &cursor_w, &cursor_h);
-   width = cursor_w;
-   height = cursor_h;
-
-   switch(rotation)
-     {
-      case 90:
-         rot_x = y * awh;
-         rot_y = ahw * (zone_w - x);
-         transform = WL_OUTPUT_TRANSFORM_90;
-         width = cursor_h;
-         height = cursor_w;
-         break;
-      case 180:
-         rot_x = zone_w - x;
-         rot_y = zone_h - y;
-         transform = WL_OUTPUT_TRANSFORM_180;
-         break;
-      case 270:
-         rot_x = awh * (zone_h - y);
-         rot_y = ahw * x;
-         transform = WL_OUTPUT_TRANSFORM_270;
-         width = cursor_h;
-         height = cursor_w;
-         break;
-      default:
-         transform = WL_OUTPUT_TRANSFORM_NORMAL;
-         break;
-     }
-   ec->client.x = rot_x, ec->client.y = rot_y;
-   ec->x = rot_x, ec->y = rot_y;
-
-   map = evas_map_new(4);
-   evas_map_util_points_populate_from_geometry(map,
-                                               ec->x, ec->y,
-                                               width, height, 0);
-
-   x1 = 0.0;
-   y1 = 0.0;
-   x2 = width;
-   y2 = height;
-
-   _e_client_map_transform(width, height, transform,
-                            x1, y1, &dx, &dy);
-   evas_map_point_image_uv_set(map, 0, dx, dy);
-
-   _e_client_map_transform(width, height, transform,
-                            x2, y1, &dx, &dy);
-   evas_map_point_image_uv_set(map, 1, dx, dy);
-
-   _e_client_map_transform(width, height, transform,
-                            x2, y2, &dx, &dy);
-   evas_map_point_image_uv_set(map, 2, dx, dy);
-
-   _e_client_map_transform(width, height, transform,
-                            x1, y2, &dx, &dy);
-   evas_map_point_image_uv_set(map, 3, dx, dy);
-
-   evas_object_map_set(ec->frame, map);
-   evas_object_map_enable_set(ec->frame, map ? EINA_TRUE : EINA_FALSE);
-
-   evas_map_free(map);
+   // TODO: repace the e_client_cursor_map_apply to e_pointer_rotation_set
+   //       remove(deprecate) the e_client_cursor_map_apply.
+   e_pointer_rotation_set(e_comp->pointer, rotation);
 }
 
 E_API void
@@ -5536,7 +5429,6 @@ e_client_signal_move_begin(E_Client *ec, const char *sig, const char *src EINA_U
    if (e_client_util_resizing_get(ec) || (ec->moving)) return;
    _e_client_moveinfo_gather(ec, sig);
    if (!_e_client_move_begin(ec)) return;
-   e_pointer_mode_push(ec, E_POINTER_MOVE);
    e_zone_edge_disable();
 }
 
@@ -5597,7 +5489,6 @@ e_client_signal_resize_begin(E_Client *ec, const char *dir, const char *sig, con
    _e_client_moveinfo_gather(ec, sig);
    if (!e_client_resize_begin(ec))
      return;
-   e_pointer_mode_push(ec, ec->resize_mode);
 }
 
 E_API void
index 106e00f..1b8cc3e 100644 (file)
@@ -126,11 +126,6 @@ _e_comp_fullscreen_check(void)
 {
    E_Client *ec;
 
-   if (!e_pointer_is_hidden(e_comp->pointer))
-     {
-        return NULL;
-     }
-
    E_CLIENT_REVERSE_FOREACH(ec)
      {
         E_Comp_Wl_Client_Data *cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
index df7c369..2e02af8 100644 (file)
@@ -1077,20 +1077,6 @@ _e_comp_intercept_move(void *data, Evas_Object *obj, int x, int y)
    E_Comp_Object *cw = data;
    int ix, iy, fx, fy;
 
-   if (!e_util_strcmp("wl_pointer-cursor", cw->ec->icccm.window_role))
-     {
-        if (cw->ec->zone->rot.curr != 0)
-          {
-             e_client_cursor_map_apply(cw->ec, cw->ec->zone->rot.curr, x, y);
-             return;
-          }
-
-        cw->ec->client.x = x, cw->ec->client.y = y;
-        cw->ec->x = x, cw->ec->y = y;
-        evas_object_move(obj, x, y);
-        return;
-     }
-
    if ((e_pixmap_type_get(cw->ec->pixmap) != E_PIXMAP_TYPE_EXT_OBJECT) &&
        (cw->external_content))
      {
@@ -1178,8 +1164,7 @@ _e_comp_intercept_resize(void *data, Evas_Object *obj, int w, int h)
    E_Comp_Object *cw = data;
    int pw = 0, ph = 0, fw, fh, iw, ih, prev_w, prev_h, x, y;
 
-   if ((!e_util_strcmp("wl_pointer-cursor", cw->ec->icccm.window_role)) ||
-       (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role)))
+   if (!e_util_strcmp("input_panel_surface", cw->ec->icccm.window_role))
      {
         cw->ec->w = w, cw->ec->h = h;
         evas_object_resize(obj, w, h);
index f15aa2d..bacd8f6 100644 (file)
@@ -927,12 +927,9 @@ e_comp_screen_init()
 
    evas_event_feed_mouse_in(e_comp->evas, 0, NULL);
 
-   /* comp->pointer =  */
-   /*   e_pointer_window_new(ecore_evas_window_get(comp->ee), 1); */
    e_main_ts("\tE_Pointer New");
    if ((comp->pointer = e_pointer_canvas_new(comp->ee, EINA_TRUE)))
      {
-        comp->pointer->color = EINA_TRUE;
         e_pointer_hide(comp->pointer);
      }
    e_main_ts("\tE_Pointer New Done");
index 3ab8e5a..01bd15a 100644 (file)
@@ -880,10 +880,7 @@ _e_comp_wl_cursor_timer(void *data)
    Eina_List *l;
    uint32_t serial;
 
-   ecore_evas_cursor_unset(e_comp->pointer->ee);
-
-   if (e_comp->pointer->o_ptr)
-     e_pointer_hide(e_comp->pointer);
+   e_pointer_hide(e_comp->pointer);
 
    e_comp_wl->ptr.hide_tmr = NULL;
    cursor_timer_ec = NULL;
@@ -1022,6 +1019,7 @@ _e_comp_wl_evas_cb_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob
                           ec->client.x, ec->client.y, ec->client.w, ec->client.h);
    if (ec->cur_mouse_action && inside_check) return;
    if (e_object_is_del(E_OBJECT(e_comp))) return;
+
    /* FIXME? this is a hack to just reset the cursor whenever we mouse out. not sure if accurate */
    {
       Evas_Object *o;
@@ -1093,6 +1091,9 @@ _e_comp_wl_send_touch_move(E_Client *ec, int canvas_x, int canvas_y, uint32_t ti
         if (!e_comp_wl_input_touch_check(res)) continue;
         wl_touch_send_motion(res, timestamp, 0, x, y); //id 0 for the 1st finger
      }
+
+  /* e pointer move for touch coodination */
+  e_pointer_touch_move(e_comp->pointer, canvas_x, canvas_y);
 }
 
 static void
@@ -1111,6 +1112,9 @@ _e_comp_wl_send_mouse_move(E_Client *ec, int x, int y, unsigned int timestamp)
                                wl_fixed_from_int(x - ec->client.x),
                                wl_fixed_from_int(y - ec->client.y));
      }
+
+   /* e pointer move for touch coodination */
+   e_pointer_mouse_move(e_comp->pointer, x, y);
 }
 
 static void
index 4cf8490..540f72a 100644 (file)
@@ -35,7 +35,6 @@ _e_comp_wl_input_pointer_map(struct wl_resource *resource)
    if (e_object_is_del(E_OBJECT(ec))) return;
 
    e_pointer_object_set(e_comp->pointer, ec->frame, ec->x, ec->y);
-   ec->comp_data->mapped = EINA_TRUE;
 }
 
 static void
@@ -92,8 +91,9 @@ _e_comp_wl_input_pointer_cb_cursor_set(struct wl_client *client, struct wl_resou
         ec->x = x;
         ec->y = y;
 
-        ec->lock_focus_out = ec->layer_block = ec->visible = ec->override = 1;
-        ec->icccm.title = eina_stringshare_add("noshadow");
+        ec->lock_focus_out = ec->layer_block = ec->visible = 1;
+        //ec->override = 1;
+        ec->icccm.title = eina_stringshare_add("Cursor");
         ec->icccm.window_role = eina_stringshare_add("wl_pointer-cursor");
         evas_object_pass_events_set(ec->frame, 1);
         e_client_focus_stack_set(eina_list_remove(e_client_focus_stack_get(), ec));
@@ -103,6 +103,8 @@ _e_comp_wl_input_pointer_cb_cursor_set(struct wl_client *client, struct wl_resou
         ec->comp_data->shell.surface = surface_resource;
         ec->comp_data->shell.configure = _e_comp_wl_input_pointer_configure;
         ec->comp_data->shell.map = _e_comp_wl_input_pointer_map;
+
+        evas_object_layer_set(ec->frame, E_LAYER_MAX - 1);
      }
 
    /* ignore cursor changes during resize/move I guess */
index 4dd01f7..eda6612 100644 (file)
@@ -1215,7 +1215,6 @@ static Eina_Bool
 _e_main_cb_idle_before(void *data EINA_UNUSED)
 {
    e_client_idler_before();
-   e_pointer_idler_before();
    edje_thaw();
    return ECORE_CALLBACK_RENEW;
 }
index 95e427e..a35d05f 100644 (file)
 #include "e.h"
 
-typedef struct _E_Pointer_Stack E_Pointer_Stack;
-struct _E_Pointer_Stack
-{
-   void *obj;
-   const char *type;
-};
-
 /* local variables */
-static Eina_List *_hdlrs = NULL;
 static Eina_List *_ptrs = NULL;
 static Eina_Bool _initted = EINA_FALSE;
 
-static inline void
-_e_pointer_theme_buf(E_Pointer *ptr, char cursor[1024])
-{
-   if (ptr->color)
-     snprintf(cursor, 1024, "e/pointer/enlightenment/%s/color", ptr->type);
-   else
-     snprintf(cursor, 1024, "e/pointer/enlightenment/%s/mono", ptr->type);
-}
-
-static inline void 
-_e_pointer_hot_update(E_Pointer *ptr, int x, int y)
+static void
+_e_pointer_map_transform(int width, int height, uint32_t transform,
+                         int sx, int sy, int *dx, int *dy)
 {
-   if ((ptr->hot.x != x) || (ptr->hot.y != y))
+   switch (transform)
      {
-        ptr->hot.x = x;
-        ptr->hot.y = y;
-        ptr->hot.update = EINA_TRUE;
-     }
-}
-
-static void 
-_e_pointer_active(E_Pointer *ptr)
-{
-   if (!ptr->idle) return;
-   if (ptr->o_ptr)
-     edje_object_signal_emit(ptr->o_ptr, "e,state,mouse,active", "e");
-   ptr->idle = EINA_FALSE;
-}
-
-static void 
-_e_pointer_idle(E_Pointer *ptr)
-{
-   if (ptr->idle) return;
-   if (ptr->o_ptr)
-     edje_object_signal_emit(ptr->o_ptr, "e,state,mouse,idle", "e");
-   ptr->idle = EINA_TRUE;
-}
-
-static Eina_Bool 
-_e_pointer_cb_idle_poller(void *data)
-{
-   E_Pointer *ptr;
-   int x = 0, y = 0;
-
-   if (!(ptr = data)) return ECORE_CALLBACK_RENEW;
-
-   if (!e_config->idle_cursor)
-     {
-        ptr->idle_poll = NULL;
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   if (ptr->canvas)
-     ecore_evas_pointer_xy_get(ptr->ee, &x, &y);
-
-   if ((ptr->x != x) || (ptr->y != y))
-     {
-        ptr->x = x;
-        ptr->y = y;
-        if (ptr->idle) _e_pointer_active(ptr);
-        return ECORE_CALLBACK_RENEW;
+      case WL_OUTPUT_TRANSFORM_NORMAL:
+      default:
+        *dx = sx, *dy = sy;
+        break;
+      case WL_OUTPUT_TRANSFORM_90:
+        *dx = height - sy, *dy = sx;
+        break;
+      case WL_OUTPUT_TRANSFORM_180:
+        *dx = width - sx, *dy = height - sy;
+        break;
+      case WL_OUTPUT_TRANSFORM_270:
+        *dx = sy, *dy = width - sx;
+        break;
      }
-
-   if (!ptr->idle) _e_pointer_idle(ptr);
-
-   return ECORE_CALLBACK_RENEW;
 }
 
-static Eina_Bool 
-_e_pointer_cb_idle_wait(void *data)
-{
-   E_Pointer *ptr;
-
-   if (!(ptr = data)) return ECORE_CALLBACK_RENEW;
-   ptr->idle_tmr = NULL;
-   if (!e_config->idle_cursor)
-     {
-        E_FREE_FUNC(ptr->idle_poll, ecore_poller_del);
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   if (!ptr->idle_poll)
-     ptr->idle_poll = ecore_poller_add(ECORE_POLLER_CORE, 64, 
-                                       _e_pointer_cb_idle_poller, ptr);
-
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static Eina_Bool 
-_e_pointer_cb_idle_pre(void *data)
-{
-   E_Pointer *ptr;
-
-   if (!(ptr = data)) return ECORE_CALLBACK_RENEW;
-
-   if (ptr->canvas)
-     ecore_evas_pointer_xy_get(ptr->ee, &ptr->x, &ptr->y);
+static void
+_e_pointer_rotation_apply(E_Pointer *ptr)
+{
+   Evas_Map *map;
+   int x1, y1, x2, y2, dx, dy;
+   int32_t width, height;
+   int cursor_w, cursor_h;
+   uint32_t transform;
+   int rot_x, rot_y, x, y;
+   int zone_w, zone_h;
+   double awh, ahw;
+   E_Client *ec;
+   int rotation;
 
-   ptr->idle_tmr = ecore_timer_loop_add(4.0, _e_pointer_cb_idle_wait, ptr);
+   EINA_SAFETY_ON_NULL_RETURN(ptr);
+   if (!ptr->o_ptr) return;
 
-   return ECORE_CALLBACK_CANCEL;
-}
+   ec = e_comp_object_client_get(ptr->o_ptr);
+   EINA_SAFETY_ON_NULL_RETURN(ec);
 
-static void 
-_e_pointer_active_handle(E_Pointer *ptr)
-{
-   _e_pointer_active(ptr);
-   if (ptr->idle_tmr)
-     ecore_timer_reset(ptr->idle_tmr);
-   else
-     {
-        E_FREE_FUNC(ptr->idle_poll, ecore_poller_del);
-        if (!e_config->idle_cursor) return;
-        ptr->idle_tmr = ecore_timer_loop_add(1.0, _e_pointer_cb_idle_pre, ptr);
-     }
-}
+   x = ptr->x;
+   y = ptr->y;
+   rotation = ptr->rotation;
 
-static Eina_Bool 
-_e_pointer_cb_mouse_down(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
-{
-   Eina_List *l;
-   E_Pointer *ptr;
+   evas_object_geometry_get(ec->frame, NULL, NULL, &cursor_w, &cursor_h);
 
-   EINA_LIST_FOREACH(_ptrs, l, ptr)
+   if ((rotation == 0) || (rotation % 90 != 0) || (rotation / 90 > 3))
      {
-        _e_pointer_active_handle(ptr);
-        if (ptr->o_ptr)
-          edje_object_signal_emit(ptr->o_ptr, "e,action,mouse,down", "e");
+        evas_object_map_set(ec->frame, NULL);
+        evas_object_map_enable_set(ec->frame, EINA_FALSE);
+        evas_object_move(ec->frame, x, y);
+        return;
      }
 
-   return ECORE_CALLBACK_PASS_ON;
-}
+   zone_w = ec->zone->w;
+   zone_h = ec->zone->h;
+   awh = ((double)zone_w / (double)zone_h);
+   ahw = ((double)zone_h / (double)zone_w);
 
-static Eina_Bool 
-_e_pointer_cb_mouse_up(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
-{
-   Eina_List *l;
-   E_Pointer *ptr;
+   rot_x = x;
+   rot_y = y;
+   width = cursor_w;
+   height = cursor_h;
 
-   EINA_LIST_FOREACH(_ptrs, l, ptr)
+   switch(rotation)
      {
-        _e_pointer_active_handle(ptr);
-        if (ptr->o_ptr)
-          edje_object_signal_emit(ptr->o_ptr, "e,action,mouse,up", "e");
+      case 90:
+         rot_x = y * awh;
+         rot_y = ahw * (zone_w - x);
+         transform = WL_OUTPUT_TRANSFORM_90;
+         width = cursor_h;
+         height = cursor_w;
+         break;
+      case 180:
+         rot_x = zone_w - x;
+         rot_y = zone_h - y;
+         transform = WL_OUTPUT_TRANSFORM_180;
+         break;
+      case 270:
+         rot_x = awh * (zone_h - y);
+         rot_y = ahw * x;
+         transform = WL_OUTPUT_TRANSFORM_270;
+         width = cursor_h;
+         height = cursor_w;
+         break;
+      default:
+         transform = WL_OUTPUT_TRANSFORM_NORMAL;
+         break;
      }
 
-   return ECORE_CALLBACK_PASS_ON;
-}
-
-static Eina_Bool 
-_e_pointer_cb_mouse_move(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
-{
-   Eina_List *l;
-   E_Pointer *ptr;
-
-   EINA_LIST_FOREACH(_ptrs, l, ptr)
+   if (ptr->device == E_POINTER_MOUSE)
      {
-        _e_pointer_active_handle(ptr);
-        if (ptr->o_ptr)
-          edje_object_signal_emit(ptr->o_ptr, "e,action,mouse,move", "e");
+        ec->client.x = rot_x, ec->client.y = rot_y;
+        ec->x = rot_x, ec->y = rot_y;
+        ptr->x = rot_x;
+        ptr->y = rot_y;
      }
 
-   return ECORE_CALLBACK_PASS_ON;
-}
+   map = evas_map_new(4);
+   evas_map_util_points_populate_from_geometry(map,
+                                               ec->x, ec->y,
+                                               width, height, 0);
 
-static Eina_Bool 
-_e_pointer_cb_mouse_wheel(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_UNUSED)
-{
-   Eina_List *l;
-   E_Pointer *ptr;
+   x1 = 0.0;
+   y1 = 0.0;
+   x2 = width;
+   y2 = height;
 
-   EINA_LIST_FOREACH(_ptrs, l, ptr)
-     {
-        _e_pointer_active_handle(ptr);
-        if (ptr->o_ptr)
-          edje_object_signal_emit(ptr->o_ptr, "e,action,mouse,wheel", "e");
-     }
+   _e_pointer_map_transform(width, height, transform,
+                            x1, y1, &dx, &dy);
+   evas_map_point_image_uv_set(map, 0, dx, dy);
 
-   return ECORE_CALLBACK_PASS_ON;
-}
+   _e_pointer_map_transform(width, height, transform,
+                            x2, y1, &dx, &dy);
+   evas_map_point_image_uv_set(map, 1, dx, dy);
 
-static void 
-_e_pointer_cb_hot_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Pointer *ptr = data;
-   int x = 0, y = 0;
+   _e_pointer_map_transform(width, height, transform,
+                            x2, y2, &dx, &dy);
+   evas_map_point_image_uv_set(map, 2, dx, dy);
 
-   if (!ptr->e_cursor) return;
-   if (!evas_object_visible_get(ptr->o_ptr)) return;
-   edje_object_part_geometry_get(ptr->o_ptr, "e.swallow.hotspot", 
-                                 &x, &y, NULL, NULL);
-   _e_pointer_hot_update(ptr, x, y);
-}
+   _e_pointer_map_transform(width, height, transform,
+                            x1, y2, &dx, &dy);
+   evas_map_point_image_uv_set(map, 3, dx, dy);
 
-static void 
-_e_pointer_cb_hot_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
-{
-   E_Pointer *ptr = data;
-   int x = 0, y = 0;
+   evas_object_map_set(ec->frame, map);
+   evas_object_map_enable_set(ec->frame, map ? EINA_TRUE : EINA_FALSE);
 
-   if (!ptr->e_cursor) return;
-   edje_object_part_geometry_get(ptr->o_ptr, "e.swallow.hotspot", 
-                                 &x, &y, NULL, NULL);
-   _e_pointer_hot_update(ptr, x, y);
+   evas_map_free(map);
 }
 
 static void
-_e_pointer_pointer_canvas_init(E_Pointer *ptr, Evas *e, Evas_Object **o_ptr, Evas_Object **o_hot)
-{
-   /* create pointer object */
-   *o_ptr = edje_object_add(e);
-
-   /* create hotspot object */
-   *o_hot = evas_object_rectangle_add(e);
-   evas_object_color_set(*o_hot, 0, 0, 0, 0);
-
-   evas_object_event_callback_add(*o_hot, EVAS_CALLBACK_MOVE,
-                                  _e_pointer_cb_hot_move, ptr);
-   evas_object_event_callback_add(*o_hot, EVAS_CALLBACK_SHOW,
-                                  _e_pointer_cb_hot_show, ptr);
-
-   evas_object_move(*o_ptr, 0, 0);
-   evas_object_resize(*o_ptr, ptr->w, ptr->h);
-}
-
-static void 
-_e_pointer_canvas_del(E_Pointer *ptr)
-{
-   E_FREE_FUNC(ptr->buffer_o_hot, evas_object_del);
-   E_FREE_FUNC(ptr->buffer_o_ptr, evas_object_del);
-   E_FREE_FUNC(ptr->buffer_evas, evas_free);
-   E_FREE(ptr->pixels);
-}
-
-static void 
-_e_pointer_canvas_add(E_Pointer *ptr)
-{
-   Evas_Engine_Info_Buffer *einfo;
-   int method = 0;
-
-   /* try to create new canvas */
-   if (!(ptr->buffer_evas = evas_new())) goto err;
-
-   method = evas_render_method_lookup("buffer");
-   evas_output_method_set(ptr->buffer_evas, method);
-   evas_output_size_set(ptr->buffer_evas, ptr->w, ptr->h);
-   evas_output_viewport_set(ptr->buffer_evas, 0, 0, ptr->w, ptr->h);
-
-   /* try to allocate space for pixels */
-   if (!(ptr->pixels = malloc(ptr->w * ptr->h * sizeof(int))))
-     goto err;
-
-   /* try to get the buffer engine info */
-   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ptr->buffer_evas);
-   if (!einfo) goto err;
-
-   /* fill in buffer engine info */
-   einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
-   einfo->info.dest_buffer = ptr->pixels;
-   einfo->info.dest_buffer_row_bytes = (ptr->w * sizeof(int));
-   einfo->info.use_color_key = 0;
-   einfo->info.alpha_threshold = 0;
-   einfo->info.func.new_update_region = NULL;
-   einfo->info.func.free_update_region = NULL;
-
-   /* set buffer engine info */
-   evas_engine_info_set(ptr->buffer_evas, (Evas_Engine_Info *)einfo);
-
-   _e_pointer_pointer_canvas_init(ptr, ptr->buffer_evas, &ptr->buffer_o_ptr, &ptr->buffer_o_hot);
-   if (!ptr->evas)
-     {
-        ptr->evas = ptr->buffer_evas;
-        ptr->o_ptr = ptr->buffer_o_ptr;
-        ptr->o_hot = ptr->buffer_o_hot;
-     }
-   return;
-
-err:
-   _e_pointer_canvas_del(ptr);
-}
-
-static void 
-_e_pointer_canvas_resize(E_Pointer *ptr, int w, int h)
-{
-   Evas_Engine_Info_Buffer *einfo;
-
-   if ((ptr->w == w) && (ptr->h == h)) return;
-   ptr->w = w;
-   ptr->h = h;
-   evas_output_size_set(ptr->buffer_evas, w, h);
-   evas_output_viewport_set(ptr->buffer_evas, 0, 0, w, h);
-
-   ptr->pixels = realloc(ptr->pixels, (ptr->w * ptr->h * sizeof(int)));
-
-   einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ptr->buffer_evas);
-   EINA_SAFETY_ON_NULL_RETURN(einfo);
-
-   einfo->info.dest_buffer = ptr->pixels;
-   einfo->info.dest_buffer_row_bytes = (ptr->w * sizeof(int));
-   evas_engine_info_set(ptr->buffer_evas, (Evas_Engine_Info *)einfo);
-
-   evas_object_move(ptr->buffer_o_ptr, 0, 0);
-   evas_object_resize(ptr->buffer_o_ptr, ptr->w, ptr->h);
-}
-
-static void 
-_e_pointer_stack_free(E_Pointer_Stack *stack)
-{
-   if (stack->type) eina_stringshare_del(stack->type);
-   free(stack);
-}
-
-static void 
 _e_pointer_cb_free(E_Pointer *ptr)
 {
    _ptrs = eina_list_remove(_ptrs, ptr);
 
-   E_FREE_LIST(ptr->stack, _e_pointer_stack_free);
-
-   eina_stringshare_del(ptr->type);
-
-   E_FREE_FUNC(ptr->idle_tmr, ecore_timer_del);
-   E_FREE_FUNC(ptr->idle_poll, ecore_poller_del);
-
-   if (ptr->buffer_evas) _e_pointer_canvas_del(ptr);
-
    free(ptr);
 }
 
-static void
-_e_pointer_x11_setup(E_Pointer *ptr, const char *cursor)
-{
-   if (ptr->e_cursor)
-     {
-        /* create a pointer canvas if we need to */
-        if ((!ptr->buffer_evas) && ptr->win) _e_pointer_canvas_add(ptr);
-        if (ptr->buffer_o_ptr && (ptr->buffer_o_ptr != ptr->o_ptr))
-          {
-             e_theme_edje_object_set(ptr->buffer_o_ptr, "base/theme/pointer", cursor);
-             edje_object_part_swallow(ptr->buffer_o_ptr, "e.swallow.hotspot", ptr->buffer_o_hot);
-          }
-        return;
-     }
-   if (ptr->buffer_evas) _e_pointer_canvas_del(ptr);
-}
-
-static void 
-_e_pointer_type_set(E_Pointer *ptr, const char *type)
-{
-   /* check if pointer type is already set */
-   if (!e_util_strcmp(ptr->type, type)) return;
-
-   eina_stringshare_replace(&ptr->type, type);
-
-   /* don't show cursor if in hidden mode */
-   if ((!e_config->show_cursor) || (!e_comp_wl->ptr.enabled))
-     {
-        e_pointer_hide(ptr);
-        return;
-     }
-
-   if (ptr->e_cursor)
-     {
-        char cursor[1024];
-        int x = 0, y = 0;
-
-        if ((!ptr->buffer_evas) && ptr->win) _e_pointer_canvas_add(ptr);
-        _e_pointer_theme_buf(ptr, cursor);
-
-        /* try to set the edje object theme */
-        if (!e_theme_edje_object_set(ptr->o_ptr, "base/theme/pointer", cursor))
-          cursor[0] = 0;
-        _e_pointer_x11_setup(ptr, cursor);
-        if (!cursor[0]) return;
-
-        edje_object_part_geometry_get(ptr->o_ptr, "e.swallow.hotspot", 
-                                      &x, &y, NULL, NULL);
-        _e_pointer_hot_update(ptr, x, y);
-
-        if (ptr->canvas)
-          e_pointer_object_set(ptr, NULL, 0, 0);
-        else
-          evas_object_show(ptr->o_ptr);
-
-     }
-   else
-     _e_pointer_x11_setup(ptr, NULL);
-}
-
-EINTERN int 
+EINTERN int
 e_pointer_init(void)
 {
-   E_LIST_HANDLER_APPEND(_hdlrs, ECORE_EVENT_MOUSE_BUTTON_DOWN, 
-                         _e_pointer_cb_mouse_down, NULL);
-   E_LIST_HANDLER_APPEND(_hdlrs, ECORE_EVENT_MOUSE_BUTTON_UP, 
-                         _e_pointer_cb_mouse_up, NULL);
-   E_LIST_HANDLER_APPEND(_hdlrs, ECORE_EVENT_MOUSE_MOVE, 
-                         _e_pointer_cb_mouse_move, NULL);
-   E_LIST_HANDLER_APPEND(_hdlrs, ECORE_EVENT_MOUSE_WHEEL, 
-                         _e_pointer_cb_mouse_wheel, NULL);
    _initted = EINA_TRUE;
    return 1;
 }
 
-EINTERN int 
+EINTERN int
 e_pointer_shutdown(void)
 {
    _initted = EINA_FALSE;
-   E_FREE_LIST(_hdlrs, ecore_event_handler_del);
    return 1;
 }
 
-E_API E_Pointer *
-e_pointer_window_new(Ecore_Window win, Eina_Bool filled)
-{
-   E_Pointer *ptr = NULL;
-
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(win, NULL);
-   if (!_initted) return NULL;
-
-   /* allocate space for new pointer */
-   if (!(ptr = E_OBJECT_ALLOC(E_Pointer, E_POINTER_TYPE, _e_pointer_cb_free)))
-     return NULL;
-
-   /* set default pointer properties */
-   ptr->w = ptr->h = e_config->cursor_size;
-   ptr->e_cursor = e_config->use_e_cursor;
-   ptr->win = win;
-   ptr->color = EINA_FALSE;
-   if (e_comp->pointer)
-     ptr->color = e_comp->pointer->color;
-
-   /* set pointer default type */
-   if (filled) e_pointer_type_push(ptr, ptr, "default");
-
-   /* append this pointer to the list */
-   _ptrs = eina_list_append(_ptrs, ptr);
-
-   return ptr;
-}
-
-E_API E_Pointer *
+EINTERN E_Pointer *
 e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled)
 {
    E_Pointer *ptr = NULL;
@@ -466,320 +171,152 @@ e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled)
      return NULL;
 
    /* set default pointer properties */
-   ptr->color = EINA_TRUE;
    ptr->canvas = EINA_TRUE;
    ptr->w = ptr->h = e_config->cursor_size;
    ptr->e_cursor = e_config->use_e_cursor;
 
    ptr->ee = ee;
    ptr->evas = ecore_evas_get(ee);
-   _e_pointer_pointer_canvas_init(ptr, ptr->evas, &ptr->o_ptr, &ptr->o_hot);
 
-   /* set pointer default type */
-   if (filled) e_pointer_type_push(ptr, ptr, "default");
-
-     /* append this pointer to the list */
+   /* append this pointer to the list */
    _ptrs = eina_list_append(_ptrs, ptr);
 
-   _e_pointer_active_handle(ptr);
-
    return ptr;
 }
 
-E_API void 
-e_pointers_size_set(int size)
+EINTERN void
+e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int y)
 {
-   Eina_List *l;
-   E_Pointer *ptr;
+   E_Client *ec;
 
-   if (!e_config->show_cursor) return;
+   EINA_SAFETY_ON_NULL_RETURN(ptr);
 
-   EINA_LIST_FOREACH(_ptrs, l, ptr)
+   /* don't show cursor if in hidden mode */
+   if ((!e_config->show_cursor) || (!e_comp_wl->ptr.enabled))
      {
-        if ((ptr->w == size) && (ptr->h == size)) continue;
-        if (ptr->buffer_evas)
-          _e_pointer_canvas_resize(ptr, size, size);
-        if (ptr->canvas)
-          {
-             ptr->w = size;
-             ptr->h = size;
-             evas_object_resize(ptr->o_ptr, size, size);
-          }
+        e_pointer_hide(ptr);
+        return;
      }
-}
-
-E_API void 
-e_pointer_hide(E_Pointer *ptr)
-{
-   EINA_SAFETY_ON_NULL_RETURN(ptr);
 
-   if (ptr->buffer_evas)
-     _e_pointer_canvas_del(ptr);
-   if (ptr->canvas)
-     evas_object_hide(ptr->o_ptr);
-}
-
-E_API void 
-e_pointer_type_push(E_Pointer *ptr, void *obj, const char *type)
-{
-   E_Pointer_Stack *stack;
-
-   EINA_SAFETY_ON_NULL_RETURN(ptr);
-
-   _e_pointer_type_set(ptr, type);
-
-   if (!(stack = E_NEW(E_Pointer_Stack, 1))) return;
-   stack->type = eina_stringshare_ref(ptr->type);
-   stack->obj = obj;
-   ptr->stack = eina_list_prepend(ptr->stack, stack);
-}
-
-E_API void 
-e_pointer_type_pop(E_Pointer *ptr, void *obj, const char *type)
-{
-   Eina_List *l, *ll;
-   E_Pointer_Stack *stack;
-
-   EINA_SAFETY_ON_NULL_RETURN(ptr);
-
-   EINA_LIST_FOREACH_SAFE(ptr->stack, l, ll, stack)
+   /* hide and unset the existed ptr->o_ptr */
+   if (ptr->o_ptr)
      {
-        if ((stack->obj == obj) && 
-            ((!type) || (!e_util_strcmp(stack->type, type))))
+        ec = e_comp_object_client_get(ptr->o_ptr);
+        if (ec)
           {
-             _e_pointer_stack_free(stack);
-             ptr->stack = eina_list_remove_list(ptr->stack, l);
-             if (type) break;
+             ec->hidden = 1;
+             ec->visible = EINA_FALSE;
+             ec->comp_data->mapped = EINA_FALSE;
+             ec->override = 1; /* ignore the previous cursor_ec */
           }
-     }
 
-   if (!ptr->stack)
-     {
-        e_pointer_hide(ptr);
-        eina_stringshare_replace(&ptr->type, NULL);
-        return;
+        /* hide cursor object */
+        evas_object_hide(ptr->o_ptr);
+        ptr->o_ptr = NULL;
+        ptr->device = E_POINTER_NONE;
      }
 
-   if (!(stack = eina_list_data_get(ptr->stack))) return;
-
-   _e_pointer_type_set(ptr, stack->type);
-
-   eina_stringshare_refplace(&ptr->type, stack->type);
-}
-
-E_API void 
-e_pointer_mode_push(void *obj, E_Pointer_Mode mode)
-{
-   E_Client *ec;
-   Evas_Object *o;
-
-   EINA_SAFETY_ON_NULL_RETURN(e_comp->pointer);
-
-   ecore_evas_cursor_get(e_comp->pointer->ee, &o, NULL, NULL, NULL);
-   if ((o != e_comp->pointer->o_ptr) && (ec = e_comp_object_client_get(o)))
-     return;
-
-   switch (mode)
+   /* if obj is not null, set the obj to ptr->o_ptr */
+   if (obj)
      {
-      case E_POINTER_RESIZE_TL:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_tl");
-        break;
-
-      case E_POINTER_RESIZE_T:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_t");
-        break;
-
-      case E_POINTER_RESIZE_TR:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_tr");
-        break;
-
-      case E_POINTER_RESIZE_R:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_r");
-        break;
-
-      case E_POINTER_RESIZE_BR:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_br");
-        break;
-
-      case E_POINTER_RESIZE_B:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_b");
-        break;
-
-      case E_POINTER_RESIZE_BL:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_bl");
-        break;
+        ec = e_comp_object_client_get(obj);
+        if (ec)
+          {
+             ec->hidden = 0;
+             ec->visible = EINA_TRUE;
+             ec->comp_data->mapped = EINA_TRUE;
+             ec->override = 0; /* do not ignore the cursor_ec to set the image object */
+          }
 
-      case E_POINTER_RESIZE_L:
-        e_pointer_type_push(e_comp->pointer, obj, "resize_l");
-        break;
+        /* apply the cursor obj rotation */
+        _e_pointer_rotation_apply(ptr);
 
-      case E_POINTER_MOVE:
-        e_pointer_type_push(e_comp->pointer, obj, "move");
-        break;
+        /* move the pointer to the current position */
+        evas_object_move(obj, ptr->x, ptr->y);
 
-      default: break;
+        /* show cursor object */
+        evas_object_show(obj);
+        ptr->o_ptr = obj;
      }
 }
 
-E_API void 
-e_pointer_mode_pop(void *obj, E_Pointer_Mode mode)
+EINTERN void
+e_pointer_touch_move(E_Pointer *ptr, int x, int y)
 {
-   switch (mode)
-     {
-      case E_POINTER_RESIZE_TL:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_tl");
-        break;
-
-      case E_POINTER_RESIZE_T:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_t");
-        break;
-
-      case E_POINTER_RESIZE_TR:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_tr");
-        break;
-
-      case E_POINTER_RESIZE_R:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_r");
-        break;
-
-      case E_POINTER_RESIZE_BR:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_br");
-        break;
-
-      case E_POINTER_RESIZE_B:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_b");
-        break;
+   EINA_SAFETY_ON_NULL_RETURN(ptr);
 
-      case E_POINTER_RESIZE_BL:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_bl");
-        break;
+   if (!e_config->show_cursor) return;
+   if (!ptr->o_ptr) return;
+   if (!evas_object_visible_get(ptr->o_ptr)) return;
 
-      case E_POINTER_RESIZE_L:
-        e_pointer_type_pop(e_comp->pointer, obj, "resize_l");
-        break;
+   /* save the current position */
+   ptr->x = x;
+   ptr->y = y;
 
-      case E_POINTER_MOVE:
-        e_pointer_type_pop(e_comp->pointer, obj, "move");
-        break;
+   if (ptr->device != E_POINTER_TOUCH) ptr->device = E_POINTER_TOUCH;
 
-      default: break;
-     }
+   _e_pointer_rotation_apply(ptr);
+   evas_object_move(ptr->o_ptr, ptr->x, ptr->y);
 }
 
-E_API void 
-e_pointer_idler_before(void)
+EINTERN void
+e_pointer_mouse_move(E_Pointer *ptr, int x, int y)
 {
-   Eina_List *l;
-   E_Pointer *ptr;
-
-   if ((!e_config->show_cursor) || (!e_comp_wl->ptr.enabled)) return;
+   EINA_SAFETY_ON_NULL_RETURN(ptr);
 
-   EINA_LIST_FOREACH(_ptrs, l, ptr)
-     {
-        if ((!ptr->e_cursor) || (!ptr->buffer_evas)) continue;
+   if (!e_config->show_cursor) return;
+   if (!ptr->o_ptr) return;
+   if (!evas_object_visible_get(ptr->o_ptr)) return;
 
-        if (ptr->hot.update)
-          _e_pointer_type_set(ptr, ptr->type);
-        if (ptr->buffer_evas)
-          {
-             Eina_List *updates;
+   /* save the current position */
+   ptr->x = x;
+   ptr->y = y;
 
-             if ((updates = evas_render_updates(ptr->buffer_evas)))
-               {
-                  evas_render_updates_free(updates);
-               }
-          }
+   if (ptr->device != E_POINTER_MOUSE) ptr->device = E_POINTER_MOUSE;
 
-        ptr->hot.update = EINA_FALSE;
-     }
+   _e_pointer_rotation_apply(ptr);
+   evas_object_move(ptr->o_ptr, ptr->x, ptr->y);
 }
 
 E_API void
-e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int y)
+e_pointer_hide(E_Pointer *ptr)
 {
-   Evas_Object *o;
-   E_Client *ec;
-
    EINA_SAFETY_ON_NULL_RETURN(ptr);
+   if (ptr->o_ptr) return;
 
-   /* don't show cursor if in hidden mode */
-   if ((!e_config->show_cursor) || (!e_comp_wl->ptr.enabled))
-     {
-        if (obj) evas_object_hide(obj);
-        return;
-     }
+   evas_object_hide(ptr->o_ptr);
+}
 
-   ecore_evas_cursor_get(ptr->ee, &o, NULL, NULL, NULL);
-   if (o)
-     {
-        if (o == obj)
-          {
-             ecore_evas_object_cursor_set(ptr->ee, obj, E_LAYER_MAX - 1, x, y);
-             if (e_pointer_is_hidden(ptr))
-               {
-                 e_comp_hwc_end("re_cursor_set");
-               }
-             return;
-          }
-        ec = e_comp_object_client_get(o);
-        if (ec)
-          {
-             ec->hidden = 1;
-             ec->visible = EINA_FALSE;
-          }
-     }
-   ecore_evas_cursor_unset(ptr->ee);
+E_API Eina_Bool
+e_pointer_is_hidden(E_Pointer *ptr)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ptr, EINA_TRUE);
 
-   if (obj)
-     {
-        ec = e_comp_object_client_get(obj);
-        if (ec)
-          {
-             ec->hidden = 1;
-             ec->visible = EINA_FALSE;
-          }
-        ecore_evas_object_cursor_set(ptr->ee, obj, E_LAYER_MAX - 1, x, y);
-     }
-   else if (ptr->o_ptr)
-     ecore_evas_object_cursor_set(ptr->ee, ptr->o_ptr, E_LAYER_MAX - 1, ptr->hot.x, ptr->hot.y);
+   if (!e_config->show_cursor) return EINA_TRUE;
+   if (ptr->o_ptr && evas_object_visible_get(ptr->o_ptr)) return EINA_FALSE;
 
-   if (e_pointer_is_hidden(ptr))
-     {
-       e_comp_hwc_end("cursor_set");
-     }
+   return EINA_TRUE;
 }
 
 E_API void
-e_pointer_window_add(E_Pointer *ptr, Ecore_Window win)
+e_pointer_rotation_set(E_Pointer *ptr, int rotation)
 {
-   char buf[1024];
+   ptr->rotation = rotation;
 
-   ptr->win = win;
-   _e_pointer_theme_buf(ptr, buf);
-   _e_pointer_x11_setup(ptr, buf);
+   _e_pointer_rotation_apply(ptr);
+   evas_object_move(ptr->o_ptr, ptr->x, ptr->y);
 }
 
-E_API Eina_Bool
-e_pointer_is_hidden(E_Pointer *ptr)
+E_API void
+e_pointer_position_get(E_Pointer *ptr, int *x, int *y)
 {
-   Evas_Object *o;
-
-   EINA_SAFETY_ON_NULL_RETURN_VAL(ptr, EINA_TRUE);
+   EINA_SAFETY_ON_NULL_RETURN(ptr);
 
-   if (!e_config->show_cursor)
-     return EINA_TRUE;
+   if (!e_config->show_cursor) return;
+   if (!ptr->o_ptr) return;
+   if (!evas_object_visible_get(ptr->o_ptr)) return;
 
-   ecore_evas_cursor_get(ptr->ee, &o, NULL, NULL, NULL);
-   if (o)
-     {
-        if (evas_object_visible_get(o))
-          return EINA_FALSE;
-     }
-   else
-     {
-        if (ptr->o_ptr && (evas_object_visible_get(ptr->o_ptr)))
-          return EINA_FALSE;
-     }
-   return EINA_TRUE;
+   *x = ptr->x;
+   *y = ptr->y;
 }
+
index 0135993..3ce1989 100644 (file)
@@ -2,7 +2,7 @@
 
 typedef struct _E_Pointer E_Pointer;
 
-typedef enum 
+typedef enum
 {
    /* These are compatible with netwm */
    E_POINTER_RESIZE_TL = 0,
@@ -17,6 +17,13 @@ typedef enum
    E_POINTER_RESIZE_NONE = 11
 } E_Pointer_Mode;
 
+typedef enum
+{
+   E_POINTER_NONE = 0,
+   E_POINTER_MOUSE = 1,
+   E_POINTER_TOUCH = 2
+} E_Pointer_Device;
+
 #else
 # ifndef E_POINTER_H
 #  define E_POINTER_H
@@ -29,50 +36,27 @@ struct _E_Pointer
 
    Evas *evas;
    Ecore_Evas *ee;
-   Evas *buffer_evas;
    Evas_Object *o_ptr;
-   Evas_Object *o_hot;
-   Evas_Object *buffer_o_ptr;
-   Evas_Object *buffer_o_hot;
 
-   Ecore_Window win;
-
-   int *pixels;
    int x, y, w, h;
-   const char *type;
-
-   struct 
-     {
-        int x, y;
-        Eina_Bool update : 1;
-     } hot;
+   int rotation;
 
-   Ecore_Timer *idle_tmr;
-   Ecore_Poller *idle_poll;
-
-   Eina_List *stack;
+   E_Pointer_Device device;
 
    Eina_Bool e_cursor : 1;
-   Eina_Bool color : 1;
-   Eina_Bool idle : 1;
    Eina_Bool canvas : 1;
 };
 
-EINTERN int e_pointer_init(void);
-EINTERN int e_pointer_shutdown(void);
-
-E_API E_Pointer *e_pointer_window_new(Ecore_Window win, Eina_Bool filled);
-E_API E_Pointer *e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled);
-
-E_API void e_pointers_size_set(int size);
-E_API void e_pointer_hide(E_Pointer *ptr);
-E_API void e_pointer_type_push(E_Pointer *ptr, void *obj, const char *type);
-E_API void e_pointer_type_pop(E_Pointer *ptr, void *obj, const char *type);
-E_API void e_pointer_mode_push(void *obj, E_Pointer_Mode mode);
-E_API void e_pointer_mode_pop(void *obj, E_Pointer_Mode mode);
-E_API void e_pointer_idler_before(void);
-E_API void e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int y);
-E_API void e_pointer_window_add(E_Pointer *ptr, Ecore_Window win);
-E_API Eina_Bool e_pointer_is_hidden(E_Pointer *ptr);
+EINTERN int        e_pointer_init(void);
+EINTERN int        e_pointer_shutdown(void);
+EINTERN E_Pointer *e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled);
+EINTERN void       e_pointer_object_set(E_Pointer *ptr, Evas_Object *obj, int x, int y);
+EINTERN void       e_pointer_touch_move(E_Pointer *ptr, int x, int y);
+EINTERN void       e_pointer_mouse_move(E_Pointer *ptr, int x, int y);
+
+E_API void         e_pointer_hide(E_Pointer *ptr);
+E_API Eina_Bool    e_pointer_is_hidden(E_Pointer *ptr);
+E_API void         e_pointer_rotation_set(E_Pointer *ptr, int rotation);
+E_API void         e_pointer_position_get(E_Pointer *ptr, int *x, int *y);
 # endif
 #endif