Skip to content

Commit

Permalink
Don't send button events to surfaces when dragging or resizing
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
RyanDwyer authored and ddevault committed Mar 11, 2019
1 parent ab1b1da commit 9bfb385
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 8 deletions.
3 changes: 3 additions & 0 deletions include/sway/input/seat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
11 changes: 3 additions & 8 deletions sway/input/cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions sway/input/seat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions sway/input/seatop_down.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 9bfb385

Please sign in to comment.