我有一个bash脚本,想要向用户显示一张图片。可以使用ImageMagick的 display
实现。
display image.png
但是现在终端窗口的焦点丢失了,并放置到图像上。为了继续我的bash脚本,我必须要求用户在继续之前单击终端。这是不需要的行为。
有没有一种方法可以显示图像而不失去我的bash终端的焦点?我希望它能在Ubuntu Linux(12.04)上工作。
![焦点丢失](https://istack.dev59.com/CqxCm.webp)
我有一个bash脚本,想要向用户显示一张图片。可以使用ImageMagick的 display
实现。
display image.png
这里有一个不太复杂的解决方案,使用wmctrl
:
wmctrl -T master$$ -r :ACTIVE: ; display image.png & sleep 0.1 ; wmctrl -a master$$
wmctrl -T master$$ -r :ACTIVE:
要控制一个窗口,wmctrl
需要知道它的名称,默认情况下是它的窗口标题。因此,这一步将当前窗口分配给唯一的名称master$$
,其中shell会将$$
扩展为进程ID号码。你可能想选择一个不同的名称。
display image.png &
这一步将您的图像显示为“后台”进程。图像窗口将抓住焦点。
sleep 0.1
我们需要等待足够的时间让display
打开它的窗口。
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
,它确实像广告中描述的那样工作! - CousinCocainesleep
循环足够长时间,像这样:(while true; do wmctrl -l | egrep -iq 'imagemagick:' && break; sleep 0.1s; done)
- Jan Kyu Peblik另一种关闭活动窗口的方法:
$ xdotool getwindowfocus
并设置焦点:
$ xdotool windowfocus <wid>
-i
,它很重要!):$ wid=$(xdotool getwindowfocus); display image.png & sleep 0.1; xdotool windowfocus $wid
p.s. 阅读关于 xdotool 的内容。
在不失去终端焦点的情况下,您可以使用Sublime Text打开任何图像
subl
image.png
subl
抓取焦点。 - Ljm Dullaart
wmctrl
... - Mark Setchell