IT Notes

Настройка Openbox: Юзабилити

Мы уже закончили с базовой настройкой Openbox в прошлый раз. Но все еще не так здорово, как хотелось бы. Теперь поработаем над улучшением опыта взаимодействия с системой.

Шаг 1. Управление окнами

В Openbox можно установить комбинации клавиш для выполнения практически любых операций с окнами. Вот лишь небольшой список тех комбинаций, которые можно настроить (и которыми я сам пользуюсь регулярно):

  1. Win + c - закрыть текущее окно (замена Alt + F4);
  2. Win + m - изменить размер текущего окна, чтобы оно занимало все доступное пространство рабочего стола;
  3. Win + l - свернуть (минимизировать) текущее окно;
  4. Win + Space - развернуть (максимизировать) текущее окно на весь экран или восстановить его размер, если оно уже развернуто;
  5. Win + Enter - поместить текущее окно в центр рабочего стола;
  6. Win + ; - переместить текущее окно на следующий монитор (конечно, если мониторов несколько);
  7. Ctrl + Alt + Shift + h - изменить размер текущего окна в левую сторону;
  8. Ctrl + Alt + Shift + l - изменить размер текущего окна в правую сторону;
  9. Ctrl + Alt + Shift + k - изменить размер текущего окна в нижнем направлении;
  10. Ctrl + Alt + Shift + j - изменить размер текущего окна в верхнем направлении;
  11. Ctrl + Win + h - сдвинуть текущее окно влево;
  12. Ctrl + Win + l - сдвинуть текущее окно вправо;
  13. Ctrl + Win + k - сдвинуть текущее окно вниз;
  14. Ctrl + Win + j - сдвинуть текущее окно вверх.

По умолчанию эти комбинации не включены. Но добавить их очень легко. Для этого откройте файл ~/.config/openbox/rc.xml. Найдите раздел <keyboard> и комментарий <!-- Keybindings for windows -->. А затем вставьте после этого комментария следующий xml-код:

<keybind key="W-c">
  <action name="Close"/>
</keybind>

<keybind key="W-m">
  <action name="MoveResizeTo">
    <x>center</x>
    <y>center</y>
    <height>100%</height>
    <width>100%</width>
  </action>
</keybind>

<keybind key="W-l">
  <action name="Iconify"/>
</keybind>

<keybind key="W-space">
  <action name="ToggleMaximizeFull"/>
</keybind>

<keybind key="W-Return">
  <action name="MoveResizeTo">
    <x>center</x>
    <y>center</y>
  </action>
</keybind>

<keybind key="W-0x2F">
  <action name="MoveResizeTo">
    <monitor>next</monitor>
  </action>
</keybind>

<keybind key="C-A-S-h">
  <action name="GrowToEdgeWest"/>
</keybind>

<keybind key="C-A-S-l">
  <action name="GrowToEdgeEast"/>
</keybind>

<keybind key="C-A-S-k">
  <action name="GrowToEdgeNorth"/>
</keybind>

<keybind key="C-A-S-j">
  <action name="GrowToEdgeSouth"/>
</keybind>

<keybind key="C-W-h">
  <action name="MoveRelative">
    <x>-5%</x>
    <y>0</y>
  </action>
</keybind>

<keybind key="C-W-l">
  <action name="MoveRelative">
    <x>5%</x>
    <y>0</y>
  </action>
</keybind>

<keybind key="C-W-k">
  <action name="MoveRelative">
    <x>0</x>
    <y>-5%</y>
  </action>
</keybind>

<keybind key="C-W-j">
  <action name="MoveRelative">
    <x>0</x>
    <y>5%</y>
  </action>
</keybind>

Чтобы опробовать эти настройки, не забудьте обновить конфигурацию Openbox.

Следует заметить, что некоторые из назначенных комбинаций клавиш могут создавать конфликты с теми или иными приложениями. Например, текстовым редактором emacs. Поэтому вам может понадобиться подправить конфигурацию под свою среду.

