Xmonad: Перехватить все сочетания клавиш

Gnome-terminal (точнее VTE ) имитирует некоторую версию escape-последовательностей xterm. Насколько точно он это делает, зависит от версии VTE.

Соответствующая документация xterm находится в разделе Функциональные клавиши в стиле ПК документа XTerm Control Sequences .

Вам нужна строка вида \ e [1; 5D (для стрелки влево), где 5 обозначает элемент управления модификатор.

В ncurses эти строки можно увидеть, используя infocmp -x , как значения для kUP5 , kDN5 , kLFT5 и kRIT5 . Например:

    kDN5=\E[1;5B,
    kLFT5=\E[1;5D,
    kRIT5=\E[1;5C,        
    kUP5=\E[1;5A,

5
21.04.2016, 10:51
1 ответ

Есть ли хороший способ сделать это без необходимости перечислять все неопределенные на данный момент комбо?

Вы должны понимать, что это не просто "блокировать любое неизвестное комбо". Вы, вероятно, не хотите блокировать такие вещи, как Control-R, которая позволяет вам выполнить обратный поиск в истории вашей оболочки, или Control-P, которая открывает диалог печати в вашем любимом офисном пакете.

С учетом сказанного, самый чистый способ достичь цели - это переопределить способ поиска привязок клавиш в XMonad так, чтобы любые "not founds" превращались в "lock the screen". К сожалению, XMonad не предоставляет таких возможностей пользователю; вам придется взломать сам XMonad.

Следующее лучшее, что вы можете сделать, это сгенерировать карту всех допустимых комбинаций клавиш, удалить из нее те, которые вы уже определили, а затем привязать все оставшиеся к команде "заблокировать экран". К счастью, все это можно автоматизировать.

Я предположу, что команда блокировки экрана у вас определена так:

lockScreen = spawn "i3lock"

Комбинации клавиш состоят из маски и клавиши, которые перечислены в Graphics.X11.Types.

Сначала определим список возможных масок:

masks = [controlMask, mod1Mask]

Здесь я предположил, что вы хотите блокировать только комбинации, начинающиеся с Control и Alt. Существует 8 масок, и их можно комбинировать, поэтому эта строка может быть гораздо сложнее. Однако, чем больше масок мы здесь определим, тем более осторожными мы должны быть при генерации привязок - мы же не хотим случайно заблокировать что-то важное!

Итак, следующая остановка - список ключей. Они тоже перечислены в Graphics.X11.Types и начинаются с xK_. Они имеют тип KeySym, но на самом деле это Word64. Однако я советую не сходить с ума и не писать что-то вроде [0 ... maxBound :: KeySym]- это приведет к огромной карте, которая будет потреблять много памяти.

Поэтому вместо этого просто найдите количество ключей, которые вы хотите охватить, и сгруппируйте их в небольшие определения. Здесь, например, я охватываю наиболее распространенные клавиши:

keys :: [KeySym]
keys = [xK_Home     .. xK_Num_Lock] ++  -- Cursor control & motion
       [xK_KP_Space .. xK_R15] ++       -- Keypad and Function keys
       [xK_space    .. xK_asciitilde]   -- ASCII and such

Теперь мы готовы определить список привязок клавиш:

fallbackKeys = [((mask, key), lockScreen)
               | mask <- masks
               , key  <- keys ]

Это создаст определение привязки для каждой возможной комбинации заданных масок и клавиш.

Теперь нам нужно применить эти определения к вашему конфигу.

XMonad.Util.EZConfig имеет очень полезный additionalKeys combinator, который, учитывая конфиг и список определений привязки клавиш, добавит последние к первому, перезаписывая существующие определения, если есть какие-либо противоречия. Мы же хотим как раз обратного: мы хотим применять fallbackKeys таким образом, чтобы они заполняли только неопределенные места, оставляя уже определенные привязки клавиш как есть. Чтобы добиться этого, мы определим еще одну функцию:

import qualified Data.Map as M

backupKeys :: XConfig a -> [((ButtonMask, KeySym), X ())] -> XConfig a
backupKeys conf keyList =
    conf { keys = \cnf -> M.union (keys conf cnf) (M.fromList keyList) }

Это прямая копия-вставка additionalKeys, но аргументы Data.Map.union в ней поменяны местами, что приводит к нужному нам поведению. (См. документацию union, чтобы понять, как это работает.)

И теперь мы можем наконец использовать все это. Где-то в вашем xmonad.hs есть такая строка:

main = xmonad $ def {…} `additionalKeys` myKeys

Измените ее следующим образом:

main = xmonad $ def {…} `additionalKeys` myKeys `backupKeys` fallbackKeys

Перекомпилируйте и перезапустите XMonad, и наслаждайтесь новыми настройками!

1
27.01.2020, 20:43

Теги

Похожие вопросы