mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2025-12-12 11:02:51 +00:00
Updated DirectX mouse buttons handling (#382)
- mouse clicks registered even when the game doesn't have focus - generally, `SDL_GetMouseState()` and `SDL_GetRelativeMouseState()` functions will not work with the `DXGI` backend, so that's why custom logic exists in `"src/pc/controller/controller_mouse.c"` - fixing this issue required adding explicit checks for `(GetFocus() == game_window)` - mouse clicks being registered immediatelly once the window receives focus - added a check to match the logic of the "SDL2 / OpenGL" version: 1st mouse click only activates the focus, then any following mouse buttons are processed as usual - detecting whether the primary and secondary mouse buttons were swapped - `GetKeyState()` seems to work better than `GetAsyncKeyState()` because it does not require extra conditional statement like `(GetSystemMetrics(SM_SWAPBUTTON) != FALSE)`, and also from testing it seems the game will not receive an input when user clicks away to choose a different window
This commit is contained in:
parent
947ce9f080
commit
f81919ca23
1 changed files with 44 additions and 10 deletions
|
|
@ -23,17 +23,49 @@ s32 mouse_window_y;
|
||||||
|
|
||||||
bool mouse_relative_enabled;
|
bool mouse_relative_enabled;
|
||||||
|
|
||||||
|
#ifdef WAPI_DXGI
|
||||||
|
u32 mouse_relative_buttons_held_on_focus;
|
||||||
|
u32 mouse_window_buttons_held_on_focus;
|
||||||
|
bool mouse_dxgi_prev_focus;
|
||||||
|
|
||||||
|
static u32 controller_mouse_dxgi_button_state(u32* mouse_held, bool has_focus) {
|
||||||
|
u32 mouse =
|
||||||
|
((GetKeyState(VK_LBUTTON) < 0) ? (1 << 0) : 0) |
|
||||||
|
((GetKeyState(VK_MBUTTON) < 0) ? (1 << 1) : 0) |
|
||||||
|
((GetKeyState(VK_RBUTTON) < 0) ? (1 << 2) : 0);
|
||||||
|
|
||||||
|
bool prev_focus = mouse_dxgi_prev_focus;
|
||||||
|
mouse_dxgi_prev_focus = has_focus;
|
||||||
|
|
||||||
|
// Ignore mouse clicks when game window doesn't have focus.
|
||||||
|
if (!has_focus) { return 0; }
|
||||||
|
if (mouse_held == NULL) { return mouse; }
|
||||||
|
|
||||||
|
// Window just received input focus, ignore any held down mouse buttons.
|
||||||
|
if (!prev_focus && has_focus) {
|
||||||
|
*mouse_held = mouse;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for a mouse button held down (e.g. while clicking on the window)
|
||||||
|
// to be released and pressed again.
|
||||||
|
*mouse_held = (*mouse_held) & mouse;
|
||||||
|
return ~(*mouse_held) & mouse;
|
||||||
|
}
|
||||||
|
#endif // WAPI_DXGI
|
||||||
|
|
||||||
void controller_mouse_read_window(void) {
|
void controller_mouse_read_window(void) {
|
||||||
if (!mouse_init_ok) { return; }
|
if (!mouse_init_ok) { return; }
|
||||||
|
|
||||||
#if defined(WAPI_DXGI)
|
#if defined(WAPI_DXGI)
|
||||||
mouse_window_buttons =
|
HWND game_window = gfx_dxgi_get_h_wnd();
|
||||||
(GetAsyncKeyState(VK_LBUTTON) ? (1 << 0) : 0) |
|
|
||||||
(GetAsyncKeyState(VK_MBUTTON) ? (1 << 1) : 0) |
|
mouse_window_buttons = controller_mouse_dxgi_button_state(
|
||||||
(GetAsyncKeyState(VK_RBUTTON) ? (1 << 2) : 0);
|
&mouse_window_buttons_held_on_focus,
|
||||||
|
GetFocus() == game_window);
|
||||||
|
|
||||||
POINT p;
|
POINT p;
|
||||||
if (GetCursorPos(&p) && ScreenToClient(gfx_dxgi_get_h_wnd(), &p)) {
|
if (GetCursorPos(&p) && ScreenToClient(game_window, &p)) {
|
||||||
mouse_window_x = p.x;
|
mouse_window_x = p.x;
|
||||||
mouse_window_y = p.y;
|
mouse_window_y = p.y;
|
||||||
}
|
}
|
||||||
|
|
@ -46,16 +78,18 @@ void controller_mouse_read_relative(void) {
|
||||||
if (!mouse_init_ok) { return; }
|
if (!mouse_init_ok) { return; }
|
||||||
|
|
||||||
#if defined(WAPI_DXGI)
|
#if defined(WAPI_DXGI)
|
||||||
mouse_buttons =
|
HWND game_window = gfx_dxgi_get_h_wnd();
|
||||||
(GetAsyncKeyState(VK_LBUTTON) ? (1 << 0) : 0) |
|
|
||||||
(GetAsyncKeyState(VK_MBUTTON) ? (1 << 1) : 0) |
|
// Always get the buttons state, regardless if the relative mode is enabled.
|
||||||
(GetAsyncKeyState(VK_RBUTTON) ? (1 << 2) : 0);
|
mouse_buttons = controller_mouse_dxgi_button_state(
|
||||||
|
&mouse_relative_buttons_held_on_focus,
|
||||||
|
GetFocus() == game_window);
|
||||||
|
|
||||||
if (mouse_relative_enabled) {
|
if (mouse_relative_enabled) {
|
||||||
static POINT p0;
|
static POINT p0;
|
||||||
POINT p1;
|
POINT p1;
|
||||||
RECT rect;
|
RECT rect;
|
||||||
if (GetWindowRect(gfx_dxgi_get_h_wnd(), &rect) && GetCursorPos(&p1)) {
|
if (GetWindowRect(game_window, &rect) && GetCursorPos(&p1)) {
|
||||||
mouse_x = p1.x - p0.x;
|
mouse_x = p1.x - p0.x;
|
||||||
mouse_y = p1.y - p0.y;
|
mouse_y = p1.y - p0.y;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue