From 4073a6b92362d8096f57cd3744fcf8f34ee27d84 Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Fri, 31 May 2024 15:10:39 +0900 Subject: [PATCH] cursor: rate-limit resize events respecting monitor's refresh rate This fixes the lag when resizing windows of some apps on XWayland (e.g. Chromium and Steam). --- src/input/cursor.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/input/cursor.c b/src/input/cursor.c index e5a214b7..4c0015d3 100644 --- a/src/input/cursor.c +++ b/src/input/cursor.c @@ -248,6 +248,28 @@ process_cursor_move(struct server *server, uint32_t time) static void process_cursor_resize(struct server *server, uint32_t time) { + /* Rate-limit resize events respecting monitor refresh rate */ + static uint32_t last_resize_time = 0; + static struct view *last_resize_view = NULL; + + if (server->grabbed_view == last_resize_view) { + int32_t refresh = 0; + if (output_is_usable(last_resize_view->output)) { + refresh = last_resize_view->output->wlr_output->refresh; + } + /* Limit to 250Hz if refresh rate is not available */ + if (refresh <= 0) { + refresh = 250000; + } + /* Not caring overflow, but it won't be observable */ + if (time - last_resize_time < 1000000 / (uint32_t)refresh) { + return; + } + } + + last_resize_time = time; + last_resize_view = server->grabbed_view; + double dx = server->seat.cursor->x - server->grab_x; double dy = server->seat.cursor->y - server->grab_y; -- 2.52.0