LINUX.ORG.RU

История изменений

Исправление Zubok, (текущая версия) :

P.S. Извиняюсь за многабукв

Не, это действительно многабукав. Я на такое не подписывался. :)

На самом деле, не сказано, какая стоит задача? В исходном посте есть только посыл, что есть окно 1 и окно 2 и надо скопировать одно в другое. Но вот это:

9) Допустим есть окно gedit'а, у меня есть его id, как его нарисовать в теневой pixmap?

говорит о том, что речь идет не о копирование своих окон, а всех вообще. X Window System в базовом варианте не хранит изображения окон в offscreen memory. Если надо нарисовать что-то в окне, то иксы прямо в фреймбуфер и рисуют, поэтому нельзя получить изображение всего окна, если оно перекрыто другим. Можно получить только видимую область. Чтобы в этом убедиться, можно вызвать, например,

$ xwd > convert - /tmp/window.png
$ display /tmp/window.png

(она использует XGetImage) на частично закрытое окно ткруть крестиком и убедиться, что пришла только видимая часть. Это все говорит о том, что в базовых иксах нельзя получить окно, не имея теневого изображения окна в памяти.

Потом появилось расширение Composite Extension, которое одной командой позволяет включить автоматический редирект в теневой pixmap либо всех окон вообще, либо отдельных. Вообще, до Composite Extension был backing store у окон. Он нужен был, чтобы X Server не слал много событий expose клиентам, а обновлял окна своими силами. http://tronche.com/gui/x/xlib/window/attributes/backing-store.html Но backing store может пропасть или с самого начала быть недоступным, об этом есть специальное предупреждение, чтобы не рассчитывали на него, та как оно всегда может из соображений экономии памяти пропасть, поэтому expose обрабатывать все равно обязательно надо. Насколько я знаю, сейчас backing store реализовано при помощи все того же Composite Extension.

12) https://www.talisman.org/~erlkonig/misc/x11-composite-tutorial/ - я оттуда про damage-eventы узнал, надо наверное внимательнее прочитать, т.к. мне показалось, что статья на QT ориентирована, у вас не найдётся ссылки на подобный ресурс для Xlib?

Там нет ничего серьезного для Qt. Когда у тебя уже pixmap, то уже не важно, чем ты его обрабатываешь - делай все при помощи xlib просто. Там же Qt все те же пиксмапы читает, но просто приводит их к своем представлению.

Это как раз то, что тебе нужно:

This tutorial is mainly aimed at those that are interested in using Composite for providing thumbnails in a desktop pager, or for those working on Exposé like features. But the concepts introduced here are applicable to Composite managers as well. This tutorial is not meant to be the one and only reference you'll ever need for everything having to do with the Composite extension however, but I've tried to cover all aspects of its usage for the above mentioned purposes. It should also help you avoid all the pitfalls you're likely to run into when using the Composite extension.

Исходная версия Zubok, :

P.S. Извиняюсь за многабукв

Не, это действительно многабукав. Я на такое не подписывался. :)

На самом деле, не сказано, какая стоит задача? В исходном посте есть только посыл, что есть окно 1 и окно 2 и надо скопировать одно в другое. Но вот это:

9) Допустим есть окно gedit'а, у меня есть его id, как его нарисовать в теневой pixmap?

говорит о том, что речь идет не о копирование своих окон, а всех вообще. X Window System в базовом варианте не хранит изображения окон в offscreen memory. Если надо нарисовать что-то в окне, то иксы прямо в фреймбуфер и рисуют, поэтому нельзя получить изображение всего окна, если оно перекрыто другим. Можно получить только видимую область. Чтобы в этом убедиться, можно вызвать, например,

$ xwd > convert - /tmp/window.png
$ display /tmp/window.png

(она использует XGetImage) на частично закрытое окно ткруть крестиком и убедиться, что пришла только видимая часть. Это все говорит о том, что в базовых иксах нельзя получить окно, не имея теневого изображения окна в памяти. Все, что ты пытаешь сделать и понять, этот факт перечеркивает.

Потом появилось расширение Composite Extension, которое одной командой позволяет включить автоматический редирект в теневой pixmap либо всех окон вообще, либо отдельных. Вообще, до Composite Extension был backing store у окон. Он нужен был, чтобы X Server не слал много событий expose клиентам, а обновлял окна своими силами. http://tronche.com/gui/x/xlib/window/attributes/backing-store.html Но backing store может пропасть или с самого начала быть недоступным, об этом есть специальное предупреждение, чтобы не рассчитывали на него, та как оно всегда может из соображений экономии памяти пропасть, поэтому expose обрабатывать все равно обязательно надо. Насколько я знаю, сейчас backing store реализовано при помощи все того же Composite Extension.

12) https://www.talisman.org/~erlkonig/misc/x11-composite-tutorial/ - я оттуда про damage-eventы узнал, надо наверное внимательнее прочитать, т.к. мне показалось, что статья на QT ориентирована, у вас не найдётся ссылки на подобный ресурс для Xlib?

Там нет ничего серьезного для Qt. Когда у тебя уже pixmap, то уже не важно, чем ты его обрабатываешь - делай все при помощи xlib просто. Там же Qt все те же пиксмапы читает, но просто приводит их к своем представлению.

Это как раз то, что тебе нужно:

This tutorial is mainly aimed at those that are interested in using Composite for providing thumbnails in a desktop pager, or for those working on Exposé like features. But the concepts introduced here are applicable to Composite managers as well. This tutorial is not meant to be the one and only reference you'll ever need for everything having to do with the Composite extension however, but I've tried to cover all aspects of its usage for the above mentioned purposes. It should also help you avoid all the pitfalls you're likely to run into when using the Composite extension.