diff options
| author | Israel Araújo de Oliveira <[email protected]> | 2026-02-09 06:00:35 -0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-02-09 17:00:35 +0800 |
| commit | 93a11ddedf697c9b673dd59628cee3db48ac67d0 (patch) | |
| tree | eaa37846d594604d49afb0333662df453103e88f /packages/desktop/src-tauri | |
| parent | 94feb811ca32f4e01a1bada9cfbc022e8d5ca9e3 (diff) | |
| download | opencode-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.rs | 41 | ||||
| -rw-r--r-- | packages/desktop/src-tauri/src/linux_display.rs | 47 | ||||
| -rw-r--r-- | packages/desktop/src-tauri/src/main.rs | 17 |
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()); } |
