devilhorns pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=63b5da69f09d6222f019a6ea14180b3fb38b81a8

commit 63b5da69f09d6222f019a6ea14180b3fb38b81a8
Author: Chris Michael <[email protected]>
Date:   Thu Aug 28 11:10:07 2014 -0400

    fix pointer for stupid X11...but this breaks pointers in wayland (for
    now) :(
    
    Signed-off-by: Chris Michael <[email protected]>
---
 src/bin/e_pointer.c | 374 +++++++++++++++++++++++++++++++++-------------------
 1 file changed, 236 insertions(+), 138 deletions(-)

diff --git a/src/bin/e_pointer.c b/src/bin/e_pointer.c
index ceb2a58..b2484f0 100644
--- a/src/bin/e_pointer.c
+++ b/src/bin/e_pointer.c
@@ -11,11 +11,22 @@ struct _E_Pointer_Stack
 static Eina_List *_hdlrs = NULL;
 static Eina_List *_ptrs = NULL;
 
+static inline void 
+_e_pointer_hot_update(E_Pointer *ptr, int x, int y)
+{
+   if ((ptr->hot.x != x) || (ptr->hot.y != y))
+     {
+        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) 
+   if (ptr->o_ptr)
      edje_object_signal_emit(ptr->o_ptr, "e,state,mouse,active", "e");
    ptr->idle = EINA_FALSE;
 }
@@ -30,12 +41,13 @@ _e_pointer_idle(E_Pointer *ptr)
 }
 
 static Eina_Bool 
-_e_pointer_cb_idle_poll(void *data)
+_e_pointer_cb_idle_poller(void *data)
 {
    E_Pointer *ptr;
    int x = 0, y = 0;
 
    if (!(ptr = data)) return ECORE_CALLBACK_RENEW;
+
    if ((e_powersave_mode_get() >= E_POWERSAVE_MODE_MEDIUM) || 
        (!e_config->idle_cursor))
      {
@@ -43,7 +55,13 @@ _e_pointer_cb_idle_poll(void *data)
         return ECORE_CALLBACK_CANCEL;
      }
 
+#ifndef HAVE_WAYLAND_ONLY
+   if (!ptr->canvas)
+     ecore_x_pointer_xy_get(ptr->win, &x, &y);
+#else
    ecore_evas_pointer_xy_get(ptr->ee, &x, &y);
+#endif
+
    if ((ptr->x != x) || (ptr->y != y))
      {
         ptr->x = x;
@@ -53,6 +71,7 @@ _e_pointer_cb_idle_poll(void *data)
      }
 
    if (!ptr->idle) _e_pointer_idle(ptr);
+
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -62,20 +81,19 @@ _e_pointer_cb_idle_wait(void *data)
    E_Pointer *ptr;
 
    if (!(ptr = data)) return ECORE_CALLBACK_RENEW;
+
    if ((e_powersave_mode_get() >= E_POWERSAVE_MODE_MEDIUM) || 
        (!e_config->idle_cursor))
      {
         E_FREE_FUNC(ptr->idle_poll, ecore_poller_del);
+        ptr->idle_poll = NULL;
         ptr->idle_tmr = NULL;
         return ECORE_CALLBACK_CANCEL;
      }
 
    if (!ptr->idle_poll)
-     {
-        ptr->idle_poll = 
-          ecore_poller_add(ECORE_POLLER_CORE, 64, 
-                           _e_pointer_cb_idle_poll, ptr);
-     }
+     ptr->idle_poll = ecore_poller_add(ECORE_POLLER_CORE, 64, 
+                                       _e_pointer_cb_idle_poller, ptr);
 
    ptr->idle_tmr = NULL;
    return ECORE_CALLBACK_CANCEL;
@@ -87,26 +105,22 @@ _e_pointer_cb_idle_pre(void *data)
    E_Pointer *ptr;
 
    if (!(ptr = data)) return ECORE_CALLBACK_RENEW;
-   ecore_evas_pointer_xy_get(ptr->ee, &ptr->x, &ptr->y);
-   ptr->idle_tmr = ecore_timer_loop_add(4.0, _e_pointer_cb_idle_wait, ptr);
-   return ECORE_CALLBACK_CANCEL;
-}
 
