- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

XFCE

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

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

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

БАГ

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

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

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

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

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

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

Ресерч

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 и «автоматический» диалог - 11

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

Нюанс

У 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 есть полностью аналогичное место [17], где также зашит вызов диалога «Display Settings».

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

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

Сборка

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

Так что экстремальных приключений в виде сборки всего 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 и «автоматический» диалог - 12

Эпилог

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

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

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

P.S.

Более вольный оригинал [19] в нашем блоге и на Яндекс Дзене.

Еще каждый вторник мы теперь выпускаем «велоподкаст»:

Где я детально раскрываю тот или иной аспект разработки, проектирования или ИТ в целом.

Автор: alex0x08

Источник [21]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/opensource/430008

Ссылки в тексте:

[1] Xfce: https://en.wikipedia.org/wiki/Xfce

[2] моих статьях: https://blog.0x08.ru/xfce-damn-sessions

[3] пользовался: https://www.linuxjournal.com/content/linus-ditches-kde-and-gnome-so-what

[4] тайловых менеджеров: https://ru.wikipedia.org/wiki/%D0%A4%D1%80%D0%B5%D0%B9%D0%BC%D0%BE%D0%B2%D1%8B%D0%B9_%D0%BE%D0%BA%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80

[5] Плазма не падает: https://neolurk.org/wiki/%D0%9F%D0%BB%D0%B0%D0%B7%D0%BC%D0%B0_%D0%BD%D0%B5_%D0%BF%D0%B0%D0%B4%D0%B0%D0%B5%D1%82

[6] сообщение с официального форума: https://forum.xfce.org/viewtopic.php?id=14840

[7] пишут: https://forums.linuxmint.com/viewtopic.php?t=413429

[8] на форуме: https://forum.manjaro.org/t/xfce-4-18-and-display-settings-from-sleep/130173

[9] на форуме FreeBSD: https://forums.freebsd.org/threads/resume-from-sleep-show-display-dialog-every-time.90827/

[10] этому: https://gitlab.xfce.org/xfce/xfce4-settings/-/issues/32

[11] тут: https://bugzilla.xfce.org/show%5C_bug.cgi?id=10459

[12] это сообщение: https://forum.xfce.org/viewtopic.php?pid=62227#p62227

[13] это место: https://gitlab.xfce.org/xfce/xfce4-settings/-/blob/xfce-4.20/xfsettingsd/displays-x11.c?ref%5C_type=heads#L712

[14] логики: https://gitlab.xfce.org/xfce/xfce4-settings/-/blob/xfce-4.20/xfsettingsd/displays-x11.c?ref%5C_type=heads#L649

[15] выше: https://gitlab.xfce.org/xfce/xfce4-settings/-/blob/xfce-4.20/xfsettingsd/displays-x11.c?ref%5C_type=heads#L644

[16] displays-x11.c: https://gitlab.xfce.org/xfce/xfce4-settings/-/blob/xfce-4.20/xfsettingsd/displays-x11.c

[17] аналогичное место: https://gitlab.xfce.org/xfce/xfce4-settings/-/blob/xfce-4.20/xfsettingsd/displays-wayland.c?ref%5C_type=heads#L543

[18] xfce4-settings: https://gitlab.xfce.org/xfce/xfce4-settings

[19] вольный оригинал: https://blog.0x08.ru/xfce-display-settings-dialog

[20] rutube.ru: https://rutube.ru/plst/1158944/

[21] Источник: https://habr.com/ru/articles/944772/?utm_source=habrahabr&utm_medium=rss&utm_campaign=944772