summaryrefslogtreecommitdiff
path: root/src/rinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rinput.c')
-rw-r--r--src/rinput.c46
1 files changed, 21 insertions, 25 deletions
diff --git a/src/rinput.c b/src/rinput.c
index a7ed1a4..8d3a6d9 100644
--- a/src/rinput.c
+++ b/src/rinput.c
@@ -91,27 +91,24 @@ static ssize __stdcall inproc(void *wnd, uint msg, usize wp, ssize lp) {
typedef int (*__stdcall GetCursorPos_func)(POINT *p);
typedef uint (*VCALLCONV GetRawMouseAccumulators_func)(void *, int *, int *);
-static union { // more cheeky space saving
- GetCursorPos_func orig_GetCursorPos;
- GetRawMouseAccumulators_func orig_GetRawMouseAccumulators;
-} u2;
-#define orig_GetCursorPos u2.orig_GetCursorPos
-#define orig_GetRawMouseAccumulators u2.orig_GetRawMouseAccumulators
-
-static int __stdcall hook_GetCursorPos(POINT *p) {
+DEF_INLINE_HOOK(GetCursorPos_func, GetCursorPos)
+DEF_VTABLE_HOOK(GetRawMouseAccumulators_func, GetRawMouseAccumulators)
+
+static int __stdcall hookdest_GetCursorPos(POINT *p) {
if (!con_getvari(m_rawinput)) return orig_GetCursorPos(p);
p->x = cx; p->y = cy;
return 1;
}
typedef int (*__stdcall SetCursorPos_func)(int x, int y);
-static SetCursorPos_func orig_SetCursorPos = 0;
-static int __stdcall hook_SetCursorPos(int x, int y) {
+DEF_INLINE_HOOK(SetCursorPos_func, SetCursorPos)
+static int __stdcall hookdest_SetCursorPos(int x, int y) {
cx = x; cy = y;
return orig_SetCursorPos(x, y);
}
-static uint VCALLCONV hook_GetRawMouseAccumulators(void *this, int *x, int *y) {
+static uint VCALLCONV hookdest_GetRawMouseAccumulators(void *this,
+ int *x, int *y) {
int dx, dy;
uint ret = orig_GetRawMouseAccumulators(this, &dx, &dy);
int d = con_getvari(sst_mouse_factor);
@@ -135,9 +132,8 @@ INIT {
errmsg_errorx("couldn't make virtual table writable");
return FEAT_FAIL;
}
- orig_GetRawMouseAccumulators = (GetRawMouseAccumulators_func)hook_vtable(
- vtable_insys, vtidx_GetRawMouseAccumulators,
- (void *)&hook_GetRawMouseAccumulators);
+ hook_GetRawMouseAccumulators(vtable_insys, vtidx_GetRawMouseAccumulators,
+ &hookdest_GetRawMouseAccumulators);
}
else {
// create cvar hidden so config is still preserved if we fail to init
@@ -181,11 +177,11 @@ INIT {
}
int err;
- struct hook_inline_featsetup_ret h1 = hook_inline_featsetup(
- (void *)GetCursorPos, (void **)&orig_GetCursorPos, "GetCursorPos");
+ struct hook_featsetup_ret_GetCursorPos h1 =
+ hook_featsetup_GetCursorPos(&GetCursorPos);
if_cold (err = h1.err) goto e0;
- struct hook_inline_featsetup_ret h2 = hook_inline_featsetup(
- (void *)SetCursorPos, (void **)&orig_SetCursorPos, "SetCursorPos");
+ struct hook_featsetup_ret_SetCursorPos h2 =
+ hook_featsetup_SetCursorPos(&SetCursorPos);
if_cold (err = h2.err) goto e0;
inwin = CreateWindowExW(0, L"RInput", L"RInput", 0, 0, 0, 0, 0, 0, 0, 0, 0);
if_cold (!inwin) {
@@ -202,8 +198,8 @@ INIT {
err = FEAT_FAIL;
goto e1;
}
- hook_inline_commit(h1.prologue, (void *)&hook_GetCursorPos);
- hook_inline_commit(h2.prologue, (void *)&hook_SetCursorPos);
+ hook_commit_GetCursorPos(h1.hookpos, &hookdest_GetCursorPos);
+ hook_commit_SetCursorPos(h2.hookpos, &hookdest_SetCursorPos);
ok: // XXX: this is a little tricky and a little clunky. we have registered
// m_rawinput above but sst_mouse_factor will get auto-registered after init
@@ -218,7 +214,7 @@ e0: UnregisterClassW(L"RInput", 0);
}
END {
- if_hot (orig_SetCursorPos) { // we inited our own implementation
+ if_hot (inwin) { // we inited our own implementation
RAWINPUTDEVICE rd = {
.dwFlags = RIDEV_REMOVE,
.hwndTarget = 0,
@@ -229,13 +225,13 @@ END {
DestroyWindow(inwin);
if_hot (!sst_userunloaded) return;
UnregisterClassW(L"RInput", 0);
- unhook_inline((void *)orig_GetCursorPos);
- unhook_inline((void *)orig_SetCursorPos);
+ unhook_SetCursorPos();
+ unhook_GetCursorPos();
}
else if_cold (sst_userunloaded) {
// we must have hooked the *existing* implementation
- unhook_vtable(vtable_insys, vtidx_GetRawMouseAccumulators,
- (void *)orig_GetRawMouseAccumulators);
+ unhook_GetRawMouseAccumulators(vtable_insys,
+ vtidx_GetRawMouseAccumulators);
}
}