summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop/src-tauri
diff options
context:
space:
mode:
authorIsrael Araújo de Oliveira <[email protected]>2026-02-09 06:00:35 -0300
committerGitHub <[email protected]>2026-02-09 17:00:35 +0800
commit93a11ddedf697c9b673dd59628cee3db48ac67d0 (patch)
treeeaa37846d594604d49afb0333662df453103e88f /packages/desktop/src-tauri
parent94feb811ca32f4e01a1bada9cfbc022e8d5ca9e3 (diff)
downloadopencode-93a11ddedf697c9b673dd59628cee3db48ac67d0.tar.gz
opencode-93a11ddedf697c9b673dd59628cee3db48ac67d0.zip
feat(desktop): add native Wayland toggle on Linux (#11971)
Co-authored-by: Brendan Allan <[email protected]>
Diffstat (limited to 'packages/desktop/src-tauri')
-rw-r--r--packages/desktop/src-tauri/src/lib.rs41
-rw-r--r--packages/desktop/src-tauri/src/linux_display.rs47
-rw-r--r--packages/desktop/src-tauri/src/main.rs17
3 files changed, 100 insertions, 5 deletions
diff --git a/packages/desktop/src-tauri/src/lib.rs b/packages/desktop/src-tauri/src/lib.rs
index 14105e5dd..92eead786 100644
--- a/packages/desktop/src-tauri/src/lib.rs
+++ b/packages/desktop/src-tauri/src/lib.rs
@@ -2,6 +2,8 @@ mod cli;
mod constants;
#[cfg(windows)]
mod job_object;
+#[cfg(target_os = "linux")]
+mod linux_display;
mod markdown;
mod server;
mod window_customizer;
@@ -194,6 +196,43 @@ fn check_macos_app(app_name: &str) -> bool {
.unwrap_or(false)
}
+#[derive(serde::Serialize, serde::Deserialize, specta::Type)]
+#[serde(rename_all = "camelCase")]
+pub enum LinuxDisplayBackend {
+ Wayland,
+ Auto,
+}
+
+#[tauri::command]
+#[specta::specta]
+fn get_display_backend() -> Option<LinuxDisplayBackend> {
+ #[cfg(target_os = "linux")]
+ {
+ let prefer = linux_display::read_wayland().unwrap_or(false);
+ return Some(if prefer {
+ LinuxDisplayBackend::Wayland
+ } else {
+ LinuxDisplayBackend::Auto
+ });
+ }
+
+ #[cfg(not(target_os = "linux"))]
+ None
+}
+
+#[tauri::command]
+#[specta::specta]
+fn set_display_backend(_app: AppHandle, _backend: LinuxDisplayBackend) -> Result<(), String> {
+ #[cfg(target_os = "linux")]
+ {
+ let prefer = matches!(_backend, LinuxDisplayBackend::Wayland);
+ return linux_display::write_wayland(&_app, prefer);
+ }
+
+ #[cfg(not(target_os = "linux"))]
+ Ok(())
+}
+
#[cfg(target_os = "linux")]
fn check_linux_app(app_name: &str) -> bool {
return true;
@@ -209,6 +248,8 @@ pub fn run() {
await_initialization,
server::get_default_server_url,
server::set_default_server_url,
+ get_display_backend,
+ set_display_backend,
markdown::parse_markdown_command,
check_app_exists
])
diff --git a/packages/desktop/src-tauri/src/linux_display.rs b/packages/desktop/src-tauri/src/linux_display.rs
new file mode 100644
index 000000000..9e1cf9091
--- /dev/null
+++ b/packages/desktop/src-tauri/src/linux_display.rs
@@ -0,0 +1,47 @@
+use serde::{Deserialize, Serialize};
+use serde_json::json;
+use std::path::PathBuf;
+use tauri::AppHandle;
+use tauri_plugin_store::StoreExt;
+
+use crate::constants::SETTINGS_STORE;
+
+pub const LINUX_DISPLAY_CONFIG_KEY: &str = "linuxDisplayConfig";
+
+#[derive(Default, Serialize, Deserialize)]
+struct DisplayConfig {
+ wayland: Option<bool>,
+}
+
+fn dir() -> Option<PathBuf> {
+ Some(dirs::data_dir()?.join("ai.opencode.desktop"))
+}
+
+fn path() -> Option<PathBuf> {
+ dir().map(|dir| dir.join(SETTINGS_STORE))
+}
+
+pub fn read_wayland() -> Option<bool> {
+ let path = path()?;
+ let raw = std::fs::read_to_string(path).ok()?;
+ let config = serde_json::from_str::<DisplayConfig>(&raw).ok()?;
+ config.wayland
+}
+
+pub fn write_wayland(app: &AppHandle, value: bool) -> Result<(), String> {
+ let store = app
+ .store(SETTINGS_STORE)
+ .map_err(|e| format!("Failed to open settings store: {}", e))?;
+
+ store.set(
+ LINUX_DISPLAY_CONFIG_KEY,
+ json!(DisplayConfig {
+ wayland: Some(value),
+ }),
+ );
+ store
+ .save()
+ .map_err(|e| format!("Failed to save settings store: {}", e))?;
+
+ Ok(())
+}
diff --git a/packages/desktop/src-tauri/src/main.rs b/packages/desktop/src-tauri/src/main.rs
index 9ffee8aa5..a95c62578 100644
--- a/packages/desktop/src-tauri/src/main.rs
+++ b/packages/desktop/src-tauri/src/main.rs
@@ -3,6 +3,9 @@
// borrowed from https://github.com/skyline69/balatro-mod-manager
#[cfg(target_os = "linux")]
+mod display;
+
+#[cfg(target_os = "linux")]
fn configure_display_backend() -> Option<String> {
use std::env;
@@ -23,12 +26,16 @@ fn configure_display_backend() -> Option<String> {
return None;
}
- // Allow users to explicitly keep Wayland if they know their setup is stable.
- let allow_wayland = matches!(
- env::var("OC_ALLOW_WAYLAND"),
- Ok(v) if matches!(v.to_ascii_lowercase().as_str(), "1" | "true" | "yes")
- );
+ let prefer_wayland = display::read_wayland().unwrap_or(false);
+ let allow_wayland = prefer_wayland
+ || matches!(
+ env::var("OC_ALLOW_WAYLAND"),
+ Ok(v) if matches!(v.to_ascii_lowercase().as_str(), "1" | "true" | "yes")
+ );
if allow_wayland {
+ if prefer_wayland {
+ return Some("Wayland session detected; using native Wayland from settings".into());
+ }
return Some("Wayland session detected; respecting OC_ALLOW_WAYLAND=1".into());
}