在Gnome / Wayland会话上从Mutter检索活动窗口

时间:2018-02-14 22:33:17

标签: gnome wayland active-window

我正在尝试编写一个应用程序,根据活动的应用程序向不同的应用程序发送不同的dBus信号。这个想法是将它与Libinput手势配对,并允许每个应用程序手势响应。问题是,无法确定客户端上哪个应用程序处于活动状态。

我一直在研究检测应用程序是否关注Wayland下的任何特定窗口管理器。共识是,Wayland不知道某个应用程序是否具有重点,并且不会提供该信息。然而,窗口管理器本身确实知道。

有没有办法为gnome创建一个完整的服务器端例程,将活动窗口客户端的标题发送到选定数量的应用程序。换句话说,我们仍然具有“安全性”,即不让任意应用程序了解环境的所有内容,但仍然允许一些可访问性软件检索该信息并使用它。

1 个答案:

答案 0 :(得分:2)

快2岁了,可是!!我不确定Mutter是否也可以做到这一点,或者是否有更好的方法可以做到以下几点。我怀疑如果对gdbus有更好的了解,并且需要进一步研究,您还可以将其转换为某种官方gdbus监控,可以与其他应用程序进行通信,因此您不必强制查询状态。

这是特定于Gnome的,我怀疑至少在3.15以上可以使用。在Ubuntu 19.10 Wayland上测试。 (侏儒3.34.2)

# Single Command, runs 2 calls to gdbus to get the currently active Window from Gnome 3.x
# Escaped so you can copy and paste into terminal directly
gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval global.get_window_actors\(\)[`gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval global.get_window_actors\(\).findIndex\(a\=\>a.meta_window.has_focus\(\)===true\) | cut -d"'" -f 2`].get_meta_window\(\).get_wm_class\(\) | cut -d'"' -f 2

# Unescaped version, will not run
# Broken down into 2 commands.

# Call to Gnome to get the array location of the active Application
gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval \
global.get_window_actors().findIndex(a=>a.meta_window.has_focus()===true) \
| cut -d"'" -f 2

# Replace the array number 2 with the one from the previous command and you will get the App Name of the actively focused Window
gdbus call -e -d org.gnome.Shell -o /org/gnome/Shell -m org.gnome.Shell.Eval \
global.get_window_actors()[2].get_meta_window().get_wm_class() \
| cut -d'"' -f 2

这是我做笔记的要点,与上面的代码相同。 https://gist.github.com/rbreaves/257c3edfa301786e66e964d7ac036269

对于在我的github上的Wayland下的KDE5 Plasma,有兴趣的人,我也有一个非gdbus方法。 (向已经检索了类名的现有Plasmoid添加了一些代码。)