47

Xfce и «автоматический» диалог

Серия Мы не пишем в техподдержку

Сейчас будет еще одна «трешевая» история из мира открытого ПО, из тех что не рассказывают детям, дамам и сотрудникам ППС.

С добрым утром!

С добрым утром!

XFCE

Xfce это такое очень популярное рабочее окружение (Desktop Environment), яркий представитель опенсорса, который вы неоднократно могли видеть в моих статьях и скриншотах.

Одно время им пользовался даже сам Линус Торвальдс, мотивировав переезд чрезмерным ожирением KDE и уходом в лунатизм разработчиков Gnome.

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

БАГ

Разумеется в Xfce есть баги и недоработки, не такие феерические как например в KDE («Плазма не падает» ага), но тоже временами доставляющие и долгоживущие. Как раз об одном таком «долгожителе» и пойдет наш сегодняшний рассказ.

Как это выглядит в действии:

ноутбук засыпает, ноутбук просыпается и на экране внезапно появляется.. диалог «Display Settings».

Казалось бы мелочь, ну появляется и появляется (причем не на всех ОС и ноутбуках), б‑г с ним и без того проблем навалом.

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

Так что я полез за боевым топором компилятором.

Ресерч

Первый же беглый поиск дал понять, что это не осеннее обострение проблема есть далеко не только у меня, вот например сообщение с официального форума Xfce от 2021 года:

А вот об этой проблеме пишут на форуме Linux Mint:

<a href="https://d.pikabu.ru/story/xfce_i_avtomaticheskiy_dialog_14153311?u=https%3A%2F%2Fforums.linuxmint.com%2Fviewtopic.php%3Ft%3D413429&t=%D0%A0%D0%B5%D0%BF%D0%BE%D1%80%D1%82&h=48d1b6934569fb2232a3ea9ffc1d2f0220e60378" title="https://forums.linuxmint.com/viewtopic.php?t=413429" target="_blank" rel="nofollow noopener">Репорт</a> бага из Linux Mint

Репорт бага из Linux Mint

И на форуме Manjaro Linux:

И даже на форуме FreeBSD:

Так что проблема действительно есть, причем именно в Xfce а не в конкретной ОС, дистрибутиве или настройках окружения.

Дальнейшие изыскания привели в багтрекер Xfce, к этому багу из 2013 (!) года:

Я насчитал двадцать (20) дублей, закрытых за все время жизни этого тикета, но поскольку с 2013го года сам трекер успел переехать с BugZilla на Gitlab (оригинальный тикет находится тут) — гарантированно что-то успело потеряться.

Несмотря на сильно отличающееся описание, если посмотреть переписку под тикетом — можно увидеть знакомые рога и копыта очертания бага с открытием диалога:

А вот это сообщение в обсуждении навело на возможное место в исходном коде, ответственное за проблему:

Разумеется с 2021го года логика в исходниках успела измениться до неузнаваемости и в актуальной на момент написания статьи версии 4.20 это место выглядит иначе:

Суть происходящего

При восстановлении из сна, происходит повторное включение монитора (какой сюрприз), которое вызывает отработку логики, отвечающей за поиск новых устройств вывода:

Из-за данной логики и происходит отображение диалога «Display Settings», по замыслу авторов — как приглашение к настройке нового устройства, когда например подключается второй монитор или проектор.

"Благими намерениями", вы правильно поняли.

Обратите внимание на вот такую проверку:

/* Start the display dialog according to the user preferences */
if (action == ACTION_ON_NEW_OUTPUT_SHOW_DIALOG)
{
..

Чуть выше по коду в этом же файле displays-x11.c происходит чтение из настроек:

gint action = xfconf_channel_get_int (channel, NOTIFY_PROP, ACTION_ON_NEW_OUTPUT_DEFAULT);
if (action != ACTION_ON_NEW_OUTPUT_DO_NOTHING || old_outputs->len == 0)
{
..

Таким образом по идее создателей, если в этом диалоге в поле «When display is connected» выставлено значение «Do nothing»:

Тогда никакого диалога при просыпании ноутбука появляться не будет.

Но есть нюанс.

Нюанс

У Xfce традиционно не очень хорошо с настройками — она их регулярно теряет и сбрасывает при обновлениях, перезаписывает новыми опциями и вообще всячески ломает.

Из‑за чего диалог «Display Settings» появляется снова и снова.

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

Решение

Думаю нетрудно догадаться, что окончательное решение диалогового вопроса оказалось очень простым:

/* Start the display dialog according to the user preferences */
if (action == ACTION_ON_NEW_OUTPUT_SHOW_DIALOG)
{
// const gchar *cmd = helper->outputs->len <= 2 ? "xfce4-display-settings -m" : "xfce4-display-settings";
// xfce_spawn_command_line (NULL, cmd, FALSE, FALSE, TRUE, NULL);
g_print("Ignored 'Display Settings' dialog \n");
}

Да, весь блок (он такой один), отвечающий за запуск диалога «Display Settings» был самым банальным образом закомментирован в файле displays-x11.c. И нет, мне не стыдно.

Wayland

Несмотря на то что автор не пользуется Wayland, Xfce его поддерживает и в файле displays-wayland.c есть полностью аналогичное место, где также зашит вызов диалога «Display Settings».

Так что если вы используете Wayland и столкнулись с описываемой проблемой — теперь знаете где именно искать и что делать.

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

Сборка

На самом деле мне сильно повезло, что исправление выше находится в небольшом и автономном консольном приложении xfsettingsd, исходники которого в свою очередь находятся в отдельном репозитории xfce4-settings.

Так что экстремальных приключений в виде сборки всего Xfce из исходников с последующей установкой удастся избежать.

Забираем исходники xfce4-settings:

git clone https://gitlab.xfce.org/xfce/xfce4-settings.git

Переключаемся на релизную ветку той версии Xfce, которая у вас уже установлена — не забываем, что мы правим лишь один небольшой сервис, а все остальное остается из пакетной версии:

git checkout origin/xfce-4.20 -b xfce-4.20

Вытаскиваем зависимые репозитории:

git submodule update --init --recursive

Запускаем сборку:

./autogen
./configure
gmake

В каталоге xfsettingsd появится одноименный бинарник с измененной логикой.

Я не стал заморачиваться с отдельным каталогом в PATH и изучать доступные в Xfce механизмы переопределения путей, вместо этого просто подменив бинарник:

cp ./xfsettingsd/xfsettingsd /usr/local/bin/

И все, больше никаких надоедливых диалогов.

Так выглядит проверочное сообщение, добавленное вместо закомментированных вызовов:

Эпилог

Разумеется такое исправление никогда не примут в апстрим Xfce (занятый переездом на meson) и без навыков программирования вы обречены на вечные муки и страдания наблюдать этот диалог до скончания времен — пока при очередном обновлении не слетит конфигурация.

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

Но повлиять «с моей галерки» на авторов Xfce разумеется никакой возможности нет.

P.S.

Статья была опубликована на Хабре, более вольный оригинал в нашем блоге.

GNU/Linux

1.2K поста15.6K подписчиков

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества