用于聚焦特定窗口的 Bash 命令

Mal*_*rba 61 gnome bash ubuntu

有没有办法在 bash 命令行中将焦点放在正在运行的进程的特定窗口上。假设我知道进程的名称、编号以及我需要的任何其他信息。

例如,如果我有一个 Firefox 实例正在运行,但是它被最小化了(或者它上面有一些其他窗口)。我需要一个 bash 命令,通过将其设置为活动窗口来调出并聚焦到 Firefox 窗口。

Mal*_*rba 89

wmctrl 命令似乎可以完成这项工作。它已经为我安装,但它可以在存储库中使用,以防有人需要它。

wmctrl -l 
Run Code Online (Sandbox Code Playgroud)

列出当前打开的窗口(包括 gnome 面板)。

wmctrl -a STRING
Run Code Online (Sandbox Code Playgroud)

将焦点放在标题中包含 STRING 的窗口上。如果多个窗口满足该条件,我不确定会发生什么。
在我的情况下,命令是:

wmctrl -a Firefox
Run Code Online (Sandbox Code Playgroud)

  • 很高兴看到有人在阅读,而且我不只是对自己胡言乱语。=) (7认同)
  • 您还可以使用 `xdotool` 来执行此操作:`xdotool search --class "class name" windowfocus`,或使用其名称来定位窗口。使用“xev”查找窗口信息。 (2认同)

Chr*_*her 12

使用wmctrl与组合xdotool,你可以切换焦点到Firefox,然后执行键盘或鼠标操作。

在这个例子中:

wmctrl -R firefox && \
  xdotool key --clearmodifiers ctrl+t ctrl+l && \
  xdotool type --delay=250 google && \
  xdotool key --clearmodifiers Tab Return
Run Code Online (Sandbox Code Playgroud)

执行以下步骤:

  1. 将焦点放在第一个匹配的 Firefox 窗口上
  2. 打开一个新的浏览器标签
  3. 将焦点放在地址栏中
  4. 输入“谷歌”
  5. Tab 到第一个浏览器自动完成结果
  6. 按回车(或回车)键


小智 7

我在 ubuntu 电脑中使用的以下脚本如何?用例是这样的。

   $ ./focus_win.sh 1            # focus on a application window that executed at first
   $ ./focus_win.sh 2            # second executed application window
Run Code Online (Sandbox Code Playgroud)

我在键盘自定义快捷方式中分配它后使用它。ctrl+1, ctrl+2, ...

猫focus_win.sh

#! /bin/sh

if [ "" = "$1" ] ; then
    echo "usage $0 <win index>"
    exit 1;
fi

WIN_ID=`wmctrl -l | cut -d ' ' -f1 | head -n $1 | tail -n 1`

if [ "" = "$WIN_ID" ] ; then
    echo "fail to get win id of index $1"
    exit 1;
fi
wmctrl -i -a $WIN_ID
Run Code Online (Sandbox Code Playgroud)


Zim*_*biX 6

更新

遗憾的是,出于安全原因,这不再适用于 Gnome 41

在 Looking Glass 中运行global.context.unsafe_mode = true会重新启用该功能,但只是暂时的。

原答案

在 Wayland 上,遗憾的是wmctrl,它xdotool不起作用。相反,我们可以与窗口管理器对话。

对于 Gnome,我们可以运行gdbus发送 DBUS 消息来执行一些 GJS(GNOME C API 的 JavaScript 绑定)。

聚焦窗口:

$ gdbus call \
  --session \
  --dest org.gnome.Shell \
  --object-path /org/gnome/Shell \
  --method org.gnome.Shell.Eval "
var mw =
  global.get_window_actors()
    .map(w=>w.meta_window)
    .find(mw=>mw.get_title().includes('Firefox'));
mw && mw.activate(0)"
Run Code Online (Sandbox Code Playgroud)

也可以看看:

您可以使用 Gnome 的“Looking Glass”调试器来尝试 GJS 中的可能性:Alt+F2,然后运行lg