diff --git a/app/src/app_menus.rs b/app/src/app_menus.rs index da618eaaf..13923e730 100644 --- a/app/src/app_menus.rs +++ b/app/src/app_menus.rs @@ -211,16 +211,23 @@ fn make_new_app_menu(ctx: &AppContext) -> Menu { "Set Warp as Default Terminal", move |ctx| { DefaultTerminal::handle(ctx).update(ctx, |default_terminal, ctx| { - default_terminal.make_warp_default(ctx) + if default_terminal.is_warp_default() { + default_terminal.unset_warp_default(ctx) + } else { + default_terminal.make_warp_default(ctx) + } }); }, move |_props, ctx| { let default_terminal = DefaultTerminal::handle(ctx).as_ref(ctx); + let is_warp_default = default_terminal.is_warp_default(); MenuItemPropertyChanges { - disabled: Some( - !DefaultTerminal::can_warp_become_default() - || default_terminal.is_warp_default(), - ), + name: Some(if is_warp_default { + "Restore macOS Terminal as Default".to_string() + } else { + "Set Warp as Default Terminal".to_string() + }), + disabled: Some(!DefaultTerminal::can_warp_become_default()), ..Default::default() } }, diff --git a/app/src/default_terminal/mac.rs b/app/src/default_terminal/mac.rs index db728064d..aebcaecd0 100644 --- a/app/src/default_terminal/mac.rs +++ b/app/src/default_terminal/mac.rs @@ -71,6 +71,12 @@ pub fn set_warp_as_default_terminal() -> Result<(), String> { set_default_terminal(&bundle_id) } +pub fn unset_warp_as_default_terminal() -> Result<(), String> { + log::debug!("Unsetting Warp as default terminal (reverting to Terminal.app)"); + + set_default_terminal("com.apple.Terminal") +} + fn set_default_terminal(bundle_id: &str) -> Result<(), String> { log::debug!("Setting default terminal to bundle ID: {bundle_id}"); diff --git a/app/src/default_terminal/mod.rs b/app/src/default_terminal/mod.rs index f5e421f54..d87589721 100644 --- a/app/src/default_terminal/mod.rs +++ b/app/src/default_terminal/mod.rs @@ -24,6 +24,11 @@ mod non_mac { pub fn set_warp_as_default_terminal() -> Result<(), String> { Err("Not implemented".to_string()) } + + /// Unsets Warp as the default terminal + pub fn unset_warp_as_default_terminal() -> Result<(), String> { + Err("Not implemented".to_string()) + } } #[allow(unused_imports)] @@ -90,8 +95,7 @@ impl DefaultTerminal { self.is_warp_default } - /// This is a one-way operation. Once we set the default terminal to Warp, we can't really - /// "unset" it unless we pick a new default terminal. Picking a new default is complicated. + /// Sets Warp as the default terminal. pub fn make_warp_default(&mut self, ctx: &mut ModelContext) { if let Err(e) = set_warp_as_default_terminal() { log::error!("Error setting Warp as default terminal: {e:#}"); @@ -99,6 +103,14 @@ impl DefaultTerminal { self.set_is_warp_default(true, ctx); } } + + pub fn unset_warp_default(&mut self, ctx: &mut ModelContext) { + if let Err(e) = unset_warp_as_default_terminal() { + log::error!("Error unsetting Warp as default terminal: {e:#}"); + } else { + self.set_is_warp_default(false, ctx); + } + } } pub enum DefaultTerminalEvent { diff --git a/app/src/settings_view/features_page.rs b/app/src/settings_view/features_page.rs index 884d02a9e..626f9e563 100644 --- a/app/src/settings_view/features_page.rs +++ b/app/src/settings_view/features_page.rs @@ -645,6 +645,7 @@ pub enum FeaturesPageAction { ToggleShowTerminalInputMessageLine, ToggleAgentInAppNotifications, MakeWarpDefaultTerminal, + UnsetWarpDefaultTerminal, } lazy_static! { @@ -1138,6 +1139,10 @@ impl FeaturesPageAction { action: "MakeWarpDefaultTerminal".to_string(), value: to_string(DefaultTerminal::as_ref(ctx).is_warp_default()), }, + Self::UnsetWarpDefaultTerminal => TelemetryEvent::FeaturesPageAction { + action: "UnsetWarpDefaultTerminal".to_string(), + value: to_string(DefaultTerminal::as_ref(ctx).is_warp_default()), + }, Self::ToggleAutoOpenCodeReviewPane => TelemetryEvent::FeaturesPageAction { action: "ToggleAutoOpenCodeReviewPane".to_string(), value: to_string( @@ -1910,6 +1915,11 @@ impl TypedActionView for FeaturesPageView { default_terminal.make_warp_default(ctx); }); } + UnsetWarpDefaultTerminal => { + DefaultTerminal::handle(ctx).update(ctx, |default_terminal, ctx| { + default_terminal.unset_warp_default(ctx); + }); + } } send_telemetry_from_ctx!(action.telemetry_event(ctx), ctx); @@ -4793,13 +4803,16 @@ impl SettingsWidget for DefaultTerminalWidget { let default_terminal = DefaultTerminal::as_ref(app); if default_terminal.is_warp_default() { ui_builder - .wrappable_text("Warp is the default terminal", true) - .with_style(UiComponentStyles { - font_color: Some(appearance.theme().disabled_ui_text_color().into()), - margin: Some(Coords::default().bottom(16.)), - ..Default::default() - }) + .link( + "Restore macOS Terminal as the default terminal".to_string(), + None, + Some(Box::new(|ctx| { + ctx.dispatch_typed_action(FeaturesPageAction::UnsetWarpDefaultTerminal); + })), + self.link_state.clone(), + ) .build() + .with_margin_bottom(16.) .finish() } else { ui_builder