Skip to content

Fix full-screen logo hiding on notched displays (detect via Spaces API) - #31

Open
jeffscottmtl wants to merge 1 commit into
lihaoyun6:mainfrom
jeffscottmtl:fix/fullscreen-detection
Open

Fix full-screen logo hiding on notched displays (detect via Spaces API)#31
jeffscottmtl wants to merge 1 commit into
lihaoyun6:mainfrom
jeffscottmtl:fix/fullscreen-detection

Conversation

@jeffscottmtl

@jeffscottmtl jeffscottmtl commented May 23, 2026

Copy link
Copy Markdown

Summary

On notched MacBooks (Sequoia/Tahoe) the logo did not hide when an app entered native full screen, and once hidden it could stay stuck until the app was relaunched. This fixes both, for any app, on any display.

Root cause

The old getFullScreens() recognised full screen by matching window bounds against the screen frame (windowRect.equalTo(screen.frame)). On notched displays that can never be made to work, because a native full-screen window and a merely maximized (green-zoom) window report identical bounds, both rendering below the notch.

Verified live on macOS 26 with a built-in notched display:

window reported bounds
maximized Chrome (menu bar visible) (0, 34, 1710, 1073)
full-screen Chrome (0, 34, 1710, 1073)

There is also no persistent full-screen-sized window to key off (only a 1-frame flicker during the transition). So any geometry-based rule must pick one horn of a dilemma: either miss full screen (logo never hides) or fire on maximized windows (logo hides when it shouldn't, and gets "stuck" because a maximized window is usually present after exiting).

Fix

Ask the window server directly instead of guessing from rectangles. The CoreGraphics Spaces API (CGSCopyManagedDisplaySpaces) reports each display's current Space type; a native full-screen Space is type == 4. We collect the displays currently in a full-screen Space and map them back to NSScreen frames by display UUID.

This is:

  • app-agnostic (works for any app, not specific window shapes),
  • per-display (correct on multi-monitor setups), and
  • immediate on exit (the Space type flips back to normal the instant full screen ends, so the logo reappears with no stuck state).

Verified across repeated enter/exit cycles on the built-in notched display: FULLSCREEN -> normal -> FULLSCREEN -> normal, logo hides/reappears correctly each time, and stays visible for maximized windows.

Also removes the now-dead isFullScreenWindow() and getOwner() helpers.

Notes

  • This uses a private CoreGraphics API. That is consistent with the existing use of the private CGWindowList API in this file, and Logoer ships outside the App Store. If CGSCopyManagedDisplaySpaces ever returns nothing on a future OS, the code degrades gracefully (logo simply stays visible).
  • Apps using non-native full screen (e.g. iTerm2's "non-native full screen windows" option) do not create a full-screen Space and are intentionally not matched, since such windows are geometrically indistinguishable from a maximized window.

Closes #29
Closes #30

On notched MacBooks (Sequoia/Tahoe) the logo did not hide when an app
entered native full screen, and once hidden could stay stuck until the
app was relaunched. The root cause is that the old getFullScreens() tried
to recognise full screen by matching window bounds against the screen
frame (windowRect.equalTo(screen.frame)), which fails on these machines.

Window-bounds matching fundamentally cannot work here. Verified live on
macOS 26 with a built-in notched display, a native full-screen window and
a merely maximized (green-zoom) window report identical bounds, both
rendering below the notch:
  - maximized Chrome main window:   (0, 34, 1710, 1073)
  - full-screen Chrome main window: (0, 34, 1710, 1073)   <- identical
and there is no persistent full-screen-sized window to key off. So any
geometric rule either misses full screen (logo never hides) or fires on
maximized windows (logo hides when it should not).

Detect full screen by asking the window server directly instead. The
CoreGraphics Spaces API (CGSCopyManagedDisplaySpaces) reports each
display's current Space type; a native full-screen Space is type 4. We
collect the displays currently in a full-screen Space and map them back
to NSScreen frames by display UUID. This is app-agnostic and per-display,
and it flips back to normal the instant full screen is exited, so the
logo reappears immediately with no stuck state. Verified across repeated
enter/exit cycles on the built-in display.

This is a private API, consistent with the existing use of the private
CGWindowList API; Logoer ships outside the App Store. Apps using
*non-native* full screen (e.g. iTerm2's option) do not create a
full-screen Space and are intentionally not matched, since they are
geometrically indistinguishable from a maximized window.

Closes lihaoyun6#29
Closes lihaoyun6#30

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@jeffscottmtl
jeffscottmtl force-pushed the fix/fullscreen-detection branch from 347120c to 536378c Compare June 18, 2026 00:08
@jeffscottmtl jeffscottmtl changed the title Fix fullscreen detection on notched displays (Sequoia/Tahoe) Fix full-screen logo hiding on notched displays (detect via Spaces API) Jun 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

unable to hide the icon under full screen mode No option to disable "Visible in full screen mode"

1 participant