-static Eina_Bool 
-_e_pointer_cb_idle(void *data)
-{
-   E_Pointer *ptr;
+#ifndef HAVE_WAYLAND_ONLY
+   if (!ptr->canvas)
+     ecore_x_pointer_xy_get(ptr->win, &ptr->x, &ptr->y);
+#else
+   ecore_evas_pointer_xy_get(ptr->ee, &ptr->x, &ptr->y);
+#endif
 
-   if (!(ptr = data)) return ECORE_CALLBACK_RENEW;
-   if (e_config->idle_cursor) _e_pointer_idle(ptr);
+   ptr->idle_tmr = ecore_timer_loop_add(4.0, _e_pointer_cb_idle_wait, ptr);
 
-   return EINA_TRUE;
+   return ECORE_CALLBACK_CANCEL;
 }
 
 static void 
 _e_pointer_active_handle(E_Pointer *ptr)
 {
-   if (!ptr) return;
    _e_pointer_active(ptr);
    if (ptr->idle_tmr)
      ecore_timer_reset(ptr->idle_tmr);
@@ -120,17 +134,6 @@ _e_pointer_active_handle(E_Pointer *ptr)
      }
 }
 
-static void 
-_e_pointer_hot_update(E_Pointer *ptr, Evas_Coord x, Evas_Coord y)
-{
-   if ((ptr->hot.x != x) || (ptr->hot.y != y))
-     {
-        ptr->hot.x = x;
-        ptr->hot.y = y;
-        ptr->hot.update = EINA_TRUE;
-     }
-}
-
 static Eina_Bool 
 _e_pointer_cb_mouse_down(void *data EINA_UNUSED, int type EINA_UNUSED, void 
*event EINA_UNUSED)
 {
@@ -211,10 +214,9 @@ 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;
-   Evas_Coord x = 0, y = 0;
+   int x = 0, y = 0;
 
    if (!(ptr = data)) return;
-   if (!e_config->show_cursor) return;
    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", 
@@ -223,18 +225,108 @@ _e_pointer_cb_hot_move(void *data, Evas *evas 
EINA_UNUSED, Evas_Object *obj EINA
 }
 
 static void 
-_e_pointer_cb_hot_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj, 
void *event EINA_UNUSED)
+_e_pointer_cb_hot_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event EINA_UNUSED)
 {
    E_Pointer *ptr;
-   Evas_Coord x = 0, y = 0;
+   int x = 0, y = 0;
 
    if (!(ptr = data)) return;
-   edje_object_part_geometry_get(obj, "e.swallow.hotspot", 
+   edje_object_part_geometry_get(ptr->o_ptr, "e.swallow.hotspot", 
                                  &x, &y, NULL, NULL);
    _e_pointer_hot_update(ptr, x, y);
 }
 
 static void 
+_e_pointer_canvas_del(E_Pointer *ptr)
+{
+   E_FREE_FUNC(ptr->o_hot, evas_object_del);
+   E_FREE_FUNC(ptr->o_ptr, evas_object_del);
+   if (ptr->evas) evas_free(ptr->evas);
+   ptr->evas = NULL;
+   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->evas = evas_new())) goto err;
+
+   method = evas_render_method_lookup("buffer");
+   evas_output_method_set(ptr->evas, method);
+   evas_output_size_set(ptr->evas, ptr->w, ptr->h);
+   evas_output_viewport_set(ptr->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->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->evas, (Evas_Engine_Info *)einfo);
+
+   /* create pointer object */
+   ptr->o_ptr = edje_object_add(ptr->evas);
+
+   /* create hotspot object */
+   ptr->o_hot = evas_object_rectangle_add(ptr->evas);
+   evas_object_color_set(ptr->o_hot, 0, 0, 0, 0);
+
+   evas_object_event_callback_add(ptr->o_hot, EVAS_CALLBACK_MOVE, 
+                                  _e_pointer_cb_hot_move, ptr);
+   evas_object_event_callback_add(ptr->o_hot, EVAS_CALLBACK_SHOW, 
+                                  _e_pointer_cb_hot_show, ptr);
+
+   evas_object_move(ptr->o_ptr, 0, 0);
+   evas_object_resize(ptr->o_ptr, ptr->w, ptr->h);
+   evas_object_show(ptr->o_ptr);
+
+   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->evas, w, h);
+   evas_output_viewport_set(ptr->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->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->evas, (Evas_Engine_Info *)einfo);
+
+   evas_object_move(ptr->o_ptr, 0, 0);
+   evas_object_resize(ptr->o_ptr, ptr->w, ptr->h);
+}
+
+static void 
 _e_pointer_stack_free(E_Pointer_Stack *stack)
 {
    if (stack->type) eina_stringshare_del(stack->type);
@@ -246,9 +338,6 @@ _e_pointer_cb_free(E_Pointer *ptr)
 {
    _ptrs = eina_list_remove(_ptrs, ptr);
 
-   E_FREE_FUNC(ptr->o_ptr, evas_object_del);
-   E_FREE_FUNC(ptr->o_hot, evas_object_del);
-
    E_FREE_LIST(ptr->stack, _e_pointer_stack_free);
 
    if (ptr->type) eina_stringshare_del(ptr->type);
@@ -256,19 +345,21 @@ _e_pointer_cb_free(E_Pointer *ptr)
    E_FREE_FUNC(ptr->idle_tmr, ecore_timer_del);
    E_FREE_FUNC(ptr->idle_poll, ecore_poller_del);
 
+   if (!ptr->canvas) _e_pointer_canvas_del(ptr);
+
    E_FREE(ptr);
 }
 
 static void 
 _e_pointer_type_set(E_Pointer *ptr, const char *type)
 {
-   if (!ptr) return;
-
+   /* check if pointer type is already set */
    if (!e_util_strcmp(ptr->type, type)) return;
 
    eina_stringshare_replace(&ptr->type, type);
 
-   if (!e_config->show_cursor) 
+   /* don't show cursor if in hidden mode */
+   if (!e_config->show_cursor)
      {
         e_pointer_hide(ptr);
         return;
@@ -277,85 +368,83 @@ _e_pointer_type_set(E_Pointer *ptr, const char *type)
    if (ptr->e_cursor)
      {
         char cursor[1024];
-        Evas_Coord x, y;
+        int x = 0, y = 0;
+
+        /* create a pointer canvas if we need to */
+        if ((!ptr->evas) && (!ptr->canvas)) _e_pointer_canvas_add(ptr);
 
         if (ptr->color)
-          snprintf(cursor, sizeof(cursor),
+          snprintf(cursor, sizeof(cursor), 
                    "e/pointer/enlightenment/%s/color", type);
         else
-          snprintf(cursor, sizeof(cursor),
+          snprintf(cursor, sizeof(cursor), 
                    "e/pointer/enlightenment/%s/mono", type);
 
+        /* try to set the edje object theme */
         if (!e_theme_edje_object_set(ptr->o_ptr, "base/theme/pointer", cursor))
           goto fallback;
 
         edje_object_part_swallow(ptr->o_ptr, "e.swallow.hotspot", ptr->o_hot);
-        edje_object_part_geometry_get(ptr->o_ptr, "e.swallow.hotspot",
-                                      &x, &y, NULL, NULL);
 
+        edje_object_part_geometry_get(ptr->o_ptr, "e.swallow.hotspot", 
+                                      &x, &y, NULL, NULL);
         _e_pointer_hot_update(ptr, x, y);
 
         evas_object_show(ptr->o_ptr);
 
-//        if (ptr->hot.update)
-          {
-             /* Layer Max - 32 snarfed from Elm */
-             ecore_evas_object_cursor_set(ptr->ee, ptr->o_ptr, EVAS_LAYER_MAX, 
-                                          ptr->hot.x, ptr->hot.y);
-             /* ptr->hot.update = EINA_FALSE; */
-          }
+        if (ptr->canvas)
+          ecore_evas_object_cursor_set(ptr->ee, ptr->o_ptr, EVAS_LAYER_MAX, 
+                                       ptr->hot.x, ptr->hot.y);
 
         return;
      }
 
 fallback:
-   WRN("FALLBACK POINTER !!!");
-     {
+   if ((ptr->evas) && (!ptr->canvas)) _e_pointer_canvas_del(ptr);
 #ifndef HAVE_WAYLAND_ONLY
-        Ecore_X_Cursor cursor = 0;
+   Ecore_X_Cursor cursor = 0;
 
-        if (!strcmp(type, "move"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_FLEUR);
+   if (!strcmp(type, "move"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_FLEUR);
 # if 0
-        else if (!strcmp(type, "resize"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_SIZING);
+   else if (!strcmp(type, "resize"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_SIZING);
 # endif
-        else if (!strcmp(type, "resize_tl"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_TOP_LEFT_CORNER);
-        else if (!strcmp(type, "resize_t"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_TOP_SIDE);
-        else if (!strcmp(type, "resize_tr"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_TOP_RIGHT_CORNER);
-        else if (!strcmp(type, "resize_r"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_RIGHT_SIDE);
-        else if (!strcmp(type, "resize_br"))
-          cursor = 
ecore_x_cursor_shape_get(ECORE_X_CURSOR_BOTTOM_RIGHT_CORNER);
-        else if (!strcmp(type, "resize_b"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_BOTTOM_SIDE);
-        else if (!strcmp(type, "resize_bl"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_BOTTOM_LEFT_CORNER);
-        else if (!strcmp(type, "resize_l"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_LEFT_SIDE);
-        else if (!strcmp(type, "entry"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_XTERM);
-        else if (!strcmp(type, "default"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_LEFT_PTR);
-        else if (!strcmp(type, "plus"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_PLUS);
-        else if (!strcmp(type, "hand"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_HAND1);
-        else if (!strcmp(type, "rotate"))
-          cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_EXCHANGE);
-        else
-          {
-             WRN("Unknown pointer type: %s\n", type);
-             cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_ARROW);
-          }
-        if (!cursor) WRN("X Cursor for %s is missing\n", type);
-        ecore_x_window_cursor_set(ptr->win, cursor);
-        if (cursor) ecore_x_cursor_free(cursor);
-#endif
+   else if (!strcmp(type, "resize_tl"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_TOP_LEFT_CORNER);
+   else if (!strcmp(type, "resize_t"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_TOP_SIDE);
+   else if (!strcmp(type, "resize_tr"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_TOP_RIGHT_CORNER);
+   else if (!strcmp(type, "resize_r"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_RIGHT_SIDE);
+   else if (!strcmp(type, "resize_br"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_BOTTOM_RIGHT_CORNER);
+   else if (!strcmp(type, "resize_b"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_BOTTOM_SIDE);
+   else if (!strcmp(type, "resize_bl"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_BOTTOM_LEFT_CORNER);
+   else if (!strcmp(type, "resize_l"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_LEFT_SIDE);
+   else if (!strcmp(type, "entry"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_XTERM);
+   else if (!strcmp(type, "default"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_LEFT_PTR);
+   else if (!strcmp(type, "plus"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_PLUS);
+   else if (!strcmp(type, "hand"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_HAND1);
+   else if (!strcmp(type, "rotate"))
+     cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_EXCHANGE);
+   else
+     {
+        WRN("Unknown pointer type: %s\n", type);
+        cursor = ecore_x_cursor_shape_get(ECORE_X_CURSOR_ARROW);
      }
+   if (!cursor) WRN("X Cursor for %s is missing\n", type);
+   ecore_x_window_cursor_set(ptr->win, cursor);
+   if (cursor) ecore_x_cursor_free(cursor);
+#endif
    return;
 }
 
@@ -370,11 +459,6 @@ e_pointer_init(void)
                          _e_pointer_cb_mouse_move, NULL);
    E_LIST_HANDLER_APPEND(_hdlrs, ECORE_EVENT_MOUSE_WHEEL, 
                          _e_pointer_cb_mouse_wheel, NULL);
-
-#ifndef HAVE_WAYLAND_ONLY
-   ecore_x_cursor_size_set(e_config->cursor_size * 3 / 4);
-#endif
-
    return 1;
 }
 
@@ -382,36 +466,33 @@ EINTERN int
 e_pointer_shutdown(void)
 {
    E_FREE_LIST(_hdlrs, ecore_event_handler_del);
-
    return 1;
 }
 
 EAPI E_Pointer *
 e_pointer_window_new(Ecore_Window win, Eina_Bool filled)
 {
-   WRN("E_Pointer Window New Called !!!");
-   return NULL;
-
-   E_Pointer *ptr;
+   E_Pointer *ptr = NULL;
    E_Comp *comp;
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL(win, NULL);
 
-   /* allocate new e_pointer object */
+   /* allocate space for new pointer */
    if (!(ptr = E_OBJECT_ALLOC(E_Pointer, E_POINTER_TYPE, _e_pointer_cb_free)))
      return NULL;
 
-   /* set some pointer properties */
+   /* set default pointer properties */
+   ptr->w = ptr->h = e_config->cursor_size;
    ptr->e_cursor = e_config->use_e_cursor;
-   ptr->color = EINA_FALSE;
    ptr->win = win;
-
+   ptr->color = EINA_FALSE;
    if ((comp = e_comp_get(NULL)))
      {
         if (comp->pointer)
           ptr->color = comp->pointer->color;
      }
 
+   /* set pointer default type */
    if (filled) e_pointer_type_push(ptr, ptr, "default");
 
    /* append this pointer to the list */
@@ -423,30 +504,23 @@ e_pointer_window_new(Ecore_Window win, Eina_Bool filled)
 EAPI E_Pointer *
 e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled)
 {
-   E_Pointer *ptr;
-   E_Comp *comp;
+   E_Pointer *ptr = NULL;
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL(ee, NULL);
 
-   /* allocate new e_pointer object */
+   /* allocate space for new pointer */
    if (!(ptr = E_OBJECT_ALLOC(E_Pointer, E_POINTER_TYPE, _e_pointer_cb_free)))
      return NULL;
 
-   /* set some pointer properties */
-   ptr->ee = ee;
-   ptr->e_cursor = e_config->use_e_cursor;
-   ptr->w = ptr->h = e_config->cursor_size;
-   ptr->canvas = EINA_TRUE;
-   ptr->win = ecore_evas_window_get(ee);
-
+   /* set default pointer properties */
    ptr->color = EINA_TRUE;
-   if ((comp = e_comp_get(NULL)))
-     {
-        if (comp->pointer)
-          ptr->color = comp->pointer->color;
-     }
+   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);
+
    ptr->o_ptr = edje_object_add(ptr->evas);
 
    ptr->o_hot = evas_object_rectangle_add(ptr->evas);
@@ -461,13 +535,14 @@ e_pointer_canvas_new(Ecore_Evas *ee, Eina_Bool filled)
    evas_object_resize(ptr->o_ptr, ptr->w, ptr->h);
    evas_object_show(ptr->o_ptr);
 
+   /* set pointer default type */
    if (filled) e_pointer_type_push(ptr, ptr, "default");
 
-   ptr->idle_tmr = ecore_timer_loop_add(4.0, _e_pointer_cb_idle, ptr);
-
-   /* 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;
 }
 
@@ -482,20 +557,26 @@ e_pointers_size_set(int size)
    EINA_LIST_FOREACH(_ptrs, l, ptr)
      {
         if ((ptr->w == size) && (ptr->h == size)) continue;
-        ptr->w = size;
-        ptr->h = size;
-        evas_object_resize(ptr->o_ptr, ptr->w, ptr->h);
+        if ((ptr->evas) && (!ptr->canvas))
+          _e_pointer_canvas_resize(ptr, size, size);
+        else if (ptr->canvas)
+          evas_object_resize(ptr->o_ptr, size, size);
+#ifndef HAVE_WAYLAND_ONLY
+        ecore_x_cursor_size_set(e_config->cursor_size * 3 / 4);
+#endif
      }
 }
 
 EAPI void 
 e_pointer_hide(E_Pointer *ptr)
 {
-   if (!ptr) return;
+   if ((ptr->evas) && (!ptr->canvas)) 
+     _e_pointer_canvas_del(ptr);
+   else if (ptr->canvas)
+     evas_object_hide(ptr->o_ptr);
 #ifndef HAVE_WAYLAND_ONLY
    ecore_x_window_cursor_set(ptr->win, 0);
 #endif
-   evas_object_hide(ptr->o_ptr);
 }
 
 EAPI void 
@@ -503,12 +584,10 @@ e_pointer_type_push(E_Pointer *ptr, void *obj, const char 
*type)
 {
    E_Pointer_Stack *stack;
 
-   if (!ptr) return;
+   EINA_SAFETY_ON_NULL_RETURN(ptr);
 
    _e_pointer_type_set(ptr, type);
 
-   /* ptr->obj = obj; */
-
    if (!(stack = E_NEW(E_Pointer_Stack, 1))) return;
    stack->type = eina_stringshare_ref(ptr->type);
    stack->obj = obj;
@@ -521,7 +600,7 @@ e_pointer_type_pop(E_Pointer *ptr, void *obj, const char 
*type)
    Eina_List *l, *ll;
    E_Pointer_Stack *stack;
 
-   if (!ptr) return;
+   EINA_SAFETY_ON_NULL_RETURN(ptr);
 
    EINA_LIST_FOREACH_SAFE(ptr->stack, l, ll, stack)
      {
@@ -536,7 +615,7 @@ e_pointer_type_pop(E_Pointer *ptr, void *obj, const char 
*type)
 
    if (!ptr->stack)
      {
-//        e_pointer_hide(ptr);
+        e_pointer_hide(ptr);
         eina_stringshare_replace(&ptr->type, NULL);
         return;
      }
@@ -546,7 +625,6 @@ e_pointer_type_pop(E_Pointer *ptr, void *obj, const char 
*type)
    _e_pointer_type_set(ptr, stack->type);
 
    eina_stringshare_refplace(&ptr->type, stack->type);
-   /* ptr->obj = stack->obj; */
 }
 
 EAPI void 
@@ -650,8 +728,28 @@ e_pointer_idler_before(void)
    EINA_LIST_FOREACH(_ptrs, l, ptr)
      {
         if ((!ptr->e_cursor) || (!ptr->evas)) continue;
+
         if (ptr->hot.update)
           _e_pointer_type_set(ptr, ptr->type);
+ 
+        if (!ptr->canvas)
+          {
+             Eina_List *updates;
+
+             if ((updates = evas_render_updates(ptr->evas)))
+               {
+#ifndef HAVE_WAYLAND_ONLY
+                  Ecore_X_Cursor cur;
+
+                  cur = ecore_x_cursor_new(ptr->win, ptr->pixels, ptr->w, 
+                                           ptr->h, ptr->hot.x, ptr->hot.y);
+                  ecore_x_window_cursor_set(ptr->win, cur);
+                  ecore_x_cursor_free(cur);
+#endif
+                  evas_render_updates_free(updates);
+               }
+          }
+
         ptr->hot.update = EINA_FALSE;
      }
 }

-- 


Reply via email to