diff options
| author | Ryan Dwyer <ryandwyer1@gmail.com> | 2019-03-06 18:54:41 +1000 | 
|---|---|---|
| committer | emersion <contact@emersion.fr> | 2019-03-11 14:55:54 +0100 | 
| commit | d16845d5f0f7ea0316fb9d5e2b7d20b78ca41991 (patch) | |
| tree | 3db6efe184aa5c311ecc89140f3f340f25db0687 | |
| parent | 00570c139e037d5d88f1683bb71b42a7f34139b8 (diff) | |
| download | sway-d16845d5f0f7ea0316fb9d5e2b7d20b78ca41991.tar.xz | |
Don't send button events to surfaces when dragging or resizing
It turns out sending button events during all seat operations is not
desirable. This patch introduces a new property
`seatop_impl.allows_events` which allows each operation to define
whether button events should be passed to the surface or not.
The `down` seat operation is the only one that supports this. As all the
other seatops don't support it, the calls to seat_pointer_notify_button
prior to starting them have been removed.
| -rw-r--r-- | include/sway/input/seat.h | 3 | ||||
| -rw-r--r-- | sway/input/cursor.c | 11 | ||||
| -rw-r--r-- | sway/input/seat.c | 4 | ||||
| -rw-r--r-- | sway/input/seatop_down.c | 1 | 
4 files changed, 11 insertions, 8 deletions
diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h index 0f5dab98..eb674b70 100644 --- a/include/sway/input/seat.h +++ b/include/sway/input/seat.h @@ -15,6 +15,7 @@ struct sway_seatop_impl {  	void (*unref)(struct sway_seat *seat, struct sway_container *con);  	void (*render)(struct sway_seat *seat, struct sway_output *output,  			pixman_region32_t *damage); +	bool allows_events;  };  struct sway_seat_device { @@ -239,4 +240,6 @@ void seatop_unref(struct sway_seat *seat, struct sway_container *con);  void seatop_render(struct sway_seat *seat, struct sway_output *output,  		pixman_region32_t *damage); +bool seatop_allows_events(struct sway_seat *seat); +  #endif diff --git a/sway/input/cursor.c b/sway/input/cursor.c index b96fde88..ef03c6aa 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -613,7 +613,9 @@ void dispatch_cursor_button(struct sway_cursor *cursor,  		} else {  			state_erase_button(cursor, button);  		} -		seat_pointer_notify_button(seat, time_msec, button, state); +		if (seatop_allows_events(seat)) { +			seat_pointer_notify_button(seat, time_msec, button, state); +		}  		return;  	} @@ -682,7 +684,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,  	if (cont && resize_edge && button == BTN_LEFT &&  			state == WLR_BUTTON_PRESSED && !is_floating) {  		seat_set_focus_container(seat, cont); -		seat_pointer_notify_button(seat, time_msec, button, state);  		seatop_begin_resize_tiling(seat, cont, button, edge);  		return;  	} @@ -713,7 +714,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,  			}  			cursor_set_image(seat->cursor, image, NULL);  			seat_set_focus_container(seat, cont); -			seat_pointer_notify_button(seat, time_msec, button, state);  			seatop_begin_resize_tiling(seat, cont, button, edge);  			return;  		} @@ -729,7 +729,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,  				cont = cont->parent;  			}  			seat_set_focus_container(seat, cont); -			seat_pointer_notify_button(seat, time_msec, button, state);  			seatop_begin_move_floating(seat, cont, button);  			return;  		} @@ -740,7 +739,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,  			state == WLR_BUTTON_PRESSED) {  		// Via border  		if (button == BTN_LEFT && resize_edge != WLR_EDGE_NONE) { -			seat_pointer_notify_button(seat, time_msec, button, state);  			seatop_begin_resize_floating(seat, cont, button, resize_edge);  			return;  		} @@ -758,7 +756,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,  				WLR_EDGE_RIGHT : WLR_EDGE_LEFT;  			edge |= cursor->cursor->y > floater->y + floater->height / 2 ?  				WLR_EDGE_BOTTOM : WLR_EDGE_TOP; -			seat_pointer_notify_button(seat, time_msec, button, state);  			seatop_begin_resize_floating(seat, floater, button, edge);  			return;  		} @@ -775,8 +772,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,  			seat_set_focus(seat, node);  		} -		seat_pointer_notify_button(seat, time_msec, button, state); -  		// If moving a container by it's title bar, use a threshold for the drag  		if (!mod_pressed && config->tiling_drag_threshold > 0) {  			seatop_begin_move_tiling_threshold(seat, cont, button); diff --git a/sway/input/seat.c b/sway/input/seat.c index 3a68904b..be523539 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -1234,3 +1234,7 @@ void seatop_render(struct sway_seat *seat, struct sway_output *output,  		seat->seatop_impl->render(seat, output, damage);  	}  } + +bool seatop_allows_events(struct sway_seat *seat) { +	return seat->seatop_impl && seat->seatop_impl->allows_events; +} diff --git a/sway/input/seatop_down.c b/sway/input/seatop_down.c index 7f394095..895571b1 100644 --- a/sway/input/seatop_down.c +++ b/sway/input/seatop_down.c @@ -58,6 +58,7 @@ static const struct sway_seatop_impl seatop_impl = {  	.finish = handle_finish,  	.abort = handle_abort,  	.unref = handle_unref, +	.allows_events = true,  };  void seatop_begin_down(struct sway_seat *seat, struct sway_container *con,  | 
