This commit is contained in:
2026-10-18 00:49:38 +07:00
parent 62d56962e0
commit 7f2a02b69f
8 changed files with 71 additions and 12 deletions
+4 -2
View File
@@ -57,8 +57,10 @@ Commit и push выполняет только пользователь. Вло
Нужны Node.js 24.15+ и ffmpeg с libx264 в PATH.
В Linux приложение использует X11; для сессии Wayland нужен XWayland, чтобы
размещать показ на выбранном мониторе.
В Wayland-сессии отключается GPU-композиция окон: на текущем Manjaro-стенде
Electron/ANGLE падает при создании EGL-поверхности. Отключать sandbox для запуска не нужно.
Команды npm передают выбор X11 до старта Electron. Обычный запуск Linux-сборки
без этого флага автоматически перезапускает её с X11 до создания окон.
Поздний выбор X11 из main.js смешивал Wayland/X11 и оставлял пульт невидимым.
Отключать GPU или sandbox для запуска не нужно.
```sh
npm ci
+6
View File
@@ -235,6 +235,12 @@ SCREEN-009 (LAN-пульт) отменена владельцем; ID не пе
профилем подтверждён отрисованным пультом без падений GPU. 77 тестов, типы,
линтеры и GUI smoke без no-sandbox/disable-gpu — PASS. Linux x64 пересобран;
подробности в docs/SCREEN-008_RESULTS.md. Аппаратная приёмка остаётся открытой.
- Уточнение SCREEN-001/008 (2026-10-18): предыдущая проверка снимком страницы
не подтверждала native-видимость окна. Причина — выбор X11 через appendSwitch
после выбора Wayland в Electron. npm-команды теперь используют ранний X11;
обычный Linux-запуск перезапускается с ним до создания окон. Прежнее отключение
GPU-композиции удалено. Проверены native XID и регистрация окна в KWin; 77 тестов,
типы, линтеры и GUI smoke — PASS. Аппаратная приёмка остаётся открытой.
- Открыто: получить macOS x64/arm64 через workflow после commit/push владельцем;
выполнить аппаратную матрицу, включая оба Linux-дистрибутива, час офлайн,
проектор/звук/телефон и физические замеры на M1. Статус IN_PROGRESS до получения
+30 -1
View File
@@ -83,7 +83,11 @@ macOS нет. Этот стенд не подтверждает Ubuntu/Debian,
Прежние ограничения GUI-стенда сохраняются: Linux x64, синтетический внешний
дисплей, тестовые no-sandbox/mute-audio/disable-gpu. Новых аппаратных результатов нет.
## Исправление запуска на Manjaro XWayland (2026-10-17)
## Диагностика запуска на Manjaro XWayland (2026-10-17)
Вывод о видимости окна ниже опровергнут 2026-10-18: снимок страницы и
isVisible() подтвердили внутреннее состояние Electron, но окно не было
зарегистрировано в KWin. Прежний обход GPU-композиции удалён; исправление ниже.
- Обычный запуск исходников с чистым профилем воспроизвёл три падения GPU-процесса
с exit_code=139. Coredump указывает на libGLESv2/ANGLE, EGL_CreateWindowSurface
@@ -108,6 +112,31 @@ macOS нет. Этот стенд не подтверждает Ubuntu/Debian,
SCREEN-001/008 остаются IN_PROGRESS. Diff проверен вручную по применимому
стандарту; нарушений не найдено. Коммиты и push агент не выполнял.
## Исправление невидимого окна (2026-10-18)
- Без раннего X11-флага Electron возвращал native handle `1` и isVisible=true,
но `_NET_CLIENT_LIST` KWin оставался пустым. DOM пульта был загружен. Это
объясняет ложноположительные прежние проверки снимком страницы и GUI smoke.
- С CLI-флагом `--ozone-platform=x11` до запуска процесса native handle стал
настоящим X11 ID `0x1200004`; тот же ID появился в `_NET_CLIENT_LIST`.
Пульт загружен, падений GPU и XGetWindowAttributes нет, GPU не отключён.
- Причина: Electron выбирает Ozone до main.js. Поздний appendSwitch менял
параметры дочернего GPU, сохраняя Wayland-окно основного процесса.
[Порядок инициализации Electron 42](https://github.com/electron/electron/blob/v42.0.0/shell/browser/electron_browser_main_parts.cc).
- npm dev/smoke/acceptance теперь запускают Electron через scripts/start.cjs,
передающий X11 заранее только на Linux и сохраняющий код завершения процесса.
Обычный Linux-запуск без раннего X11 перезапускается с ним до создания окон.
Отключение GPU-композиции и поздний appendSwitch удалены; sandbox сохранён.
- 77 тестов, type-check, ESLint, Stylelint, сборка и GUI smoke с mute-audio — PASS.
В smoke добавлена проверка native X11 ID; внешний дисплей синтетический.
Полный diff проверен вручную по применимому стандарту; нарушений не найдено.
- Именно `npm run dev` запущен на обычном профиле: KWin зарегистрировал окно
`0x1200004`. Linux x64 пересобран, состав и распакованный архив проверены;
обновлены build-info, SHA256SUMS-linux-x64 и запись в общем manifest.
Остальные архивы не пересобирались.
- SCREEN-001/008 остаются IN_PROGRESS: реальный проектор, системный звук,
аппаратный p95, час офлайн и матрица ОС не подтверждены. Коммитов и push нет.
## Отчёт одного стенда
- Дата, версия приложения и SHA-256 архива:
+4 -6
View File
@@ -23,12 +23,10 @@ import { PackageStore } from './package-store.js'
import { packageMediaResponse } from './package-media.js'
import type { HostInfo } from '../src/types/screen.js'
// Native Wayland запрещает размещение окна на выбранном дисплее по координатам.
if (process.platform === 'linux') {
app.commandLine.appendSwitch('ozone-platform', 'x11')
// Electron 42/ANGLE падает при создании EGL-поверхности в XWayland на этом стенде.
if (process.env.XDG_SESSION_TYPE === 'wayland' || process.env.WAYLAND_DISPLAY)
app.commandLine.appendSwitch('disable-gpu-compositing')
// Ozone выбирается до main.js; поздний appendSwitch смешивает Wayland и X11.
if (process.platform === 'linux' && app.commandLine.getSwitchValue('ozone-platform') !== 'x11') {
app.relaunch({ args: [...process.argv.slice(1), '--ozone-platform=x11'] })
app.exit(0)
}
app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required')
protocol.registerSchemesAsPrivileged([
+3 -3
View File
@@ -6,7 +6,7 @@
"author": "Вечерний детектив",
"main": "dist-electron/electron/main.js",
"scripts": {
"dev": "npm run build && electron .",
"dev": "npm run build && node scripts/start.cjs .",
"type-check": "vue-tsc --noEmit && tsc -p tsconfig.electron.json --noEmit",
"lint": "eslint .",
"lint:css": "stylelint \"src/**/*.{css,vue}\"",
@@ -15,8 +15,8 @@
"media:generate": "node scripts/generate-media.cjs",
"pack": "npm run build && electron-builder --dir",
"dist": "npm run build && electron-builder",
"smoke": "npm run build && electron scripts/smoke.cjs",
"acceptance": "npm run build && electron scripts/smoke.cjs --manual",
"smoke": "npm run build && node scripts/start.cjs scripts/smoke.cjs",
"acceptance": "npm run build && node scripts/start.cjs scripts/smoke.cjs --manual",
"build:electron": "node -e \"require('node:fs').rmSync('dist-electron', { recursive: true, force: true })\" && tsc -p tsconfig.electron.json",
"smoke:packaged": "node scripts/packaged-smoke.cjs",
"verify:release": "node scripts/release-finish.cjs"
+1
View File
@@ -19,6 +19,7 @@ async function launch(binary, profile, check) {
const child = spawn(
binary,
[
...(process.platform === 'linux' ? ['--ozone-platform=x11'] : []),
`--user-data-dir=${profile}`,
'--remote-debugging-port=0',
'--remote-debugging-address=127.0.0.1',
+2
View File
@@ -201,6 +201,8 @@ app.whenReady().then(async () => {
try {
await seeded
const control = await poll(() => BrowserWindow.getAllWindows()[0], 'control')
if (process.platform === 'linux')
assert.ok(control.getNativeWindowHandle().readUInt32LE(0) > 0xffff, 'native X11 window ID')
control.webContents.on('console-message', (_event, details) =>
console.log('renderer:', details.message),
)
+21
View File
@@ -0,0 +1,21 @@
const { spawn } = require('node:child_process')
const { join } = require('node:path')
// X11 нужен до запуска Electron, чтобы размещать показ на выбранном дисплее.
const child = spawn(
require('electron'),
[
...(process.platform === 'linux' ? ['--ozone-platform=x11'] : []),
process.argv[2],
...process.argv.slice(3),
],
{ cwd: join(__dirname, '..'), stdio: 'inherit' },
)
child.on('error', (error) => {
console.error(error.message)
process.exitCode = 1
})
child.on('exit', (code) => {
process.exitCode = code ?? 1
})
for (const signal of ['SIGINT', 'SIGTERM']) process.on(signal, () => child.kill(signal))