Вы уже приняли частичный ответ, но я надеюсь, что вы все равно прочтете его.
Это правда, что фон рабочего стола по соглашению является корневым окном.Однако на типичном современном рабочем столе действуют две важные механики:
- настройка корневого изображения (обои), которая не рисуется на фоне корневого окна
- обогащение фона рабочего стола (например, кликабельных значков) путем создания препятствия для корневого окна другим окном базового уровня
Если вы хотите нарисовать на фоне,только последнее имеет значение для вас.Однако если вы также хотите прочитать фон, например, для реальной прозрачности, то также играет роль первая точка.
Рисование на фоне:
Авторыпрограммы xsnow и xpenguins были первыми, кто решил эту проблему.Они написали умную функцию, которая может выводить окна рабочего стола KDE и Gnome, если они присутствуют.Поскольку другие оконные менеджеры, которые мешают корневому окну, как правило, подчиняются этим стандартам де-факто, они работают очень надежно.С их кодом вы мгновенно узнаете, в какое окно рисовать.
Чтение корневого фона (растровое изображение):
Это сложнее.Наивный запрос для оконных пикселей не удастся, потому что все передние окна также являются частью корневого окна;так что это облегчает создание скриншота, но не позволяет получить реальный фон.
Однако существует соглашение о глобальном имени корневого растрового изображения (которое используется любым подходящим установщиком растрового изображения фонового изображения).Растровое изображение можно найти, запросив это имя.Однако становится неприятно, если либо установщик фона отстой и не подчиняется этому правилу, либо фон не растровое изображение, а только шаблон или что-то в этом роде.
Второй вариант, который я нашел только недавно, это использовать расширение XDBE (двойной буфер), чтобы получить фон корневого окна.Это очень чисто, занимает всего две-три строки кода и работает в любом случае. Но Xorg считает XDBE устаревшим (или, точнее, скорее устаревшим).Так что я не знаю, является ли использование его только для этой цели все еще хорошей идеей.Но я могу дать вам код по запросу !
Наконец, реализация:
Да, есть реализация, доступная для обеих вещей.Проверьте http://fopref.meinungsverstaerker.de/xmms-rootvis/ В этом архиве, который является GPL, getroot.c
взят из xpenguins, без зависимостей от другого кода xpenguins.Кроме того, начиная со строки 144 rootvis.c
вы найдете код для захвата фонового растрового изображения.
Веселитесь!