#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
#[cfg(target_os = "linux")]
fn prefers_wayland(backend: Option<&str>) -> bool {
match backend {
Some(list) => matches!(
list.split(',').next().map(str::trim),
Some("wayland") | Some("*") | Some("")
),
None => true,
}
}
#[cfg(target_os = "linux")]
fn nvidia_on_wayland() -> bool {
let on_wayland = (std::env::var_os("WAYLAND_DISPLAY").is_some()
|| std::env::var_os("WAYLAND_SOCKET").is_some()
|| std::env::var("XDG_SESSION_TYPE").as_deref() == Ok("wayland"))
&& prefers_wayland(std::env::var("GDK_BACKEND").ok().as_deref());
on_wayland && std::path::Path::new("/sys/module/nvidia_drm").exists()
}
fn main() {
#[cfg(target_os = "linux")]
if std::env::var_os("WEBKIT_DISABLE_DMABUF_RENDERER").is_none() && nvidia_on_wayland() {
std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
eprintln!("kana-trainer: Nvidia on Wayland, disabling WebKit DMA-BUF renderer");
}
kana_trainer_lib::run();
}
#[cfg(all(test, target_os = "linux"))]
mod tests {
use super::prefers_wayland;
#[test]
fn gdk_backend_ordering() {
assert!(prefers_wayland(None));
assert!(prefers_wayland(Some("wayland")));
assert!(prefers_wayland(Some("wayland,x11")));
assert!(prefers_wayland(Some(" wayland , x11")));
assert!(prefers_wayland(Some("*")));
assert!(!prefers_wayland(Some("x11")));
assert!(!prefers_wayland(Some("x11,wayland")));
}
}
#[cfg(all(test, target_os = "linux"))]
mod probe {
#[test]
#[ignore = "machine-specific probe, not a pass/fail assertion"]
fn nvidia_on_wayland_here() {
println!("nvidia_on_wayland() = {}", super::nvidia_on_wayland());
}
}