From 6e459e1f9676e592274030acc83bbaa29a6c2a92 Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Thu, 16 May 2024 21:43:23 -0600 Subject: [PATCH] Report an error when trying to open ui in linux::headless --- crates/gpui/src/app.rs | 7 +++++++ crates/gpui/src/platform.rs | 3 +++ crates/gpui/src/platform/linux/headless/client.rs | 4 ++++ crates/gpui/src/platform/linux/platform.rs | 7 +++++++ crates/zed/src/main.rs | 4 ++++ 5 files changed, 25 insertions(+) diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 3ac958793052..560a24456aa3 100644 --- a/crates/gpui/src/app.rs +++ b/crates/gpui/src/app.rs @@ -502,6 +502,13 @@ impl AppContext { }) } + /// Returns Ok() if the platform supports opening windows. + /// This returns false (for example) on linux when we could + /// not establish a connection to X or Wayland. + pub fn can_open_windows(&self) -> anyhow::Result<()> { + self.platform.can_open_windows() + } + /// Instructs the platform to activate the application by bringing it to the foreground. pub fn activate(&self, ignoring_other_apps: bool) { self.platform.activate(ignoring_other_apps); diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index bd0170d62243..f7183ad0bf34 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -108,6 +108,9 @@ pub(crate) trait Platform: 'static { fn displays(&self) -> Vec>; fn primary_display(&self) -> Option>; fn active_window(&self) -> Option; + fn can_open_windows(&self) -> anyhow::Result<()> { + Ok(()) + } fn open_window( &self, handle: AnyWindowHandle, diff --git a/crates/gpui/src/platform/linux/headless/client.rs b/crates/gpui/src/platform/linux/headless/client.rs index c02646ae4649..f41a02784efc 100644 --- a/crates/gpui/src/platform/linux/headless/client.rs +++ b/crates/gpui/src/platform/linux/headless/client.rs @@ -68,6 +68,10 @@ impl LinuxClient for HeadlessClient { None } + fn can_open_windows(&self) -> anyhow::Result<()> { + return Err(anyhow::anyhow!("neither DISPLAY, nor WAYLAND_DISPLAY found. You can still run zed for remote development with --dev-server-token.")); + } + fn open_window( &self, _handle: AnyWindowHandle, diff --git a/crates/gpui/src/platform/linux/platform.rs b/crates/gpui/src/platform/linux/platform.rs index c0b14742f6b3..6cd533cfe0c6 100644 --- a/crates/gpui/src/platform/linux/platform.rs +++ b/crates/gpui/src/platform/linux/platform.rs @@ -55,6 +55,9 @@ pub trait LinuxClient { fn displays(&self) -> Vec>; fn primary_display(&self) -> Option>; fn display(&self, id: DisplayId) -> Option>; + fn can_open_windows(&self) -> anyhow::Result<()> { + Ok(()) + } fn open_window( &self, handle: AnyWindowHandle, @@ -132,6 +135,10 @@ impl Platform for P { }); } + fn can_open_windows(&self) -> anyhow::Result<()> { + self.can_open_windows() + } + fn quit(&self) { self.with_common(|common| common.signal.stop()); } diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index 957f753da31c..4c649d927e22 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -124,6 +124,10 @@ fn init_ui(app_state: Arc, cx: &mut AppContext) -> Result<()> { } }; + if let Err(err) = cx.can_open_windows() { + return Err(err); + } + SystemAppearance::init(cx); load_embedded_fonts(cx);