Отключить numlock, сохраняя привязки клавиш мыши
У меня возникают проблемы с отключением клавиши Numlock (заставьте ключ ничего не делать, чтобы номера чисел всегда работали), в то же время сопоставляя дополнительные кнопки мыши (на стороне моей мыши) с ярлыками для выполнения пользовательских действий.
Я использую Arch Linux и Xfce, а Менеджер входа - LightDM.
Я использую этот код, помещенный в файл bash, чтобы отключить мой numlock при запуске:
xmodmap -e "keycode 77 = NoSymbol"
И у меня есть файл.xbindkeysrc в моем домашнем каталоге, с:
"xdotool key ctrl+w"
b:8 + Release
"xdotool key ctrl+d"
b:9 + Release
(Закрыть вкладку и закладку)
Если я включаю код "отключить Numlock" при запуске, файл.xbindkeysrc больше не действует. Похоже, это связано с командой numlockx on
который находится в том же файле bash, что и команда xmodmap (перед ней). Как я могу решить это?
Добавление
"NoCommand"
c:77
к.xbindkeysrc тоже не дает желаемого эффекта. Изменение c на m, потому что Numlock в теории является ключом-модификатором, не помогает. Использование Num_Lock вместо c:77 также не работает.
4 ответа
Давайте начнем с некоторого объяснения того, что происходит и почему ваша идея не работает. Сначала взглянем на карту модификатора:
$ xmodmap
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Как вы видете, Num_Lock
является mod2
Вот. Когда он включен, все события нажатия клавиши приходят с mod2
немного дальше
Если вы отключите это так:
$ xmodmap -e "keycode 77 = NoSymbol"
$ xmodmap
xmodmap: up to 3 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 BadKey (0x4d)
mod3
mod4 Super_L (0x85), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Обратите внимание, что mod2
теперь связано с BadKey
и это, похоже, сильно смущает Xorg. Фактически, большинство изменений карты модификаторов, кажется, ломают X11 для меня.
Сейчас я не могу найти хорошее решение, которое включает в себя игру с картой-модификатором. Но у меня есть еще одна идея: вы можете сопоставить все клавиши клавиатуры, чтобы они работали одинаково при включенной и выключенной функции num lock. То есть:
xmodmap -e "keysym KP_Up = KP_8"
xmodmap -e "keysym KP_Left = KP_4"
# ...
и т. д. Как только вы это сделаете, состояние блокировки num больше не будет иметь значения.
Вы даже можете впоследствии удалить модификатор, чтобы выключить светодиод:
xmodmap -e "remove mod2 = Num_Lock"
Основано на ответе @Michał Górny. Вот команды для отключения num-lock, использования номеров в любом случае и сопоставления numlock с F13 (может быть удобно привязать к специальной функции в вашем оконном менеджере).
# NumLock is F13
xmodmap -e "remove mod2 = Num_Lock" \
-e "keycode 77 = F13"
# Use numbers even when numlock is off
xmodmap -e "keysym KP_End = KP_1" \
-e "keysym KP_Down = KP_2" \
-e "keysym KP_Next = KP_3" \
-e "keysym KP_Left = KP_4" \
-e "keysym KP_Begin = KP_5" \
-e "keysym KP_Right = KP_6" \
-e "keysym KP_Home = KP_7" \
-e "keysym KP_Up = KP_8" \
-e "keysym KP_Prior = KP_9" \
-e "keysym KP_Insert = KP_0" \
-e "keysym KP_Delete = KP_Decimal"
Приятно, что световой индикатор не включается постоянно:)
- Настройки клавиатуры Xfce: снимите флажок восстановить состояние numlock (это выключит свет, когда он уже включен)
- Параметры запуска Xfce: добавьте упоминание в скрипт: sh /home/$USER/numlockalwayson.sh
Автор сценария:
#timeout, otherwise it will not work upon boot/login (make two variants of the script. Use sleep 2 for the login variant)
sleep 20
xmodmap -e "keysym KP_Up = KP_8"
xmodmap -e "keysym KP_Left = KP_4"
xmodmap -e "keysym KP_Right = KP_6"
xmodmap -e "keysym KP_Down = KP_2"
#
xmodmap -e "keysym KP_Begin = KP_5"
#
xmodmap -e "keysym KP_Home = KP_7"
xmodmap -e "keysym KP_Next = KP_3"
xmodmap -e "keysym KP_Prior = KP_9"
xmodmap -e "keysym KP_End = KP_1"
#
xmodmap -e "keysym KP_Insert = KP_0"
xmodmap -e "keysym KP_Delete = KP_Decimal"
#
numlockx on
Этот свет выключается, когда вы нажимаете Num_Lock. Это единственный недостаток этого решения, и это огромное улучшение того, что я имел. Это решение не ломает другие клавиши-модификаторы, такие как Alt.
Большое спасибо Michał Górny за это решение.
бонус
Если вы выходите из системы и снова входите в систему, скрипт больше не работает (вам нужно перезагрузиться, чтобы он снова заработал). Чтобы это исправить, отредактируйте /etc/lightdm/lightdm.conf (место, где он находится в Manjaro Linux) и добавьте вариант сценария для входа в систему:
session-setup-script=sh /home/$USER/numlockalwayson-login.sh
Кроме того, LightDM отключает блокировку num, если вы выходите из системы. Чтобы исправить это, добавьте в тот же файл:
greeter-setup-script=/usr/bin/numlockx on
Не забудьте сохранить.
Вам нужен как запуск Xfce, так и эта конфигурация, чтобы она работала всегда.
Я думаю xmodmap
не следует использовать, когда xkb
включен (что всегда в настоящее время). Вот решение на основе xkb: замените код ключа numlock кодом неиспользованного ключа:
/usr/bin/numlockx on
/usr/bin/xkbcomp $DISPLAY /tmp/kbmap.xkb
sed -i.bak 's/<NMLK> = 77;/<NMLK> = 98;/
s/<KATA> = 98;/<KATA> = 77;/' /tmp/kbmap.xkb
/usr/bin/xkbcomp /tmp/kbmap.xkb $DISPLAY