Skip to content
Open
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
17 changes: 12 additions & 5 deletions app/src/app_menus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
}
},
Expand Down
6 changes: 6 additions & 0 deletions app/src/default_terminal/mac.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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}");

Expand Down
16 changes: 14 additions & 2 deletions app/src/default_terminal/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -90,15 +95,22 @@ 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<Self>) {
if let Err(e) = set_warp_as_default_terminal() {
log::error!("Error setting Warp as default terminal: {e:#}");
} else {
self.set_is_warp_default(true, ctx);
}
}

pub fn unset_warp_default(&mut self, ctx: &mut ModelContext<Self>) {
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 {
Expand Down
25 changes: 19 additions & 6 deletions app/src/settings_view/features_page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -645,6 +645,7 @@ pub enum FeaturesPageAction {
ToggleShowTerminalInputMessageLine,
ToggleAgentInAppNotifications,
MakeWarpDefaultTerminal,
UnsetWarpDefaultTerminal,
}

lazy_static! {
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down