【问题标题】:How can i move a gtk window from a workspace to another using wnck in python?如何在 python 中使用 wnck 将 gtk 窗口从工作区移动到另一个工作区?
【发布时间】:2014-02-20 11:29:21
【问题描述】:

我正在尝试开发一个允许在 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) 会返回“None”,但它可以工作(但它不会移动窗口!)。

我可以解决我的问题吗?

提前感谢大家。

【问题讨论】:

    标签: python gtk pygtk wnck


    【解决方案1】:

    当您调用 screen.get_workspace(2) 时,您的窗口管理器根本没有工作区 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() 可用于显式获取 信息。

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

    【讨论】:

    • 谢谢@jku。所以我不能在空的工作区中移动我的窗口?我正在研究 gnome 经典环境。
    • 没有什么可以阻止您将窗口移动到空工作区,但工作区必须存在。在普通的 GNOME 3 中总是有一个空工作区(最后一个),但我不知道经典模式的作用。
    • 我的环境中有 4 个工作区(我使用 ctrl+alt+箭头在它们之间跳转)。也许我误解了“工作区”的含义?
    • 您可能已经尽可能地理解了它......整个事情并没有很明确地指定,不同的实现最终会做非常不同的事情。尽管如此,如果 screen.get_workspace(2) 为 None,那 应该 意味着当前最多只存在 2 个工作区(0 和 1)。您可以为每个工作区执行 screen.get_workspaces() 并打印 workspace.get_number() 以进行检查。
    猜你喜欢
    • 2021-07-02
    • 2020-12-27
    • 2014-07-03
    • 2011-05-07
    • 1970-01-01
    • 2021-06-16
    • 2020-05-26
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多