使用终端显示图像而不失去焦点

6

我有一个bash脚本,想要向用户显示一张图片。可以使用ImageMagick的 display 实现。

display image.png

但是现在终端窗口的焦点丢失了,并放置到图像上。为了继续我的bash脚本,我必须要求用户在继续之前单击终端。这是不需要的行为。
有没有一种方法可以显示图像而不失去我的bash终端的焦点?我希望它能在Ubuntu Linux(12.04)上工作。 焦点丢失

1
你可以使用 wmctrl... - Mark Setchell
4个回答

10

这里有一个不太复杂的解决方案,使用wmctrl

wmctrl -T master$$ -r :ACTIVE: ; display image.png & sleep 0.1 ; wmctrl -a master$$

为了解释清楚,我将把它分成几个步骤:
  1. wmctrl -T master$$ -r :ACTIVE:

    要控制一个窗口,wmctrl需要知道它的名称,默认情况下是它的窗口标题。因此,这一步将当前窗口分配给唯一的名称master$$,其中shell会将$$扩展为进程ID号码。你可能想选择一个不同的名称。

  2. display image.png &

    这一步将您的图像显示为“后台”进程。图像窗口将抓住焦点。

  3. sleep 0.1

    我们需要等待足够的时间让display打开它的窗口。

  4. wmctrl -a master$$

    现在,我们从display中重新获得焦点。如果你在第一步中选择了一个不同的主窗口名称,请在这里使用那个名称代替master$$

如果您的系统未安装wmctrl,则需要安装它。在类似debian的系统上运行:

apt-get install wmctrl

wmctrl 可以支持 Enlightenment、icewm、kwin、metacity、sawfish 和所有其他 EWMH/NetWM 兼容的 X 窗口管理器。

另一种不需要知道窗口标题的方法

首先,获取当前窗口的 ID:

my_id=$(wmctrl -l -p | awk -v pid=$PPID '$3 == pid {print $1}')

我们现在可以使用这个ID来代替窗口标题。为了启动display并保持当前窗口的焦点:

display image.png & sleep 0.1 ; wmctrl -i -a "$my_id"

太好了!这是一个完整的答案。我之前没有听说过 wmctrl,它确实像广告中描述的那样工作! - CousinCocaine
你可以轮询已打开的窗口,而不是希望你的 sleep 循环足够长时间,像这样:(while true; do wmctrl -l | egrep -iq 'imagemagick:' && break; sleep 0.1s; done) - Jan Kyu Peblik

1
除了 John1024的回答 之外,还有其他相关编程内容。

另一种关闭活动窗口的方法:

$ xdotool getwindowfocus

并设置焦点:

$ xdotool windowfocus <wid>

因此完整的命令将如下所示(请注意选项-i,它很重要!):
$ wid=$(xdotool getwindowfocus); display image.png & sleep 0.1; xdotool windowfocus $wid

p.s. 阅读关于 xdotool 的内容。


0

在不失去终端焦点的情况下,您可以使用Sublime Text打开任何图像

subl image.png


subl 抓取焦点。 - Ljm Dullaart

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接