Вступление

Была цель - ради увеличения производительности, максимально задействовав официальные репозитории системы и минимум сторонних программ, использовать OpenBox в Lubuntu. Он устанавливается «из коробки» и доступен для выбора на экране логина. В OpenBox по умолчанию нет панелей, а у меня были старые, удобные и любимые :-) конфиги fbPanel, я использовал fbPanel.

При использовании fbPanel есть сложности с индикатором клавиатуры. Также, те, кто в LXDE использует возможность многострочности у панели, могут захотеть заменить обычный индикатор, когда он занимает полную высоту панели в две-три строки. Заменить на что-либо занимающее один квадратик в трее, вместо двух-трёх рядом. Попробовал разное и остановился на gxNeur с отключенным движком автоматики. Не понятно, как запускать gxNeur со сразу отключённым демоном слежения, если это вообще возможно. Не нашёл. У меня демона слежения отключает скрипт. И, фактически, главное в этом посте - запустить индикатор без демона.

Как это сделать

Индикатор будет запускаться из файла автозапуска при входе пользователя в систему. Оттуда же и паралельно будет запускаться процесс, отключающий демона.

Я выбрал файл автоматически запускаемый только при использовании OpenBox, только для текущего пользователя (есть много прочих мест автозапуска). По умолчанию файл отсутствует. Нужно создать этот файл. Для этого найти в меню эмулятор терминала LXTerminal, и в ней ввести подряд команды:

mkdir -p ~/.config/openbox/
touch ~/.config/openbox/autostart.sh

Расширение имени файла важно. В документации OpenBox найдёте, что в имени не должно быть «.sh», но без расширения sh оно не работает, не реагирует на файл. А вот атрибут «запускаемый» этому файлу необязателен.

Ещё команда - запустить редактор с открытым файлом:

leafpad ~/.config/openbox/autostart.sh

Содержимое файла автозапуска, которое касается индикатора раскладки:

# Две раскладки - us и ru, порядок перечисления играет роль.
# "Пустая" опция '-option' специально - отмена прежних настроек.
# Переключение, удобное мне, по CapsLock - caps_toggle. Роль Caps после этого играет Shift+CapsLock.
# Можно указывать разные комбинации, в т.ч. не затрагивая функции CapsLock использовать привычное ctrl_shift_toggle
# Список возможных комбинаций кнопок доступен по команде: "cat /usr/share/X11/xkb/rules/base.lst | grep toggle"
# См. http://xgu.ru/wiki/xkb
setxkbmap -layout "us,ru" -option -option 'grp:caps_toggle' &
# Скрипт запуска gxNeur.
~/opt/gxneur-no-daemon-start.sh &

Теперь создать скрипт запуска gxNeur:

mkdir ~/opt/
touch ~/opt/gxneur-no-daemon-start.sh
chmod +x ~/opt/gxneur-no-daemon-start.sh # обязательно установить атрибут "запускаемый-выполняемый"
leafpad ~/opt/gxneur-no-daemon-start.sh

Содержимое файла со скриптом:

gxneur-no-daemon-start.sh
#!/bin/bash
 
# Объявление переменных.
 
wantedUserName="isDefinedBelow" # Искомое имя пользователя.
gxnBin="/usr/bin/gxneur" # Исполняемый файл самой gxNeur.
neurProcessName="xneur" # Имя процесса-цели контролирующего ввод. Цель - отключить его.
 
timeout="10" # Секунды.
 
# Объявление функции.
# Останавливает все процессы-цели, запущенные только от имени конкретного пользователя.
function killIt {
    while read pid realUser command ; do
        if [ "${realUser}" == "${wantedUserName}" ] \
                && [ "${command}" == "${neurProcessName}" ] ; then
            kill -9 "${pid}" ; operationResult=$?
            [ "${operationResult}" != "0" ] && echo "Error [ $0 ]:$LINENO: Failed to stop process '${command}' with PID=${pid}." >&2
        fi
    done <<< "$( ps -C "${neurProcessName}" -o pid,ruser=RealUser,comm )"
}
 
# Начало выполнения скрипта отсюда...
 
# Если не найден файл, исполняемый файл, то выход с сообщением.
[ ! -x "${gxnBin}" ] && echo "Error [ $0 ]:$LINENO: Not found executable '${gxnBin}'." >&2 && exit 1
 
# Определяем имя пользователя.
# Если было указано в командной строке, то использовать его.
# Иначе - использовать имя текущего пользователя.
if [ -n "${1}" ] ; then
    wantedUserName="${1}"
else
    wantedUserName="${USER}"
fi
 
# Запуск gxNeur как процесса независимого от этого скрипта родителя.
# С блокированием создания журнала в '~/nohup.txt'.
nohup "${gxnBin}" >/dev/null 2>/dev/null &
 
# Выдержка паузы.
sleep "${timeout}"
 
# Завершение процесса-цели.
killIt
 
# Ещё 4 попытки завершения, пауза увеличивается с каждым разом.
# Сделано для малопроизводительных систем и т.п. Когда нет гарантий, что
# все ожидаемые процессы закончатся ранее ожидаемого срока, когда можно
# "выстрелить", а процесс-цель даже ещё и не запускался.
for idx in 1 2 3 4 ; do
    timeout=$(( ${timeout} + ${timeout} ))
    sleep "${timeout}"
    killIt
done

Теперь надо выйти-зайти (завершить сессию и войти заново). В трее должен появиться значок gxNeur, через несколько секунд после входа индикатор остаётся, а демон-автопилот будет отключен. Отключение демона можно проверить - через минуту после входа щёлкнуть правой кнопкой мыши по пиктограмме gxNeur, и при отключённом демоне в меню будет строчка c предложением запустить его (Start daemon). Раньше при отключении демона у флажка страны на индикаторе стильно, слегка приглушались цвета, сейчас этого нет (gxNeur 0.15.0, LUbuntu Precise 12.04). Далее, если демон понадобится, демона можно запускать и выключать через обычное меню gxNeur.

Если используется не OpenBox, то для автозапуска можно использовать каталог ~/.config/autostart/ , туда положить нужные скрипты. И ещё - для LXPanel всё нужное есть и так - см. вот тут в FAQ. Более того, LXPanel построена на базе fbPanel [ LXDE Wiki ]. Но LXPanel бедна :-) в сравнении с fbPanel, для LX внешними скриптами сложнее контролировать некоторые фичи.