Команда Bash для фокусировки на конкретном окне

50

Есть ли способ, в командной строке bash, чтобы сосредоточиться на конкретном окне запущенного процесса. Предположим, я знаю имя процесса, номер и все, что мне нужно.

Например, если у меня запущен единственный экземпляр Firefox, но он свернут (или поверх него есть какое-то другое окно). Мне нужна команда bash, которая вызывает и фокусирует окно Firefox, делая его активным окном.

Malabarba
источник

Ответы:

78

Команда wmctrl, кажется, делает эту работу. Он уже был установлен для меня, но он доступен в репозиториях на тот случай, если это кому-нибудь понадобится.

wmctrl -l 

Списки в настоящее время открытых окон (включая панели гномов).

wmctrl -a STRING

Дает фокус окну, содержащему STRING в заголовке. Я не уверен, что произойдет, если более одного окна соответствует этому условию.
В моем случае команда была:

wmctrl -a Firefox
Malabarba
источник
6
Приятно видеть, что кто-то читает, и я не просто болтаю про себя. =)
Малабарба
1
Также попробуйте xdotool .
Андрес Риофрио
Это замечательно для возврата фокуса к gdb (отладчику), когда он запускает цель отладчика с окном, которое крадет фокус, как kvm. Используйте команду gdb shell wmctrl -a something, где что-то есть в заголовке вашего терминала отладчика.
doug65536
Большое спасибо, это чистое золото, я боялся, что потерял всю свою ожидающую работу в каком-то окне Chrome, которое как-то просто исчезло на заднем плане, это сработало!
Осмар
9

Используя 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. Вкладка к первому результату автозаполнения браузера
  6. Нажмите клавишу возврата (или ввода)
Кристофер
источник
4

Как ниже сценарий, который я использую в моем Ubuntu ПК? Вариант использования такой.

   $ ./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, ...

кошка 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
SWJ
источник