up
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 до получения
|
||||
|
||||
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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),
|
||||
)
|
||||
|
||||
@@ -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))
|
||||
Reference in New Issue
Block a user