From de4173ee0af28465b43c4eac1f4c64cf43d38fcf Mon Sep 17 00:00:00 2001 From: Rafael Antognolli Date: Mon, 22 Apr 2013 13:35:54 -0300 Subject: [PATCH] ecore/wayland: Add support for engine animated cursor. --- src/lib/ecore_wayland/Ecore_Wayland.h | 3 + src/lib/ecore_wayland/ecore_wl_input.c | 80 ++++++++++++++++++++------ 2 files changed, 65 insertions(+), 18 deletions(-) diff --git a/src/lib/ecore_wayland/Ecore_Wayland.h b/src/lib/ecore_wayland/Ecore_Wayland.h index 42d836fcb2..6a5adfb359 100644 --- a/src/lib/ecore_wayland/Ecore_Wayland.h +++ b/src/lib/ecore_wayland/Ecore_Wayland.h @@ -146,8 +146,11 @@ struct _Ecore_Wl_Input struct wl_touch *touch; const char *cursor_name; + struct wl_cursor *cursor; struct wl_surface *cursor_surface; struct wl_callback *cursor_frame_cb; + Ecore_Timer *cursor_timer; + unsigned int cursor_current_index; struct wl_data_device *data_device; diff --git a/src/lib/ecore_wayland/ecore_wl_input.c b/src/lib/ecore_wayland/ecore_wl_input.c index 4732055ea3..554b8b1e39 100644 --- a/src/lib/ecore_wayland/ecore_wl_input.c +++ b/src/lib/ecore_wayland/ecore_wl_input.c @@ -165,27 +165,78 @@ ecore_wl_input_ungrab(Ecore_Wl_Input *input) input->grab_button = 0; } +static void +_pointer_update_stop(Ecore_Wl_Input *input) +{ + if (!input->cursor_timer) return; + + ecore_timer_del(input->cursor_timer); + input->cursor_timer = NULL; +} + EAPI void ecore_wl_input_pointer_set(Ecore_Wl_Input *input, struct wl_surface *surface, int hot_x, int hot_y) { LOGFN(__FILE__, __LINE__, __FUNCTION__); - if (input) - wl_pointer_set_cursor(input->pointer, input->pointer_enter_serial, - surface, hot_x, hot_y); + if (!input) return; + + _pointer_update_stop(input); + wl_pointer_set_cursor(input->pointer, input->pointer_enter_serial, + surface, hot_x, hot_y); +} + +static Eina_Bool +_ecore_wl_input_cursor_update(void *data) +{ + struct wl_cursor_image *cursor_image; + struct wl_buffer *buffer; + Ecore_Wl_Input *input = data; + unsigned int delay; + + cursor_image = input->cursor->images[input->cursor_current_index]; + if ((buffer = wl_cursor_image_get_buffer(cursor_image))) + { + ecore_wl_input_pointer_set(input, input->cursor_surface, + cursor_image->hotspot_x, + cursor_image->hotspot_y); + wl_surface_attach(input->cursor_surface, buffer, 0, 0); + wl_surface_damage(input->cursor_surface, 0, 0, + cursor_image->width, cursor_image->height); + wl_surface_commit(input->cursor_surface); + + if (!input->cursor_frame_cb) + _ecore_wl_input_cb_pointer_frame(input, NULL, 0); + } + + if (input->cursor->image_count <= 1) + return ECORE_CALLBACK_CANCEL; + + delay = cursor_image->delay; + input->cursor_current_index = + (input->cursor_current_index + 1) % input->cursor->image_count; + + if (!input->cursor_timer) + input->cursor_timer = + ecore_timer_loop_add(delay / 1000.0, + _ecore_wl_input_cursor_update, input); + else + ecore_timer_interval_set(input->cursor_timer, delay / 1000.0); + + return ECORE_CALLBACK_RENEW; } EAPI void ecore_wl_input_cursor_from_name_set(Ecore_Wl_Input *input, const char *cursor_name) { - struct wl_cursor_image *cursor_image; - struct wl_buffer *buffer; struct wl_cursor *cursor; LOGFN(__FILE__, __LINE__, __FUNCTION__); if (!input) return; + _pointer_update_stop(input); + eina_stringshare_replace(&input->cursor_name, cursor_name); /* No cursor. Set to default Left Pointer */ @@ -200,26 +251,17 @@ ecore_wl_input_cursor_from_name_set(Ecore_Wl_Input *input, const char *cursor_na return; } + input->cursor = cursor; + if ((!cursor->images) || (!cursor->images[0])) { ecore_wl_input_pointer_set(input, NULL, 0, 0); return; } - cursor_image = cursor->images[0]; - if ((buffer = wl_cursor_image_get_buffer(cursor_image))) - { - ecore_wl_input_pointer_set(input, input->cursor_surface, - cursor_image->hotspot_x, - cursor_image->hotspot_y); - wl_surface_attach(input->cursor_surface, buffer, 0, 0); - wl_surface_damage(input->cursor_surface, 0, 0, - cursor_image->width, cursor_image->height); - wl_surface_commit(input->cursor_surface); + input->cursor_current_index = 0; - if (!input->cursor_frame_cb) - _ecore_wl_input_cb_pointer_frame(input, NULL, 0); - } + _ecore_wl_input_cursor_update(input); } EAPI void @@ -289,6 +331,8 @@ _ecore_wl_input_del(Ecore_Wl_Input *input) { if (!input) return; + _pointer_update_stop(input); + if (input->cursor_name) eina_stringshare_del(input->cursor_name); input->cursor_name = NULL;