From 852eb6bf69558d45ef4c8f58c624e08579a70d09 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Wed, 2 Apr 2025 13:46:55 +1100 Subject: [PATCH] [client] core: new message event system to debounce window size events --- client/CMakeLists.txt | 1 + client/src/core.c | 50 +++++++++++++++++++++++++++---------------- client/src/core.h | 1 + client/src/main.c | 6 ++++++ 4 files changed, 39 insertions(+), 19 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 084ec55b..5ff2c9eb 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -113,6 +113,7 @@ set(SOURCES src/main.c src/core.c src/app.c + src/message.c src/audio.c src/config.c src/keybind.c diff --git a/client/src/core.c b/client/src/core.c index fa38b97d..13eaa284 100644 --- a/client/src/core.c +++ b/client/src/core.c @@ -23,6 +23,8 @@ #include "app.h" #include "util.h" #include "kb.h" +#include "message.h" +#include "message.h" #include "common/time.h" #include "common/debug.h" @@ -188,29 +190,39 @@ bool core_warpPointer(int x, int y, bool exiting) return true; } +void core_onWindowSizeChanged(unsigned width, unsigned height) +{ + if (!g_state.pointerQueue) + return; + + const KVMFRWindowSize msg = + { + .msg.type = KVMFR_MESSAGE_WINDOWSIZE, + .w = g_state.windowW, + .h = g_state.windowH + }; + + uint32_t serial; + LGMP_STATUS status; + if ((status = lgmpClientSendData(g_state.pointerQueue, + &msg, sizeof(msg), &serial)) != LGMP_OK) + DEBUG_WARN("Message send failed: %s", lgmpStatusString(status)); +} + void core_updatePositionInfo(void) { - if (g_state.pointerQueue && - g_state.kvmfrFeatures & KVMFR_FEATURE_WINDOWSIZE) + if (g_state.kvmfrFeatures & KVMFR_FEATURE_WINDOWSIZE) { - static unsigned lastW = 0, lastH = 0; - if (lastW != g_state.windowW || lastH != g_state.windowH) + LGMsg msg = { - lastW = g_state.windowW; - lastH = g_state.windowH; - - const KVMFRWindowSize msg = { - .msg.type = KVMFR_MESSAGE_WINDOWSIZE, - .w = g_state.windowW, - .h = g_state.windowH - }; - - uint32_t serial; - LGMP_STATUS status; - if ((status = lgmpClientSendData(g_state.pointerQueue, - &msg, sizeof(msg), &serial)) != LGMP_OK) - DEBUG_WARN("Message send failed: %s", lgmpStatusString(status)); - } + .type = LG_MSG_WINDOWSIZE, + .windowSize = + { + .width = g_state.windowW, + .height = g_state.windowH + } + }; + lgMessage_post(&msg); } if (!g_state.haveSrcSize) diff --git a/client/src/core.h b/client/src/core.h index fd01f22b..f0f9ec96 100644 --- a/client/src/core.h +++ b/client/src/core.h @@ -29,6 +29,7 @@ void core_setCursorInView(bool enable); void core_setGrab(bool enable); void core_setGrabQuiet(bool enable); bool core_warpPointer(int x, int y, bool exiting); +void core_onWindowSizeChanged(unsigned width, unsigned height); void core_updatePositionInfo(void); void core_alignToGuest(void); bool core_isValidPointerPos(int x, int y); diff --git a/client/src/main.c b/client/src/main.c index d7bf16e1..21ec248e 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -52,6 +52,7 @@ #include "common/cpuinfo.h" #include "common/ll.h" +#include "message.h" #include "core.h" #include "app.h" #include "audio.h" @@ -1756,6 +1757,7 @@ restart: g_state.state = APP_STATE_RESTART; break; } + lgMessage_process(); g_state.ds->wait(100); } @@ -1872,6 +1874,9 @@ int main(int argc, char * argv[]) egl_dynProcsInit(); gl_dynProcsInit(); + if (!lgMessage_init()) + return -1; + g_state.bindings = ll_new(); g_state.overlays = ll_new(); @@ -1902,6 +1907,7 @@ int main(int argc, char * argv[]) const int ret = lg_run(); lg_shutdown(); + lgMessage_deinit(); config_free();