瀏覽代碼

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.
Camilla Löwy 1 年之前
父節點
當前提交
d93868bcf3
共有 3 個文件被更改,包括 18 次插入33 次删除
  1. 0 3
      src/win32_init.c
  2. 0 2
      src/win32_platform.h
  3. 18 28
      src/win32_window.c

+ 0 - 3
src/win32_init.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;
 }

+ 0 - 2
src/win32_platform.h

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

+ 18 - 28
src/win32_window.c

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