diff --git a/src/bin/e_pointer.c b/src/bin/e_pointer.c index ceb2a5893..b2484f0c3 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; + +#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 + 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; - - if (!(ptr = data)) return ECORE_CALLBACK_RENEW; - if (e_config->idle_cursor) _e_pointer_idle(ptr); - - return EINA_TRUE; -} - 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,17 +225,107 @@ _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) { @@ -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; } }