Просмотр исходного кода

tauri: configure display backends more correctly on linux (#5730)

Brendan Allan 2 месяцев назад
Родитель
Сommit
17221e6ffe
1 измененных файлов с 57 добавлено и 0 удалено
  1. 57 0
      packages/tauri/src-tauri/src/main.rs

+ 57 - 0
packages/tauri/src-tauri/src/main.rs

@@ -1,6 +1,63 @@
 // Prevents additional console window on Windows in release, DO NOT REMOVE!!
 #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
 
+// borrowed from https://github.com/skyline69/balatro-mod-manager
+#[cfg(target_os = "linux")]
+fn configure_display_backend() -> Option<String> {
+    use std::env;
+
+    let set_env_if_absent = |key: &str, value: &str| {
+        if env::var_os(key).is_none() {
+            // Safety: called during startup before any threads are spawned, so mutating the
+            // process environment is safe.
+            unsafe { env::set_var(key, value) };
+        }
+    };
+
+    let on_wayland = env::var_os("WAYLAND_DISPLAY").is_some()
+        || matches!(
+            env::var("XDG_SESSION_TYPE"),
+            Ok(v) if v.eq_ignore_ascii_case("wayland")
+        );
+    if !on_wayland {
+        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")
+    );
+    if allow_wayland {
+        return Some("Wayland session detected; respecting OC_ALLOW_WAYLAND=1".into());
+    }
+
+    // Prefer XWayland when available to avoid Wayland protocol errors seen during startup.
+    if env::var_os("DISPLAY").is_some() {
+        set_env_if_absent("WINIT_UNIX_BACKEND", "x11");
+        set_env_if_absent("GDK_BACKEND", "x11");
+        set_env_if_absent("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
+        return Some(
+            "Wayland session detected; forcing X11 backend to avoid compositor protocol errors. \
+               Set OC_ALLOW_WAYLAND=1 to keep native Wayland."
+                .into(),
+        );
+    }
+
+    set_env_if_absent("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
+    Some(
+        "Wayland session detected without X11; leaving Wayland enabled (set WINIT_UNIX_BACKEND/GDK_BACKEND manually if needed)."
+            .into(),
+    )
+}
+
 fn main() {
+    #[cfg(target_os = "linux")]
+    {
+        if let Some(backend_note) = configure_display_backend() {
+            eprintln!("{backend_note:?}");
+        }
+    }
+
     opencode_lib::run()
 }