При работе за компом имею привычку открывать много терминалов, не группируя их по вкладкам, рабочим столам или менеджером терминалов типа tmux. При этом терминалы расположены по всему рабочему экрану.
Из-за этого была такая проблема: при переключении на браузер или редактор, которые обычно занимают по полэкрана, все терминалы оказывались под большими окнами.
Придумал решение: нужно, чтобы можно было выбрать один терминал (который обычно доступен по Alt-Tab), нажать хоткей и достать все окна этой же программы наверх.
Для этого нужно:
- определить текущее окно
- определить его класс
- найти все окна с тем же классом
- активировать каждое из окон
Для манипуляции с окнами из консоли использовал xdotool
:
sudo aptitude install xdotool
Через полчаса родился страшный однострочник, в итоге из него получился такой скрипт:
# !/bin/bash
#
# Activate all windows with process name of currently active window
# Получить текущее активное окно, его pid, имя процесса
current_pid=$(xdotool getwindowpid $(xdotool getactivewindow))
current_name=$(ps -p $current_pid -o comm=)
clean_name=${current_name%-}
name=${1:-$clean_name}
# найти окна процесса (только видимые), активировать каждое из них
xdotool search --onlyvisible --class "$name" \
| xargs -L1 --no-run-if-empty xdotool windowactivate
Какие были проблемы:
- У каждого процесса оказалось штук по 5 “окон”, которые на самом деле не видны
- Текущий процесс
gnome-terminal
виден в процессах какgnome-terminal-server
, в процессах имя не входит и отображается какgnome-terminal-
, в этом месте был вбит костыль, добавлена обрезка дефиса в конце.
Скрипт был сохранен в /usr/local/bin/window-activate
и через ccsm
(Compiz config settings manager) повешен на хоткей.
Скрипт можно вызывать, передав параметром имя процесса, иначе возьмет его из текущего окна.