Skip to content

display: fill the area beside the camera housing on macOS 12 and later - #7910

Open
osy wants to merge 1 commit into
mainfrom
feature/fullscreen-notch-macos12
Open

osy wants to merge 1 commit into
mainfrom
feature/fullscreen-notch-macos12

Conversation

@osy

@osy osy commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor

Follow-up to #7885 (see #6183). The option to fill the area beside the camera housing in full screen was limited to macOS 27 because the reveal hook it used, +[NSMenu _dispatchAgentRevealChangedForSpaceID:…], is part of the menu bar "agent" layer added in macOS 27. The window frame methods and SkyLight functions the feature relies on exist with the same signatures on macOS 12 through 26.

On every version AppKit reports each step of the reveal animation to the full screen window's menu bar companion through -[_NSFullScreenMenuBarCompanionController setMenuBarReveal:] (plus setToolbarWindowReveal: on macOS 27): on 12–26 the window server's reveal notification calls it, on 27 the menu bar agent's animation does. This observes those two setters (identical type encodings on 12.6, 15.5, 26.0 and 27.0), maps the companion to its window through contentController.window, and keeps the reveal state on the window — replacing the 27-only hook rather than adding a second one. As before, every private symbol is looked up at runtime and checked against the expected type encoding, and the window falls back to normal full screen if any is missing. The settings toggle is no longer limited to macOS 27. Keeping Hot Corners disabled still uses the public .disableScreenCornerInteractions option, which only exists on macOS 27.

Testing: Tested by a human on macOS 15 (MacBook with a camera housing) with the first revision of this PR: full screen fills the area beside the camera housing, the menu bar is not revealed while the pointer is over that area, and it is revealed at the top edge. The current revision (single hook) has been verified end to end in a macOS 12.6 VM with a simulated camera housing and on macOS 27.0 (MacBook Air M3), and its reveal path confirmed on macOS 15.5 and 26.0 VMs by invoking AppKit's reveal handler. A human test of this revision on real pre-27 hardware is still pending, so this remains a draft. The author acknowledges that this change must be tested and/or reviewed by a human in accordance with UTM's AI contribution guidelines before it is marked ready for review.

@osy
osy force-pushed the feature/fullscreen-notch-macos12 branch from 77cc09b to 9cde8f3 Compare September 24, 2026 15:38
@osy osy added this to the v5.0 milestone Sep 24, 2026
@osy
osy marked this pull request as ready for review September 24, 2026 15:44
@pingu-the-penguin

Copy link
Copy Markdown

I would be supportive of an option to make it possible to disable per-VM. Linux VMs using AVF do not map out nicely with this (I tried GNOME, top bar with dates and time was chopped off) but for macOS VMs it looks really nice.

The option to fill the area beside the camera housing in full screen was
limited to macOS 27 because the hook used to learn when the menu bar is
revealed, +[NSMenu _dispatchAgentRevealChangedForSpaceID:...], only
exists there. Everything else the feature relies on exists with the
same signatures on macOS 12 through 26.

On every version, AppKit reports each step of the reveal animation to
the menu bar companion of the full screen window through
-[_NSFullScreenMenuBarCompanionController setMenuBarReveal:] (and
setToolbarWindowReveal: on macOS 27), whether the window server or the
menu bar agent drives it. Observe those setters instead, keep the reveal
state on the window, and drop the version specific hook.

See #6183.

Assisted-by: Claude:claude-opus-5-5
Assisted-by: Claude:claude-fable-5-1
@osy
osy force-pushed the feature/fullscreen-notch-macos12 branch from 9cde8f3 to c06081c Compare September 25, 2026 01:52
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.

2 participants