From aad12cc6630c50785a89a55ff375cf077fc14161 Mon Sep 17 00:00:00 2001 From: sonninnos Date: Sun, 7 Feb 2021 20:18:04 +0200 Subject: [PATCH] (Windows) Mouse grabbing/clipping with alt-tab --- gfx/common/win32_common.c | 14 ++++++++++++-- input/drivers/dinput.c | 4 ++++ input/drivers/winraw_input.c | 6 ++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index ff1994fac3..09aebef38b 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -1019,7 +1019,12 @@ static LRESULT CALLBACK wnd_proc_common_internal(HWND hwnd, #endif break; case WM_SETFOCUS: - win32_clip_window(input_mouse_grabbed()); + if (input_mouse_grabbed()) + win32_clip_window(true); + break; + case WM_KILLFOCUS: + if (input_mouse_grabbed()) + win32_clip_window(false); break; } @@ -1128,7 +1133,12 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd, #endif break; case WM_SETFOCUS: - win32_clip_window(input_mouse_grabbed()); + if (input_mouse_grabbed()) + win32_clip_window(true); + break; + case WM_KILLFOCUS: + if (input_mouse_grabbed()) + win32_clip_window(false); break; } diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 9eeaeb2c70..1a72e9d265 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -1003,9 +1003,13 @@ static void dinput_grab_mouse(void *data, bool state) IDirectInputDevice8_Unacquire(di->mouse); IDirectInputDevice8_SetCooperativeLevel(di->mouse, (HWND)video_driver_window_get(), +#if 0 state ? (DISCL_EXCLUSIVE | DISCL_FOREGROUND) : (DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)); +#else + (DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)); +#endif IDirectInputDevice8_Acquire(di->mouse); #ifndef _XBOX diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index 5e9f762cc6..5a254526fc 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -228,10 +228,16 @@ static BOOL winraw_set_mouse_input(HWND window, bool grab) { RAWINPUTDEVICE rid; +#if 0 if (window) rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE | RIDEV_NOLEGACY : 0; else rid.dwFlags = RIDEV_REMOVE; +#else + rid.dwFlags = 0; + if (!window) + rid.dwFlags = RIDEV_REMOVE; +#endif rid.hwndTarget = window; rid.usUsagePage = 0x01; /* generic desktop */