【问题标题】:Moving a window between workspaces/virtual desktops在工作区/虚拟桌面之间移动窗口
【发布时间】:2010-01-25 10:59:46
【问题描述】:

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

  • 图标化版本的窗口出现在预期工作区中
  • 如果我在“源”工作区中将窗口图标化,它就会消失

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

【问题讨论】:

    标签: wxpython x11 window-managers


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      最后我决定只使用wmctrl

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多