[PATCH weston] window: Fix crash in input_set_pointer_image when cursor is special

Derek Foreman derekf at osg.samsung.com
Thu Mar 5 06:04:00 PST 2015


On 05/03/15 02:15 AM, Pekka Paalanen wrote:
> On Wed,  4 Mar 2015 16:26:25 -0600
> Derek Foreman <derekf at osg.samsung.com> wrote:
> 
>> Certain circumstances may lead to the "force" clause in
>> input_set_pointer_image() being reached when the current cursor
>> is blank or unset.  These are special cursors that don't have
>> images, and they need to be handled differently than image cursors.
>>
>> This patch puts the special cursor handling in its own function and calls
>> it from both places that need it.  Previously only the frame callback
>> handler did this correctly.
>>
>> Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
>> ---
>>  clients/window.c | 27 +++++++++++++++++++--------
>>  1 file changed, 19 insertions(+), 8 deletions(-)
>>
>> diff --git a/clients/window.c b/clients/window.c
>> index a04cef9..1399fa4 100644
>> --- a/clients/window.c
>> +++ b/clients/window.c
>> @@ -38,6 +38,7 @@
>>  #include <sys/mman.h>
>>  #include <sys/epoll.h>
>>  #include <sys/timerfd.h>
>> +#include <stdbool.h>
>>  
>>  #ifdef HAVE_CAIRO_EGL
>>  #include <wayland-egl.h>
>> @@ -3524,6 +3525,22 @@ input_set_pointer_image_index(struct input *input, int index)
>>  
>>  static const struct wl_callback_listener pointer_surface_listener;
>>  
>> +static bool
>> +input_set_pointer_special(struct input *input)
>> +{
>> +	if (input->current_cursor == CURSOR_BLANK) {
>> +		wl_pointer_set_cursor(input->pointer,
>> +				      input->pointer_enter_serial,
>> +				      NULL, 0, 0);
>> +		return true;
>> +	}
>> +
>> +	if (input->current_cursor == CURSOR_UNSET)
>> +		return true;
>> +
>> +	return false;
>> +}
>> +
>>  static void
>>  pointer_surface_frame_callback(void *data, struct wl_callback *callback,
>>  			       uint32_t time)
>> @@ -3541,15 +3558,9 @@ pointer_surface_frame_callback(void *data, struct wl_callback *callback,
>>  	if (!input->pointer)
>>  		return;
>>  
>> -	if (input->current_cursor == CURSOR_BLANK) {
>> -		wl_pointer_set_cursor(input->pointer,
>> -				      input->pointer_enter_serial,
>> -				      NULL, 0, 0);
>> +	if (input_set_pointer_special(input))
>>  		return;
>> -	}
>>  
>> -	if (input->current_cursor == CURSOR_UNSET)
>> -		return;
>>  	cursor = input->display->cursors[input->current_cursor];
>>  	if (!cursor)
>>  		return;
>> @@ -3598,7 +3609,7 @@ input_set_pointer_image(struct input *input, int pointer)
>>  	input->cursor_serial = input->pointer_enter_serial;
>>  	if (!input->cursor_frame_cb)
>>  		pointer_surface_frame_callback(input, NULL, 0);
>> -	else if (force) {
>> +	else if (force && !input_set_pointer_special(input)) {
>>  		/* The current frame callback may be stuck if, for instance,
>>  		 * the set cursor request was processed by the server after
>>  		 * this client lost the focus. In this case the cursor surface
> 
> I can certainly see how calling input_set_pointer_image_index() with a
> non-image cursor would not do what was intended, as far as I can
> understand.
> 
> R-b me then.
>    fa79b1d..493d979  master -> master
> 
> Would've been nice to how I could trigger the crash, but if it's
> complicated, nevermind.

Not really complicated, but it's a bit of a pain :)

Build Enlightenment with its wayland backend, launch weston-terminal,
change its size with win-left or win-right.



More information about the wayland-devel mailing list