From ee07dcf4c704e64d3d9d95191129bccd98c2c37d Mon Sep 17 00:00:00 2001 From: Dudemanguy Date: Tue, 25 Feb 2025 23:36:30 -0600 Subject: [PATCH] input: add quiet arg to mp_input_set_mouse_pos for wayland Setting the mouse position always updates the cursor visibility state in the core, but that's not always desired by the caller. Make it optional. In practice, this is for wayland. Fixes #15967. --- input/input.c | 15 ++++++++------- input/input.h | 2 +- osdep/mac/input_helper.swift | 2 +- osdep/terminal-unix.c | 2 +- osdep/terminal-win.c | 2 +- video/out/vo_caca.c | 2 +- video/out/vo_sdl.c | 2 +- video/out/w32_common.c | 2 +- video/out/wayland_common.c | 8 ++++---- video/out/x11_common.c | 2 +- 10 files changed, 20 insertions(+), 19 deletions(-) diff --git a/input/input.c b/input/input.c index 65e6944bae..de00931756 100644 --- a/input/input.c +++ b/input/input.c @@ -887,7 +887,7 @@ bool mp_input_vo_keyboard_enabled(struct input_ctx *ictx) return r; } -static void set_mouse_pos(struct input_ctx *ictx, int x, int y) +static void set_mouse_pos(struct input_ctx *ictx, int x, int y, bool quiet) { MP_TRACE(ictx, "mouse move %d/%d\n", x, y); @@ -909,7 +909,8 @@ static void set_mouse_pos(struct input_ctx *ictx, int x, int y) MP_TRACE(ictx, "-> %d/%d\n", x, y); } - ictx->mouse_event_counter++; + if (!quiet) + ictx->mouse_event_counter++; ictx->mouse_vo_x = x; ictx->mouse_vo_y = y; @@ -955,15 +956,15 @@ static void set_mouse_pos(struct input_ctx *ictx, int x, int y) void mp_input_set_mouse_pos_artificial(struct input_ctx *ictx, int x, int y) { input_lock(ictx); - set_mouse_pos(ictx, x, y); + set_mouse_pos(ictx, x, y, false); input_unlock(ictx); } -void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y) +void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y, bool quiet) { input_lock(ictx); if (ictx->opts->enable_mouse_movements) - set_mouse_pos(ictx, x, y); + set_mouse_pos(ictx, x, y, quiet); input_unlock(ictx); } @@ -993,7 +994,7 @@ static void update_touch_point(struct input_ctx *ictx, int idx, int id, int x, i ictx->touch_points[idx].y = y; // Emulate mouse input from the primary touch point (the first one added) if (ictx->opts->touch_emulate_mouse && idx == 0) - set_mouse_pos(ictx, x, y); + set_mouse_pos(ictx, x, y, false); notify_touch_update(ictx); } @@ -1012,7 +1013,7 @@ void mp_input_add_touch_point(struct input_ctx *ictx, int id, int x, int y) (struct touch_point){id, x, y}); // Emulate MBTN_LEFT down if this is the only touch point if (ictx->opts->touch_emulate_mouse && ictx->num_touch_points == 1) { - set_mouse_pos(ictx, x, y); + set_mouse_pos(ictx, x, y, false); feed_key(ictx, MP_MBTN_LEFT | MP_KEY_STATE_DOWN, 1, false); } notify_touch_update(ictx); diff --git a/input/input.h b/input/input.h index 8c5b85e117..4da6178c05 100644 --- a/input/input.h +++ b/input/input.h @@ -95,7 +95,7 @@ void mp_input_put_key_utf8(struct input_ctx *ictx, int mods, struct bstr t); void mp_input_put_wheel(struct input_ctx *ictx, int direction, double value); // Update mouse position (in window coordinates). -void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y); +void mp_input_set_mouse_pos(struct input_ctx *ictx, int x, int y, bool quiet); // Like mp_input_set_mouse_pos(), but ignore mouse disable option. void mp_input_set_mouse_pos_artificial(struct input_ctx *ictx, int x, int y); diff --git a/osdep/mac/input_helper.swift b/osdep/mac/input_helper.swift index 0acec6bd40..6f23135505 100644 --- a/osdep/mac/input_helper.swift +++ b/osdep/mac/input_helper.swift @@ -171,7 +171,7 @@ class InputHelper: NSObject { if !mouseEnabled() { return } lock.withLock { guard let input = input else { return } - mp_input_set_mouse_pos(input, Int32(position.x), Int32(position.y)) + mp_input_set_mouse_pos(input, Int32(position.x), Int32(position.y), false) } } diff --git a/osdep/terminal-unix.c b/osdep/terminal-unix.c index bf9f8317ed..49ddf8f163 100644 --- a/osdep/terminal-unix.c +++ b/osdep/terminal-unix.c @@ -306,7 +306,7 @@ static void process_input(struct input_ctx *input_ctx, bool timeout) terminal_get_size2(&num_rows, &num_cols, &total_px_width, &total_px_height); mp_input_set_mouse_pos(input_ctx, (buf.b[4] - 32.5) * (total_px_width / num_cols), - (buf.b[5] - 32.5) * (total_px_height / num_rows)); + (buf.b[5] - 32.5) * (total_px_height / num_rows), false); } if (match->type != ENTRY_TYPE_MOUSE_MOVE) mp_input_put_key(input_ctx, buf.mods | match->mpkey); diff --git a/osdep/terminal-win.c b/osdep/terminal-win.c index 3051b57dbe..1720595fc6 100644 --- a/osdep/terminal-win.c +++ b/osdep/terminal-win.c @@ -198,7 +198,7 @@ static void read_input(HANDLE in) int w = 0, h = 0; if (get_font_size(&w, &h)) { mp_input_set_mouse_pos(input_ctx, w * (record->dwMousePosition.X + 0.5), - h * (record->dwMousePosition.Y + 0.5)); + h * (record->dwMousePosition.Y + 0.5), false); } break; } diff --git a/video/out/vo_caca.c b/video/out/vo_caca.c index 8ce4322a4e..49df5f0584 100644 --- a/video/out/vo_caca.c +++ b/video/out/vo_caca.c @@ -185,7 +185,7 @@ static void check_events(struct vo *vo) mp_input_put_key(vo->input_ctx, MP_KEY_CLOSE_WIN); break; case CACA_EVENT_MOUSE_MOTION: - mp_input_set_mouse_pos(vo->input_ctx, cev.data.mouse.x, cev.data.mouse.y); + mp_input_set_mouse_pos(vo->input_ctx, cev.data.mouse.x, cev.data.mouse.y, false); break; case CACA_EVENT_MOUSE_PRESS: mp_input_put_key(vo->input_ctx, diff --git a/video/out/vo_sdl.c b/video/out/vo_sdl.c index d1e3734e35..a0240f995d 100644 --- a/video/out/vo_sdl.c +++ b/video/out/vo_sdl.c @@ -608,7 +608,7 @@ static void wait_events(struct vo *vo, int64_t until_time_ns) break; } case SDL_MOUSEMOTION: - mp_input_set_mouse_pos(vo->input_ctx, ev.motion.x, ev.motion.y); + mp_input_set_mouse_pos(vo->input_ctx, ev.motion.x, ev.motion.y, false); break; case SDL_MOUSEBUTTONDOWN: { int i; diff --git a/video/out/w32_common.c b/video/out/w32_common.c index d17ddbbcc5..f650d4ef13 100644 --- a/video/out/w32_common.c +++ b/video/out/w32_common.c @@ -1668,7 +1668,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, w32->mouse_x = x; w32->mouse_y = y; if (!should_ignore_mouse_event(w32)) - mp_input_set_mouse_pos(w32->input_ctx, x, y); + mp_input_set_mouse_pos(w32->input_ctx, x, y, false); } break; } diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c index f46a34a6b6..207177520b 100644 --- a/video/out/wayland_common.c +++ b/video/out/wayland_common.c @@ -288,8 +288,8 @@ static void pointer_handle_enter(void *data, struct wl_pointer *pointer, wl->mouse_x = handle_round(wl->scaling, wl_fixed_to_int(sx)); wl->mouse_y = handle_round(wl->scaling, wl_fixed_to_int(sy)); - if (!wl->toplevel_configured) - mp_input_set_mouse_pos(wl->vo->input_ctx, wl->mouse_x, wl->mouse_y); + mp_input_set_mouse_pos(wl->vo->input_ctx, wl->mouse_x, wl->mouse_y, + wl->toplevel_configured); wl->toplevel_configured = false; } @@ -310,8 +310,8 @@ static void pointer_handle_motion(void *data, struct wl_pointer *pointer, wl->mouse_x = handle_round(wl->scaling, wl_fixed_to_int(sx)); wl->mouse_y = handle_round(wl->scaling, wl_fixed_to_int(sy)); - if (!wl->toplevel_configured) - mp_input_set_mouse_pos(wl->vo->input_ctx, wl->mouse_x, wl->mouse_y); + mp_input_set_mouse_pos(wl->vo->input_ctx, wl->mouse_x, wl->mouse_y, + wl->toplevel_configured); wl->toplevel_configured = false; } diff --git a/video/out/x11_common.c b/video/out/x11_common.c index c0f9726a05..a3c681a67a 100644 --- a/video/out/x11_common.c +++ b/video/out/x11_common.c @@ -1311,7 +1311,7 @@ void vo_x11_check_events(struct vo *vo) break; case MotionNotify: mp_input_set_mouse_pos(x11->input_ctx, Event.xmotion.x, - Event.xmotion.y); + Event.xmotion.y, false); break; case LeaveNotify: if (Event.xcrossing.mode != NotifyNormal)