Прозрачная Windows в Linux (Электрон)

Использование прозрачного аргумента и установка его в значение true при создании нового BrowserWindow в Electron обычно дает окну прозрачный фон... Но в Linux, насколько мне известно, это не так.

Теперь я слышал, что вы можете установить некоторые аргументы командной строки... Но это не работает... Он просто отображает черный или белый цвет, несмотря ни на что...

// Should set the commandLine arguments and work...

const {app} = require('electron')

app.commandLine.appendSwitch('enable-transparent-visuals');
app.commandLine.appendSwitch('disable-gpu');

Теперь я слышал, что это не проблема с электроном, а проблема с оборудованием ... Но мне просто нужно было убедиться, поэтому я создал этот вопрос!

Вы можете взглянуть на это: ourcodeworld.com/articles/read/315/…

CodeF0x 19.02.2019 11:13

Я сделал, и это не работает...

undefinedChar 19.02.2019 11:16

попробуйте установить атрибут rgba тега body rgba(255,255,255,0.5). Это будет работать?

Maged Saeed 20.02.2019 04:06

Нам поможет, если вы сможете описать вашу машину и ОС.

doom 20.02.2019 12:51

Может быть, вы также можете поделиться своим источником в репо?

doom 20.02.2019 13:13

Это также не работает извне, используя командную строку teransset linux. Подозреваю что-то присущее Chromium, но моих знаний об архитектуре Electron недостаточно.

matanster 15.06.2020 12:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
11
6
4 496
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Кажется, что есть несколько проблем с прозрачностью в разных дистрибутивах с разным оборудованием. Существуют различные предлагаемые обходные пути. Возможно, вы не сможете заставить прозрачность работать приемлемо для вашего сценария на оборудовании и дистрибутивах все.

Примеры

Из документов Электрона:

On Linux, users have to put --enable-transparent-visuals --disable-gpu in the command line to disable GPU and allow ARGB to make transparent window, this is caused by an upstream bug that alpha channel doesn't work on some NVidia drivers on Linux.

https://github.com/electron/electron/blob/master/docs/api/frameless-window.md

Вопрос о командной строке, которую я уже добавил с помощью: app.commandLine.appendSwitch('enable-transparent-visuals'); app.commandLine.appendSwitch('disable-gpu');

undefinedChar 20.02.2019 08:22

Привет, я думаю, что обращался к этой части вашего вопроса: «Но мне просто нужно было убедиться, поэтому я создал этот вопрос!» в основном, похоже, есть несколько проблем, и это может быть связано с вашим дистрибутивом / оборудованием. В ссылках упоминаются некоторые интересные обходные пути - например. чтобы отложить отображение окна на несколько секунд после того, как оно «готово».

GrahamMc 20.02.2019 08:41

Просто чтобы прояснить это, пока ничего не сработало, и я предполагаю, что ничего не сработает ... Хотя я готов к любому, у кого есть представление о том, как решить мою проблему, и попробовать указанное исправление.

undefinedChar 20.02.2019 12:00

Возможно, попробуйте предложение задержки от doom в его ответе, также может быть полезно упомянуть где-нибудь информацию о вашей видеокарте и дистрибутиве Linux.

GrahamMc 20.02.2019 12:08

Прости! Ошибки восходящего потока в Chrome = одна из наименее интересных частей работы с Electron, но если вы зарегистрируете проблему в нужном месте, она может быть отсортирована.

GrahamMc 20.02.2019 12:16

Куда бы вы порекомендовали мне обратиться и сообщить об этом?

undefinedChar 20.02.2019 12:17

Я бы начал с самих Electron здесь: github.com/электрон/электрон/вопросы или подумал о добавлении к проблеме Doom здесь, если у вас такой же дистрибутив: github.com/электрон/электрон/проблемы/15947.

GrahamMc 20.02.2019 12:21

@GrahamMc ошибка восходящего потока в Chromium была исправлена ​​2 года назад (если вы говорите об этом bugs.chromium.org/p/chromium/issues/detail?id=369209)

doom 20.02.2019 12:55
Ответ принят как подходящий

Я столкнулся с той же проблемой, что и вы, поэтому я написал:

Пока запрошенная функция не реализована, решение простое, просто добавьте задержку перед запуском окна.

Можно клонировать это репозиторий git, поставить задержку на 500 и нормально магия появится.

РЕДАКТИРОВАТЬ 1: Используйте это репо: https://gitlab.com/doom-fr/electron-transparency-demo

git clone https://gitlab.com/doom-fr/electron-transparency-demo
cd electron-transparency-demo
npm install
npm start
# or npm run startWithTransparentOption
# or npm run startWithAllOptions

У меня работает из коробки с Debian Jessie и electronic 4.0.5, для npm start, npm run startWithTransparentOption но не с npm run startWithAllOptions.

NB: будьте осторожны, чтобы установить не менее 500 мс, чтобы он работал. После можно уменьшить задержку, но она не стабильна. Вот почему необходимо событие для TransparentReady.

Рок

@OneGuy Я обновил репо, попробуйте. Если не работает, попробуйте команду npm run

doom 20.02.2019 12:46

Окей круто. Для статистики, можете ли вы сказать нам свою ОС, и работает ли она также с npm run startWithTransparentOption и npm run startWithAllOptions

doom 20.02.2019 13:16

И если вы можете использовать этот запрос функции: github.com/электрон/электрон/проблемы/16809, это тоже будет круто. Рок.

doom 20.02.2019 13:19

В настоящее время я использую Xubuntu, но на своем домашнем компьютере я установил несколько дистрибутивов, и они тоже не работали ... Дистрибутивы Ubuntu, Manjaro, Arch и Kubuntu, похоже, не работали до этого исправления, и мне не нужно тестировать это еще ... У меня есть больше дистрибутивов, но это были те, на которых я тестировал это .... И для команд запуска npm я просто получаю ошибку отсутствующего сценария, не знаю почему ...

undefinedChar 20.02.2019 13:22

осторожность: задержка может зависеть от аппаратного обеспечения - быстрый процессор, не требуется большая задержка и т. д.

Sam Johnson 27.12.2019 23:11

Этот код может сработать для вас. Я добавляю объяснение в комментарии.

//electron can't be transparent on linux
//see issue on github: https://github.com/electron/electron/issues/2170

// app.disableHardwareAcceleration(); //use this
//or use these two lines code
app.commandLine.appendSwitch('enable-transparent-visuals');
app.commandLine.appendSwitch('disable-gpu');

//createWindow need to wait(more than about 100ms) if you want the window to be transparent
// app.whenReady().then(createWindow); //this won't work
app.commandLine.appendSwitch('enable-transparent-visuals');
app.commandLine.appendSwitch('disable-gpu');
app.on('ready', () => {
    setTimeout(() => {
        createWindow();
    }, 200);
});

Это сработало для меня:

if (process.platform === "linux") {
  app.commandLine.appendSwitch('enable-transparent-visuals');
  app.disableHardwareAcceleration();

  app.on('ready', () => setTimeout(createWindow, 400));
}

Другие вопросы по теме