up
This commit is contained in:
@@ -57,8 +57,10 @@ Commit и push выполняет только пользователь. Вло
|
|||||||
Нужны Node.js 24.15+ и ffmpeg с libx264 в PATH.
|
Нужны Node.js 24.15+ и ffmpeg с libx264 в PATH.
|
||||||
В Linux приложение использует X11; для сессии Wayland нужен XWayland, чтобы
|
В Linux приложение использует X11; для сессии Wayland нужен XWayland, чтобы
|
||||||
размещать показ на выбранном мониторе.
|
размещать показ на выбранном мониторе.
|
||||||
В Wayland-сессии отключается GPU-композиция окон: на текущем Manjaro-стенде
|
Команды npm передают выбор X11 до старта Electron. Обычный запуск Linux-сборки
|
||||||
Electron/ANGLE падает при создании EGL-поверхности. Отключать sandbox для запуска не нужно.
|
без этого флага автоматически перезапускает её с X11 до создания окон.
|
||||||
|
Поздний выбор X11 из main.js смешивал Wayland/X11 и оставлял пульт невидимым.
|
||||||
|
Отключать GPU или sandbox для запуска не нужно.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm ci
|
npm ci
|
||||||
|
|||||||
@@ -235,6 +235,12 @@ SCREEN-009 (LAN-пульт) отменена владельцем; ID не пе
|
|||||||
профилем подтверждён отрисованным пультом без падений GPU. 77 тестов, типы,
|
профилем подтверждён отрисованным пультом без падений GPU. 77 тестов, типы,
|
||||||
линтеры и GUI smoke без no-sandbox/disable-gpu — PASS. Linux x64 пересобран;
|
линтеры и GUI smoke без no-sandbox/disable-gpu — PASS. Linux x64 пересобран;
|
||||||
подробности в docs/SCREEN-008_RESULTS.md. Аппаратная приёмка остаётся открытой.
|
подробности в 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 владельцем;
|
- Открыто: получить macOS x64/arm64 через workflow после commit/push владельцем;
|
||||||
выполнить аппаратную матрицу, включая оба Linux-дистрибутива, час офлайн,
|
выполнить аппаратную матрицу, включая оба Linux-дистрибутива, час офлайн,
|
||||||
проектор/звук/телефон и физические замеры на M1. Статус IN_PROGRESS до получения
|
проектор/звук/телефон и физические замеры на M1. Статус IN_PROGRESS до получения
|
||||||
|
|||||||
@@ -83,7 +83,11 @@ macOS нет. Этот стенд не подтверждает Ubuntu/Debian,
|
|||||||
Прежние ограничения GUI-стенда сохраняются: Linux x64, синтетический внешний
|
Прежние ограничения GUI-стенда сохраняются: Linux x64, синтетический внешний
|
||||||
дисплей, тестовые no-sandbox/mute-audio/disable-gpu. Новых аппаратных результатов нет.
|
дисплей, тестовые no-sandbox/mute-audio/disable-gpu. Новых аппаратных результатов нет.
|
||||||
|
|
||||||
## Исправление запуска на Manjaro XWayland (2026-10-17)
|
## Диагностика запуска на Manjaro XWayland (2026-10-17)
|
||||||
|
|
||||||
|
Вывод о видимости окна ниже опровергнут 2026-10-18: снимок страницы и
|
||||||
|
isVisible() подтвердили внутреннее состояние Electron, но окно не было
|
||||||
|
зарегистрировано в KWin. Прежний обход GPU-композиции удалён; исправление ниже.
|
||||||
|
|
||||||
- Обычный запуск исходников с чистым профилем воспроизвёл три падения GPU-процесса
|
- Обычный запуск исходников с чистым профилем воспроизвёл три падения GPU-процесса
|
||||||
с exit_code=139. Coredump указывает на libGLESv2/ANGLE, EGL_CreateWindowSurface
|
с exit_code=139. Coredump указывает на libGLESv2/ANGLE, EGL_CreateWindowSurface
|
||||||
@@ -108,6 +112,31 @@ macOS нет. Этот стенд не подтверждает Ubuntu/Debian,
|
|||||||
SCREEN-001/008 остаются IN_PROGRESS. Diff проверен вручную по применимому
|
SCREEN-001/008 остаются IN_PROGRESS. Diff проверен вручную по применимому
|
||||||
стандарту; нарушений не найдено. Коммиты и push агент не выполнял.
|
стандарту; нарушений не найдено. Коммиты и 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 архива:
|
- Дата, версия приложения и SHA-256 архива:
|
||||||
|
|||||||
+4
-6
@@ -23,12 +23,10 @@ import { PackageStore } from './package-store.js'
|
|||||||
import { packageMediaResponse } from './package-media.js'
|
import { packageMediaResponse } from './package-media.js'
|
||||||
import type { HostInfo } from '../src/types/screen.js'
|
import type { HostInfo } from '../src/types/screen.js'
|
||||||
|
|
||||||
// Native Wayland запрещает размещение окна на выбранном дисплее по координатам.
|
// Ozone выбирается до main.js; поздний appendSwitch смешивает Wayland и X11.
|
||||||
if (process.platform === 'linux') {
|
if (process.platform === 'linux' && app.commandLine.getSwitchValue('ozone-platform') !== 'x11') {
|
||||||
app.commandLine.appendSwitch('ozone-platform', 'x11')
|
app.relaunch({ args: [...process.argv.slice(1), '--ozone-platform=x11'] })
|
||||||
// Electron 42/ANGLE падает при создании EGL-поверхности в XWayland на этом стенде.
|
app.exit(0)
|
||||||
if (process.env.XDG_SESSION_TYPE === 'wayland' || process.env.WAYLAND_DISPLAY)
|
|
||||||
app.commandLine.appendSwitch('disable-gpu-compositing')
|
|
||||||
}
|
}
|
||||||
app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required')
|
app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required')
|
||||||
protocol.registerSchemesAsPrivileged([
|
protocol.registerSchemesAsPrivileged([
|
||||||
|
|||||||
+3
-3
@@ -6,7 +6,7 @@
|
|||||||
"author": "Вечерний детектив",
|
"author": "Вечерний детектив",
|
||||||
"main": "dist-electron/electron/main.js",
|
"main": "dist-electron/electron/main.js",
|
||||||
"scripts": {
|
"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",
|
"type-check": "vue-tsc --noEmit && tsc -p tsconfig.electron.json --noEmit",
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"lint:css": "stylelint \"src/**/*.{css,vue}\"",
|
"lint:css": "stylelint \"src/**/*.{css,vue}\"",
|
||||||
@@ -15,8 +15,8 @@
|
|||||||
"media:generate": "node scripts/generate-media.cjs",
|
"media:generate": "node scripts/generate-media.cjs",
|
||||||
"pack": "npm run build && electron-builder --dir",
|
"pack": "npm run build && electron-builder --dir",
|
||||||
"dist": "npm run build && electron-builder",
|
"dist": "npm run build && electron-builder",
|
||||||
"smoke": "npm run build && electron scripts/smoke.cjs",
|
"smoke": "npm run build && node scripts/start.cjs scripts/smoke.cjs",
|
||||||
"acceptance": "npm run build && electron scripts/smoke.cjs --manual",
|
"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",
|
"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",
|
"smoke:packaged": "node scripts/packaged-smoke.cjs",
|
||||||
"verify:release": "node scripts/release-finish.cjs"
|
"verify:release": "node scripts/release-finish.cjs"
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ async function launch(binary, profile, check) {
|
|||||||
const child = spawn(
|
const child = spawn(
|
||||||
binary,
|
binary,
|
||||||
[
|
[
|
||||||
|
...(process.platform === 'linux' ? ['--ozone-platform=x11'] : []),
|
||||||
`--user-data-dir=${profile}`,
|
`--user-data-dir=${profile}`,
|
||||||
'--remote-debugging-port=0',
|
'--remote-debugging-port=0',
|
||||||
'--remote-debugging-address=127.0.0.1',
|
'--remote-debugging-address=127.0.0.1',
|
||||||
|
|||||||
@@ -201,6 +201,8 @@ app.whenReady().then(async () => {
|
|||||||
try {
|
try {
|
||||||
await seeded
|
await seeded
|
||||||
const control = await poll(() => BrowserWindow.getAllWindows()[0], 'control')
|
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) =>
|
control.webContents.on('console-message', (_event, details) =>
|
||||||
console.log('renderer:', details.message),
|
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