2013-05-06 12 views
13

Mam przezroczystą, podobną do znaku wodnego aplikację, która jest napisana z XLib w C. Aktualnie, jeśli klikniesz gdziekolwiek na aplikacji nic się nie dzieje, ale chciałbym, aby przekazała myszą dane do tego, co znajduje się poniżej. na przykład Jeśli klikniesz X, aby zamknąć okno znajdujące się pod aplikacją, zamknij aplikację, a nie rób nic.Klikaj przez przezroczyste okna xlib

Odpowiedz

1

Myślę, że może być pomocna XQueryTree. Wykonaj go w oknie głównym i uzyskaj listę okien podrzędnych, znajdź ich lokalizacje i przekaż nazwę XEvent myszy/klawiatury do odpowiedniego okna.

Uwaga: Musisz dbać o aktywne/nieaktywne okna, aktywny/nieaktywny obszar okna, podrzędność innego okna, rozmiar i lokalizację x/y innych okien . Kod będzie na tym bałagan.

+0

Więc chciałbym używać XQueryTree aby uzyskać identyfikator okna następnie XGetWindowAttributes i sprawdzić zakładkę, jeśli jest na kolanach wyślę zdarzenia myszy do tego okna? Również w jaki sposób wysłać lub przekazać zdarzenie myszy do okna? – Corey

+1

Nie jestem w 100% pewny, ale "XSendEvent" powinien nad tym pracować. – bikram990

+1

Spójrz na to również "http://stackoverflow.com/questions/14656615/xlib-xsendevent-click-event-do-work-inside-of-some-windows-on-ubuntu-12-04 ? rq = 1 'i to również "http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html" – bikram990

2

Jeśli nie chcesz, aby twoje okno "znaku wodnego" otrzymywało jakiekolwiek dane wejściowe, a zamiast tego wprowadzi je do okna pod nim, wtedy zajrzę do implementation behind gtk_widget_input_shape_combine_region. Poprzednio użyłem jego poprzednika gtk_widget_input_shape_combine_mask, aby spowodować, że wszystkie części wyskakującego okienka nie będą otrzymywać żadnych zdarzeń.

Wychodzę z mojej strefy komfortu tutaj, ale wygląda na to, że XShapeCombineRectangles jest odpowiednim połączeniem (połączony do_shape_combine_region jest wywoływany z shape = ShapeInput dla tego przypadku).

+0

Próbowałem go z oknem GDK, ale to nie zadziałało. –

+0

Po wypróbowaniu tego dla okna xlib zadziałało (nawet wymóg, że można kliknąć "X", aby zamknąć podstawowe okno jest spełnione). –

0
  1. Trzeba wdrożyć mały menedżer okien, który będzie nasłuchiwał wszystkich wydarzenia na domyślnym korzenia indow użyciu XSelectInput.

  2. Następnie wykonaj polling na fd = connectionNember (display).

  3. Zawsze, gdy otrzymasz zdarzenie. Sprawdź, czy jest to zdarzenie Mouse, to dostarczy Ci x, y. Możesz znaleźć poprawne okno, przechodząc przez stos okien.

  4. Następnie użyj XGrabPinter, aby zgłosić zdarzenie do podstawowego okna.