diff options
author | Michael Smith <mikesmiffy128@gmail.com> | 2022-03-21 20:02:56 +0000 |
---|---|---|
committer | Michael Smith <mikesmiffy128@gmail.com> | 2022-03-21 20:02:56 +0000 |
commit | 437b9952b29ba42dbb1036b29fb431a635b05a60 (patch) | |
tree | 7c754dd71ff75c14d66064a211bb547f52cfd93f | |
parent | 0eee6827c4764cca1e807744eb486d60f7c2113a (diff) |
Remove useless raw input multithreading
Turns out creating the input window on the main thread means it actually
gets events from the game's event loop on the main thread which means we
don't have to do our own event loop at all and in fact doing so is kind
of broken and causes thread lockups and leaks and other such nonsense.
-rw-r--r-- | src/rinput.c | 27 |
1 files changed, 3 insertions, 24 deletions
diff --git a/src/rinput.c b/src/rinput.c index 1929aee..170fd3e 100644 --- a/src/rinput.c +++ b/src/rinput.c @@ -38,7 +38,7 @@ #define USAGEPAGE_MOUSE 1 #define USAGE_MOUSE 2 -static volatile long dx = 0, dy = 0; +static long dx = 0, dy = 0; static void *inwin; DEF_CVAR_UNREG(m_rawinput, "Use Raw Input for mouse input (SST reimplementation)", @@ -53,14 +53,8 @@ static ssize __stdcall inproc(void *wnd, uint msg, ssize wp, ssize lp) { sizeof(RAWINPUTHEADER)) != -1) { RAWINPUT *ri = (RAWINPUT *)buf; if (ri->header.dwType == RIM_TYPEMOUSE) { - // NOTE: I can't tell if RInput has been really slightly - // wrong for years or if there's actually a really subtle - // reason why an atomic/memory-fenced add is unnecessary for - // synchronisation but I'd rather err on the side of being - // really pedantic and careful for totally accurate mouse - // input, at *presumably* no noticeable performance cost. - InterlockedAdd(&dx, ri->data.mouse.lLastX); - InterlockedAdd(&dy, ri->data.mouse.lLastY); + dx += ri->data.mouse.lLastX; + dy += ri->data.mouse.lLastY; } } return 0; @@ -71,14 +65,6 @@ static ssize __stdcall inproc(void *wnd, uint msg, ssize wp, ssize lp) { return DefWindowProc(wnd, msg, wp, lp); } -static ulong __stdcall threadmain(void *unused) { - MSG m; - // XXX: ignoring errors, in theory could spin? in practice rinput does this - // too and it's probably fine lol - while (GetMessageW(&m, inwin, 0, 0)) DispatchMessage(&m); - return 0; -} - typedef int (*__stdcall GetCursorPos_func)(POINT *p); static GetCursorPos_func orig_GetCursorPos; static int __stdcall hook_GetCursorPos(POINT *p) { @@ -131,7 +117,6 @@ bool rinput_init(void) { con_warn(ERR "couldn't hook SetCursorPos\n"); goto e1; } - inwin = CreateWindowExW(0, L"RInput", L"RInput", 0, 0, 0, 0, 0, 0, 0, 0, 0); if (!inwin) { con_warn(ERR " couldn't create input window\n"); @@ -146,16 +131,10 @@ bool rinput_init(void) { con_warn(ERR " couldn't create raw mouse device\n"); goto e3; } - if (!CreateThread(0, 8192, &threadmain, 0, 0, 0)) { - con_warn(ERR " couldn't create thread\n"); - goto e4; - } m_rawinput->base.flags &= ~CON_HIDDEN; return true; -e4: rd.dwFlags |= RIDEV_REMOVE; rd.hwndTarget = 0; - RegisterRawInputDevices(&rd, 1, sizeof(rd)); e3: DestroyWindow(inwin); e2: unhook_inline((void *)orig_SetCursorPos); e1: unhook_inline((void *)orig_GetCursorPos); |