Win32: Fix handling of local absolute raw motion

The implementation for how to handle absolute raw motion remotely is
just how to handle absolute raw motion, period.
This commit is contained in:
Camilla Löwy 2024-02-07 00:59:58 +01:00
parent 275b92f887
commit d93868bcf3
3 changed files with 18 additions and 33 deletions

View File

@ -698,9 +698,6 @@ int _glfwInitWin32(void)
if (!createHelperWindow()) if (!createHelperWindow())
return GLFW_FALSE; return GLFW_FALSE;
// Check if the current process was started via Remote Desktop
_glfw.win32.isRemoteSession = GetSystemMetrics(SM_REMOTESESSION) > 0;
_glfwPollMonitorsWin32(); _glfwPollMonitorsWin32();
return GLFW_TRUE; return GLFW_TRUE;
} }

View File

@ -458,8 +458,6 @@ typedef struct _GLFWlibraryWin32
RAWINPUT* rawInput; RAWINPUT* rawInput;
int rawInputSize; int rawInputSize;
UINT mouseTrailSize; UINT mouseTrailSize;
// Indicate if the process was started behind Remote Destop
BOOL isRemoteSession;
// The cursor handle to use to hide the cursor (NULL or a transparent cursor) // The cursor handle to use to hide the cursor (NULL or a transparent cursor)
HCURSOR blankCursor; HCURSOR blankCursor;

View File

@ -929,38 +929,28 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
data = _glfw.win32.rawInput; data = _glfw.win32.rawInput;
if (data->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE) if (data->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE)
{ {
if (_glfw.win32.isRemoteSession) POINT pos = {0};
int width, height;
if (data->data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP)
{ {
// NOTE: According to DirectXTK, when running via Remote Desktop, raw pos.x += GetSystemMetrics(SM_XVIRTUALSCREEN);
// mouse motion is provided as MOUSE_MOVE_ABSOLUTE and pos.y += GetSystemMetrics(SM_YVIRTUALSCREEN);
// MOUSE_VIRTUAL_DESKTOP. width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int width, height;
if (data->data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP)
{
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
}
else
{
width = GetSystemMetrics(SM_CXSCREEN);
height = GetSystemMetrics(SM_CYSCREEN);
}
POINT pos;
pos.x = (int) ((data->data.mouse.lLastX / 65535.f) * width);
pos.y = (int) ((data->data.mouse.lLastY / 65535.f) * height);
ScreenToClient(window->win32.handle, &pos);
dx = pos.x - window->win32.lastCursorPosX;
dy = pos.y - window->win32.lastCursorPosY;
} }
else else
{ {
dx = data->data.mouse.lLastX - window->win32.lastCursorPosX; width = GetSystemMetrics(SM_CXSCREEN);
dy = data->data.mouse.lLastY - window->win32.lastCursorPosY; height = GetSystemMetrics(SM_CYSCREEN);
} }
pos.x += (int) ((data->data.mouse.lLastX / 65535.f) * width);
pos.y += (int) ((data->data.mouse.lLastY / 65535.f) * height);
ScreenToClient(window->win32.handle, &pos);
dx = pos.x - window->win32.lastCursorPosX;
dy = pos.y - window->win32.lastCursorPosY;
} }
else else
{ {
@ -1324,7 +1314,7 @@ static int createNativeWindow(_GLFWwindow* window,
} }
} }
if (_glfw.win32.isRemoteSession) if (GetSystemMetrics(SM_REMOTESESSION))
{ {
// NOTE: On Remote Desktop, setting the cursor to NULL does not hide it // NOTE: On Remote Desktop, setting the cursor to NULL does not hide it
// HACK: Create a transparent cursor and always set that instead of NULL // HACK: Create a transparent cursor and always set that instead of NULL