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 834d0775a7..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" @@ -225,7 +229,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; @@ -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 = {