Также обратите внимание на <keybind key="W-0x2F">. W означает клавишу Win, а 0x2F - 16-ричный код клавиши ';'. Но как узнать код клавиши? Для этого можно воспользоваться утилитой xev. Запустите ее в консоли, и нажмите ту клавишу, которая вас интересует. Например, для клавиши ';' в результате вы увидите (я оставил только интересующую нас часть информации):

KeyPress event, serial 48, synthetic NO, window 0x4000001,
    root 0x2a3, subw 0x0, time 36945581, (1056,298), root:(1057,334),
    state 0x0, keycode 47 (keysym 0x3b, semicolon), same_screen YES,
    XLookupString gives 1 bytes: (3b) ";"
    XmbLookupString gives 1 bytes: (3b) ";"
    XFilterEvent returns: False

KeyRelease event, serial 48, synthetic NO, window 0x4000001,
    root 0x2a3, subw 0x0, time 36945651, (1056,298), root:(1057,334),
    state 0x0, keycode 47 (keysym 0x3b, semicolon), same_screen YES,
    XLookupString gives 1 bytes: (3b) ";"
    XFilterEvent returns: False

Обратите внимание на значение keycode 47. Это и есть код клавиши ';'. Но почему 47, а не 0x2F? Потому что 47 - десятичная запись 16-ричного числа 0x2F.

Еще пара полезных комбинаций клавиш, которые напрямую не связаны с управлением окнами:

  1. Win + n - замена Alt + Tab;
  2. Win + Shift + n - замена Alt + Shift + Tab;
  3. Ctrl + Alt + k - перейти на следующий рабочий стол;
  4. Ctrl + Alt + j - перейти на предыдущий рабочий стол;
  5. Shift + Ctrl + k - перейти на следующий рабочий стол вместе с текущим окном;
  6. Shift + Ctrl + j - перейти на предыдущий рабочий стол вместе с текущим окном.

Для их использования вставьте следующий xml-код в файл ~/.config/openbox/rc.xml в любое место раздела <keyboard> (например, сразу после предыдущих добавленных инструкций):

<keybind key="W-n">
  <action name="NextWindow">
    <finalactions>
      <action name="Focus"/>
      <action name="Raise"/>
      <action name="Unshade"/>
    </finalactions>
  </action>
</keybind>

<keybind key="W-S-n">
  <action name="PreviousWindow">
    <finalactions>
      <action name="Focus"/>
      <action name="Raise"/>
      <action name="Unshade"/>
    </finalactions>
  </action>
</keybind>

<keybind key="C-A-k">
  <action name="GoToDesktop">
    <to>right</to>
  </action>
</keybind>

<keybind key="C-A-j">
  <action name="GoToDesktop">
    <to>left</to>
  </action>
</keybind>

<keybind key="S-C-k">
  <action name="SendToDesktop">
    <to>right</to>
  </action>
</keybind>

<keybind key="S-C-j">
  <action name="SendToDesktop">
    <to>left</to>
  </action>
</keybind>

Шаг 2. Запуск приложений с помощью комбинаций клавиш

В предыдущей статье мы уже добавили комбинацию клавиш для вызова oblogout. По аналогии можно обеспечить вызов любого приложения по нужному для вас сочетанию. Например, для терминала удобно использовать Win + t:

<keybind key="W-t">
  <action name="Execute">
    <command>sakura</command>
  </action>
</keybind>

Если вы вставите этот фрагмент сразу за кодом привязки клавиш для oblogout, то легко сможете запускать терминал. Но есть один недостаток - каждый раз будет открываться новый терминал. Мне обычно достаточно одного. К тому же, sakura поддерживает вкладки.

Что же делать? Я использую следующий подход: если приложение еще не запущено, то запускаем его, иначе переходим к уже работающему экземпляру (даже если он находится на другом рабочем столе), передавая ему фокус ввода. Звучит хорошо, но как это сделать? К сожалению, на момент написания статьи Openbox такой возможности не поддерживает. Придется написать свой вспомогательный скрипт. А вот и он:

