Используйте терминал для отображения изображения без потери фокуса

У меня есть bash-скрипт, в котором я хочу отобразить изображение пользователю. Это возможно с помощью ImageMagick display.

display image.png

Но теперь фокус окна терминала теряется и помещается на изображение. Чтобы продолжить мой bash-скрипт, я должен попросить пользователя нажать на терминал, прежде чем продолжить. Это нежелательное поведение.

Есть ли способ отобразить изображение, не теряя фокуса моего терминала bash? Я хочу, чтобы он работал на Ubuntu Linux (12.04).

Фокус потерян


person CousinCocaine    schedule 30.08.2014    source источник
comment
Вы можете использовать wmctrl...   -  person Mark Setchell    schedule 30.08.2014


Ответы (4)


Вот не слишком неудобное решение с использованием wmctrl:

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

Чтобы объяснить, я разобью его на шаги:

  1. wmctrl -T master$$ -r :ACTIVE:

    Чтобы управлять окном, wmctrl необходимо знать его имя, которое по умолчанию является заголовком окна. Таким образом, на этом шаге текущему окну присваивается уникальное имя master$$, где оболочка расширяет $$ до идентификационного номера процесса. Вы можете выбрать другое имя.

  2. display image.png &

    На этом шаге ваше изображение отображается как «фоновый» процесс. Окно изображения захватит фокус.

  3. спать 0,1

    Нам нужно подождать достаточно времени, пока display откроет свое окно.

  4. wmctrl -a master$$

    Теперь мы возвращаем фокус с display. Если вы выбрали другое имя для главного окна на шаге 1, используйте это имя вместо master$$.

Если wmctrl не установлен в вашей системе, вам необходимо установить его. В debian-подобных системах запустите:

apt-get install wmctrl

wmctrl поддерживает Enlightenment, icewm, kwin, metacity, sawfish и все другие X-window-менеджеры, совместимые с EWMH/NetWM.

Альтернативный подход, не требующий знания заголовка окна

Сначала получите идентификатор текущего окна:

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

Теперь мы можем использовать этот идентификатор вместо заголовка окна. Чтобы запустить display, сохраняя фокус в текущем окне:

display image.png & sleep 0.1 ; wmctrl -i -a "$my_id"
person John1024    schedule 30.08.2014
comment
Большой! Это один полный ответ. У меня не было сердца wmctrl, оно работает как рекламируется! - person CousinCocaine; 31.08.2014
comment
Вы можете опросить открытое окно вместо того, чтобы надеяться, что ваш sleep будет достаточной продолжительности с помощью цикла, подобного этому: (while true; do wmctrl -l | egrep -iq 'imagemagick:' && break; sleep 0.1s; done) - person Jan Kyu Peblik; 18.05.2018

в дополнение к ответу John1024.


еще один способ получить ширину активного окна:

$ xdotool getwindowfocus

и установите фокус:

$ xdotool windowfocus <wid>

поэтому полная команда будет выглядеть так (обратите внимание на опцию -i, это важно!):

$ wid=$(xdotool getwindowfocus); display image.png & sleep 0.1; xdotool windowfocus $wid

p.s. прочитайте xdotool.

person aleksandr barakin    schedule 26.07.2019

Не теряя фокуса терминала, вы можете использовать возвышенный текст, чтобы открыть любое изображение.

subl изображение.png

person noelyahan    schedule 01.02.2015

Вы можете использовать picterm, он был создан для этой цели: https://github.com/artemsen/picterm

person art    schedule 27.06.2020