diff --git a/crates/gpui/src/app.rs b/crates/gpui/src/app.rs index 3ac9587930..560a24456a 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 bd0170d622..f7183ad0bf 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 c02646ae46..f41a02784e 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 c0b14742f6..6cd533cfe0 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 957f753da3..4c649d927e 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);