Фотография | Компьютеры | Программы | Эсперанто | Кровное
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, в котором можно разместить собственные настройки и скрипты. Эти настройки будут перекрывать общесистемные.
Это главный настроечный скрипт. Я практически полностью поменял привязки клавиатуры и добавил парочку собственных.
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.
Alt-F1 и выводящий справку (при помощи xmessage) по назначенным клавишам путем анализа предыдущего файла
Системное меню представляет собой набор скриптов, использующих =wmiimenu= и запускающих програмы или выполняющих различные действия. Все пункты меню верхнего уровня являются скриптами и расположены в каталоге ~/.wmii-3. Некоторые содержат в себе дополнительные меню, вызывающие скрипты “второго уровня”, которые располагаются в ~/.wmii-3/scripts.
Этот скрипт (и, одновременно, пункт меню) содержит команды завершения сеанса, перезагрузки и выключения компьютера.
#!/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
Этот скрипт, вызываемый из 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 для наиболее часто используемых хостов. В заголовке лкна выводится имя пользователя и название хоста, кроме того, я использую различные цвета фона и символов чтобы визуально ориентироваться на каком хосте я нахожусь в данный момент.
По понятным причинам я изменил названия реальных хостов и имена пользователей, под которыми я там работаю.
#!/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.
wmiimenu из Питона