From 7f2a02b69f030e461d6b2be0688fc9acce4a17a2 Mon Sep 17 00:00:00 2001 From: Fedorov Vladimir Date: Sun, 18 Oct 2026 00:49:38 +0700 Subject: [PATCH] up --- README.md | 6 ++++-- TASKS.md | 6 ++++++ docs/SCREEN-008_RESULTS.md | 31 ++++++++++++++++++++++++++++++- electron/main.ts | 10 ++++------ package.json | 6 +++--- scripts/packaged-smoke.cjs | 1 + scripts/smoke.cjs | 2 ++ scripts/start.cjs | 21 +++++++++++++++++++++ 8 files changed, 71 insertions(+), 12 deletions(-) create mode 100644 scripts/start.cjs diff --git a/README.md b/README.md index c6d9003..0724fdc 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/TASKS.md b/TASKS.md index 7d2a095..148b122 100644 --- a/TASKS.md +++ b/TASKS.md @@ -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 до получения diff --git a/docs/SCREEN-008_RESULTS.md b/docs/SCREEN-008_RESULTS.md index dd1e30c..0df1b4d 100644 --- a/docs/SCREEN-008_RESULTS.md +++ b/docs/SCREEN-008_RESULTS.md @@ -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 архива: diff --git a/electron/main.ts b/electron/main.ts index 0127fe2..f24cca5 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -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([ diff --git a/package.json b/package.json index df502f5..399ddf2 100644 --- a/package.json +++ b/package.json @@ -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" diff --git a/scripts/packaged-smoke.cjs b/scripts/packaged-smoke.cjs index 88b712b..756fb92 100644 --- a/scripts/packaged-smoke.cjs +++ b/scripts/packaged-smoke.cjs @@ -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', diff --git a/scripts/smoke.cjs b/scripts/smoke.cjs index f7d45b9..355bdc2 100644 --- a/scripts/smoke.cjs +++ b/scripts/smoke.cjs @@ -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), ) diff --git a/scripts/start.cjs b/scripts/start.cjs new file mode 100644 index 0000000..5c44b6b --- /dev/null +++ b/scripts/start.cjs @@ -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))