mirror of
https://github.com/by-sonic/tglock.git
synced 2026-08-08 07:13:23 +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:
Generated
+1
-1
@@ -3553,7 +3553,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tglock"
|
||||
version = "2.0.0-beta.1"
|
||||
version = "2.0.0-beta.2"
|
||||
dependencies = [
|
||||
"aes",
|
||||
"cipher",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tglock"
|
||||
version = "2.0.0-beta.1"
|
||||
version = "2.0.0-beta.2"
|
||||
edition = "2021"
|
||||
rust-version = "1.88"
|
||||
description = "Telegram unblock via local WebSocket tunnel"
|
||||
|
||||
@@ -323,6 +323,16 @@ xattr -cr /Applications/TGLock.app
|
||||
- На macOS — убедись что снят Gatekeeper (`xattr -cr ...`).
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Приложение вообще не запускается — окно не появляется</b></summary>
|
||||
|
||||
Так проявляется отсутствие 3D-ускорения: интерфейс построен на системном WebView, а тот без ускорения окно не создаёт. Отсюда же случаи «не работает в виртуалке», «не стартует с дефолтным драйвером Microsoft» и «нет монитора».
|
||||
|
||||
Начиная с **2.0.0-beta.2** TGLock сам просит у WebView программный рендер, так что на таких машинах должен запускаться. Если хочется вернуть аппаратное ускорение — запусти с переменной `TGLOCK_FORCE_GPU=1`.
|
||||
|
||||
Если окно всё равно не появилось, интерфейс тебе и не нужен: возьми [`tglock-cli`](#-без-графического-интерфейса-tglock-cli), которому WebView не требуется вообще. И напиши в [#10](https://github.com/by-sonic/tglock/issues/10) или [#17](https://github.com/by-sonic/tglock/issues/17), что именно за система — это как раз те ишью.
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><b>Порт 1080 уже занят другим приложением</b></summary>
|
||||
|
||||
|
||||
+12
-8
@@ -12,9 +12,11 @@
|
||||
|
||||
Фича `gui` включена по умолчанию и подтягивает `tauri`, `tauri-build` и `open`.
|
||||
При `--no-default-features` ни Tauri, ни системный WebView, ни фронтенд в сборку
|
||||
не попадают, и `build.rs` не вызывает `tauri_build`. Это единственный способ
|
||||
собрать и запустить TGLock там, где WebView не создаёт окно: сервер, контейнер,
|
||||
виртуалка, машина без монитора или без 3D-ускорения.
|
||||
не попадают, и `build.rs` не вызывает `tauri_build`. Так TGLock собирается и
|
||||
работает там, где WebView недоступен в принципе: сервер без графического
|
||||
окружения, контейнер, машина без монитора. Для случаев, где WebView есть, но нет
|
||||
3D-ускорения, GUI дополнительно просит программный рендер — см. Current
|
||||
limitations.
|
||||
|
||||
## Local protocols
|
||||
|
||||
@@ -109,11 +111,13 @@ Worker должен принимать WebSocket на:
|
||||
- SNI camouflage не включена: небезопасное отключение hostname verification
|
||||
из референсной реализации не переносится.
|
||||
- Голосовые звонки по UDP не поддерживаются.
|
||||
- **GUI не запускается там, где WebView не может создать окно** — нет
|
||||
3D-ускорения, дефолтный видеодрайвер, отсутствует монитор, виртуальная
|
||||
машина. Это ограничение Tauri, а не транспорта; программный рендер как
|
||||
обходной путь не проверен. Рабочий вариант для таких машин — `tglock-cli`
|
||||
(issues #10, #17).
|
||||
- **GUI зависит от WebView, а тот — от 3D-ускорения.** Начиная с
|
||||
2.0.0-beta.2 приложение перед стартом Tauri само просит программный рендер:
|
||||
на Windows через `WEBVIEW2_ADDITIONAL_BROWSER_ARGUMENTS`, на Linux через
|
||||
`WEBKIT_DISABLE_COMPOSITING_MODE` и `WEBKIT_DISABLE_DMABUF_RENDERER`. Уже
|
||||
заданные оператором значения не перезаписываются, а `TGLOCK_FORCE_GPU=1`
|
||||
возвращает аппаратное ускорение. Для машин без монитора остаётся
|
||||
`tglock-cli`, которому WebView не нужен вовсе (issues #10, #17).
|
||||
- Windows-инсталлятор не подписан, macOS-сборка не нотарифицирована. Часть
|
||||
антивирусов реагирует на неподписанный установщик, открывающий локальный
|
||||
сокет; проверяемый ответ — сборка из исходников либо публичные логи
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "tglock-ui",
|
||||
"private": true,
|
||||
"version": "2.0.0-beta.1",
|
||||
"version": "2.0.0-beta.2",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite --port 1420",
|
||||
|
||||
+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"
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "TGLock",
|
||||
"version": "2.0.0-beta.1",
|
||||
"version": "2.0.0-beta.2",
|
||||
"identifier": "com.bysonic.tglock",
|
||||
"build": {
|
||||
"beforeDevCommand": "npm run dev",
|
||||
|
||||
Reference in New Issue
Block a user