1
0
mirror of https://codeberg.org/vyivel/dulcepan/ synced 2025-03-12 18:59:15 +02:00

seat: use correct serial when updating cursor shape

This commit is contained in:
Kirill Primak 2024-08-09 15:46:37 +03:00
parent 553147259b
commit 6f7dfab735
2 changed files with 16 additions and 11 deletions

View File

@ -88,6 +88,7 @@ struct dp_seat {
struct xkb_keymap *xkb_keymap; struct xkb_keymap *xkb_keymap;
struct xkb_state *xkb_state; struct xkb_state *xkb_state;
uint32_t pointer_serial;
struct wp_cursor_shape_device_v1 *cursor_shape_device; struct wp_cursor_shape_device_v1 *cursor_shape_device;
// The output the pointer is on // The output the pointer is on

View File

@ -123,17 +123,17 @@ static enum wp_cursor_shape_device_v1_shape get_cursor_shape(struct dp_selection
abort(); // Unreachable abort(); // Unreachable
} }
static void update_cursor(struct dp_seat *seat, uint32_t serial) { static void update_cursor(struct dp_seat *seat) {
wp_cursor_shape_device_v1_set_shape( wp_cursor_shape_device_v1_set_shape(seat->cursor_shape_device, seat->pointer_serial,
seat->cursor_shape_device, serial, get_cursor_shape(&seat->state->selection)); get_cursor_shape(&seat->state->selection));
} }
static void process_position(struct dp_seat *seat, wl_fixed_t x, wl_fixed_t y, uint32_t serial) { static void process_position(struct dp_seat *seat, wl_fixed_t x, wl_fixed_t y) {
struct dp_output *output = seat->ptr_output; struct dp_output *output = seat->ptr_output;
seat->ptr_x = wl_fixed_to_double(x); seat->ptr_x = wl_fixed_to_double(x);
seat->ptr_y = wl_fixed_to_double(y); seat->ptr_y = wl_fixed_to_double(y);
dp_select_notify_pointer_position(&seat->state->selection, output, seat->ptr_x, seat->ptr_y); dp_select_notify_pointer_position(&seat->state->selection, output, seat->ptr_x, seat->ptr_y);
update_cursor(seat, serial); update_cursor(seat);
} }
static void pointer_handle_enter(void *data, struct wl_pointer *wl_pointer, uint32_t serial, static void pointer_handle_enter(void *data, struct wl_pointer *wl_pointer, uint32_t serial,
@ -141,22 +141,24 @@ static void pointer_handle_enter(void *data, struct wl_pointer *wl_pointer, uint
struct dp_seat *seat = data; struct dp_seat *seat = data;
seat->ptr_output = wl_surface_get_user_data(surface); seat->ptr_output = wl_surface_get_user_data(surface);
assert(seat->ptr_output != NULL); assert(seat->ptr_output != NULL);
process_position(seat, sx, sy, serial); seat->pointer_serial = serial;
process_position(seat, sx, sy);
} }
static void pointer_handle_leave( static void pointer_handle_leave(
void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface) { void *data, struct wl_pointer *wl_pointer, uint32_t serial, struct wl_surface *surface) {
struct dp_seat *seat = data; struct dp_seat *seat = data;
seat->ptr_output = NULL; seat->ptr_output = NULL;
seat->pointer_serial = serial;
} }
static void pointer_handle_motion( static void pointer_handle_motion(void *data, struct wl_pointer *wl_pointer, uint32_t time_msec,
void *data, struct wl_pointer *wl_pointer, uint32_t serial, wl_fixed_t sx, wl_fixed_t sy) { wl_fixed_t sx, wl_fixed_t sy) {
struct dp_seat *seat = data; struct dp_seat *seat = data;
if (seat->ptr_output == NULL) { if (seat->ptr_output == NULL) {
return; // Shouldn't happen return; // Shouldn't happen
} }
process_position(seat, sx, sy, serial); process_position(seat, sx, sy);
} }
static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial, static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uint32_t serial,
@ -164,6 +166,8 @@ static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uin
struct dp_seat *seat = data; struct dp_seat *seat = data;
struct dp_state *state = seat->state; struct dp_state *state = seat->state;
seat->pointer_serial = serial;
struct dp_selection *selection = &state->selection; struct dp_selection *selection = &state->selection;
if (button_state != WL_POINTER_BUTTON_STATE_PRESSED) { if (button_state != WL_POINTER_BUTTON_STATE_PRESSED) {
if (selection->width > 0 && selection->height > 0 && state->config.quick_select) { if (selection->width > 0 && selection->height > 0 && state->config.quick_select) {
@ -182,14 +186,14 @@ static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer, uin
case BTN_RIGHT: case BTN_RIGHT:
dp_select_start_interactive( dp_select_start_interactive(
selection, seat->ptr_output, seat->ptr_x, seat->ptr_y, button == BTN_LEFT); selection, seat->ptr_output, seat->ptr_x, seat->ptr_y, button == BTN_LEFT);
update_cursor(seat, serial); update_cursor(seat);
break; break;
case BTN_MIDDLE: case BTN_MIDDLE:
dp_select_whole(selection, seat->ptr_output); dp_select_whole(selection, seat->ptr_output);
// dp_select_whole() doesn't invalidate the interactive state, so do it manually // dp_select_whole() doesn't invalidate the interactive state, so do it manually
dp_select_notify_pointer_position(selection, seat->ptr_output, seat->ptr_x, seat->ptr_y); dp_select_notify_pointer_position(selection, seat->ptr_output, seat->ptr_x, seat->ptr_y);
update_cursor(seat, serial); update_cursor(seat);
if (state->config.quick_select) { if (state->config.quick_select) {
state->status = DP_STATUS_SAVED; state->status = DP_STATUS_SAVED;