2012-02-19 13 views
5

Jestem trochę zdezorientowany z niektórymi koncepcjami gtk i gnome. Próbuję uzyskać listę nie zminimalizowanych okien na moim pulpicie gnome2, ale po przeczytaniu dokumentacji pygtk i sprawdzeniu wyników, nie mogę zrozumieć wyników.Jak uzyskać listę wszystkich okien na moim pulpicie gnome2 za pomocą pygtk?

Żadne z dwóch opisów poniżej nie wydaje się działać.

Najpierw próbowałem to ..

>>> gtk.gdk.window_get_toplevels() 
[<gtk.gdk.Window object at 0xb74339b4 (GdkWindow at 0x8a4c170)>] 

>>> gtk.gdk.window_get_toplevels()[0].get_children() 
[] 

wówczas

>>> d = gtk.gdk.DisplayManager() 
>>> d.get_default_display().get_screen(0).get_root_window().get_children() 
[<gtk.gdk.Window object at 0x89dcc84 (GdkWindow at 0x8a4c170)>, <gtk.gdk.Window object at 0x89dccac (GdkWindow at 0x8a4c0c0)>] 

Jak widać na wyjściu konsoli druga opcja zwraca dwa okna. Ale nie byłem w stanie dowiedzieć się, co to jest. Żaden z nich nie ma dzieci i zawsze uzyskuję te dwa okna bez względu na to, ile okien mam na moim pulpicie.

Czy ktoś mógłby wyjaśnić hierarchię obiektów typowego środowiska graficznego opartego na gtk? Nie mogę zrozumieć, dlaczego powyższy kod nie działa.

Proszę nie zamieszczać alternatywnych rozwiązań dotyczących zasobów do wnck, xlib, qt itp. Jestem bardziej zainteresowany zrozumieniem, co robię źle, niż w uzyskaniu porady takiej, jak sprawdzanie innych bibliotek.

Odpowiedz

9

Twoje przymus jest jak powiedzenie "Chcę zbudować odtwarzacz CD za pomocą tylko banana. Proszę powstrzymać się od publikowania alternatywnych rozwiązań, które używają laserów." GTK nie może tego zrobić, używasz niewłaściwego narzędzia do pracy.

Oto wyjaśnienie, co to jest „okno” w rzeczywistości oznacza i dlaczego Twój kod nie działa:

Po pierwsze, trzeba zrozumieć różnicę między gtk.Window i gtk.gdk.Window. Okno GTK jest widgetem GTK najwyższego poziomu, który może zawierać inne widżety. Zazwyczaj jest połączony z oknem na pulpicie, ale nie musi być - w GTK 3 istnieje OffscreenWindow. Z drugiej strony, platforma jest zależna od platformy. Na pulpicie X jest cienkim opakowaniem wokół okna X, które niekoniecznie jest oknem biurkowym. W innych systemach istnieje możliwość usunięcia systemu okien. Okno GDK odbiera zdarzenia, więc niektóre widżety inne niż okna mają własne okna GDK. "Okno" jest naprawdę straszną nazwą tych obiektów, ale zostało odziedziczone po X i prawdopodobnie nie ulegnie zmianie.

Każdy proces GTK wie tylko o swoich własnych własnych oknach. Możesz uzyskać listę okien GTK o numerze dostępnym pod numerem , korzystając z własnej aplikacji, używając gtk.window_list_toplevels(). Pobranie elementów potomnych tych okien powinno zwrócić ci widżety GTK, które zawierają. Nie można jednak zejść do hierarchii widżetów okien innych procesów. Na przykład, co jeśli inny proces ma okno z widżetem podrzędnym, który jest niestandardowym widgetem, o którym twój proces nie wie? Co powinien zgłosić jako typ tego widżetu?

Uzyskanie listy okien GDK z gtk.gdk.window_get_toplevels() jest zasadniczo takie samo, jak uzyskanie listy X okien X, o ile rozumiem. Nie masz możliwości dowiedzenia się, jakie to są okna - mogą to być panel Gnome, albo mogą to być okna Qt, albo mogą być czymś zupełnie innym, nie odpowiadającym oknu na pulpicie.

Libwnck (link do przeglądu tego, co robi) może wyświetlić listę niezminimalizowanych okien i ich tytułów, ale nie pozwoli zobaczyć ich w środku. Nie ma sposobu, aby to zrobić. Libwnck używa wewnętrznie GDK, więc technicznie można to zrobić za pomocą GDK, ale dlaczego miałbyś zawracać sobie głowę, jeśli jest już biblioteka, która robi to za Ciebie? Jeśli naprawdę chcesz zrobić to sam, spójrz na kod źródłowy libwnck.

+1

Nie chcę być niegrzeczny, ale nie sądzę, że twoja odpowiedź jest zadowalająca. Pod koniec odpowiedzi, zdemaskowałeś swoją początkową analogię do czytnika bananów. Zdaję sobie sprawę z różnic między oknem gtk a dtk.gdk, jeśli przeczytałeś dokładnie moje pytanie, zauważysz, że było to trochę nie na temat ... chociaż wspomniałem, że byłem zdezorientowany, więc myślę, że twierdzić, że mea-culpa. – Pico

+0

Domyślam się, dlaczego nie jest 'gtk.gdk.window_get_toplevels()' wyprowadzanie wynik, który opisałeś? Jeśli chodzi o sortowanie okien, miałem wrażenie, że mają atrybuty do tego wyłącznego celu. – Pico

+0

Ok, domyślam się, że zinterpretowałem twoje pytanie, aby powiedzieć, dlaczego nie mogłeś uzyskać _widgets_ z okien. Nie wiem, dlaczego wywołanie GDK nie robi tego, co chcesz. Być może powinieneś spojrzeć na kod źródłowy libwnck, aby zobaczyć, jak działa? – ptomato

7

Wyświetlane okna to okna, które zostały utworzone w ramach procesu. Aby uzyskać listę okien, trzeba zapytać właściwości okna głównego, tak:

import gtk.gdk 
root = gtk.gdk.get_default_root_window() 
for id in root.property_get('_NET_CLIENT_LIST')[2]: 
    w = gtk.gdk.window_foreign_new(id) 
    if w: 
     print(w.property_get('WM_NAME')[2]) 

Uwaga GDK jest cienką warstwą na bazowym silniku graficznym OS (X11/Kwarc/Aqua/GDI etc) i wynik może się różnić na różnych urządzeniach NIX.

+0

Ostatnie zdanie jest okropnie niepoprawne. GDK to ** nie ** "cienki mechanizm przechwytywania przez widget", to biblioteka rysowania/okienkowania używana do ** implementacji ** GTK. Qt i Motif nie są w żaden sposób połączone z GDK. – user4815162342

+0

@ user4815162342 Wielkie dzięki, naprawione. – grigoryvp

Powiązane problemy