2

メニュー/ツールバーとして機能する wxFrame を備えた Linux 専用の wxPython アプリケーションがあります。ツールバー自体から独立した新しいウィンドウを開くことができます。
ユーザーはこれらのウィンドウを任意の仮想ワークスペースに移動できるため、ユーザーがウィンドウをアクティブにするたびにツールバーを現在のワークスペースに移動する方法を探しています。
Raise() を使用してみましたが、この方法ではツールバーもフォーカスを受け取りますが、それは望ましくありません。すべてのワークスペースでツールバーを固定したくないので、ツールバーを固定できないことに注意してください。

ありがとう!

(wxPython 2.8.9.1、Ubuntu 9.04)

ファローアップ:

xfwm4のソース コードをチェックして、「ウィンドウをワークスペース N に移動」がどのように行われるかを確認しました。_NET_WM_DESKTOP ヒントを使用しているため、Python を使用して実行しようとしています。現在のコードは次のとおりです。

import gtk

def move_to_workspace(frame, ws):
    gdkwin = gtk.gdk.window_lookup(frame.GetHandle())
    win = gdkwin.get_user_data()
    while not isinstance(win, gtk.Window): # Find parent Window object
        win = win.get_parent()
    win.window.property_change(gtk.gdk.atom_intern("_NET_WM_DESKTOP"),
                                                        gtk.gdk.atom_intern("CARDINAL"), 32,
                                                        gtk.gdk.PROP_MODE_REPLACE,
                                                        [ws])

xprop が変更を検出するため、コードはある程度成功しているように見えます。

(before execution)
$ xprop | grep WM_DESKTOP
_NET_WM_DESKTOP(CARDINAL) = 0

(after)
$xprop | grep WM_DESKTOP
_NET_WM_DESKTOP(CARDINAL) = 1

しかし問題は、ウィンドウが目的のワークスペースに移動しないことです:/

pygtk の代わりに python-xlib を使用する必要がありますか? その場合、wxFrame (または gtk.Window、または XID) から対応する Xlib.Window を取得するにはどうすればよいですか?

フォローアップ 2:

xprop を使用しても同じことが起こります。

$ xprop -id <id> -f _NET_WM_DESKTOP 32c -set _NET_WM_DESKTOP 1

変更された_NET_WM_DESKTOPを検出しますが、ウィンドウはそこにとどまります:/しかし、次のことに気付きました:

  • ウィンドウのアイコン化されたバージョンが目的のワークスペースに表示されます
  • 「ソース」ワークスペースでウィンドウをアイコン化すると、ウィンドウが消えます

それで、ウィンドウマネージャにもある種の「リフレッシュ」メッセージを送るべきでしょうか..?

4

2 に答える 2

1

結局、 wmctrlを使用することにしました。

于 2010-02-01T07:58:57.160 に答える
1

少し古いですが、それでも...ウィンドウのプロパティを設定してイベントを送信した後、インスタンスflushのメソッドを呼び出す必要があります。display.Display

于 2014-01-16T14:14:16.233 に答える