From 94446ab4889e7b2601f44d2be8ca178c7593f54d Mon Sep 17 00:00:00 2001 From: sonninnos Date: Mon, 1 Feb 2021 23:22:34 +0200 Subject: [PATCH 1/2] (WINRAW) Prevent outside window mouse clicks when grabbed --- input/drivers/winraw_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index 834d0775a7..15be0fb777 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -225,7 +225,7 @@ static BOOL winraw_set_mouse_input(HWND window, bool grab) RAWINPUTDEVICE rid; if (window) - rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE : 0; + rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE | RIDEV_NOLEGACY : 0; else rid.dwFlags = RIDEV_REMOVE; From e39ade0f059f0560bc433c4001a534421226188e Mon Sep 17 00:00:00 2001 From: sonninnos Date: Tue, 2 Feb 2021 00:52:03 +0200 Subject: [PATCH 2/2] (WIN32) Cursor clipping for grabbed mouse --- gfx/common/win32_common.c | 30 ++++++++++++++++++++++++++++++ gfx/common/win32_common.h | 2 ++ input/drivers/dinput.c | 4 ++++ input/drivers/winraw_input.c | 16 ++++++++++++---- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index 74b0a8375c..ff1994fac3 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -1018,6 +1018,9 @@ static LRESULT CALLBACK wnd_proc_common_internal(HWND hwnd, taskbar_is_created = true; #endif break; + case WM_SETFOCUS: + win32_clip_window(input_mouse_grabbed()); + break; } return DefWindowProc(hwnd, message, wparam, lparam); @@ -1124,6 +1127,9 @@ static LRESULT CALLBACK wnd_proc_common_dinput_internal(HWND hwnd, taskbar_is_created = true; #endif break; + case WM_SETFOCUS: + win32_clip_window(input_mouse_grabbed()); + break; } return DefWindowProc(hwnd, message, wparam, lparam); @@ -1531,6 +1537,30 @@ void win32_check_window(void *data, #endif } +void win32_clip_window(bool state) +{ +#if !defined(_XBOX) + RECT clip_rect; + + if (state && main_window.hwnd) + { + PWINDOWINFO info; + info = malloc(sizeof(*info)); + info->cbSize = sizeof(PWINDOWINFO); + + if (GetWindowInfo(main_window.hwnd, info)) + clip_rect = info->rcClient; + + free(info); + info = NULL; + } + else + GetWindowRect(GetDesktopWindow(), &clip_rect); + + ClipCursor(&clip_rect); +#endif +} + bool win32_suppress_screensaver(void *data, bool enable) { #if !defined(_XBOX) diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index e018e4d4b2..e2944ee5e7 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -98,6 +98,8 @@ HWND win32_get_window(void); bool win32_has_focus(void *data); +void win32_clip_window(bool grab); + void win32_check_window(void *data, bool *quit, bool *resize, unsigned *width, unsigned *height); diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index 8b9d51b81f..9eeaeb2c70 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -1007,6 +1007,10 @@ static void dinput_grab_mouse(void *data, bool state) (DISCL_EXCLUSIVE | DISCL_FOREGROUND) : (DISCL_NONEXCLUSIVE | DISCL_FOREGROUND)); IDirectInputDevice8_Acquire(di->mouse); + +#ifndef _XBOX + win32_clip_window(state); +#endif } static uint64_t dinput_get_capabilities(void *data) diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index 15be0fb777..5e9f762cc6 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -25,6 +25,10 @@ extern "C" { } #endif +#ifndef _XBOX +#include "../../gfx/common/win32_common.h" +#endif + #include "../input_keymaps.h" #include "../../configuration.h" @@ -874,17 +878,21 @@ static uint64_t winraw_get_capabilities(void *u) (1 << RETRO_DEVICE_LIGHTGUN); } -static void winraw_grab_mouse(void *d, bool grab) +static void winraw_grab_mouse(void *d, bool state) { winraw_input_t *wr = (winraw_input_t*)d; - if (grab == wr->mouse_grab) + if (state == wr->mouse_grab) return; - if (!winraw_set_mouse_input(wr->window, grab)) + if (!winraw_set_mouse_input(wr->window, state)) return; - wr->mouse_grab = grab; + wr->mouse_grab = state; + +#ifndef _XBOX + win32_clip_window(state); +#endif } input_driver_t input_winraw = {