在工作区/虚拟桌面之间移动窗口

时间:2010-01-25 10:59:47

标签: wxpython x11 window-managers

我有一个仅支持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,但窗口仍然存在:/但是,我注意到以下内容:

  • 窗口的图标化版本显示在预期的工作区
  • 如果我在“源”工作区上图标化窗口,它就会消失

所以,也许我应该向窗口管理器发送某种“刷新”消息..?

2 个答案:

答案 0 :(得分:1)

最后我决定使用wmctrl

答案 1 :(得分:1)

有点老了,但还是...... 在设置窗口属性和发送事件后,您必须调用flush实例的display.Display方法。