XInput2: Handle mouse centering hotkey.
This commit is contained in:
parent
d57d04bb04
commit
e0870166ef
|
@ -15,6 +15,8 @@
|
||||||
|
|
||||||
#include "Common/StringUtil.h"
|
#include "Common/StringUtil.h"
|
||||||
|
|
||||||
|
#include "Core/Host.h"
|
||||||
|
|
||||||
// This is an input plugin using the XInput 2.0 extension to the X11 protocol,
|
// This is an input plugin using the XInput 2.0 extension to the X11 protocol,
|
||||||
// loosely based on the old XLib plugin. (Has nothing to do with the XInput
|
// loosely based on the old XLib plugin. (Has nothing to do with the XInput
|
||||||
// API on Windows.)
|
// API on Windows.)
|
||||||
|
@ -209,30 +211,44 @@ KeyboardMouse::~KeyboardMouse()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the mouse cursor controls
|
// Update the mouse cursor controls
|
||||||
void KeyboardMouse::UpdateCursor()
|
void KeyboardMouse::UpdateCursor(bool should_center_mouse)
|
||||||
{
|
{
|
||||||
double root_x, root_y, win_x, win_y;
|
double root_x, root_y, win_x, win_y;
|
||||||
Window root, child;
|
Window root, child;
|
||||||
|
|
||||||
// unused-- we're not interested in button presses here, as those are
|
|
||||||
// updated using events
|
|
||||||
XIButtonState button_state;
|
|
||||||
XIModifierState mods;
|
|
||||||
XIGroupState group;
|
|
||||||
|
|
||||||
XIQueryPointer(m_display, pointer_deviceid, m_window, &root, &child, &root_x, &root_y, &win_x,
|
|
||||||
&win_y, &button_state, &mods, &group);
|
|
||||||
|
|
||||||
free(button_state.mask);
|
|
||||||
|
|
||||||
XWindowAttributes win_attribs;
|
XWindowAttributes win_attribs;
|
||||||
XGetWindowAttributes(m_display, m_window, &win_attribs);
|
XGetWindowAttributes(m_display, m_window, &win_attribs);
|
||||||
|
const auto win_width = std::max(win_attribs.width, 1);
|
||||||
|
const auto win_height = std::max(win_attribs.height, 1);
|
||||||
|
|
||||||
|
if (should_center_mouse)
|
||||||
|
{
|
||||||
|
win_x = win_width / 2;
|
||||||
|
win_y = win_height / 2;
|
||||||
|
|
||||||
|
XIWarpPointer(m_display, pointer_deviceid, None, m_window, 0.0, 0.0, 0, 0, win_x, win_y);
|
||||||
|
|
||||||
|
g_controller_interface.SetMouseCenteringRequested(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// unused-- we're not interested in button presses here, as those are
|
||||||
|
// updated using events
|
||||||
|
XIButtonState button_state;
|
||||||
|
XIModifierState mods;
|
||||||
|
XIGroupState group;
|
||||||
|
|
||||||
|
XIQueryPointer(m_display, pointer_deviceid, m_window, &root, &child, &root_x, &root_y, &win_x,
|
||||||
|
&win_y, &button_state, &mods, &group);
|
||||||
|
|
||||||
|
free(button_state.mask);
|
||||||
|
}
|
||||||
|
|
||||||
const auto window_scale = g_controller_interface.GetWindowInputScale();
|
const auto window_scale = g_controller_interface.GetWindowInputScale();
|
||||||
|
|
||||||
// the mouse position as a range from -1 to 1
|
// the mouse position as a range from -1 to 1
|
||||||
m_state.cursor.x = (win_x / std::max(win_attribs.width, 1) * 2 - 1) * window_scale.x;
|
m_state.cursor.x = (win_x / win_width * 2 - 1) * window_scale.x;
|
||||||
m_state.cursor.y = (win_y / std::max(win_attribs.height, 1) * 2 - 1) * window_scale.y;
|
m_state.cursor.y = (win_y / win_height * 2 - 1) * window_scale.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KeyboardMouse::UpdateInput()
|
void KeyboardMouse::UpdateInput()
|
||||||
|
@ -318,8 +334,10 @@ void KeyboardMouse::UpdateInput()
|
||||||
m_state.axis.y /= MOUSE_AXIS_SMOOTHING + 1.0f;
|
m_state.axis.y /= MOUSE_AXIS_SMOOTHING + 1.0f;
|
||||||
|
|
||||||
// Get the absolute position of the mouse pointer
|
// Get the absolute position of the mouse pointer
|
||||||
if (mouse_moved)
|
const bool should_center_mouse =
|
||||||
UpdateCursor();
|
g_controller_interface.IsMouseCenteringRequested() && Host_RendererHasFocus();
|
||||||
|
if (mouse_moved || should_center_mouse)
|
||||||
|
UpdateCursor(should_center_mouse);
|
||||||
|
|
||||||
// KeyRelease and FocusOut events are sometimes not received.
|
// KeyRelease and FocusOut events are sometimes not received.
|
||||||
// Cycling Alt-Tab and landing on the same window results in a stuck "Alt" key.
|
// Cycling Alt-Tab and landing on the same window results in a stuck "Alt" key.
|
||||||
|
|
|
@ -108,7 +108,7 @@ private:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void SelectEventsForDevice(XIEventMask* mask, int deviceid);
|
void SelectEventsForDevice(XIEventMask* mask, int deviceid);
|
||||||
void UpdateCursor();
|
void UpdateCursor(bool should_center_mouse);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void UpdateInput() override;
|
void UpdateInput() override;
|
||||||
|
|
Loading…
Reference in New Issue