Refactor Windows work area handling for improved frame overhang management
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good

- Introduced separate constants for native and CEF window frame overhangs to accommodate different rendering contexts.
- Updated `getMaximizedWorkAreaFrame` to accept a window parameter, allowing dynamic selection of the appropriate overhang based on the window type.
- Enhanced `isWindowWorkAreaMaximized` and `clampWindowToWorkArea` functions to utilize the updated frame overhang logic, improving accuracy in window positioning.
This commit is contained in:
Tom Butcher 2026-08-09 15:27:54 +01:00
parent f52f0e35a9
commit 517921f3e3

View File

@ -4,12 +4,24 @@ const FRAME_TOLERANCE_PX = 4
// Win32 DWM invisible borders sit outside the client work area; Electrobun's // Win32 DWM invisible borders sit outside the client work area; Electrobun's
// maximized frame includes those overhangs, so we treat this adjusted rect as // maximized frame includes those overhangs, so we treat this adjusted rect as
// the canonical "maximized to work area" geometry. // the canonical "maximized to work area" geometry.
const WIN32_FRAME_OVERHANG = { const WIN32_FRAME_OVERHANG_NATIVE = {
x: -8, x: -8,
y: 0, y: 0,
width: 16, width: 16,
height: 8 height: 8
} }
const WIN32_FRAME_OVERHANG_CEF = {
x: -10,
y: 0,
width: 20,
height: 10
}
function getWin32FrameOverhang(window) {
return window?.renderer === 'cef'
? WIN32_FRAME_OVERHANG_CEF
: WIN32_FRAME_OVERHANG_NATIVE
}
function framesMatch(a, b, tolerance = FRAME_TOLERANCE_PX) { function framesMatch(a, b, tolerance = FRAME_TOLERANCE_PX) {
return ( return (
@ -20,12 +32,13 @@ function framesMatch(a, b, tolerance = FRAME_TOLERANCE_PX) {
) )
} }
function getMaximizedWorkAreaFrame(workArea) { function getMaximizedWorkAreaFrame(workArea, window) {
const overhang = getWin32FrameOverhang(window)
return { return {
x: workArea.x + WIN32_FRAME_OVERHANG.x, x: workArea.x + overhang.x,
y: workArea.y + WIN32_FRAME_OVERHANG.y, y: workArea.y + overhang.y,
width: workArea.width + WIN32_FRAME_OVERHANG.width, width: workArea.width + overhang.width,
height: workArea.height + WIN32_FRAME_OVERHANG.height height: workArea.height + overhang.height
} }
} }
@ -70,7 +83,7 @@ export function isWindowWorkAreaMaximized(window) {
const { workArea } = getDisplayForFrame(frame) const { workArea } = getDisplayForFrame(frame)
return ( return (
framesMatch(frame, workArea) || framesMatch(frame, workArea) ||
framesMatch(frame, getMaximizedWorkAreaFrame(workArea)) framesMatch(frame, getMaximizedWorkAreaFrame(workArea, window))
) )
} }
@ -90,7 +103,7 @@ export function clampWindowToWorkArea(window) {
const display = getDisplayForFrame(frame) const display = getDisplayForFrame(frame)
const { bounds, workArea } = display const { bounds, workArea } = display
const maximizedFrame = getMaximizedWorkAreaFrame(workArea) const maximizedFrame = getMaximizedWorkAreaFrame(workArea, window)
if (framesMatch(frame, workArea) || framesMatch(frame, maximizedFrame)) { if (framesMatch(frame, workArea) || framesMatch(frame, maximizedFrame)) {
return false return false