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())
return GLFW_FALSE;
// Check if the current process was started via Remote Desktop
_glfw.win32.isRemoteSession = GetSystemMetrics(SM_REMOTESESSION) > 0;
_glfwPollMonitorsWin32();
return GLFW_TRUE;
}

@ -458,8 +458,6 @@ typedef struct _GLFWlibraryWin32
RAWINPUT* rawInput;
int rawInputSize;
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)
HCURSOR blankCursor;

@ -929,38 +929,28 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
data = _glfw.win32.rawInput;
if (data->data.mouse.usFlags & MOUSE_MOVE_ABSOLUTE)
{
if (_glfw.win32.isRemoteSession)
{
// 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);
POINT pos = {0};
int width, height;
dx = pos.x - window->win32.lastCursorPosX;
dy = pos.y - window->win32.lastCursorPosY;
if (data->data.mouse.usFlags & MOUSE_VIRTUAL_DESKTOP)
{
pos.x += GetSystemMetrics(SM_XVIRTUALSCREEN);
pos.y += GetSystemMetrics(SM_YVIRTUALSCREEN);
width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
}
else
{
dx = data->data.mouse.lLastX - window->win32.lastCursorPosX;
dy = data->data.mouse.lLastY - window->win32.lastCursorPosY;
width = GetSystemMetrics(SM_CXSCREEN);
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
{
@ -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
// HACK: Create a transparent cursor and always set that instead of NULL

Loading…
Cancel
Save