Показать все окна gnome terminal в Ubuntu

16.11.2015, 23:55 - 2 мин читать

При работе за компом имею привычку открывать много терминалов, не группируя их по вкладкам, рабочим столам или менеджером терминалов типа 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) повешен на хоткей.

Скрипт можно вызывать, передав параметром имя процесса, иначе возьмет его из текущего окна.

, теги: ubuntu bash