Отключить 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
Другие вопросы по тегам