#!/bin/bash
WMCTRL=`which wmctrl`;
GREP=`which grep`;
APPLICATION=$1;
BASENAME=`basename $APPLICATION | tr "[:upper:]" "[:lower:]"`
FOUND=0;

function findwindow {
    IFS=$'\n';
    MAX_MATCHES=0;
    for RUNNING in `$2 -l -x | awk '{print $1, $3}' | tac`; do
        MATCH_COUNT=`echo $RUNNING | tr "[:upper:]" "[:lower:]" | $3 -o $1 | wc -l`
        if [ $MATCH_COUNT -gt $MAX_MATCHES ]; then
            MAX_MATCHES=$MATCH_COUNT
            WINDOW_ID=`echo $RUNNING | cut -c1-11`
            FOUND=1;
        fi;
    done
}

findwindow $BASENAME $WMCTRL $GREP;
if [ $FOUND -eq 0 ]; then
    $APPLICATION &
else
    $WMCTRL -i -a $WINDOW_ID
fi

Обратите внимание, что для его работы вам понадобится утилита wmctrl. Скрипт работает не идеально и иногда может находить не то окно, которое нужно, но это происходит не часто.

Сохранить этот скрипт можно в подкаталоге домашнего каталога ~/.scripts/find_app.sh. Не забудьте дать ему права на выполнение chmod u+x ~/.scripts/find_app.sh. Далее откройте в редакторе файл ~/.config/openbox/environment, и добавьте в самый конец:

PATH=$PATH:$HOME/.scripts/

После перезагрузки Openbox наш скрипт find_app.sh станет виден в среде окружения. Поэтому мы можем вновь вернуться к ~/.config/openbox/rc.xml и отредактировать команду запуска sakura:

<keybind key="W-t">
  <action name="Execute">
    <command>find_app.sh sakura</command>
  </action>
</keybind>

После вступления новой конфигурации в силу поведение комбинации клавиш Win + t будет приводить именно к тому поведению, которое мы ожидаем.

По аналогии вы можете назначить комбинации клавиш для любого приложения, которого захотите.

Шаг 3. Скриншоты

Еще одна крайне полезная вещь, без которой можно обходиться, но иметь под рукой необходимо. Сам Openbox не умеет делать скриншоты. Приходится использовать вспомогательные утилиты. Одной из таких утилит является scrot. Назначим создание скриншота всего экрана на комбинацию клавиш Win + ':

<keybind key="W-0x30">
  <action name="Execute">
    <command>scrot ~/screenshots/%Y-%m-%d-%T-screenshot.png</command>
  </action>
</keybind>

Чтобы она работала, не забудьте создать в домашнем каталоге подкаталог ~/screenshots/.

Еще время от времени требуется делать скриншоты только текущего окна, а не всего экрана. Для этого можно воспользоваться утилитой import, входящей в пакет imagemagick (не забудьте его установить). Создадим вспомогательный скрипт ~/.scripts/active_window_screenshot.sh:

#!/bin/sh

activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
import -window "$activeWinId" ~/screenshots/$(date +%F-%H:%M:%S-screenshot).png

Пусть этот скрипт вызывается по комбинации клавиш Win + [:

<keybind key="W-0x22">
  <action name="Execute">
      <command>active_window_screenshot.sh</command>
  </action>
</keybind>

Заключение

Теперь у нас имеется полноценная среда управления окнами с клавиатуры на базе Openbox. Также мы можем быстро запускать нужные приложения и делать скриншоты наших достижений. В следующий раз займемся настройкой отображения некоторых приложений по аналогии с тем, что сейчас сделано только для терминала. Разберемся с закреплением окон к рабочему столу и монитору

Похожие публикации

Комментарии

Можно ещё в тэгах, или в заголовке добавить "снэппинг".

Анон:

Можно ещё в тэгах, или в заголовке добавить "снэппинг".

Сам тэг добавить не проблема, но в статье снэппинг в традиционном смысле (как в Windows) не рассматривается. В Openbox такой функционал обычно привязывают к тем или иным комбинациям клавиш.