Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ port. The `dtc` mirror should be reverted once kernel.org returns.
2. Open the DMG and drag **Try Omarchy** to **Applications**.
3. Launch **Try Omarchy** from Applications.

Every launch begins at the start menu. **Immersive** is on by default and controls only the Full Screen presentation. Turn it off to keep Omarchy full screen while letting the Mac menu bar and Dock appear at the screen edges. Whenever the Omarchy window is focused, Command belongs to the guest as Super in either mode; Accessibility permission lets system shortcuts such as Command-Space reach it before macOS. Microphone and camera access are optional. The first launch takes longer while the app prepares Linux and starts Omarchy's account provisioning.
Every launch begins at the start menu. **Immersive** is on by default, so Omarchy opens Full Screen with the Mac menu bar and Dock hidden. Turn it off to open a resizable window; if you later enter Full Screen, the Mac menu bar and Dock remain available at the screen edges. Whenever the Omarchy window is focused, Command belongs to the guest as Super in either mode; Accessibility permission lets system shortcuts such as Command-Space reach it before macOS. Microphone and camera access are optional. The first launch takes longer while the app prepares Linux and starts Omarchy's account provisioning.

Restarting from inside Omarchy reboots the guest in the same Try Omarchy app.
Shutting down Omarchy closes the app and leaves it closed.
Expand Down
4 changes: 2 additions & 2 deletions macos/Sources/OmarchyVMHelper/StartMenuPresentation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ enum StartMenuPresentation {

static func immersiveDetail(isEnabled: Bool) -> String {
isEnabled
? "Mac menu bar and Dock stay hidden while Omarchy is Full Screen."
: "Mac menu bar and Dock remain available at the screen edges while Omarchy is Full Screen."
? "Omarchy opens Full Screen with the Mac menu bar and Dock hidden."
: "Omarchy opens in a window with the Mac menu bar and Dock available."
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import Foundation
import Testing

@Suite("Immersive Full Screen native contract")
@Suite("Immersive presentation native contract")
struct FullscreenNativeContractTests {
@Test("Runner keeps focused keyboard capture independent of presentation")
func runnerMapping() throws {
let runner = try source(named: "run-qemu-gpu.sh")

#expect(runner.contains("case ${OMARCHY_QEMU_GPU_IMMERSIVE:-1} in"))
#expect(runner.contains("1) cocoa_immersive=on ;;"))
#expect(runner.contains("0) cocoa_immersive=off ;;"))
#expect(runner.contains("cocoa_full_screen=on\n cocoa_immersive=on"))
#expect(runner.contains("cocoa_full_screen=off\n cocoa_immersive=off"))
#expect(runner.contains("OMARCHY_QEMU_GPU_IMMERSIVE must be 0 or 1"))
#expect(runner.contains(
"full-screen=on,full-grab=on,immersive=$cocoa_immersive,swap-opt-cmd=off"
"full-screen=$cocoa_full_screen,full-grab=on,immersive=$cocoa_immersive,swap-opt-cmd=off"
))
#expect(!runner.contains("cocoa_full_grab"))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,11 +68,11 @@ struct FullscreenLaunchConfigurationTests {
#expect(immersive.environment["KEEP_ME"] == "yes")
#expect(immersive.environment[FullscreenLaunchConfiguration.immersiveEnvironmentKey] == "1")

let standard = FullscreenLaunchConfiguration.make(
let windowed = FullscreenLaunchConfiguration.make(
baseEnvironment: inherited,
preferences: FullscreenPreferences(isImmersive: false)
)
#expect(standard.environment["KEEP_ME"] == "yes")
#expect(standard.environment[FullscreenLaunchConfiguration.immersiveEnvironmentKey] == "0")
#expect(windowed.environment["KEEP_ME"] == "yes")
#expect(windowed.environment[FullscreenLaunchConfiguration.immersiveEnvironmentKey] == "0")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -262,11 +262,11 @@ struct StartMenuPresentationTests {
])
}

@Test("immersive guidance describes fullscreen presentation only")
@Test("immersive guidance distinguishes windowed and fullscreen launch")
func immersiveGuidance() {
#expect(StartMenuPresentation.immersiveDetail(isEnabled: true)
== "Mac menu bar and Dock stay hidden while Omarchy is Full Screen.")
== "Omarchy opens Full Screen with the Mac menu bar and Dock hidden.")
#expect(StartMenuPresentation.immersiveDetail(isEnabled: false)
== "Mac menu bar and Dock remain available at the screen edges while Omarchy is Full Screen.")
== "Omarchy opens in a window with the Mac menu bar and Dock available.")
}
}
2 changes: 1 addition & 1 deletion macos/Tests/run-qemu-ssh-contract.test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ assert_contains "$(<"$test_root/disabled/storage.log")" create
run_scenario non-immersive 0 '' OMARCHY_QEMU_GPU_IMMERSIVE=0
non_immersive_qemu=$(<"$test_root/non-immersive/qemu.log")
assert_contains "$non_immersive_qemu" \
'cocoa,gl=es,show-cursor=on,zoom-to-fit=on,full-screen=on,full-grab=on,immersive=off,swap-opt-cmd=off'
'cocoa,gl=es,show-cursor=on,zoom-to-fit=on,full-screen=off,full-grab=on,immersive=off,swap-opt-cmd=off'

# Simulate installing a newer app build after the first VM was created. The
# saved VM must be selected before the launcher even considers the absent new
Expand Down
2 changes: 1 addition & 1 deletion macos/build-qemu-gpu-runtime.sh
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ texture_patch_sha256=b20bdf9a7d7ccda5b86366ad9d09a3bf95308b98a06b1ece281344405bc
gpu_fix_patch_sha256=b554e1ef9910d0891d69ee0fe84e479559c057dc28291e36e1524031808fc69f
identity_patch_sha256=5c9358c2858a74d6a678eacaae550a021f3e616c98c4e4e98c0e50bd869a0666
display_patch_sha256=1ce59350b6b8e6842bc0c9ca34c97f54cb75e85e2d7b35e5b483858654c4d693
immersive_patch_sha256=74443a02d684ed358db21846b8b0a05587a84c90322d86665cca07ca0e8078a0
immersive_patch_sha256=2462463932f7db0d659f754f7f9c182884564dbcd7d4b8e523f1b57f0bd9fe5b
full_grab_patch_sha256=d94aaa7b8b8b97eb25a5ace2b3a1268985e1b16e4e6201847b926b8ee709dbfb
audio_device_patch_sha256=03aca71c26163c337338cc3b2013c35430690fc0e8b66c5ce92a42f59a9b3334
shared_folder_patch_sha256=41247692501655393ae3a40f56915472ab29b6e89c5173e33db1f62cca56632f
Expand Down
7 changes: 4 additions & 3 deletions macos/patches/qemu-cocoa-immersive-mode.patch
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ QEMU's Cocoa fullscreen always replaces AppKit's auto-hidden menu bar and Dock
with hard-hidden variants. Add an independent immersive display option so the
user can choose that presentation without changing who owns the keyboard.
Full grab remains solely an input policy: when enabled, focused Command chords
belong to the guest in either presentation mode. Both modes begin fullscreen
and keep normal guest pointer handling. The View menu also follows the current
state so its exit action stays obvious.
belong to the guest in either presentation mode. The initial fullscreen state
remains an independent display option, and normal guest pointer handling is
unchanged. The View menu also follows the current state so its exit action
stays obvious.

`fullScreenMenuItem` is a file-scope static rather than a
`QemuCocoaAppController` ivar: `create_initial_menus` is a plain C function
Expand Down
16 changes: 11 additions & 5 deletions macos/run-qemu-gpu.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1253,8 +1253,14 @@ if ((reset_only)); then
fi

case ${OMARCHY_QEMU_GPU_IMMERSIVE:-1} in
1) cocoa_immersive=on ;;
0) cocoa_immersive=off ;;
1)
cocoa_full_screen=on
cocoa_immersive=on
;;
0)
cocoa_full_screen=off
cocoa_immersive=off
;;
*) fail "OMARCHY_QEMU_GPU_IMMERSIVE must be 0 or 1" ;;
esac

Expand Down Expand Up @@ -1286,9 +1292,9 @@ qemu_args=(
# Cocoa forwards its live backing-pixel dimensions and the current host
# display refresh rate through Virtio GPU EDID. Its accessibility-backed
# Full grab keeps every Command chord with the focused guest in either
# presentation mode. Immersive controls only whether Cocoa hard-hides the
# Mac menu bar and Dock instead of using standard fullscreen auto-hide.
-display "cocoa,gl=es,show-cursor=on,zoom-to-fit=on,full-screen=on,full-grab=on,immersive=$cocoa_immersive,swap-opt-cmd=off"
# presentation mode. Immersive launches Full Screen and hard-hides the Mac
# menu bar and Dock; otherwise Cocoa opens a centered, resizable window.
-display "cocoa,gl=es,show-cursor=on,zoom-to-fit=on,full-screen=$cocoa_full_screen,full-grab=on,immersive=$cocoa_immersive,swap-opt-cmd=off"
-device 'virtio-keyboard-pci,romfile='
-device 'virtio-tablet-pci,romfile='
-object 'rng-random,id=omarchy-rng,filename=/dev/urandom'
Expand Down
Loading