Skip to content

feat(app): fullscreen menu auto-hide and native breakout chrome - #1034

Merged
JoeMatt merged 1 commit into
developfrom
codex/fullscreen-menu-chrome
Oct 20, 2026
Merged

JoeMatt merged 1 commit into
developfrom
codex/fullscreen-menu-chrome

Conversation

@JoeMatt

@JoeMatt JoeMatt commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

Adds Settings → Interface → Desktop → Auto-hide the menu bar in fullscreen (#1028). The saved option defaults off. When enabled, entering fullscreen unpins the in-window menu; top-edge hover reveals it and F1 pins it. Leaving fullscreen restores the earlier pin state, and a temporary macOS F1 reveal preserves the native-only windowed preference. Interface reset clears the option.

Breakout windows now use their native OS title/close controls without a duplicate ImGui title/collapse/close bar. The shared window entry point preserves native close forwarding, expands a previously collapsed window, and restores ImGui controls after reattachment. Decoration-less backends keep their in-app controls.

Validation on Studio:

  • 159/159 release tests passed, including settings reset and existing UI smoke tests.
  • New fullscreen policy and real-ImGui viewport regressions fail against the old behavior and pass with the fixes; cover hover/pinning, native-only preference, native close, collapsed windows, reattachment and decoration-less backends.
  • Windowed checks passed with the option missing/default-off and enabled: fullscreen entry/exit, hover, F1, persistence and screenshots. Additional macOS native-only/F1 preference check passed. Real SDL breakout-window smoke run passed.
  • Independent review found no remaining issues. Screenshots inspected; validation source hashes matched all changed files.

Closes #1028

Copilot AI balanced review requested due to automatic review settings October 20, 2026 00:45

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-20T00:48:13.715639Z 72efc1f PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@JoeMatt JoeMatt linked an issue Oct 20, 2026 that may be closed by this pull request
1 task done
@github-actions

Copy link
Copy Markdown

Regression: linux-arm64

Regression Test Results

ROM Status Details Diff
jagniccc ✅ PASS 0 pixels differ -
yarc ✅ PASS 0 pixels differ -
jagniccc (determinism) ✅ PASS identical across runs -
yarc (determinism) ✅ PASS identical across runs -
jagniccc (frameskip) ✅ PASS skip=0 matches skip=3 -
yarc (frameskip) ✅ PASS skip=0 matches skip=3 -
jagniccc (save state) ✅ PASS round-trip matches -
yarc (save state) ✅ PASS round-trip matches -
jagniccc (rewind) ✅ PASS rewind matches -
yarc (rewind) ✅ PASS rewind matches -

Platform: Linux aarch64

Updated by CI at 2026-10-20T01:05:17.085Z

@github-actions

Copy link
Copy Markdown

Regression: macos-arm64

Regression Test Results

ROM Status Details Diff
jagniccc ✅ PASS 0 pixels differ -
yarc ✅ PASS 0 pixels differ -
jagniccc (determinism) ✅ PASS identical across runs -
yarc (determinism) ✅ PASS identical across runs -
jagniccc (frameskip) ✅ PASS skip=0 matches skip=3 -
yarc (frameskip) ✅ PASS skip=0 matches skip=3 -
jagniccc (save state) ✅ PASS round-trip matches -
yarc (save state) ✅ PASS round-trip matches -
jagniccc (rewind) ✅ PASS rewind matches -
yarc (rewind) ✅ PASS rewind matches -

Platform: Darwin arm64

Updated by CI at 2026-10-20T01:13:14.388Z

@github-actions

Copy link
Copy Markdown

🌙 Kimi review

Verdict: no blocking defects found — the policy logic, state save/restore, and chrome hand-off are internally consistent and well covered by the new tests. Two behavioral observations below, neither a proven break.

Findings (low severity, in order):

  1. app/src/app.cpp:1039 — inWindowMenuBar() changed from a pure policy function (nativeMenuActive() ? showInWindowMenu : true) to returning menuBarDrawn, which is only written inside drawUi. That is one frame stale for any caller running before drawUi in the frame, and permanently false in any context where drawUi never runs (headless paths, startup before the first rendered frame). The two in-diff consumers (toast placement, the menu-visible script expectation) are fine with that, and the old value was arguably wrong in fullscreen (it reported true for a hidden menu). But this function is public and the diff doesn't show all call sites — worth a grep to confirm nothing else (mouse-coordinate mapping, layout offsets) was relying on the old always-true-on-non-macOS semantics.

  2. app/src/fullscreen_menu.h:15 — revealExtra_ latches on for the remainder of a fullscreen session. For a native-only macOS user (menubar_in_window=0), top-edge hover reveals nothing until F1 is pressed once; after that, hover reveals the bar for the rest of the session even after F1-unpinning again ((showExtra || revealExtra_) && (pinned || hot)). That may be the intent (macOS already provides its own auto-hide menu in fullscreen, and the native-only test only exercises F1), but it's a visible asymmetry that neither the README nor the settings hint documents.

  3. app/tests/fullscreen_menu_windowed_check.sh — under set -e, if the emulator exits non-zero, the script aborts at the invocation line and the grep -E 'tv: FAIL|...' diagnostic never runs; same for the grep -q persistence checks failing silently. The run still fails correctly via exit code and the log is on disk, so this only costs debuggability. Shell hygiene otherwise conforms (quoting, set -u, no bare rm/cp/mv, no exit in a subshell).

Checked and cleared: the FullscreenMenu save/restore state machine against every path that calls update() (F11, SDL enter/leave events, the per-frame drawUi call — which also makes the policy self-healing if an event path is missed); F1 routing across all four platform/fullscreen/autohide combinations; beginWindow's one-frame-late viewport ownership (acknowledged in its comment, and forced-uncollapse correctly overrides SetNextWindowCollapsed since the later call wins the slot); native close forwarding through p_open without a title bar; NoDecoration fallback retaining in-app controls; reset-group classification and the persistence assertions in the windowed script matching saveConfig's unconditional write. No C89 concerns — all touched code is C++.

@github-actions

Copy link
Copy Markdown

An automated review was posted after this notice; the reviewer is working again.

@github-actions github-actions Bot added the documentation Docs, site, wiki, release notes label Oct 20, 2026
@JoeMatt
JoeMatt merged commit 7524a63 into develop Oct 20, 2026
51 checks passed
@JoeMatt
JoeMatt deleted the codex/fullscreen-menu-chrome branch October 20, 2026 01:28
@github-actions

Copy link
Copy Markdown

Regression: linux-x64

Regression Test Results

ROM Status Details Diff
jagniccc ✅ PASS 0 pixels differ -
yarc ✅ PASS 0 pixels differ -
jagniccc (determinism) ✅ PASS identical across runs -
yarc (determinism) ✅ PASS identical across runs -
jagniccc (frameskip) ✅ PASS skip=0 matches skip=3 -
yarc (frameskip) ✅ PASS skip=0 matches skip=3 -
jagniccc (save state) ✅ PASS round-trip matches -
yarc (save state) ✅ PASS round-trip matches -
jagniccc (rewind) ✅ PASS rewind matches -
yarc (rewind) ✅ PASS rewind matches -

Platform: Linux x86_64

Updated by CI at 2026-10-20T01:30:40.700Z

@github-actions

Copy link
Copy Markdown

App packages

Built from 72efc1f (workflow run).

Platform Download Size
Linux x86_64: Flatpak bundle (.flatpak) app-package-flatpak 19.3 MB
Linux aarch64: .AppImage + .deb app-package-linux-aarch64 44.5 MB
Linux x86_64: .AppImage + .deb app-package-linux-x86_64 45.9 MB
macOS (universal): .zip app-package-macos-universal 30.3 MB
Windows ARM64: portable .zip + -setup.exe app-package-windows-arm64 41.8 MB
Windows x64: portable .zip + -setup.exe app-package-windows-x64 45.4 MB

Downloading an artifact needs a GitHub login. macOS: Developer ID signed and notarized (PRs from forks get
no signing secrets and stay ad-hoc signed: right-click > Open, or xattr -dr com.apple.quarantine "Virtual Jaguar.app").
Windows: not code-signed yet, SmartScreen may warn. Linux AppImage: chmod +x it.

Updated by CI at 2026-10-20T04:50:45.869Z

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Docs, site, wiki, release notes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] Automatically hide tool bar when going fullscreen for desktop

2 participants