Intereting Posts
Эволюция-EWS (Exchange) Адресная книга не синхронизирует Чтение кусков из трубы и выполнение команды для каждого фрагмента Тонна ввода при входе в систему появляется для блокировки устройства? «Аббревиатура» для dd $, если текущая строка пуста Восстановить atime после vim Изображение рабочей станции Fedora 25 для VirtualBox bash – игнорировать регистр, но запретить автозаполнение, если двусмысленный Резервное копирование с помощью find и ssh для сервера вне сайта Можно ли отображать содержимое каталога без его изменения? Порядок обработки и печать файлов с помощью find Как печатать только повторяющиеся значения из текстового файла? Замените строку в нескольких файлах, используя find и sed Подавлять предупреждения от MySQL в сценарии оболочки, но допускать ошибки Расширение макроса Gmake: макрос вызывает макрос с переменной в аргументах Как настроить xorg.conf для широкоэкранного VNC на безголовом Linux / Ubuntu?

Простейший способ узнать, полностью ли загружено и готово приложение GTK (например, Firefox), чтобы максимизировать его

В киосках Linux для сброса некоторых приложений «за кулисами» (в то время как заставка закрывает экран), я использую скрипт BASH, который, среди прочего, вызывает wmctrl , с задачей максимизировать окно Firefox.

«wmctrl» отправляет (асинхронные?) сообщения в диспетчер окон (XFWM в моем случае), чтобы сначала найти «идентификатор окна»:

FF_WID=$(wmctrl -l | grep ' - Mozilla Firefox' | cut -d ' ' -f1) 

а затем, чтобы увеличить его до полного экрана:

 wmctrl -ir $FF_WID -b add,fullscreen 

Проблема в том, что последний вызов бесшумно (даже с помощью «verbose» switch), когда окно Firefox каким-то образом «не полностью загружено» (то есть: когда оконный менеджер уже назначил идентификатор окна, но – может быть, потому, что он заканчивает рисовать виджеты? – он еще не способен выполнить требуемое действие – максимизация).

Обход проблемы: В принципе, если произвольная задержка: sleep N добавляется перед командой максимизации, действие выполняется.

Но недостатки – два: разные машины нуждаются в разных задержках; плюс, если задержка слишком длинная, рабочий стол, хотя и пустой, отображается в течение заметного момента, и это не со вкусом для пользователей.

С слишком короткими задержками, очевидно, момент, когда процесс (Firefox) уже порожден, но «оконный идентификатор» WM еще не назначен. Возможным, более тонким, обходным путем было бы следующее:

 while FF_WID=$(wmctrl -l | grep ' - Mozilla Firefox' | cut -d ' ' -f1) ; do true done wmctrl -ir $FF_WID -b add,fullscreen 

Но, к сожалению, иметь «оконный идентификатор» недостаточно. Вероятно, это связано с тем, что есть события GTK, ожидающие некоторой блокировки запроса максимизации.


Такое же поведение можно наблюдать, заменив Firefox другим приложением GTK, например «xfce4-terminal».


Другим обходным решением, но действительным только в отношении Firefox, в то время как я ищу общее решение, может быть включение ведения журнала на стороне приложения и просмотр событий во время фазы загрузки, поиск «готового приложения» или тому подобного , Для этого я немного экспериментирую с возможностями регистрации в Firefox (NSPR_LOG_MODULES)

В качестве еще одного частичного обходного пути я уже пробовал несколько дополнений для Firefox в режиме киоска (полноэкранный режим), но мне нужно (и достигнуто) немного другое поведение с точки зрения настройки пользовательского интерфейса.

Излишне говорить, что -fullscreen коммутатор, зарегистрированный в других местах для Firefox, недействителен в сборке Linux.


Прочитав этот другой вопрос , и, последовательно проведя эксперименты, я стараюсь исключить любую проблему с возможным различным поведением «wmctrl» при вызове с ключом -i (имя или целочисленная форма) или без него.


Много разобрался в этой проблеме, не найдя общее и «не-грязное» решение.

A: МОЖЕТ ЛИ ВЫ ВЫПОЛНИТЬ НЕПОСРЕДСТВЕННОЕ ИЗЛУЧЕНИЕ GTK QUEUE?

B: (ЕСЛИ А ИСТИННО) ЯВЛЯЕТСЯ ТЕХНИКОЙ, ПРИМЕНИМЫМ ИЗ СЛЕДУЮЩЕГО УЩЕРБА, ДЛЯ ПРЕДОСТАВЛЕНИЯ ЗАДЕРЖКИ, ОГРАНИЧЕННОЙ ТОЛЬКО ТОЧНОСТИ, КОГДА ВЫШЕУПРАВЛЯЮЩЕЕ КОПИРОВАНИЕ?

  • Я знаю, что есть несколько способов взаимодействия с движком GTK, например, через привязки Python или PERL.
  • Существует также «gtk-сервер», подходящий для взаимодействия между GTK и BASH-скриптом.
  • Существует также интерфейс FFI (ctypes.sh), который позволяет работать как плагин BASH, прямые вызовы с общей библиотекой (включая GTK, любую общую библиотеку) из любого скрипта BASH.

Разумеется, идеальное решение будет наиболее горизонтальным (действительным не только для Firefox, но и для любого приложения GTK), и потребует минимально возможного количества программ | интерпретаторов | зависимых от версии hacks для установки и использования …

Большое спасибо за (длинное, длинное) чтение, приятный, приятный день