2010-01-25 88 views
2

我有一个仅用于Linux的wxPython应用程序,它带有一个充当菜单/工具栏的wxFrame,它可以打开独立于工具栏本身的新窗口。
因为用户可以将这些窗口中的任何一个移动到任何虚拟工作区,所以我正在寻找一种方法来在用户激活一个窗口时将工具栏移动到当前工作区。
我尝试使用Raise(),但以这种方式工具栏也收到焦点,我不想这样做。请注意,我无法使工具栏变得粘滞,因为我不想在的每个工作区上使用它。在工作区/虚拟桌面之间移动窗口

谢谢!

(wxPython的2.8.9.1,Ubuntu的9.04)

后续:

我检查的xfwm4的源代码,看看它是如何的 “将窗口移至工作区N”。它使用_NET_WM_DESKTOP hint,所以我想它使用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 

但问题是,窗口不移动到所需的工作区:/

我应该使用Python-的xlib代替PyGTK的?如果是这样的话,我怎样才能从一个wxFrame(或gtk.Window或XID)获取相应的Xlib.Window?

后续2:

同样的情况,使用xprop ..

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

它检测改变_NET_WM_DESKTOP,但窗口在那里停留:/不过,我注意到以下几点:

  • 该窗口的图标化版本出现在预期工作区上
  • 如果我对图标化的“源”工作区窗口,它消失

所以,也许我应该把某种“刷新”消息的窗口管理太..?

回答

1

这是有点旧,但仍然... 你必须在设置窗口属性和发送事件后调用flush方法display.Display实例。