окно pygtk с полем, которое игнорирует все события X (мышь) (пропускает их)

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

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

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

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


person Rumex    schedule 28.01.2012    source источник


Ответы (1)


Как вы уже догадались, пересылка событий не сработает; это создает множество условий гонки, и некоторые приложения все равно будут игнорировать данные из 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, вы можете быть обделены шлангом.

person Havoc P    schedule 14.02.2012
comment
Кроме того, при поиске правильных терминов я наткнулся на нечто подобное: stackoverflow.com/questions/4326534/ - person Rumex; 19.02.2012