2013-05-06 14 views
13

C içinde XLib ile yazılan saydam, filigranlı bir uygulamam var. Uygulamada herhangi bir yeri tıklarsanız hiçbir şey olmuyor, ancak fare girişini altından ne olursa olsun geçmek istiyorum. Örneğin. Uygulamanın altındaki bir pencereyi kapatmak için X'i tıklarsanız uygulamayı kapatmalı, hiçbir şey yapmamalı.Saydam xlib pencerelere tıklayın

cevap

1

Sanırım XQueryTree yardımcı olabilir. Kök pencerenin üzerine uygulayın ve alt pencerelerin listesini alın, konumlarını bulun ve farenin/klavyenin XEvent uygun pencereye aktarın. Not: Etkin/etkin olmayan pencerelere, etkin/etkin olmayan penceresine, başka bir pencerenin çocuğuna, diğer pencerelerin boyutuna ve x/y konumlarına dikkat etmeniz gerekir. Not:. Kod bunun için dağınık olacak.

+0

Yani kucağında üzerinde O pencereye fare olayı göndermek varsa, XGetWindowAttributes sonra pencere kimliklerini almak ve bir örtüşme olmadığını kontrol etmek için XQueryTree kullanırdınız? Ayrıca fare olayını pencereye nasıl gönderirim veya iletirim? – Corey

+1

% 100 emin değilim, ancak 'XSendEvent' bunun için çalışmalı. – bikram990

+1

Bunlara da bir göz atın 'http://stackoverflow.com/questions/14656615/xlib-xsendevent-click-event-do-not-work-inside-of-serv-windows-on-ubuntu-12-04 ? rq = 1 've bu da' http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html ' – bikram990

2

"Filigran" pencerenizin herhangi bir girdi almasını istemiyorsanız ve bunun yerine girişin altındaki pencereye gitmesini istiyorsanız, implementation behind gtk_widget_input_shape_combine_region numaralı telefona bakarım. Daha önce bir popup penceresinin tüm bölümlerinin herhangi bir olay almaması için selefi gtk_widget_input_shape_combine_mask'u kullandım.

Buradaki rahatlık alanım bitti, ancak XShapeCombineRectangles ilgili aramadır (bu durum için shape = ShapeInput ile bağlantılı do_shape_combine_region çağrılmaktadır).

+0

Bir GDK Penceresi ile denedim, ancak bu işe yaramadı. –

+0

Bir xlib penceresi için denediğimde, çalıştı (altta yatan bir pencereyi kapatmak için "X" e tıklayabilmeniz bile gerekiyor). –

0
  1. Sen XSelectInput kullanarak Doq varsayılan kökü üzerindeki tüm olayları dinleyecek küçük bir pencere yöneticisi uygulamak gerekir. Daha sonra fd = connectionNember (display) üzerinde sorgulama yapın. Olayı her aldığınızda

  2. . Bu Mouse olayı olup olmadığını kontrol edin, size x, y verecektir. Pencere yığınını geçerek doğru pencereyi bulabilirsiniz. Olayı temeldeki pencereye bildirmek için XGrabPinter'ı kullanın.