瀏覽代碼

GetCurrentMonitor() - use closest monitor (#3472)

Alexandre Almeida 2 年之前
父節點
當前提交
2db7c727b6
共有 1 個文件被更改,包括 44 次插入11 次删除
  1. 44 11
      src/platforms/rcore_desktop.c

+ 44 - 11
src/platforms/rcore_desktop.c

@@ -751,15 +751,19 @@ int GetCurrentMonitor(void)
         }
         }
         else
         else
         {
         {
-            int x = 0;
-            int y = 0;
+            int closestDist = 0x7FFFFFFF;
 
 
-            glfwGetWindowPos(platform.handle, &x, &y);
-            x += (int)CORE.Window.screen.width / 2;
-            y += (int)CORE.Window.screen.height / 2;
+            // Window center position
+            int wcx = 0;
+            int wcy = 0;
+
+            glfwGetWindowPos(platform.handle, &wcx, &wcy);
+            wcx += (int)CORE.Window.screen.width / 2;
+            wcy += (int)CORE.Window.screen.height / 2;
 
 
             for (int i = 0; i < monitorCount; i++)
             for (int i = 0; i < monitorCount; i++)
             {
             {
+                // Monitor top-left position
                 int mx = 0;
                 int mx = 0;
                 int my = 0;
                 int my = 0;
 
 
@@ -769,17 +773,46 @@ int GetCurrentMonitor(void)
 
 
                 if (mode)
                 if (mode)
                 {
                 {
-                    const int width = mode->width;
-                    const int height = mode->height;
+                    const int right = mx + mode->width - 1;
+                    const int bottom = my + mode->height - 1;
 
 
-                    if ((x >= mx) &&
-                        (x < (mx + width)) &&
-                        (y >= my) &&
-                        (y < (my + height)))
+                    if ((wcx >= mx) &&
+                        (wcx <= right) &&
+                        (wcy >= my) &&
+                        (wcy <= bottom))
                     {
                     {
                         index = i;
                         index = i;
                         break;
                         break;
                     }
                     }
+
+                    int xclosest = wcx;
+                    if (wcx < mx)
+                    {
+                        xclosest = mx;
+                    }
+                    else if (wcx > right)
+                    {
+                        xclosest = right;
+                    }
+
+                    int yclosest = wcy;
+                    if (wcy < my)
+                    {
+                        yclosest = my;
+                    }
+                    else if (wcy > bottom)
+                    {
+                        yclosest = bottom;
+                    }
+
+                    int dx = wcx - xclosest;
+                    int dy = wcy - yclosest;
+                    int dist = (dx * dx) + (dy * dy);
+                    if (dist < closestDist)
+                    {
+                        index = i;
+                        closestDist = dist;
+                    }
                 }
                 }
                 else TRACELOG(LOG_WARNING, "GLFW: Failed to find video mode for selected monitor");
                 else TRACELOG(LOG_WARNING, "GLFW: Failed to find video mode for selected monitor");
             }
             }