Ситуация такова, что вы начинаете с командной строки, а затем вызываете startx
, когда будете готовы. Эмпирически вы полагаете, что графический интерфейс пытается повторно выполнить .profile
, а сценарий python не может выйти, поэтому графический интерфейс зависает.
Одно из решений, которое, возможно, стоит попробовать, - это установить переменную среды, чтобы ваш код запускался только один раз:
# This is .profile
#
if test -z "$DONE_PROFILE" -o "X$DONE_PROFILE" != "X${USER:-unknown}"
then
# Protected code here will be called only once
#
echo "About to run keyboard polling"; sleep 3
python /home/pi/poll_keyboard.py
export DONE_PROFILE="${USER:-unknown}"
fi
Другой вариант - вызвать код, только если stdin подключен к терминалу:
# This is .profile
#
if test -t 0 -a -t 1
then
# Protected code here will be called only if stdin and stdout is a tty
#
echo "About to run keyboard polling"; sleep 3
python /home/pi/poll_keyboard.py
fi
Это второе предложение, вероятно, более безопасно, поскольку оно будет обрабатывать программы, которые входят в систему удаленно для запуска службы (например, rsync
или scp
).
Вы даже можете объединить два, чтобы код учитывался только один раз, а затем выполнялся только в том случае, если stdin и stdout подключены к терминалу. (Просто вложите операторы if ... fi
.)
Меня попросили объяснить условие test
, которое защищает код в первом примере.
if test -z "$ DONE_PROFILE" -o "X $ DONE_PROFILE"! = "X $ {USER: -unknown}"
Это может быть записано на английском языке как " If $ DONE_PROFILE
пуст или $ DONE_PROFILE
не соответствует $ USER
... ".
Конструкция $ {USER: -unknown}
заменяет unknown
, если $ USER
пусто или не задано.
В этом случае, вероятно, нет необходимости помещать X
перед обеими сторонами выражения ! =
, но это связано с защитным подходом к написанию сценариев.Рассмотрим переменную $ A
со значением -z
и другую переменную $ B
со значением apple
. В некоторых оболочках запись test "$ A"! = "$ B"
будет заменена на test -z! = Apple
, что синтаксически неверно. Добавление к обеим сторонам префикса X
приведет к расширению test X-z! = Xapple
, что является синтаксически безопасным.
Я использую производную от Arch (Antergos), и эта конфигурация была получена с их вики-страницы Marble Mouse.
Добавьте следующее в файл /usr/share/X11/xorg.conf.d/40-libinput.conf...
# Section added for scroll with Marble Mouse
Section "InputClass"
Identifier "Marble Mouse"
MatchProduct "Logitech USB Trackball"
Driver "libinput"
Option "ButtonMapping" "1 2 3 4 5 6 7 0 9"
Option "ScrollMethod" "button"
Option "ScrollButton" "8"
Option "MiddleEmulation" "on"
EndSection
Обратите внимание, что операция кнопки «Назад» отключена, поскольку она иногда срабатывал при попытке прокрутки.
Я использую следующую конфигурацию (, похожую на @PeterL, но не отключающую кнопку «Назад»)
/etc/X11/xorg.conf.d/10 -libinput.conf
Section "InputClass" Identifier "Marble Mouse" MatchProduct "Logitech USB Trackball" Driver "libinput" Option "ScrollMethod" "button" Option "ScrollButton" "8" Option "AccelSpeed" "1" # Option "TransformationMatrix" "2.4 0 0 0 2.4 0 0 0 1" EndSection
Закомментированная TransformationMatrix позволяет пропускать пиксели и двигаться быстрее, но вместо этого я предпочитаю изменять DPI, как показано ниже.
# Logitech Marble Mouse #id obtained by: mouse-dpi-tool /dev/input/event4 mouse:usb:v046dpc408:name:Logitech USB Trackball: # keep space below MOUSE_DPI=100@125
, а затем udevadm hwdb --update
, udevadm control --reload-rules && udevadm trigger
и отключите, подключите мышь. DPI 100 может быть слишком чувствительным для некоторых, вы можете заменить его на 200@125.