2

我正在尝试开发一个允许在 gnome 工作区之间移动窗口的 python 应用程序。我正在使用 wnck 与 Windows 交互,但我想知道如何将一个窗口从一个工作区移动到另一个工作区。任何人都可以建议我一个方法?

我尝试使用以下代码

screen = wnck.screen_get_default()
window_list = screen.get_windows()
titlePattern = re.compile('.*Downloads.*')
    if len(window_list) == 0:
        print "No Windows Found"
    for win in window_list:
        if(titlePattern.match(win.get_name())):
            win.move_to_workspace(screen.get_workspace(2))

但是如果我使用 screen.get_workspace(0) 作为 move_to_workspace 参数,则 screen.get_workspace(2) 会返回“无”,而它可以工作(但它不会移动窗口!)。

我可以解决我的问题吗?

提前感谢大家。

4

1 回答 1

2

当您调用时,您的窗口管理器根本没有工作区 2 screen.get_workspace(2)

您的代码应该适用于实际存在的所有工作区。在 GNOME 3 中,这意味着所有已经有窗口的工作区加上一个空工作区。这意味着screen.get_workspace(screen.get_workspace_count() - 1)应该为您提供“空”工作区,如果那是您正在寻找的。请注意,没有规范说最后一个工作区是空的,这正是 gnome-shell 当前正在做的事情。

您也可以要求窗口管理器增加屏幕上的工作区数量,但没有义务这样做:GNOME 3 窗口管理器不会这样做。

哦,关于 Wnck 要记住一件事:

在创建时,WnckScreen 对象不会从 X 服务器获取信息。如果在创建后立即查询(例如,通过 wnck_screen_get_windows() 或 wnck_screen_get_workspaces()),则 WnckScreen 对象看起来就像屏幕上没有工作区或窗口。此信息在主事件循环中使用空闲源获取,以避免在启动时进行昂贵的同步操作。如果没有使用主事件循环,或者如果在创建对象后尽快需要信息,可以使用 wnck_screen_force_update() 显式获取信息。

我不认为这是你的问题(因为你已经有一个窗口列表),但我只是在仔细检查,因为这是一个令人讨厌的陷阱。

于 2014-02-20T17:35:26.407 回答