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.
This commit is contained in:
parent
00570c139e
commit
d16845d5f0
|
@ -15,6 +15,7 @@ struct sway_seatop_impl {
|
||||||
void (*unref)(struct sway_seat *seat, struct sway_container *con);
|
void (*unref)(struct sway_seat *seat, struct sway_container *con);
|
||||||
void (*render)(struct sway_seat *seat, struct sway_output *output,
|
void (*render)(struct sway_seat *seat, struct sway_output *output,
|
||||||
pixman_region32_t *damage);
|
pixman_region32_t *damage);
|
||||||
|
bool allows_events;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sway_seat_device {
|
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,
|
void seatop_render(struct sway_seat *seat, struct sway_output *output,
|
||||||
pixman_region32_t *damage);
|
pixman_region32_t *damage);
|
||||||
|
|
||||||
|
bool seatop_allows_events(struct sway_seat *seat);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -613,7 +613,9 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
} else {
|
} else {
|
||||||
state_erase_button(cursor, button);
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -682,7 +684,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
if (cont && resize_edge && button == BTN_LEFT &&
|
if (cont && resize_edge && button == BTN_LEFT &&
|
||||||
state == WLR_BUTTON_PRESSED && !is_floating) {
|
state == WLR_BUTTON_PRESSED && !is_floating) {
|
||||||
seat_set_focus_container(seat, cont);
|
seat_set_focus_container(seat, cont);
|
||||||
seat_pointer_notify_button(seat, time_msec, button, state);
|
|
||||||
seatop_begin_resize_tiling(seat, cont, button, edge);
|
seatop_begin_resize_tiling(seat, cont, button, edge);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -713,7 +714,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
}
|
}
|
||||||
cursor_set_image(seat->cursor, image, NULL);
|
cursor_set_image(seat->cursor, image, NULL);
|
||||||
seat_set_focus_container(seat, cont);
|
seat_set_focus_container(seat, cont);
|
||||||
seat_pointer_notify_button(seat, time_msec, button, state);
|
|
||||||
seatop_begin_resize_tiling(seat, cont, button, edge);
|
seatop_begin_resize_tiling(seat, cont, button, edge);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -729,7 +729,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
cont = cont->parent;
|
cont = cont->parent;
|
||||||
}
|
}
|
||||||
seat_set_focus_container(seat, cont);
|
seat_set_focus_container(seat, cont);
|
||||||
seat_pointer_notify_button(seat, time_msec, button, state);
|
|
||||||
seatop_begin_move_floating(seat, cont, button);
|
seatop_begin_move_floating(seat, cont, button);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -740,7 +739,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
state == WLR_BUTTON_PRESSED) {
|
state == WLR_BUTTON_PRESSED) {
|
||||||
// Via border
|
// Via border
|
||||||
if (button == BTN_LEFT && resize_edge != WLR_EDGE_NONE) {
|
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);
|
seatop_begin_resize_floating(seat, cont, button, resize_edge);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -758,7 +756,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
WLR_EDGE_RIGHT : WLR_EDGE_LEFT;
|
WLR_EDGE_RIGHT : WLR_EDGE_LEFT;
|
||||||
edge |= cursor->cursor->y > floater->y + floater->height / 2 ?
|
edge |= cursor->cursor->y > floater->y + floater->height / 2 ?
|
||||||
WLR_EDGE_BOTTOM : WLR_EDGE_TOP;
|
WLR_EDGE_BOTTOM : WLR_EDGE_TOP;
|
||||||
seat_pointer_notify_button(seat, time_msec, button, state);
|
|
||||||
seatop_begin_resize_floating(seat, floater, button, edge);
|
seatop_begin_resize_floating(seat, floater, button, edge);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -775,8 +772,6 @@ void dispatch_cursor_button(struct sway_cursor *cursor,
|
||||||
seat_set_focus(seat, node);
|
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 moving a container by it's title bar, use a threshold for the drag
|
||||||
if (!mod_pressed && config->tiling_drag_threshold > 0) {
|
if (!mod_pressed && config->tiling_drag_threshold > 0) {
|
||||||
seatop_begin_move_tiling_threshold(seat, cont, button);
|
seatop_begin_move_tiling_threshold(seat, cont, button);
|
||||||
|
|
|
@ -1234,3 +1234,7 @@ void seatop_render(struct sway_seat *seat, struct sway_output *output,
|
||||||
seat->seatop_impl->render(seat, output, damage);
|
seat->seatop_impl->render(seat, output, damage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool seatop_allows_events(struct sway_seat *seat) {
|
||||||
|
return seat->seatop_impl && seat->seatop_impl->allows_events;
|
||||||
|
}
|
||||||
|
|
|
@ -58,6 +58,7 @@ static const struct sway_seatop_impl seatop_impl = {
|
||||||
.finish = handle_finish,
|
.finish = handle_finish,
|
||||||
.abort = handle_abort,
|
.abort = handle_abort,
|
||||||
.unref = handle_unref,
|
.unref = handle_unref,
|
||||||
|
.allows_events = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
void seatop_begin_down(struct sway_seat *seat, struct sway_container *con,
|
void seatop_begin_down(struct sway_seat *seat, struct sway_container *con,
|
||||||
|
|
Loading…
Reference in a new issue