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.
master
Camilla Löwy ago%!(EXTRA string=1 year)
parent 275b92f887
commit d93868bcf3
  1. 3
      src/win32_init.c
  2. 2
      src/win32_platform.h
  3. 46
      src/win32_window.c

@ -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;
} }

@ -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;

@ -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;
// NOTE: According to DirectXTK, when running via Remote Desktop, raw
// mouse motion is provided as MOUSE_MOVE_ABSOLUTE and
// MOUSE_VIRTUAL_DESKTOP.
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; if (data->data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP)
dy = pos.y - window->win32.lastCursorPosY; {
pos.x += GetSystemMetrics(SM_XVIRTUALSCREEN);
pos.y += GetSystemMetrics(SM_YVIRTUALSCREEN);
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
} }
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

Loading…
Cancel
Save