メニュー/ツールバーとして機能する 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を検出しますが、ウィンドウはそこにとどまります:/しかし、次のことに気付きました:
- ウィンドウのアイコン化されたバージョンが目的のワークスペースに表示されます
- 「ソース」ワークスペースでウィンドウをアイコン化すると、ウィンドウが消えます
それで、ウィンドウマネージャにもある種の「リフレッシュ」メッセージを送るべきでしょうか..?