[PATCH weston 3/4] evdev: Fix assertion error for unplugged output with paired touchscreen

nerdopolis bluescreen_avenger at verizon.net
Fri Apr 25 18:01:06 PDT 2014


On Thursday, April 24, 2014 03:11:16 PM Ander Conselvan de Oliveira wrote:
> From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
> 
> If the output a touchscreen is paired to is unplugged, events coming
> from it should be ignored. Commit 17bccaed introduced logic for that
> in evdev_flush_pending_damage(). However, the break statements it
> introduced would cause the assertion after the switch statement to
> fail.
> 
> That function has the odd behavior that goto's are used to skip the
> assertion after the switch statement and jump to the hunk of code that
> marks the event as processed. Only in the case where the event type has
> an invalid value the assertion should trigger. So this patch fixes the
> problem by moving the assertion into the default case of the switch
> and replacing the goto statements with break ones.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=73950
> ---
>  src/evdev.c | 19 +++++++++----------
>  1 file changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/src/evdev.c b/src/evdev.c
> index 9d97c87..ff951d3 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -100,7 +100,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
>  		notify_motion(master, time, device->rel.dx, device->rel.dy);
>  		device->rel.dx = 0;
>  		device->rel.dy = 0;
> -		goto handled;
> +		break;
>  	case EVDEV_ABSOLUTE_MT_DOWN:
>  		if (device->output == NULL)
>  			break;
> @@ -113,7 +113,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
>  		master->slot_map |= 1 << seat_slot;
>  
>  		notify_touch(master, time, seat_slot, x, y, WL_TOUCH_DOWN);
> -		goto handled;
> +		break;
>  	case EVDEV_ABSOLUTE_MT_MOTION:
>  		if (device->output == NULL)
>  			break;
> @@ -123,12 +123,12 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
>  						   &x, &y);
>  		seat_slot = device->mt.slots[slot].seat_slot;
>  		notify_touch(master, time, seat_slot, x, y, WL_TOUCH_MOTION);
> -		goto handled;
> +		break;
>  	case EVDEV_ABSOLUTE_MT_UP:
>  		seat_slot = device->mt.slots[slot].seat_slot;
>  		master->slot_map &= ~(1 << seat_slot);
>  		notify_touch(master, time, seat_slot, 0, 0, WL_TOUCH_UP);
> -		goto handled;
> +		break;
>  	case EVDEV_ABSOLUTE_TOUCH_DOWN:
>  		if (device->output == NULL)
>  			break;
> @@ -141,7 +141,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
>  		device->abs.seat_slot = seat_slot;
>  		master->slot_map |= 1 << seat_slot;
>  		notify_touch(master, time, seat_slot, x, y, WL_TOUCH_DOWN);
> -		goto handled;
> +		break;
>  	case EVDEV_ABSOLUTE_MOTION:
>  		if (device->output == NULL)
>  			break;
> @@ -156,17 +156,16 @@ evdev_flush_pending_event(struct evdev_device *device, uint32_t time)
>  				     x, y, WL_TOUCH_MOTION);
>  		else if (device->seat_caps & EVDEV_SEAT_POINTER)
>  			notify_motion_absolute(master, time, x, y);
> -		goto handled;
> +		break;
>  	case EVDEV_ABSOLUTE_TOUCH_UP:
>  		seat_slot = device->abs.seat_slot;
>  		master->slot_map &= ~(1 << seat_slot);
>  		notify_touch(master, time, seat_slot, 0, 0, WL_TOUCH_UP);
> -		goto handled;
> +		break;
> +	default:
> +		assert(0 && "Unknown pending event type");
>  	}
>  
> -	assert(0 && "Unknown pending event type");
> -
> -handled:
>  	device->pending_event = EVDEV_NONE;
>  }
>  
> 
These patches fixed the libinput crashing for me as well. 


More information about the wayland-devel mailing list