feat(window_manager): add get_virtual_desktop_bounds() for multi-monitor support

This commit is contained in:
2026-09-08 23:17:01 +02:00
parent e2e66c1938
commit ff6158e7a0
+31
View File
@@ -244,6 +244,8 @@ class WindowManager:
def get_work_area() -> Tuple[int, int, int, int]:
"""
Returns desktop work area (left, top, right, bottom) excluding the taskbar.
NOTE: This only covers the *primary* monitor's work area.
Use get_virtual_desktop_bounds() for full multi-monitor extent.
"""
SPI_GETWORKAREA = 0x0030
rect = wintypes.RECT()
@@ -252,3 +254,32 @@ class WindowManager:
# Fallback to full screen
w, h = WindowManager.get_screen_dimensions()
return (0, 0, w, h)
@staticmethod
def get_virtual_desktop_bounds() -> Tuple[int, int, int, int]:
"""
Returns the bounding rectangle of the full virtual desktop spanning ALL monitors.
On a single-monitor system this equals get_screen_dimensions().
On multi-monitor systems it covers every display, including those with
negative coordinates (monitors left of / above the primary).
Returns:
(left, top, right, bottom) in virtual-desktop pixel coordinates.
"""
SM_XVIRTUALSCREEN = 76 # Left edge of virtual desktop
SM_YVIRTUALSCREEN = 77 # Top edge of virtual desktop
SM_CXVIRTUALSCREEN = 78 # Total width of virtual desktop
SM_CYVIRTUALSCREEN = 79 # Total height of virtual desktop
vx = user32.GetSystemMetrics(SM_XVIRTUALSCREEN)
vy = user32.GetSystemMetrics(SM_YVIRTUALSCREEN)
vw = user32.GetSystemMetrics(SM_CXVIRTUALSCREEN)
vh = user32.GetSystemMetrics(SM_CYVIRTUALSCREEN)
if vw == 0 or vh == 0:
# GetSystemMetrics failed fall back to primary screen
w, h = WindowManager.get_screen_dimensions()
return (0, 0, w, h)
return (vx, vy, vx + vw, vy + vh)