Вступление
Была цель - ради увеличения производительности, максимально задействовав официальные репозитории системы и минимум сторонних программ, использовать 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 внешними скриптами сложнее контролировать некоторые фичи.