окно pygtk с полем, которое игнорирует все события X (мыши) (пропускает их через) - PullRequest
5 голосов
/ 28 января 2012

Я хотел бы сделать следующее: Создать полноэкранный, всегда в верхней части окно pygtk с виджетом webkit, отображающим некоторый html, но с полностью прозрачным прямоугольником, чтобы окна ниже были видны.(Это представляется возможным: Можно ли визуализировать веб-контент на чистом фоне с помощью WebKit? )

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

Теоретически, я полагаю, что я мог бы перехватить все интересующие меня события с помощью pygtk Eventbox, найти окно прямо под моим с помощью wnck и пропустить это событиек нему с помощью python-xlib.

Это не совсем похоже на самое элегантное решение;есть ли лучший способ?

1 Ответ

5 голосов
/ 14 февраля 2012

Пересылка событий не будет работать хорошо, как вы уже догадались;он создает множество условий гонки, и некоторые приложения все равно будут игнорировать данные с XSendEvent.

Что вы можете сделать, это установить маску входной формы.См. http://www.x.org/releases/current/doc/xextproto/shape.html, а затем посмотрите на XFixesSetWindowShapeRegion() в /usr/include/X11/extensions/Xfixes.h, который позволяет указать «вид» фигуры (здесь вы хотите ShapeInput).

Что-то вроде:

XRectangle rect;
XserverRegion region = XFixesCreateRegion(display, &rect, 1);
XFixesSetWindowShapeRegion(display, window, ShapeInput, 0, 0, region);
XFixesDestroyRegion(display, region);

Способность установить ShapeInput "всего лишь" 5-6 лет, поэтому, если вам небезразличны действительно дрянные старые версии X11, вас могут не заметить.

...