- PVSM.RU - https://www.pvsm.ru -
Сейчас будет еще одна «трешевая» история из мира открытого ПО, из тех что не рассказывают детям, дамам и сотрудникам ППС.
Xfce [1] это такое очень популярное рабочее окружение (Desktop Environment), яркий представитель опенсорса, который вы неоднократно могли видеть в моих статьях [2] и скриншотах.
Одно время им пользовался [3] даже сам Линус Торвальдс, мотивировав переезд чрезмерным ожирением KDE и уходом в лунатизм разработчиков Gnome.
Штука популярная и известная, некий баланс разумности и последний барьер, разделяющий откровенную гиковскую дичь вроде тайловых менеджеров [4] и тяжеловесные современные среды, разрабатываемые большими командами при поддержке мировых корпораций.
Разумеется в Xfce есть баги и недоработки, не такие феерические как например в KDE («Плазма не падает [5]» ага), но тоже временами доставляющие проблемы и долгоживущие. Как раз об одном таком «долгожителе» и пойдет наш сегодняшний рассказ.
Как это выглядит в действии:
ноутбук засыпает, ноутбук просыпается и на экране внезапно появляется.. диалог «Display Settings».
Казалось бы мелочь, ну появляется и появляется (причем не на всех ОС и ноутбуках), б‑г с ним и без того проблем навалом.
Но во‑первых временами появляется несколько копий этого диалога, что огорчает куда сильнее, поскольку приходится их каждый раз закрывать. А во‑вторых автор не просто так два десятка лет занимается разработкой, чтобы позволить какой‑то там программе безнаказанно творить беспредел.
Так что я полез за боевым топором компилятором.
Первый же беглый поиск дал понять, что это не осеннее обострение проблема есть далеко не только у меня, вот например сообщение с официального форума [6] Xfce от 2021 года:

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

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

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

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

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

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

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

Из-за данной логики и происходит отображение диалога «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 традиционно не очень хорошо с настройками — она их регулярно теряет и сбрасывает при обновлениях, перезаписывает новыми опциями и вообще всячески ломает.
Из‑за чего диалог «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, 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 (занятый переездом на meson) и без навыков программирования вы обречены на вечные муки и страдания наблюдать этот диалог до скончания времен — пока при очередном обновлении не слетит конфигурация.
Добавлю, что и сам этот функционал принудительного открытия диалога настроек при изменении оборудования — откровенно дурацкий, из серии «хотели как лучше» и точно нуждается в пересмотре.
Но повлиять «с моей галерки» на авторов Xfce разумеется никакой возможности нет.
Более вольный оригинал [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
Нажмите здесь для печати.