@@ -4,7 +4,7 @@ mod onboarding_banner;
pub mod platform_title_bar;
mod platforms;
mod system_window_tabs;
-mod title_bar_settings;
+pub mod title_bar_settings;
#[cfg(feature = "stories")]
mod stories;
@@ -35,7 +35,7 @@ use remote::RemoteConnectionOptions;
use settings::{Settings, SettingsLocation};
use std::{path::Path, sync::Arc};
use theme::ActiveTheme;
-use title_bar_settings::TitleBarSettings;
+use title_bar_settings::{TitleBarSettings, TitleBarVisibility};
use ui::{
Avatar, Button, ButtonLike, ButtonStyle, Chip, ContextMenu, Icon, IconName, IconSize,
IconWithIndicator, Indicator, PopoverMenu, PopoverMenuHandle, Tooltip, h_flex, prelude::*,
@@ -73,8 +73,49 @@ pub fn init(cx: &mut App) {
let Some(window) = window else {
return;
};
- let item = cx.new(|cx| TitleBar::new("title-bar", workspace, window, cx));
- workspace.set_titlebar_item(item.into(), window, cx);
+ let should_show = match TitleBarSettings::get_global(cx).show {
+ TitleBarVisibility::Always => true,
+ TitleBarVisibility::Never => false,
+ TitleBarVisibility::HideInFullScreen => !window.is_fullscreen(),
+ };
+ if should_show {
+ let item = cx.new(|cx| TitleBar::new("title-bar", workspace, window, cx));
+ workspace.set_titlebar_item(item.into(), window, cx);
+ }
+
+ cx.observe_global_in::<settings::SettingsStore>(window, |workspace, window, cx| {
+ let should_show = match TitleBarSettings::get_global(cx).show {
+ TitleBarVisibility::Always => true,
+ TitleBarVisibility::Never => false,
+ TitleBarVisibility::HideInFullScreen => !window.is_fullscreen(),
+ };
+ if should_show {
+ if workspace.titlebar_item().is_none() {
+ let item = cx.new(|cx| TitleBar::new("title-bar", workspace, window, cx));
+ workspace.set_titlebar_item(item.into(), window, cx);
+ }
+ } else {
+ workspace.clear_titlebar_item(window, cx);
+ }
+ })
+ .detach();
+
+ cx.observe_window_bounds(window, |workspace, window, cx| {
+ let should_show = match TitleBarSettings::get_global(cx).show {
+ TitleBarVisibility::Always => true,
+ TitleBarVisibility::Never => false,
+ TitleBarVisibility::HideInFullScreen => !window.is_fullscreen(),
+ };
+ if should_show {
+ if workspace.titlebar_item().is_none() {
+ let item = cx.new(|cx| TitleBar::new("title-bar", workspace, window, cx));
+ workspace.set_titlebar_item(item.into(), window, cx);
+ }
+ } else {
+ workspace.clear_titlebar_item(window, cx);
+ }
+ })
+ .detach();
#[cfg(not(target_os = "macos"))]
workspace.register_action(|workspace, action: &OpenApplicationMenu, window, cx| {
@@ -3,8 +3,17 @@ use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use settings::{Settings, SettingsKey, SettingsSources, SettingsUi};
+#[derive(Copy, Clone, Serialize, Deserialize, JsonSchema, Debug, SettingsUi)]
+#[serde(rename_all = "snake_case")]
+pub enum TitleBarVisibility {
+ Always,
+ Never,
+ HideInFullScreen,
+}
+
#[derive(Copy, Clone, Deserialize, Debug)]
pub struct TitleBarSettings {
+ pub show: TitleBarVisibility,
pub show_branch_icon: bool,
pub show_onboarding_banner: bool,
pub show_user_picture: bool,
@@ -20,6 +29,10 @@ pub struct TitleBarSettings {
#[settings_ui(group = "Title Bar")]
#[settings_key(key = "title_bar")]
pub struct TitleBarSettingsContent {
+ /// Controls when the title bar is visible: "always" | "never" | "hide_in_full_screen".
+ ///
+ /// Default: "always"
+ pub show: Option<TitleBarVisibility>,
/// Whether to show the branch icon beside branch switcher in the title bar.
///
/// Default: false