LINUX.ORG.RU

Самопальное решение для вывода уведомлений поверх «по-настоящему» полноэкранных приложений.

 , ,


1

1

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

TL;DR Уведомления поверх «упрямых» полноэкранных приложений можно выводить с помощью утилиты aosd_cat.

Теперь по порядку.

Недавно мне понадобилось получать сообщения из шелл-скрипта об изменении кое-каких файлов, причем чтобы они отображались поверх окна досбокса, переведенного в полноэкранный режим. Выяснилось, что notify-send для этого, мягко говоря, малопригоден. У разработчиков представления о том, на что должна влиять срочность (--urgency) уведомлений, какие-то, на мой взгляд, странные. Эта опция просто отменяет тайм-аут (--expire-time) для уведомлений. Т.е. уведомление так и будет висеть, пока от него вручную не избавиться, но на способность отображаться поверх других приложений это никак не повлияет. А с другой стороны, даже обычные, не срочные уведомления отображаются поверх «обычных» полноэкранных приложений. Раздражает, кстати, жутко, когда смотришь фильм, развернув плеер в полный экран, а поверх него всплывают какие-то второстепенные уведомления.

В общем, notify-send оказался для моих целей непригоден. Стал искать дальше, нашел xmessage, который выводит небольшое окно с текстом сообщения. Он «упрямую полноэкранность» пробивает, а с опцией -timeout автоматически закрывает окно с сообщением через заданное количество секунд. Недостатки в том, что его окно на время своего существования берет на себя фокус - это во-первых, а во-вторых, на время существования окна xmessage + еще пару секунд после того, как оно исчезнет, полноэкранное приложение возвращается в оконный режим. В общем, лучше, чем notify-send, но не идеально.

В конце концов нашел aosd_cat. И это оказалоь как раз то, что доктор прописал! Накладывает оверлей с текстом на экран поверх почти любого приложения, причем очень хорошо кастомизируется. Для отображения поверх «упрямых» полноэкранных приложений может понадобиться задать опцию "-t 0" или "-t 1" (по умолчанию значение 2, и оно может не срабатывать). Из того, на чем я его испытывал, не пробивает полноэкранность только у Gens (эмулятор Sega Genesis). На всем остальном - работает.

Использую его в виде

echo "$MessageText" | DISPLAY=:0 aosd_cat [Options]

Подумал - может, кому-нибудь еще сгодится эта инфа. Или наоборот, кто-нибудь может подсказать решение лучше.

Тащемта да, это дефолтное и довольно известное решение в данном случае. Костыльное только. Вот если бы кто-то сделал полноценный notifyd на основе этого оверлея, да который бы ещё работал и во фреймбуфере в терминале...

E ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.