summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMichael Smith <mikesmiffy128@gmail.com>2022-03-21 20:02:56 +0000
committerMichael Smith <mikesmiffy128@gmail.com>2022-03-21 20:02:56 +0000
commit437b9952b29ba42dbb1036b29fb431a635b05a60 (patch)
tree7c754dd71ff75c14d66064a211bb547f52cfd93f
parent0eee6827c4764cca1e807744eb486d60f7c2113a (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.c27
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);