История изменений
Исправление Zubok, (текущая версия) :
Не прибивает, но какую-то серьёзную ошибку вызывает. Бектрейс не помню уже.
Соединение обрывается и ресурсы убиваются, поэтому поведение непредсказуемое.
Может быть даже не стоит брать на себя эту функцию подчистки за другими? При этом я записываю 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, :
Не прибивает, но какую-то серьёзную ошибку вызывает. Бектрейс не помню уже.
Соединение обрывается и ресурсы убиваются, поэтому поведение непредсказуемое.
Может быть даже не стоит брать на себя эту функцию подчистки за другими? При этом я записываю 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, :
Не прибивает, но какую-то серьёзную ошибку вызывает. Бектрейс не помню уже.
Соединение обрывается и ресурсы убиваются, поэтому поведение непредсказуемое.
Может быть даже не стоит брать на себя эту функцию подчистки за другими? При этом я записываю 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 (достаточно один байт прочитать) — проверяем, что там содержимое типа 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). Поэтому в общем случае надо устанавливать картинки и порождать ресурсы и атомы в отдельном соединении.