2016-09-13 14 views
1

Я хотел бы нарисовать какое-то окно поверх всех остальных окон. Например, чтобы отобразить некоторую информацию об отладке (например, conky) или такие вещи, как таймер.Как сделать наложение, которое не фиксирует никаких событий

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

Я пробовал делать это с pygtk, pyqt и другими, но не могу найти способ сделать его реальным наложением без захвата события.

Есть ли какое-нибудь низкоуровневое решение x11?

ответ

2

Я думаю, что Композит-разгибания подход не будет работать, когда менеджер композитинга работает (и, таким образом, перекрывающее окно композита уже используется).

Поскольку вы явно не говоря уже о «не захват событий»:

позволяет установить несколько различных форм для окна. Версия 1.1 этого расширения добавила «входную» форму. Просто установка этого в пустую область должна в значительной степени делать то, что вы хотите.

Некоторые конкретный пример того, что я думаю, что вы просите, можно найти в исходном коде носатый в: http://sources.debian.net/src/conky/1.10.3-1/src/x11.cc/?hl=769#L764-L781

Edit: Так как вы сказали, что вы не нашли ничего в Gtk (ну, PyGtk), здесь функция, которая вам нужна в Gtk: https://developer.gnome.org/gdk3/stable/gdk3-Windows.html#gdk-window-input-shape-combine-region

+0

Я тоже пробовал этот подход, но не думал, что это позволит мне настроить сквозное окно, потому что это [пример QT для этого] (https://github.com/Werkov/PyQt4/blob/master/examples/ widgets/shapeclock.py) не будет. Но я собираюсь попробовать GTK и отчитаться. Большое спасибо. – damio

+0

Я думаю, что это правильный путь, моя версия сбой (segfault под python 3, ошибка утверждения под python 2), но вот он для истории: https://gist.github.com/mdamien/a1f864ab3ef3c63f63e136123cc43c56 – damio

+0

нашел это комментарий, очень связанный с этой проблемой: https://bugs.launchpad.net/ubuntu/+source/pygobject/+bug/1028115/comments/8 – damio

1

Вам может понадобиться Composite extension + GetOverlayWindow запроса:

версия 0.3 протокола добавляет Composite Overlay Window, который обеспечивает менеджер композитинга с поверхностью, на которой можно рисовать без вмешательства. Это окно всегда находится над нормальными окнами и всегда находится под окном экранной заставки . Это окно InputOutput, ширина которого составляет , а высота - размеры экрана. Его визуальным является корневой визуал , а его ширина границы равна нулю. Попытки перенаправить его с использованием составного расширения игнорируются. Это окно не отображается в ответе запроса QueryTree . Это также переопределяет перенаправление окна . Эти последние две функции делают его невидимым для оконных менеджеров и других клиентов X11. Единственный способ получить доступ к XID этого окна - это запрос CompositeGetOverlayWindow. Первоначально неактивное окно Composite Overlay.

CompositeGetOverlayWindow возвращает XID составного наложения Окно. Если окно еще не было отображено, оно отображается этим запросом . Когда все клиенты, которые вызвали этот запрос, завершили свои соединения X11, окно не будет отображено.

Композитные менеджеры могут отображать непосредственно на композитном перекрытии Окно, или они могут видеть другие окна, чтобы быть дочерними элементами этого окна и визуализировать их. Множественные клиенты могут отображать в Овальное окно Composite Overlay Window, создавать дочерние окна, изменять его и переопределять область ввода, но определенные правила арбитража, следующие этим этими клиентами, не определены этой спецификацией; эти политики должны определяться самими клиентами.

C апи: XCompositeGetOverlayWindow

+0

Большое спасибо, это уже достаточно много для того, что мне нужно. Но, на всякий случай, любая идея, где я мог бы найти пример приложения, использующего его? Еще лучше, небольшой фрагмент? – damio

+1

Поиск кода Debian обычно для этого весьма полезен. –