更新

更新

我最近安装了 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 绑定)。

要获取窗口列表及其类和标题(使用sedjq进行美化):

$ 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

相关内容