我最近安装了 Ubuntu 17.10,它使用 Wayland 而不是(或某种组合?)X11。在我可以使用xprop -root|grep ^_NET_CLIENT_LIST
或 wmctrl ( wmctrl -lpGxu
) 来获取所有活动窗口的列表之前。这不再适用于所有 gnome 应用程序(例如终端)和其他一些应用程序(例如 nautlius)。有什么办法列出这些吗?
答案1
更新
可悲的是,这出于安全原因,不再适用于 Gnome 41
在 Looking Glass 中运行global.context.unsafe_mode = true
会重新启用该功能,但只是暂时的。
原答案
是的,在 Wayland 上,遗憾的是 Xorg 实用程序wmctrl
无法xdotool
运行。相反,我们可以与窗口管理器对话。
对于 Gnome,我们可以运行gdbus
发送 DBUS 消息来执行一些 GJS (GNOME C API 的 JavaScript 绑定)。
要获取窗口列表及其类和标题(使用sed
和jq
进行美化):
$ gdbus call \
--session \
--dest org.gnome.Shell \
--object-path /org/gnome/Shell \
--method org.gnome.Shell.Eval "
global
.get_window_actors()
.map(a=>a.meta_window)
.map(w=>({class: w.get_wm_class(), title: w.get_title()}))" \
| sed -E -e "s/^\(\S+, '//" -e "s/'\)$//" \
| jq .
输出示例:
[
{
"class": "firefox",
"title": "Mozilla Firefox"
},
{
"class": "org.gnome.Nautilus",
"title": "Downloads"
},
{
"class": "Google-chrome",
"title": "ubuntu - Bash command to focus a specific window - Super User - Google Chrome"
},
{
"class": "sublime_text",
"title": "untitled (dotfiles) - Sublime Text"
},
{
"class": "gnome-terminal-server",
"title": "Projects"
},
{
"class": "Gnome-shell",
"title": "gnome-shell"
}
]
要获取当前焦点窗口的类:
$ gdbus call \
--session \
--dest org.gnome.Shell \
--object-path /org/gnome/Shell \
--method org.gnome.Shell.Eval "
global
.get_window_actors()
.map(a=>a.meta_window)
.find(w=>w.has_focus())
.get_wm_class()" \
| cut -d'"' -f 2
gnome-terminal-server
您可以使用 Gnome 的“Looking Glass”调试器来尝试 GJS 中的可能性:Alt+F2,然后运行lg