Python 如何获得Gnome Wayland上的活动窗口?

Python 如何获得Gnome Wayland上的活动窗口?,python,gnome,gnome-3,wayland,Python,Gnome,Gnome 3,Wayland,背景:我正在开发一款名为的软件,它可以记录您在计算机上的操作。基本上是试图解决一些问题:救援时间、自我间谍、arbtt等 我们所做的核心工作之一是记录有关活动窗口(类和标题)的信息。过去,这是在Linux上使用xprop完成的,现在使用python xlib也没有问题 但现在我们遇到了一个问题:韦兰正在崛起,就我所知,韦兰没有活动窗口的概念。因此,我担心的是,我们将不得不为Wayland提供的每一个桌面环境实施支持(假设它们提供获取活动窗口信息的能力) 希望它们最终会收敛,并有一些共同的界面来完

背景:我正在开发一款名为的软件,它可以记录您在计算机上的操作。基本上是试图解决一些问题:救援时间、自我间谍、arbtt等

我们所做的核心工作之一是记录有关活动窗口(类和标题)的信息。过去,这是在Linux上使用xprop完成的,现在使用python xlib也没有问题

但现在我们遇到了一个问题:韦兰正在崛起,就我所知,韦兰没有活动窗口的概念。因此,我担心的是,我们将不得不为Wayland提供的每一个桌面环境实施支持(假设它们提供获取活动窗口信息的能力)

希望它们最终会收敛,并有一些共同的界面来完成这项工作,但我不会屏住呼吸

我一直在努力。但是今天我们得到了一个真正的Wayland用户的许可。随着更大的发行版采用Wayland作为默认的显示服务器协议(Fedora25已经在使用它,Ubuntu将在即将到来的17.10中进行切换),随着时间的推移,情况将变得更加严峻

ActivityWatch的相关问题:

还有其他一些应用程序,如ActivityWatch,需要相同的功能(救援时间、arbtt、selfspy等),它们目前似乎不支持Wayland,我找不到任何关于它们计划这样做的细节

我现在对实施对Gnome的支持感兴趣,从开始,随着路径变得更加清晰,我将与其他人一起跟进

关于韦斯顿,这里也有类似的问题:

编辑:我在Freenode的#wayland上询问,得到了以下答复:

15:20:44 ErikBjare大家好。我正在开发一款名为ActivityWatch的自动跟踪软件(https://github.com/ActivityWatch/activitywatch). 我知道这不是一个合适的地方,但我想知道是否有人知道如何使用DE以任何方式获取活动窗口。
15:20:57 ErikBjare就此提出了一个问题:https://stackoverflow.com/questions/45465016/how-do-i-get-the-active-window-on-gnome-wayland
15:21:25 ErikBjare我的回购协议中有一个问题:https://github.com/ActivityWatch/activitywatch/issues/92
15:22:54 ErikBjare还有许多其他应用程序依赖它(救援时间、selfspy、arbtt、ulogme等),所以他们也需要它
15:24:23 blocage ErikBjare,在核心协议中,您无法知道哪个windnow具有键盘或光标焦点
15:24:39 blocage ErikBjare,在wayland核心协议中*
15:25:10 blocage ErikBjare,你可以知道你的窗口是否有焦点,这是一个设计选择
15:25:23避免客户互相刺探
我知道,这就是我担心的原因。我并不是说应该包括它或其他什么,但现在看来,如果要支持这类应用程序,每个DE都需要自己实现它
15:25:46 ErikBjare想知道是否有人知道在Gnome上与Wayland合作的团队
15:26:11 ErikBjare谢谢你的确认
15:26:29 Blokage ErikBjare,DE应创建自定义扩展,或使用D-bus或其他IPC
15:27:31 blocage ErikBjare,我猜这里有一些排字师,但我不知道是否已经有这样的扩展了
15:27:44 blocage合成器开发人员*
15:28:36 ErikBjare我认为没有(我做了很多搜索),所以我想我需要引起一些开发者的注意
15:29:16 ErikBjare非常感谢
15:29:42 ErikBjare blocage:你介意我分享一下我们在这个问题上的对话记录吗?
15:30:05 blocage就用吧:)这是公开的
15:30:19 ErikBjare ty:)
编辑2:存档一个文件


tl;dr:使用Wayland时,如何在Gnome上获得活动窗口?

我有一个名为
preguiça.py
的脚本,它与您所做的完全相同,尽管它可能要简单得多,而且我还没有发布它

对于我的脚本,我使用PyGObject的窗口导航器构造工具包(Wnck)获得了窗口标题

以下是它的简化版本,其中包含一些重要部分:

from gi.repository import Wnck
from gi.repository import GObject

def changed (screen, window, data):
    print ("Changed!")
#    window = screen.get_active_window()
    if window:
        print ("Title: %s" % window.get_name())

screen = Wnck.Screen.get_default ()
screen.connect ("active-window-changed", changed, None)

mainLoop = GObject.MainLoop ()

try:
    mainLoop.run ()
except KeyboardInterrupt:
    print ("Hey")

mainLoop.unref ()
您所请求的实际代码实际上在上面的示例中被注释掉了(我不需要捕获窗口,因为回调已经接收到它),但是您可能需要它,具体取决于您的实现

我为X写的,当我切换到Wayland时,它没有抱怨,所以它可能对你有用

请注意,正如您所问,它并没有从Wayland获得信息,但它实际上可能更好,因为它将是X/Wayland不可知的。它的标题来自我打开的一个xterm,所以它也应该是工具包不可知论的


不过,不要问我实施的细节。代码至少有四年历史:)

在我看来,您最好的选择不是Wayland或任何可用的库(没有)。实际上,在gnome wayland中知道活动窗口的人都在嘀咕,所以您需要找到一种方法来请求嘀咕活动窗口。Gnome可以开发一个API,在内部请求输入活动窗口并恢复功能。但事实上,你没有地方去要求它。Mutter不会开发API来访问其内部表示,因为这只针对Mutter,而不是Allwayland windows manager。因此,需要将其添加到外部库中,该库可能会与当前的窗口管理器进行对话,以一般方式解决您的请求

另一种可能是添加一个Wayland插件