LINUX.ORG.RU

X11 свойства _XROOTPMAP_ID и _XSETROOT_ID

 


0

1

Привет. Я тут в stumpwm добавляю отрисовку обоев. Проблема вот в чём:

1. Некоторые программы вроде xli могут устанавливать обои и завершаться. Чтобы при выходе X-сервер не освобождал их ресурсы (background pixmap) они ставят XSetCloseDownMode() в retainPermanent и ставят маленький pixmap в свойство рутового окна _XSETROOR_ID. Чтобы освободить ресурсы от старого запуска они потом делают XKillClient с pixmap из этого свойства.

2. Чтобы StumpWm работал правильно с композитными менеджерами, нужно pixmap с обоиной (background рутового окна) ставить в свойство _XROOTPMAP_ID.

Сейчас я делаю так: https://github.com/shamazmazum/stumpwm/blob/master/wallpaper.lisp

Собственно, правильно ли я всё делаю? Скажем, какая-нибудь сторонняя программа для установки обоев не может ли засрать мне _XROOTPMAP_ID, а я потом не смогу освободить её ресурсы? Или, скажем, эта программа убъёт мне оконный менеджер через kill-client?

В чём вообще разница этих свойств?

Zubok

Собственно, правильно ли я всё делаю? Скажем, какая-нибудь сторонняя программа для установки обоев не может ли засрать мне _XROOTPMAP_ID, а я потом не смогу освободить её ресурсы? Или, скажем, эта программа убъёт мне оконный менеджер через kill-client?

Не-не-не, погоди. Эта функция — XKillClient — сбивает с толку своим названием. Она не убивает клиента как программу. Она и не должна этого делать и не смогла бы в случае удаленных клиентов. Эта функция убивает соединение клиента с сервером и удаляет все ресурсы, с ним связанные, а не kill программе делает.

http://tronche.com/gui/x/xlib/window-and-session-manager/killing-clients.html

Чтобы твое основное соединение не сломалось, то разумно, наверное, для системы установки обоев просто открыть новое соединение (xlib:open-display...), если ты так боишься пересбросов при помощи XKillClient, выставить обои и закрыть соединение. Только желательно, наверное, чтобы оба клиента не шарили свои ресурсы между собой. Тут надо подумать. Ну и проверить потом, что получается при смене обоев с xli этим. А ты уже проверил: xli успешно прибивает stumpwm при смене обоины?

В случае Common Lisp делать отдельного клиента вряд ли разумно. Вот, например, в icewm программа установки обоев — icewmbg — отдельная. Можешь исходничек глянуть, кстати, если интересно:

https://github.com/kazzmir/icewm/blob/master/src/icewmbg.cc

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

А ты уже проверил: xli успешно прибивает stumpwm при смене обоины?

Не прибивает, но какую-то серьёзную ошибку вызывает. Бектрейс не помню уже.

Я ща делаю так: при установке обоев из stumpwm, смотрю, есть ли у меня в _XSETROOT_ID pixmap. Если да - то освобождаю ресурсы (с помощью kill-client). Может быть даже не стоит брать на себя эту функцию подчистки за другими? При этом я записываю pixmap с бекграундом в _XROOTPMAP_ID, чтобы compton при запуске подхватил обоину

x11hater
() автор топика
Ответ на: комментарий от x11hater

Не прибивает, но какую-то серьёзную ошибку вызывает. Бектрейс не помню уже.

Соединение обрывается и ресурсы убиваются, поэтому поведение непредсказуемое.

Может быть даже не стоит брать на себя эту функцию подчистки за другими? При этом я записываю pixmap с бекграундом в _XROOTPMAP_ID, чтобы compton при запуске подхватил обоину

_XSETROOT_ID содержит однопиксельный pixmap для обозначения того, что какая-то программа меняла свойства окна root и при этом какие-то ресурсы оставила. Вот, например, xsetroot сохраняет pixmap, когда делает фон из bitmap (см. исходник), сохраняет этот pixmap, чтобы цветовой контекст сохранить между двумя последовательными запусками xsetroot. Когда ты указываешь -solid или -def, то тогда производится чистка. Если надо между сеансами запуска сохранить информацию о цвете, то xsetroot этот pixmap не стирает. Присутствие этого pixmap обозначается ресурсом _XSETROOT_ID с однопиксельной картинкой. Можешь не стирать, но тогда просто этот pixmap останется болтаться навсегда. Я думаю, что это такая практика, которая исторически выросла из стандартной утилиты xsetroot. Можно удалять, а можно не удалять. Если побеспокоиться о повторном запуске пользователем xsetroot после твоей программы, то можно и не трогать. Но я не вижу смысла не трогать, так как если пользователь захочет работать с xsetroot, то он просто отключит твою программу.

Другая сторона медали: а надо ли тебе выставлять это _XSETROOT_ID самому? Вот Esetroot не выставляет. Вот это вот и не факт. Если ты не выставишь, то вежливые программы твои ресурсы и не прибьют. Но если они заменят фон, то твои ресурсы будут болтаться в памяти. Не все программы читают свойство _XROOTPMAP_ID. xsetroot, xloadimage, xli вроде не читают и ничего про него не знают.

А вот _XROOTPMAP_ID и ESETROOT_PMAP_ID (для случая псевдокопозитинга типа как сделано в aterm, eterm) вообще содержит только XID пиксмапа, который болтается в памяти. Если это свойство стоит, то в памяти сервера от какого-то клиента болтается картинка, которая осиротеет после замены фона тобой.

Я бы сделал так: видим _XSETROOT_ID делаем XKillClient. Но _XSETROOT_ID может быть не выставлен, не все выставляют. Смотрим ESETROOT_PMAP_ID (достаточно одно слово 1L прочитать) — проверяем, что там содержимое типа XA_PIXMAP, что длина 1 байт — проверяем, что там pixmap, делаем XKillClient или пришибаем этот pixmap с удалением самого свойства. Видим _XROOTPMAP_ID, то пришибаем этот этот pixmap, если до этого мы его не пришибли у ESETROOT_PMAP_ID (они, скорее всего, одинаковые будут) с удалением самого свойства. Далее создаем pixmap, создаем и выставляем _XROOTPMAP_ID и ESETROOT_PMAP_ID, а _XSETROOT_ID можно выставлять, а можно не выставлять. Если не выставишь, то xsetroot не убьет соединение твоего клиента, но pixmap останется в памяти. Однако есть клиенты, которые убивают и по ESETROOT_PMAP_ID (например, fwvm-root), и по _XROOTPMAP_ID (например, Esetroot). Поэтому в общем случае надо устанавливать картинки и порождать ресурсы и атомы в отдельном соединении.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

А, ну и отлично. У меня щас так примерно и есть - подчищаем старые ресурсы по пиксмапу в _XSETROOT_ID и ставим бекграунд в _XROOTPMAP_ID, чтобы композитные менеджеры его подхватили.

Если доведется использовать StumpWM, качай мой))) Он ещё и truetype шрифты умеет (секретная разработка некоего Михаила Филоненко), полупрозрачностью рулит вкупе с compton и что-то там ещё по мелочи. Тут узнал, что там можно рулить окнами по типу floating wm, только пока все окна появляются слева и сверху экрана. Планирую это поправить

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