Detailed changes
@@ -175,6 +175,16 @@
//
// Default: true
"zoomed_padding": true,
+ // What draws Zed's window decorations (titlebar):
+ // 1. Client application (Zed) draws its own window decorations
+ // "client"
+ // 2. Display server draws the window decorations. Not supported by GNOME Wayland.
+ // "server"
+ //
+ // This requires restarting Zed for changes to take effect.
+ //
+ // Default: "client"
+ "window_decorations": "client",
// Whether to use the system provided dialogs for Open and Save As.
// When set to false, Zed will use the built-in keyboard-first pickers.
"use_system_path_prompts": true,
@@ -25,7 +25,7 @@ use ui::{
Divider, KeyBinding, ListItem, ListItemSpacing, ListSubHeader, Render, Tooltip, prelude::*,
};
use util::{ResultExt, TryFutureExt};
-use workspace::{Workspace, client_side_decorations};
+use workspace::{Workspace, WorkspaceSettings, client_side_decorations};
use zed_actions::assistant::InlineAssist;
use prompt_store::*;
@@ -122,7 +122,10 @@ pub fn open_rules_library(
let window_decorations = match std::env::var("ZED_WINDOW_DECORATIONS") {
Ok(val) if val == "server" => gpui::WindowDecorations::Server,
Ok(val) if val == "client" => gpui::WindowDecorations::Client,
- _ => gpui::WindowDecorations::Client,
+ _ => match WorkspaceSettings::get_global(cx).window_decorations {
+ settings::WindowDecorations::Server => gpui::WindowDecorations::Server,
+ settings::WindowDecorations::Client => gpui::WindowDecorations::Client,
+ },
};
cx.open_window(
WindowOptions {
@@ -109,6 +109,9 @@ pub struct WorkspaceSettingsContent {
///
/// Default: true
pub zoomed_padding: Option<bool>,
+ /// What draws window decorations/titlebar, the client application (Zed) or display server
+ /// Default: client
+ pub window_decorations: Option<WindowDecorations>,
}
#[with_fallible_options]
@@ -290,6 +293,28 @@ pub enum BottomDockLayout {
RightAligned,
}
+#[derive(
+ Copy,
+ Clone,
+ Default,
+ Debug,
+ Serialize,
+ Deserialize,
+ PartialEq,
+ JsonSchema,
+ MergeFrom,
+ strum::VariantArray,
+ strum::VariantNames,
+)]
+#[serde(rename_all = "snake_case")]
+pub enum WindowDecorations {
+ /// Zed draws its own window decorations/titlebar (client-side decoration)
+ #[default]
+ Client,
+ /// Show system's window titlebar (server-side decoration; not supported by GNOME Wayland)
+ Server,
+}
+
#[derive(
Copy,
Clone,
@@ -843,6 +843,7 @@ impl VsCodeSettings {
resize_all_panels_in_dock: None,
restore_on_file_reopen: self.read_bool("workbench.editor.restoreViewState"),
restore_on_startup: None,
+ window_decorations: None,
show_call_status_icon: None,
use_system_path_prompts: self.read_bool("files.simpleDialog.enable"),
use_system_prompts: None,
@@ -3264,6 +3264,21 @@ pub(crate) fn settings_data(cx: &App) -> Vec<SettingsPage> {
metadata: None,
files: USER,
}),
+ SettingsPageItem::SettingItem(SettingItem {
+ title: "Window Decorations",
+ description: "(Linux only) whether Zed or your compositor should draw window decorations.",
+ field: Box::new(SettingField {
+ json_path: Some("window_decorations"),
+ pick: |settings_content| {
+ settings_content.workspace.window_decorations.as_ref()
+ },
+ write: |settings_content, value| {
+ settings_content.workspace.window_decorations = value;
+ },
+ }),
+ metadata: None,
+ files: USER,
+ }),
SettingsPageItem::SectionHeader("Pane Modifiers"),
SettingsPageItem::SettingItem(SettingItem {
title: "Inactive Opacity",
@@ -513,6 +513,7 @@ fn init_renderers(cx: &mut App) {
.add_basic_renderer::<settings::ShellDiscriminants>(render_dropdown)
.add_basic_renderer::<settings::EditPredictionsMode>(render_dropdown)
.add_basic_renderer::<settings::RelativeLineNumbers>(render_dropdown)
+ .add_basic_renderer::<settings::WindowDecorations>(render_dropdown)
// please semicolon stay on next line
;
}
@@ -31,6 +31,7 @@ pub struct WorkspaceSettings {
pub close_on_file_delete: bool,
pub use_system_window_tabs: bool,
pub zoomed_padding: bool,
+ pub window_decorations: settings::WindowDecorations,
}
#[derive(Copy, Clone, PartialEq, Debug, Default)]
@@ -105,6 +106,7 @@ impl Settings for WorkspaceSettings {
close_on_file_delete: workspace.close_on_file_delete.unwrap(),
use_system_window_tabs: workspace.use_system_window_tabs.unwrap(),
zoomed_padding: workspace.zoomed_padding.unwrap(),
+ window_decorations: workspace.window_decorations.unwrap(),
}
}
}
@@ -307,7 +307,10 @@ pub fn build_window_options(display_uuid: Option<Uuid>, cx: &mut App) -> WindowO
let window_decorations = match std::env::var("ZED_WINDOW_DECORATIONS") {
Ok(val) if val == "server" => gpui::WindowDecorations::Server,
Ok(val) if val == "client" => gpui::WindowDecorations::Client,
- _ => gpui::WindowDecorations::Client,
+ _ => match WorkspaceSettings::get_global(cx).window_decorations {
+ settings::WindowDecorations::Server => gpui::WindowDecorations::Server,
+ settings::WindowDecorations::Client => gpui::WindowDecorations::Client,
+ },
};
let use_system_window_tabs = WorkspaceSettings::get_global(cx).use_system_window_tabs;