wmii
Что такое wmii
wmii — это относительно новый оконный менеджер для X11 (*nix). Он относится к тому же классу оконных менеджеров, что и *ratpoison* и Ion.
Создатели этих оконных менеджеров исходят из того, что существующие wm (начиная с MS Windows и кончая KDE и Gnome) предполагают ручное управление окнами, в то время как хороший менеджер должен сам, автоматически управлять расположением окон, делая это наилучшим для пользователя образом, чтобы пользователь мог больше сосредоточиться на своей работе, а не поисками и перетаскиванием нужных окон.
Основными отличительными чертами оконных менеджеров этого класса является концепция тегов (tags) и отображений (view), которые по-русски, возможно, лучше называть экранами. Управляется такой оконный менеджер в основном с клавиатуры.
Вместо парадигмы “рабочего стола”, на котором хаотически разбросаны окна, чато полностью или частично перекрывающие друг друга и перемещаемые преимущественно мышью, wmii предлагает “экраны” (views), помеченные тегами. При запуске приложения его окно занимает максимум полезного места, т.е. если это единственное окно, то оно и занимает весь экран. При открытии другого окна первое “поджимается”, давая ему необходимое место. Пометив окно новым тегом, можно переместить его на новый экран. Окна практически никогда не перекрываются, за исключением использования “плавающего” (float) размещения (используемого в основном для приложений с многооконным интерфейсом, таких как GIMP).
Звучит несколько запутанно. Но, поверьте, на самом деле это очень удобно, гораздо удобнее обычного рабочего стола (IMHO, конечно).
Настройка
Настройка wmii производится при помощи обычных скриптовых файлов. Таким образом, можно использовать не только предлагаемый по умолчанию sh или bash, но и любой другой скриптовый язык, главное, чтобы он умел запускать внешние программы и обмениваться с ними данными через стандартные устройства (stdin, stdout).
Общесистемные настройки и пара полезных скриптов лежат в каталоге /usr/local/etc/wmii-3. В домашнем каталоге создается каталог ~/.wmii-3, в котором можно разместить собственные настройки и скрипты. Эти настройки будут перекрывать общесистемные.
~/.wmii-3/wmiirc
Это главный настроечный скрипт. Я практически полностью поменял привязки клавиатуры и добавил парочку собственных.
Alt-Tab |
следующий экран |
Alt-Shift-Tab |
предыдущий экран |
Alt-LEFT |
на окно слева |
Alt-RIGHT |
на окно справа |
Alt-DOWN |
на окно вниз |
Alt-UP |
на окно вверх |
Alt-Shift-Up |
увеличить высоту окна |
Alt-Shift-Down |
уменьшить высоту окна |
Alt-Shift-Right |
увеличить ширину столбца |
Alt-Shift-Left |
уменьшить ширину столбца |
Alt-PgUp |
переместить окно в предыдущую колонку (влево) |
Alt-PgDn |
переместить окно в следующую колонку (вправо) |
Alt-Control-LEFT |
переместить окно влево |
Alt-Control-RIGHT |
переместить окно вправо |
Alt-Control-DOWN |
переместить окно вниз |
Alt-Control-UP |
переместить окно вверх |
Alt-F2 |
перейти к тегу по имени |
Alt-[0-9] |
перейти к тегу с именем 0-9 |
Alt-Shift-F2 |
пометить тегом текущее окно |
Alt-Shift-[0-9] |
пометить окно цифровым тегом 0-9 |
Alt-F1 |
краткая справка (текущие комбинации клавиш) |
Alt-F5 |
установить режим по умолчанию (видны все окна) |
Alt-F6 |
установить режим стека (видно текущее окно и заголовки остальных) |
Alt-F7 |
установить максимальный режим (видно только текущее окно) |
Alt-Shift-F5 |
установить режим по умолчанию для стобцов |
Alt-Shift-F6 |
установить стековый режим для столбцов |
Alt-Shift-F7 |
установить максимальный режим для столбцов |
Alt-F4 |
закрыть текущее окно (приложение) |
Alt-F11 |
меню программ (выводятся все имеющиеся выполнимые файлы) |
Alt-F12 |
системное меню wmii |
Alt-F8 |
запуск Firefox |
Alt-F9 |
запуск Emacs |
Alt-F10 |
запуск XTerm |
Pause |
заблокировать экран |
Кроме того, щелчок правой кнопкой мыши на заголовке вызывает контекстное меню, позволяющее закрыть текущее окно или вызвать команду xkill.
- wmiirc
- wmiikeyhelp.py — скрипт, “повешенный” на
Alt-F1и выводящий справку (при помощи xmessage) по назначенным клавишам путем анализа предыдущего файла
Системное меню
Системное меню представляет собой набор скриптов, использующих wmiimenu и запускающих програмы или выполняющих различные действия. Все пункты меню верхнего уровня являются скриптами и расположены в каталоге ~/.wmii-3. Некоторые содержат в себе дополнительные меню, вызывающие скрипты “второго уровня”, которые располагаются в ~/.wmii-3/scripts
System
Этот скрипт (и, одновременно, пункт меню) содержит команды завершения сеанса, перезагрузки и выключения компьютера.
#!/bin/bash PROGDIR=`cd $(dirname $0); pwd` SCRIPTDIR="$PROGDIR/scripts"CMD=`echo "quit reboot poweroff" | wmiimenu` [[ $? -ne 0 ]] && exit 0"$SCRIPTDIR/$CMD"
Соответственно, этот скрипт вызывает один из трех однотипных скриптов: quit, reboot или poweroff, расположенных в ~/.wmii-3/scripts/.
quit
#!/bin/bash
PROGDIR=`cd $(dirname $0); pwd`
. "${PROGDIR}/functions.sh"
confirm "Quit"
if [[ $? -eq 0 ]] ; then
echo -n quit | wmiir write /ctl
fi
reboot
#!/bin/bash
PROGDIR=`cd $(dirname $0); pwd`
. "${PROGDIR}/functions.sh"
confirm "Reboot"
if [[ $? -eq 0 ]] ; then
sudo reboot
fi
poweroff
#!/bin/bash
PROGDIR=`cd $(dirname $0); pwd`
. "${PROGDIR}/functions.sh"
confirm "Shut down"
if [[ $? -eq 0 ]] ; then
sudo poweroff
fi
В файле ~/.wmii-3/scripts/functions.sh находятся некоторые общие функции. Этот файл не имеет атрибута исполняемого, поэтому не попадает ни в какое меню.
# functions.sh: include file contains menu
functionsxwrite()
{
file="$1"; shift
echo -n "$@" | wmiir write "$file"
}
####
# usage: confirm yes-prompt
# result: $? == 0 if yes, 1 if cancel selected or escape pressed
####
confirm()
{
local ANS OPTION="$1?"
ANS=`echo "$OPTION
Cancel" | wmiimenu`
if [[ "$ANS" == "$OPTION" ]] ; then
return 0
fi
return 1
}
# end of functions.sh
status
Этот скрипт, вызываемый из wmirc, формирует строку состояния, содержащую текущую дату и время, а также показатели загрузки системы и заполненности основного диска. Я изменил его, чтобы в строке статуса показывалось текущее время и состояние аккумулятора моего ноутбука. Для красоты эти данные выводятся в отдельных частях строки статуса.
#!/bin/sh
# periodically print date and battery status to the bar
xwrite()
{
file="$1"; shift
echo -n "$@" | wmiir write "${file}"
}
battery_status()
{
if [[ `acpi -aB | sed 's/.*: //'` == 'on-line' ]] ; then
AC_ON='ON'
else
AC_ON='OFF'
fi
echo "Bat:`acpi | cut -d ',' -f 2` AC:$AC_ON"
}
wmiir remove /bar/tray 2>/dev/null && sleep 2
wmiir remove /bar/status 2>/dev/null && sleep 2
wmiir remove /bar/space 2>/dev/null && sleep 2
wmiir create /bar/tray
wmiir create /bar/status
wmiir create /bar/space
xwrite /bar/tray/colors $WMII_NORMCOLORS
xwrite /bar/status/colors $WMII_NORMCOLORS
xwrite /bar/space/colors $WMII_NORMCOLORS
while true
do
xwrite /bar/tray/data `LANG=C date +'%b %d %R'`
xwrite /bar/status/data `battery_status`
sleep 5
done
ssh
Так как мне часто приходится работать на удаленных серверах, я сделал специальный скрипт, облегчающий запуск ssh для наиболее часто используемых хостов. В заголовке лкна выводится имя пользователя и название хоста, кроме того, я использую различные цвета фона и символов чтобы визуально ориентироваться на каком хосте я нахожусь в данный момент.
По понятным причинам я изменил названия реальных хостов и имена пользователей, под которыми я там работаю.
#!/bin/bash
ans=`echo "host01
user@host01
dmych@host02
user@host02" | wmiimenu`
[[ $? -ne 0 ]] && exit 0
extra=''
case $ans in
host01)
login='host01'
extra='-bg midnightblue'
;;
'user@host01')
login='user@host01'
extra='-bg midnightblue'
;;
'dmych@host02')
login='dmych@host02.corporate.net'
extra='-fg green'
;;
'user@host02')
login='user@host02.corporate.net'
;;
*)
exit 1
;;
esac
PATH="$OLD_PATH" xterm -title "$ans" $extra -e "ssh $login" &
Реализация иерархического меню
Ниже приводится пример реализации иерархического меню для wmii, построенного на базе каталогов (подменю) и исполняемых файлов (примерно как реализовано меню в том же Afterstep).
Структура меню находистся в каталоге ~/.wmii-3/.menu (верхний уровень меню виден на скриншоте в начале статьи).
Сама программа написана на Питоне и использует модуль wmiimenu.py.
- menu — реализация иерархического меню
- wmiimenu.py — интерфейс для работы с
wmiimenuиз Питона.

RSS