mirror of
https://github.com/by-sonic/tglock.git
synced 2026-08-12 09:50:27 +03:00
fix(gui): просить программный рендер, чтобы окно создавалось без 3D (#28)
Интерфейс построен на системном WebView, а тот без 3D-ускорения окно не создаёт. Отсюда весь класс жалоб: не стартует в виртуалке, не стартует с дефолтным драйвером Microsoft, не стартует без монитора. Диагноз в #17 дал @de4me: в VirtualBox приложение запускается только после включения галочки «Включить ускорение 3D». Перед стартом Tauri TGLock теперь сам запрашивает программный рендер: - Windows: WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS с --disable-gpu и --disable-gpu-compositing; - Linux: WEBKIT_DISABLE_COMPOSITING_MODE и WEBKIT_DISABLE_DMABUF_RENDERER; - macOS: не требуется, WebKit сам уходит в программный рендер. Для панели со статусом программный рендер не стоит ничего заметного, поэтому он выбран значением по умолчанию, а не аварийным режимом. Уже заданные оператором переменные не перезаписываются, TGLOCK_FORCE_GPU=1 отключает механизм целиком. Логика вынесена в чистую функцию software_rendering_vars и покрыта четырьмя тестами: значение по умолчанию, отключение через TGLOCK_FORCE_GPU, уважение чужой переменной и правильный набор ключей на каждой платформе. Версия поднята до 2.0.0-beta.2 в Cargo.toml, package.json и tauri.conf.json: нужен тег, чтобы в релиз попали и tglock-cli, и этот фикс. README получил отдельный вопрос в FAQ про «окно не появляется», ARCHITECTURE_V2.md — обновлённый пункт в Current limitations. Co-authored-by: by-sonic <171230345+by-sonic@users.noreply.github.com>
This commit is contained in:
+96
@@ -222,7 +222,56 @@ fn push_log(logs: &Arc<Mutex<Vec<LogLine>>>, message: String, error: bool) {
|
||||
});
|
||||
}
|
||||
|
||||
/// Environment variables that make the WebView render without a GPU.
|
||||
///
|
||||
/// The window is never created when 3D acceleration is unavailable: no
|
||||
/// monitor, the default Microsoft display driver, a virtual machine without
|
||||
/// 3D enabled (by-sonic/tglock#10, by-sonic/tglock#17). For a small status
|
||||
/// panel software rendering costs nothing noticeable, so preferring it is the
|
||||
/// safer default.
|
||||
///
|
||||
/// Values already present in the environment are never overwritten, and
|
||||
/// `TGLOCK_FORCE_GPU` disables the whole mechanism.
|
||||
fn software_rendering_vars(
|
||||
force_gpu: bool,
|
||||
is_set: impl Fn(&str) -> bool,
|
||||
) -> Vec<(&'static str, &'static str)> {
|
||||
if force_gpu {
|
||||
return Vec::new();
|
||||
}
|
||||
|
||||
let candidates: &[(&str, &str)] = if cfg!(target_os = "windows") {
|
||||
&[(
|
||||
"WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS",
|
||||
"--disable-gpu --disable-gpu-compositing",
|
||||
)]
|
||||
} else if cfg!(target_os = "macos") {
|
||||
// WebKit on macOS falls back to software rendering on its own.
|
||||
&[]
|
||||
} else {
|
||||
&[
|
||||
("WEBKIT_DISABLE_COMPOSITING_MODE", "1"),
|
||||
("WEBKIT_DISABLE_DMABUF_RENDERER", "1"),
|
||||
]
|
||||
};
|
||||
|
||||
candidates
|
||||
.iter()
|
||||
.filter(|(key, _)| !is_set(key))
|
||||
.copied()
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn prefer_software_rendering() {
|
||||
let force_gpu = std::env::var_os("TGLOCK_FORCE_GPU").is_some();
|
||||
for (key, value) in software_rendering_vars(force_gpu, |key| std::env::var_os(key).is_some()) {
|
||||
std::env::set_var(key, value);
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
prefer_software_rendering();
|
||||
|
||||
tauri::Builder::default()
|
||||
.setup(|app| {
|
||||
let settings_path = app
|
||||
@@ -243,3 +292,50 @@ fn main() {
|
||||
.run(tauri::generate_context!())
|
||||
.expect("failed to run TGLock");
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn software_rendering_is_requested_by_default() {
|
||||
let vars = software_rendering_vars(false, |_| false);
|
||||
if cfg!(target_os = "macos") {
|
||||
assert!(vars.is_empty(), "macOS needs no override");
|
||||
} else {
|
||||
assert!(
|
||||
!vars.is_empty(),
|
||||
"a machine without 3D acceleration must still get a window"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn force_gpu_disables_the_override() {
|
||||
assert!(software_rendering_vars(true, |_| false).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn an_operators_own_value_is_never_overwritten() {
|
||||
assert!(software_rendering_vars(false, |_| true).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn windows_uses_webview2_arguments_and_linux_uses_webkit_ones() {
|
||||
let keys: Vec<_> = software_rendering_vars(false, |_| false)
|
||||
.into_iter()
|
||||
.map(|(key, _)| key)
|
||||
.collect();
|
||||
if cfg!(target_os = "windows") {
|
||||
assert_eq!(keys, ["WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS"]);
|
||||
} else if cfg!(target_os = "linux") {
|
||||
assert_eq!(
|
||||
keys,
|
||||
[
|
||||
"WEBKIT_DISABLE_COMPOSITING_MODE",
|
||||
"WEBKIT_DISABLE_DMABUF_RENDERER"
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user