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 из Питона.