2

Вначале я признаю, что сопоставление клавиш X для меня является чем-то вроде черного искусства, которое в основном включает в себя копирование и вставку примеров из таких мест, как SO и SU, и проверку работоспособности. Однако в этом случае мне нужно лучше понять, что случилось, чтобы xcape и i3lock хорошо играли вместе.

Я использую утилиту xcape для обработки сопоставления моей клавиши возврата с альтернативным элементом управления при длительном нажатии и по-прежнему ведет себя как обычное нажатие клавиши при нажатии и отпускании. Настройка для этого выглядит следующим образом:

if [ -e ${XCAPE} ]; then
    killall xcape 2> /dev/null
    ${XMODMAP} -e 'keycode 36 = 0x1234'
    ${XMODMAP} -e 'add control = 0x1234'
    ${XMODMAP} -e 'keycode any = Return'
    ${XCAPE} -e '0x1234=Return'
    KEYMAPS="${KEYMAPS} StRet->Ctrl"
fi

Насколько я понимаю, он переводит ключ возврата (36) в поддельный ключ (0x1234). Затем он изменяет карту так, что элемент управления также отображается на (0x1234). Затем xcape выполняет "магию", чтобы гарантировать отправку правильного кода в зависимости от долгого нажатия.

Все это работает нормально, однако это нарушает мою программу блокировки экрана (i3lock), которая выполняет некоторые манипуляции с картой клавиатуры X перед ее запуском. Сбой со следующим сообщением:

Error:    (unknown file):1092:13: syntax error
Error:    Failed to parse input xkb file
[i3lock] xkb_keymap_new_from_file failed
i3lock: Could not load keymap

Добавив некоторую отладку для выгрузки карты ключей, я предположил, что следующая строка вызвала путаницу.

xkb_symbols "pc_gb_inet(evdev)_ctrl(nocaps)" {

    name[group1]="English (UK)";
    key     <> {         [          Return ] };
    key  <ESC> {         [          Escape ] };
    key <AE01> {
    ...

Так, что случилось, чтобы запутать вещи? Являются ли эти два принципиально несовместимыми? Нужно ли мне частично восстанавливать раскладку клавиатуры перед запуском i3lock?

1 ответ1

0

Таким образом, после долгого копания выясняется, что первый 'keycode any = Return' устанавливает код 8, который сбивает с толку обработку карты ключей i3lock. Кроме того, вам необходимо убедиться, что код ключа 36 генерирует возврат, чтобы вы могли ввести свой пароль.

Я включил вызов i3lock в скрипт, поэтому в моем конфиге i3:

# background, screensaver and locking
exec xautolock -time 10 -locker '/home/alex/.config/i3/lock_screen.sh'
bindsym $mod+l exec /home/alex/.config/i3/lock_screen.sh

Скрипт экрана блокировки прост:

# The initial key-sequence chosen by xcape does confuse i3lock so we reset it
xmodmap -e "keycode 8 = "
# Ensure the return key does work as intended
xmodmap -e 'keycode 36 = Return'
i3lock -c 334433

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .