Files
galaxy/specs/GH1154/tech.md
T

5.9 KiB

Hide Warp Dock Icon — Tech Spec

Summary

Add a macOS-only show_dock_icon appearance setting that switches Warp between regular and accessory AppKit activation policies. When disabled, Warp is hidden from the Dock and Cmd-Tab while continuing to run.

Relevant existing code

  • app/src/settings/app_icon.rs — app icon settings namespace and generated settings state.
  • app/src/settings_view/appearance_page.rs — Appearance settings UI.
  • app/src/appearance.rs — runtime appearance/app icon setting handling.
  • app/src/lib.rs — macOS AppBuilder setup before app_builder.run.
  • crates/warpui_core/src/platform/mod.rs and crates/warpui_core/src/core/app.rs — platform delegate API.
  • crates/warpui/src/platform/mac/app.rs — macOS app builder/run wiring.
  • crates/warpui/src/platform/mac/delegate.rs — macOS platform delegate implementation.
  • crates/warpui/src/platform/mac/objc/app.{h,m} — AppKit delegate and activation-policy calls.

Design

1. Add a macOS Dock visibility setting

Add a generated setting under AppIconSettings:

  • Name: show_dock_icon
  • Type: bool
  • Default: true
  • Platform support: SupportedPlatforms::MAC
  • Sync: disabled, matching app icon settings behavior
  • Storage key: ShowDockIcon
  • TOML path: appearance.icon.show_dock_icon
  • Description: whether Warp is shown in the macOS Dock and Cmd-Tab switcher.

Keep this as a separate field from app_icon. Do not add a hidden variant to AppIcon, because AppIcon still describes artwork when the Dock icon is visible.

2. Apply the saved preference during launch

In app/src/lib.rs, after public preferences are available and before app_builder.run, read the saved ShowDockIcon value from prefs_for_public_settings using the generated setting helper, following the same pre-app-read pattern used by ForceX11.

Extend warpui::platform::mac::AppExt with set_show_dock_icon_on_launch, store the value in the macOS backend, and apply it in warp_app_will_finish_launching.

Initializing it before launch lets the AppKit layer apply accessory mode as early as practical, reducing visible Dock flicker for users who have already hidden the Dock icon.

3. Apply runtime setting changes

Handle the generated changed event alongside AppIconState in AppearanceManager. On ShowDockIcon changes, call the platform delegate to update Dock visibility immediately.

Add a platform delegate method such as set_dock_icon_visible(visible: bool). Non-macOS implementations should be no-ops. The macOS implementation should dispatch to the main queue and call the Objective-C AppKit bridge.

4. macOS AppKit bridge

Add -[WarpDelegate setDockIconVisible:] in Objective-C. It should call:

  • NSApplicationActivationPolicyRegular when visible == YES
  • NSApplicationActivationPolicyAccessory when visible == NO

Return whether AppKit accepted the activation-policy change. If hiding fails, leave or restore the regular policy so Warp remains visible in the Dock.

5. Settings UI

Add a switch labelled "Show Warp in Dock" near the existing app icon controls in Appearance settings.

  • Default checked state reflects AppIconSettings::show_dock_icon.
  • Toggle dispatch updates AppIconSettings.show_dock_icon.
  • Gate display/support via is_supported_on_current_platform from the setting metadata rather than compile-time cfg checks.
  • Include search terms such as "dock", "cmd tab", and "app switcher".

Behavior flows

User hides the Dock icon

  1. User opens Appearance settings and turns off Show Warp in Dock.
  2. AppIconSettings.show_dock_icon is saved.
  3. AppearanceManager receives the changed event.
  4. The platform delegate applies accessory activation policy.
  5. Warp disappears from the Dock and Cmd-Tab.

User restores the Dock icon

  1. User turns on Show Warp in Dock.
  2. AppIconSettings.show_dock_icon is saved.
  3. AppearanceManager receives the changed event.
  4. The platform delegate applies regular activation policy.
  5. Warp returns to the Dock and Cmd-Tab.

Launch with hidden Dock icon

  1. app/src/lib.rs reads ShowDockIcon before app_builder.run.
  2. The macOS app builder stores show_dock_icon_on_launch.
  3. warp_app_will_finish_launching applies the initial activation policy.

Risks and mitigations

Risk: users hide the Dock icon without a hotkey

Users can still reach existing visible windows, Mission Control, and other macOS window-management surfaces, but the main intended workflow is hotkey-driven.

Mitigation: keep the setting opt-in, default it to visible, and make the label explicit.

Risk: AppKit rejects activation-policy changes

Mitigation: check the Objective-C return value. If hiding fails, leave or restore regular activation policy so Warp remains visible in the Dock.

Risk: non-macOS no-op setting

Mitigation: mark the setting as macOS-only and gate the Appearance row with is_supported_on_current_platform.

Test plan

Automated:

  • Add settings/schema coverage ensuring appearance.icon.show_dock_icon exists, defaults to true, is macOS-only, and does not sync to cloud where practical.
  • Add compile coverage for warpui macOS code paths in the existing macOS CI job.

Manual macOS:

  • Toggle Show Warp in Dock off and verify Warp disappears from the Dock and Cmd-Tab.
  • Verify configured global hotkeys still focus/show Warp while Dock visibility is disabled.
  • Restart Warp with Show Warp in Dock disabled and verify the app starts in hidden-Dock mode.
  • Toggle Show Warp in Dock back on and verify the Dock icon and Cmd-Tab entry return.
  • Verify changing the selected app icon still updates Dock art when Show Warp in Dock is enabled.
  • Verify non-macOS builds do not show an enabled no-op setting.

Future considerations

  • Consider a separate menu bar/status item recovery surface if user feedback indicates it is needed.
  • Consider launch-at-login/background-start behavior as a separate feature for users who want Warp available only through hotkey after boot.