소스 검색

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
         {
-            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++)
             {
+                // Monitor top-left position
                 int mx = 0;
                 int my = 0;
 
@@ -769,17 +773,46 @@ int GetCurrentMonitor(void)
 
                 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;
                         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");
             }