5

私はいくつかのgtkとgnomeの概念と少し混乱しています。gnome2デスクトップで最小化されていないウィンドウのリストを取得しようとしていますが、pygtkのドキュメントを読んで結果を調べた後、結果を理解できません。

以下の2つのスニペットはどちらも機能していないようです。

最初にこれを試しました。

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

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

その後、これ

>>> 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)>] 

コンソール出力に見られるように、2番目のオプションは2つのウィンドウを返します。しかし、私はそれらが何であるかを理解することができませんでした。それらのどれにも子がなく、デスクトップにあるウィンドウの数に関係なく、常にこれらの2つのウィンドウを取得します。

誰かが典型的なgtkベースのデスクトップ環境のオブジェクトの階層を説明できますか?上記のコードが機能しない理由がわかりません。

wnck、xlib、qtなどにリソースを提供する代替ソリューションの投稿は控えてください。他のライブラリをチェックするなどのアドバイスを得るよりも、自分が間違っていることを理解することに関心があります。

4

2 に答える 2

8

取得するウィンドウは、プロセス内で作成されたウィンドウです。ウィンドウのリストを取得するには、次のようにルート ウィンドウのプロパティをクエリする必要があります。

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])

GDK は、基盤となる OS グラフィック エンジン (X11/Quartz/Aqua/GDI など) 上の薄いレイヤーであり、NIX デバイスによって結果が異なる場合があることに注意してください。

于 2012-07-04T16:18:56.010 に答える