пʼятниця, 7 листопада 2014 р.

Как я делаю утилиты PC-BSD. Что делать? Как делать?


Доброго времени суток!

По случаю наличия некоторго количества свободного времени я не только в блоге активизировался но и начал наносить добро PC-BSD более предметно.
Сегодня попробую рассказать (или как минимум начну рассказывать) как и почему я сейчас делаю новую настройку клавиатуры.
Ну, для затравки скриншоты того что есть на данный момент. Пугаться рано! Это далеко не последний вариант.





Предыстория

 Создание практически любой утилиты PC-BSD для меня начинается с дискомфорта. Находится какая- то вещь, которая меня раздражает или которой мне не хватает. Я некоторое время терплю, после чего понимаю что кроме меня ее фиг кто сделает и превозмогая лень запускаю Qt Creator.

Так вот. В PC-BSD нет общесистемной настройки клавиатуры. Так чтобы с раскладками, с настройкой клавищ переключения. Если пользоваться, скажем, KDE проблема не велика. Можно настроить в KDE. Но если переодически еще и Mate запускается, то нужно повторить настройку и там. А если Вы вдруг используете LXDE или Lumina тогда вообще все плохо- без консоли тут уже никак. Ну нету ни в LXDE ни в Lumina родной настройки раскладок :( Плюс ко всему даже в KDE по умолчанию начиная с PC-BSD 10.0 переключалка раскладки поломана!
Надежды что Крис или Кен додумаются мало- у них по жизни одна раскладка- En(us). Они о моей боли даже не подозревают.

Требования

Ок. Решено- делаю настройщик клавиатуры. Но перед тем чтобы взятся за Qt нужно понять что же я хочу получить в итоге. У меня родился такой список:
  • Настройка клавиатуры должны включать в себя выбор модели клавиатуры, настройку раскладок (с вариантами), простую настройку клавиш переключения раскладки и расширенную настройку опций клавиатуры.
  • Настройка должна проводится как для всей системы (как настройка по умолчанию) так и только для текущего пользователя.
  • Хорошо бы потом эту же утилиту использовать в Lumina как родную настройку клавиатуры.
  • Кроме самой утилиты очень желательно добавить возможность настройки клавиатуры прямо в инсталяторе и в мастере первого запуска
Последний пункт позразумевает что мне не просто нужно сделать утилиту, а еще и обеспечить возможность выдрать из нее основные визуальные и не визуальные части чтобы их можно было использовать еще в двух программах (инсталяторе и мастере первого запуска). Значит нужно писать акуратный бекенд и наделать виджетов чтобы потом засунуть в libpcbsd (конец технического отступления)

Минусы

Ну куда ж без них? По факту минус только один-  окружения рабочего стола, в которых клавиатура уже настроена настройки клавиатуры, сделаные в моей утилите высокомерно проигнорируют. И заставлять их поступять по-другому я не буду.

Просвещение

 Что хочу понятно. Что буду тоже определили. Теперь осталось понять как это сделать.
Дальше немного технических деталей.
Настройка переключения клавиатуры в сервере xorg может быть выполнена двумя способами: прописыванием конфигурации клавиатуры в настройках сервера (xorg.conf) и с помощью вызова утилиты setxkbmap.
Последний вариант как раз мой. Во- первых настройки применяются с ходу, во- вторых вызов setxkbmap можно вставить куда нужно с тем, чтобы настроить клавиатуру именно когда нужно и для кого нужно.
Чтобы получить начальное представление о настройках раскладок в xorg можно посмотреть хотя бы эту страницу: http://xgu.ru/wiki/xkb (уже на русском, для ленивых).
 Как менять параметры клавиатуры уже более или менее понятно. Теперь вопрос в том где взять информацию обо всех возможных раскладках и настройках? Должна же она где- то быть. Пару минут втыкания в исходники менеджера входа PC-BSD и минута гуглежа указывают мне на файл
/usr/local/share/X11/xkb/rules/base.lst. Вот оно! Тут есть все! И все возможные раскладки. И все возможные варианты для всех раскладок и все поддерживаемые модели клавиатуры. И даже описания ко всему.
Файл разделен на секции. Описания всех возможных моделей клавиатур выглядит так:
! model
  pc101           Generic 101-key PC
  pc102           Generic 102-key (Intl) PC
  pc104           Generic 104-key PC
  pc105           Generic 105-key (Intl) PC
  dell101         Dell 101-key PC
  latitude        Dell Latitude series laptop
 (ну и дальше много- много строчек)
Открываем файл, натыкаемся на строчку "! model" и наслаждаемся

Описания раскладок выглядят не менее просто:
! layout
  us              English (US)
  af              Afghani
  ara             Arabic
  al              Albanian
  am              Armenian
  at              German (Austria)
  az              Azerbaijani
  by              Belarusian
   ..................
 Вычитать это из файла- типичная школьная задачка по программированию.

Варианты раскладок только чуточку сложнее:
  ! variant
  chr             us: Cherokee
  euro            us: English (US, with euro on 5)
  intl            us: English (US, international with dead keys)
  ..................
  ps              af: Pashto
  uz              af: Uzbek (Afghanistan)
  olpc-ps         af: Pashto (Afghanistan, OLPC)
  fa-olpc         af: Persian (Afghanistan, Dari OLPC)
  uz-olpc         af: Uzbek (Afghanistan, OLPC)
  ..................

Тут, очевидно, с начала идет идентификатор варианта раскладки потом идентификатор раскладки с двоеточием. На и на последок, собственно, описание варианта раскладки. Все по прежнему просто, только нужно еще соответствующую раскладку найти.

Теперь настройки. Они собраны в группы:
  ! option
  grp                  Switching to another layout
  grp:switch           Right Alt (while pressed)
  grp:lswitch          Left Alt (while pressed)
  grp:lwin_switch      Left Win (while pressed)
  grp:rwin_switch      Right Win (while pressed)
  grp:win_switch       Any Win key (while pressed)
  grp:ctrl_alt_toggle  Alt+Ctrl
  grp:alt_shift_toggle Alt+Shift
  ..................
 С начала идет описание всей группы настроек. Потом, собственно, все возмоджые настройки с описаниями.

Теперь как жеж нам узнать текущие настройки? Гуглим... Элементарно:
%setxkbmap -query
 rules:      base
model:      pc101
layout:     us,ua,ru
variant:    ,winkeys,
options:    terminate:ctrl_alt_bksp,grp:alt_shift_toggle
Тут и модель клавиатуры и раскладки с вариантами и настройки...

Вобщем все понятно:
  • Текущие настройки получаем с помощью  setxkbmap -query
  • Описания ко всему берем из base.lst
  • При добавлении раскладки, отображении моделей клавиатур и отображении всех опций используем все тот же base.lst
  •  То что в итоге получится собираем в строку вызова setxkbmap и либо просто его вызываем ("Применить") либо вставляем в тот или иной скрипт (либо скрипт старта xorg, либо в скрипт начала пользовательской сессии)
  • Profit!
По большому счету результатом программы является что- то типа:


setxkbmap -model pc101 -layout "us,ua(winkeys),ru" -option "terminate:ctrl_alt_bksp,grp:alt_shift_toggle"

Тут написано что клавиатура у меня обычная 101-клавишная, использую я три раскладки (английскую, украинскую с вариантом Winkeys и русскую), переключаю я раскладки по Alt+Shift ну и могу завершить работу X сервера нажав Ctrl+Alt+Backspace.

Продолжение следует...










Немає коментарів:

Дописати коментар