mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2025-07-04 00:36:36 +00:00
Use SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH to get click events on focus gain
This commit is contained in:
parent
400754c5b3
commit
8cc61ca8b8
@ -36,6 +36,12 @@ SdlInputHandler::SdlInputHandler(StreamingPreferences& prefs, NvComputer*, int s
|
|||||||
prefs.absoluteMouseMode ? "1" : "0",
|
prefs.absoluteMouseMode ? "1" : "0",
|
||||||
SDL_HINT_OVERRIDE);
|
SDL_HINT_OVERRIDE);
|
||||||
|
|
||||||
|
// Allow clicks to pass through to us when focusing the window. If we're in
|
||||||
|
// absolute mouse mode, this will avoid the user having to click twice to
|
||||||
|
// trigger a click on the host if the Moonlight window is not focused. In
|
||||||
|
// relative mode, the click event will trigger the mouse to be recaptured.
|
||||||
|
SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1");
|
||||||
|
|
||||||
#if defined(Q_OS_DARWIN) && !SDL_VERSION_ATLEAST(2, 0, 10)
|
#if defined(Q_OS_DARWIN) && !SDL_VERSION_ATLEAST(2, 0, 10)
|
||||||
// SDL 2.0.9 on macOS has a broken HIDAPI mapping for the older Xbox One S
|
// SDL 2.0.9 on macOS has a broken HIDAPI mapping for the older Xbox One S
|
||||||
// firmware, so we have to disable HIDAPI for Xbox gamepads on macOS until
|
// firmware, so we have to disable HIDAPI for Xbox gamepads on macOS until
|
||||||
@ -186,34 +192,6 @@ void SdlInputHandler::raiseAllKeys()
|
|||||||
m_KeysDown.clear();
|
m_KeysDown.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SdlInputHandler::notifyFocusGained()
|
|
||||||
{
|
|
||||||
// Capture mouse cursor when user actives the window by clicking on
|
|
||||||
// window's client area (borders and title bar excluded).
|
|
||||||
// Without this you would have to click the window twice (once to
|
|
||||||
// activate it, second time to enable capture). With this you need to
|
|
||||||
// click it only once.
|
|
||||||
//
|
|
||||||
// On Linux, the button press event is delivered after the focus gain
|
|
||||||
// so this is not neccessary (and leads to a click sent to the host
|
|
||||||
// when focusing the window by clicking).
|
|
||||||
//
|
|
||||||
// By excluding window's borders and title bar out, lets user still
|
|
||||||
// interact with them without mouse capture kicking in.
|
|
||||||
#if defined(Q_OS_WIN32) || defined(Q_OS_DARWIN)
|
|
||||||
int mouseX, mouseY;
|
|
||||||
Uint32 mouseState = SDL_GetGlobalMouseState(&mouseX, &mouseY);
|
|
||||||
if (mouseState & SDL_BUTTON(SDL_BUTTON_LEFT)) {
|
|
||||||
int x, y, width, height;
|
|
||||||
SDL_GetWindowPosition(m_Window, &x, &y);
|
|
||||||
SDL_GetWindowSize(m_Window, &width, &height);
|
|
||||||
if (mouseX > x && mouseX < x+width && mouseY > y && mouseY < y+height) {
|
|
||||||
setCaptureActive(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void SdlInputHandler::notifyFocusLost()
|
void SdlInputHandler::notifyFocusLost()
|
||||||
{
|
{
|
||||||
// Release mouse cursor when another window is activated (e.g. by using ALT+TAB).
|
// Release mouse cursor when another window is activated (e.g. by using ALT+TAB).
|
||||||
|
@ -69,8 +69,6 @@ public:
|
|||||||
|
|
||||||
void raiseAllKeys();
|
void raiseAllKeys();
|
||||||
|
|
||||||
void notifyFocusGained();
|
|
||||||
|
|
||||||
void notifyFocusLost();
|
void notifyFocusLost();
|
||||||
|
|
||||||
bool isCaptureActive();
|
bool isCaptureActive();
|
||||||
|
@ -1218,10 +1218,7 @@ void Session::exec(int displayOriginX, int displayOriginY)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SDL_WINDOWEVENT:
|
case SDL_WINDOWEVENT:
|
||||||
if (event.window.event == SDL_WINDOWEVENT_FOCUS_GAINED) {
|
if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) {
|
||||||
m_InputHandler->notifyFocusGained();
|
|
||||||
}
|
|
||||||
else if (event.window.event == SDL_WINDOWEVENT_FOCUS_LOST) {
|
|
||||||
m_InputHandler->notifyFocusLost();
|
m_InputHandler->notifyFocusLost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user