From 04e25525bf5c279f61a46f63f33e891663c5bb48 Mon Sep 17 00:00:00 2001 From: apricotbucket28 <71973804+apricotbucket28@users.noreply.github.com> Date: Sat, 27 Jul 2024 16:29:48 -0300 Subject: [PATCH] x11: Fix window menu not showing (#15328) Fixes https://github.com/zed-industries/zed/issues/15245#issuecomment-2252790889 Release Notes: - Linux: Fixed window menu not showing on X11 --- crates/gpui/src/platform.rs | 21 ++++++++++++------- .../gpui/src/platform/linux/wayland/window.rs | 8 +------ crates/gpui/src/platform/linux/x11/window.rs | 8 +++++++ 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index 7bd1b29443..4183a94114 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -255,7 +255,7 @@ pub enum Decorations { } /// What window controls this platform supports -#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Default)] +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] pub struct WindowControls { /// Whether this platform supports fullscreen pub fullscreen: bool, @@ -267,6 +267,18 @@ pub struct WindowControls { pub window_menu: bool, } +impl Default for WindowControls { + fn default() -> Self { + // Assume that we can do anything, unless told otherwise + Self { + fullscreen: true, + maximize: true, + minimize: true, + window_menu: true, + } + } +} + /// A type to describe which sides of the window are currently tiled in some way #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Default)] pub struct Tiling { @@ -355,12 +367,7 @@ pub(crate) trait PlatformWindow: HasWindowHandle + HasDisplayHandle { } fn set_app_id(&mut self, _app_id: &str) {} fn window_controls(&self) -> WindowControls { - WindowControls { - fullscreen: true, - maximize: true, - minimize: true, - window_menu: false, - } + WindowControls::default() } fn set_client_inset(&self, _inset: Pixels) {} fn gpu_specs(&self) -> Option; diff --git a/crates/gpui/src/platform/linux/wayland/window.rs b/crates/gpui/src/platform/linux/wayland/window.rs index 2efbd1a2ec..2bd57adafc 100644 --- a/crates/gpui/src/platform/linux/wayland/window.rs +++ b/crates/gpui/src/platform/linux/wayland/window.rs @@ -185,13 +185,7 @@ impl WaylandWindowState { active: false, hovered: false, in_progress_window_controls: None, - // Assume that we can do anything, unless told otherwise - window_controls: WindowControls { - fullscreen: true, - maximize: true, - minimize: true, - window_menu: true, - }, + window_controls: WindowControls::default(), inset: None, }) } diff --git a/crates/gpui/src/platform/linux/x11/window.rs b/crates/gpui/src/platform/linux/x11/window.rs index b6c775db4e..f8e7296545 100644 --- a/crates/gpui/src/platform/linux/x11/window.rs +++ b/crates/gpui/src/platform/linux/x11/window.rs @@ -1230,6 +1230,14 @@ impl PlatformWindow for X11Window { fn show_window_menu(&self, position: Point) { let state = self.0.state.borrow(); + + self.0 + .xcb_connection + .ungrab_pointer(x11rb::CURRENT_TIME) + .unwrap() + .check() + .unwrap(); + let coords = self.get_root_position(position); let message = ClientMessageEvent::new( 32,