Revert "title_bar: Add configurable window controls position (#38834)" (#40839)

This reverts commit b479d1ef49.

This PR was accidentally merged prematurely.
https://github.com/zed-industries/zed/pull/38834#issuecomment-3424186051

cc @danilo-leal

Release Notes:

- N/A
This commit is contained in:
Be
2025-10-22 00:54:46 +00:00
committed by GitHub
parent 2deafd8706
commit 2338164c10
4 changed files with 53 additions and 162 deletions
-30
View File
@@ -260,32 +260,6 @@ impl strum::VariantNames for BaseKeymapContent {
];
}
/// Position of window control buttons on Linux.
///
/// Valid values: "left" (macOS style) or "right" (Windows/Linux style)
#[derive(
Copy,
Clone,
Debug,
Serialize,
Deserialize,
JsonSchema,
MergeFrom,
PartialEq,
Eq,
Default,
strum::VariantArray,
strum::VariantNames,
)]
#[serde(rename_all = "snake_case")]
pub enum WindowControlsPosition {
/// Window controls on the left side (macOS style)
Left,
/// Window controls on the right side (Windows style)
#[default]
Right,
}
#[skip_serializing_none]
#[derive(Clone, PartialEq, Default, Serialize, Deserialize, JsonSchema, MergeFrom, Debug)]
pub struct TitleBarSettingsContent {
@@ -317,10 +291,6 @@ pub struct TitleBarSettingsContent {
///
/// Default: false
pub show_menus: Option<bool>,
/// Position of window control buttons (minimize, maximize, close) on Linux.
///
/// Default: right
pub window_controls_position: Option<WindowControlsPosition>,
}
/// Configuration of audio in Zed.
+29 -74
View File
@@ -2,7 +2,6 @@ use gpui::{
AnyElement, Context, Decorations, Entity, Hsla, InteractiveElement, IntoElement, MouseButton,
ParentElement, Pixels, StatefulInteractiveElement, Styled, Window, WindowControlArea, div, px,
};
use settings::{Settings, WindowControlsPosition};
use smallvec::SmallVec;
use std::mem;
use ui::prelude::*;
@@ -10,7 +9,6 @@ use ui::prelude::*;
use crate::{
platforms::{platform_linux, platform_mac, platform_windows},
system_window_tabs::SystemWindowTabs,
title_bar_settings::TitleBarSettings,
};
pub struct PlatformTitleBar {
@@ -136,78 +134,35 @@ impl Render for PlatformTitleBar {
PlatformStyle::Mac => title_bar,
PlatformStyle::Linux => {
if matches!(decorations, Decorations::Client { .. }) {
let title_bar_settings = TitleBarSettings::get(None, cx);
match title_bar_settings.window_controls_position {
WindowControlsPosition::Left => h_flex()
.w_full()
.bg(titlebar_color)
.child(platform_linux::LinuxWindowControls::new(close_action))
.child(title_bar)
.when(supported_controls.window_menu, |titlebar| {
titlebar.on_mouse_down(
MouseButton::Right,
move |ev, window, _| {
window.show_window_menu(ev.position)
},
)
})
.on_mouse_move(cx.listener(move |this, _ev, window, _| {
if this.should_move {
this.should_move = false;
window.start_window_move();
}
}))
.on_mouse_down_out(cx.listener(
move |this, _ev, _window, _cx| {
this.should_move = false;
},
))
.on_mouse_up(
MouseButton::Left,
cx.listener(move |this, _ev, _window, _cx| {
this.should_move = false;
}),
)
.on_mouse_down(
MouseButton::Left,
cx.listener(move |this, _ev, _window, _cx| {
this.should_move = true;
}),
),
WindowControlsPosition::Right => title_bar
.child(platform_linux::LinuxWindowControls::new(close_action))
.when(supported_controls.window_menu, |titlebar| {
titlebar.on_mouse_down(
MouseButton::Right,
move |ev, window, _| {
window.show_window_menu(ev.position)
},
)
})
.on_mouse_move(cx.listener(move |this, _ev, window, _| {
if this.should_move {
this.should_move = false;
window.start_window_move();
}
}))
.on_mouse_down_out(cx.listener(
move |this, _ev, _window, _cx| {
this.should_move = false;
},
))
.on_mouse_up(
MouseButton::Left,
cx.listener(move |this, _ev, _window, _cx| {
this.should_move = false;
}),
)
.on_mouse_down(
MouseButton::Left,
cx.listener(move |this, _ev, _window, _cx| {
this.should_move = true;
}),
),
}
title_bar
.child(platform_linux::LinuxWindowControls::new(close_action))
.when(supported_controls.window_menu, |titlebar| {
titlebar
.on_mouse_down(MouseButton::Right, move |ev, window, _| {
window.show_window_menu(ev.position)
})
})
.on_mouse_move(cx.listener(move |this, _ev, window, _| {
if this.should_move {
this.should_move = false;
window.start_window_move();
}
}))
.on_mouse_down_out(cx.listener(move |this, _ev, _window, _cx| {
this.should_move = false;
}))
.on_mouse_up(
MouseButton::Left,
cx.listener(move |this, _ev, _window, _cx| {
this.should_move = false;
}),
)
.on_mouse_down(
MouseButton::Left,
cx.listener(move |this, _ev, _window, _cx| {
this.should_move = true;
}),
)
} else {
title_bar
}
@@ -1,6 +1,4 @@
use crate::title_bar_settings::TitleBarSettings;
use gpui::{Action, Hsla, MouseButton, prelude::*, svg};
use settings::{Settings, WindowControlsPosition};
use ui::prelude::*;
#[derive(IntoElement)]
@@ -16,62 +14,33 @@ impl LinuxWindowControls {
}
}
impl LinuxWindowControls {
/// Builds the window controls based on the position setting.
fn build_controls(
position: WindowControlsPosition,
window: &Window,
close_action: Box<dyn Action>,
cx: &mut App,
) -> Vec<WindowControl> {
let maximize_type = if window.is_maximized() {
WindowControlType::Restore
} else {
WindowControlType::Maximize
};
match position {
WindowControlsPosition::Left => {
// Left side: Close, Minimize, Maximize (left to right)
vec![
WindowControl::new_close("close", WindowControlType::Close, close_action, cx),
WindowControl::new("minimize", WindowControlType::Minimize, cx),
WindowControl::new("maximize-or-restore", maximize_type, cx),
]
}
WindowControlsPosition::Right => {
// Right side: Minimize, Maximize, Close (left to right)
vec![
WindowControl::new("minimize", WindowControlType::Minimize, cx),
WindowControl::new("maximize-or-restore", maximize_type, cx),
WindowControl::new_close("close", WindowControlType::Close, close_action, cx),
]
}
}
}
}
impl RenderOnce for LinuxWindowControls {
fn render(self, window: &mut Window, cx: &mut App) -> impl IntoElement {
let title_bar_settings = TitleBarSettings::get(None, cx);
let controls = Self::build_controls(
title_bar_settings.window_controls_position,
window,
self.close_window_action,
cx,
);
let mut element = h_flex()
h_flex()
.id("generic-window-controls")
.px_3()
.gap_3()
.on_mouse_down(MouseButton::Left, |_, _, cx| cx.stop_propagation());
for control in controls {
element = element.child(control);
}
element
.on_mouse_down(MouseButton::Left, |_, _, cx| cx.stop_propagation())
.child(WindowControl::new(
"minimize",
WindowControlType::Minimize,
cx,
))
.child(WindowControl::new(
"maximize-or-restore",
if window.is_maximized() {
WindowControlType::Restore
} else {
WindowControlType::Maximize
},
cx,
))
.child(WindowControl::new_close(
"close",
WindowControlType::Close,
self.close_window_action,
cx,
))
}
}
@@ -111,7 +80,7 @@ impl WindowControlStyle {
let colors = cx.theme().colors();
Self {
background: colors.title_bar_background,
background: colors.ghost_element_background,
background_hover: colors.ghost_element_hover,
icon: colors.icon,
icon_hover: colors.icon_muted,
@@ -216,7 +185,6 @@ impl RenderOnce for WindowControl {
.rounded_2xl()
.w_5()
.h_5()
.bg(self.style.background)
.hover(|this| this.bg(self.style.background_hover))
.active(|this| this.bg(self.style.background_hover))
.child(icon)
+1 -3
View File
@@ -1,4 +1,4 @@
use settings::{Settings, SettingsContent, WindowControlsPosition};
use settings::{Settings, SettingsContent};
#[derive(Copy, Clone, Debug)]
pub struct TitleBarSettings {
@@ -9,7 +9,6 @@ pub struct TitleBarSettings {
pub show_project_items: bool,
pub show_sign_in: bool,
pub show_menus: bool,
pub window_controls_position: WindowControlsPosition,
}
impl Settings for TitleBarSettings {
@@ -23,7 +22,6 @@ impl Settings for TitleBarSettings {
show_project_items: content.show_project_items.unwrap(),
show_sign_in: content.show_sign_in.unwrap(),
show_menus: content.show_menus.unwrap(),
window_controls_position: content.window_controls_position.unwrap_or_default(),
}
}
}