Bash 命令聚焦特定窗口

Bash 命令聚焦特定窗口

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

例如,如果我正在运行一个 Firefox 实例,但它被最小化了(或者它上面有其他窗口)。我需要一个 bash 命令来调出 Firefox 窗口并将其作为活动窗口,从而将焦点放在该窗口上。

答案1

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

wmctrl -l 

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

wmctrl -a STRING

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

wmctrl -a Firefox

答案2

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

在此示例中:

wmctrl -R firefox && \
  xdotool key --clearmodifiers ctrl+t ctrl+l && \
  xdotool type --delay=250 google && \
  xdotool key --clearmodifiers Tab Return

执行以下步骤:

  1. 将焦点放在第一个匹配的 Firefox 窗口上
  2. 打开新的浏览器标签页
  3. 将焦点放在地址栏上
  4. 输入“google”
  5. 按 T​​ab 键跳至第一个浏览器自动完成结果
  6. 按 Return(或 Enter)键

答案3

我在 Ubuntu PC 上使用的以下脚本怎么样?用例是这样的。

   $ ./focus_win.sh 1            # focus on a application window that executed at first
   $ ./focus_win.sh 2            # second executed application window

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

猫焦点_win

#! /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

答案4

正如另一个答案已经提到的,wmctrl对于这项任务来说是一个不错的选择,并且wmctrl -a WINDOWTITLE允许人们激活标题包含的窗口WINDOWTITLE

然而,在许多情况下,窗口标题不包含所用程序的名称。为此, wmctrl还可以-x使用按类名聚焦窗口的选项。

您可以键入wmctrl -lx来打印所有当前打开的窗口及其类名。您可以使用 来wmctrl -xa NAME激活类名包含 的窗口NAME

例如,我遇到一个问题,如果 Evince PDF 查看器窗口已打开,我想激活它,但我无法仅通过窗口名称来做到这一点,因为它始终只包含所查看的 PDF 的名称。所以我使用wmctrl -lx并找到了以下行

0x06000007  0 evince.Evince         sejmou-desktop 2. User-User Collaborative Filtering

evince.Evince上面提到的窗口类名在哪里呢?

然后,我能够以编程方式激活 Evince 窗口wmctrl -xa Evince。当然,只有当Evince是当前打开的窗口中唯一的类名时,这才能可靠地工作。

相关内容