Есть ли способ позволить клавишам Shift kbd>, Ctrl kbd> и Alt kbd> вести себя как переключатели под X? Я знаю, как можно сделать это в CLI (например, выполнив this ), но не нашел ссылки для этого в X.
Обратите внимание, что это , а не вопрос о липких клавишах, которые можно включить с помощью опции специальных возможностей.
Это реализовано на уровне DE AFAIK. KDE имеет возможность заблокировать липкие клавиши:
с включенными блокировочными липкими клавишами:
Если дважды нажать клавишу Shift kbd>, а затем нажать Клавиша F kbd>, компьютер интерпретирует это как Shift kbd> + F kbd>. Теперь, если вы напечатаете P, компьютер интерпретирует это как букву P ( Shift kbd> + P kbd>). Чтобы отменить выбор клавиши Shift, нажмите ее еще раз.
blockquote>http://docs.kde.org/stable/en/kdebase-workspace/kcontrol/kcmaccess/index.html
Ключи в X11 повторно отображаются с xmodmap, но в/usr/include/X11/keysymdef.h нет никакого Control_Lock
Если у Вас есть несколько ключей, Вы могли бы отобразить Управление на что-то как ISO_Next_Group_Lock и определить Ваши ключи в этой группе с Управлением + Ключ.
Я нашел некоторую информацию здесь: https://bbs.archlinux.org/viewtopic.php? id=75771
Этого можно добиться с помощью компонента совместимости XKB
Проверьте используемый вариант совместимости
$ setxkbmap -v -query
Trying to build keymap using the following components:
keycodes: evdev+aliases(qwerty)
types: complete
compat: complete
symbols: pc+us(altgr-intl)+us:2+inet(evdev)
geometry: pc(pc105)
rules: evdev
model: pc105
layout: us,us
variant: altgr-intl,
$ more /usr/share/X11/xkb/compat/complete
default xkb_compatibility "complete" {
include "basic"
augment "iso9995"
augment "mousekeys"
augment "accessx(full)"
augment "misc"
augment "xfree86"
augment "level5"
augment "caps(caps_lock)"
};
Изменить файл misc
тот, который содержит необходимые интерпретаторы модификаторов
sudo nano /usr/share/X11/xkb/compat/misc
Я изменил Shift_L
, Alt_L
и amp; Alt_R
действия с SetMods
по LockMods
, добавлены новые Shift_R
, Control_L
и amp; Control_R
Интерпретация с LockMods
и комментарий //setMods.clearLocks
(не уверен, если это необходимо). Вот полный файл:
default partial xkb_compatibility "misc" {
virtual_modifiers Alt,Meta,Super,Hyper,ScrollLock;
// Interpretations for some other useful keys
interpret Terminate_Server {
action = Terminate();
};
//setMods.clearLocks= True;
// Sets the "Alt" virtual modifier
interpret Alt_L+Any {
//useModMapMods= level1;
virtualModifier= Alt;
action = LockMods(modifiers=modMapMods);
};
interpret Alt_L {
action = LockMods(modifiers=Alt);
};
interpret Alt_R+Any {
//useModMapMods= level1;
virtualModifier= Alt;
action = LockMods(modifiers=modMapMods);
};
interpret Alt_R {
action = LockMods(modifiers=Alt);
};
// Sets the "Meta" virtual modifier
interpret Meta_L+Any {
// useModMapMods= level1;
virtualModifier= Meta;
action = SetMods(modifiers=modMapMods);
};
interpret Meta_L {
action = SetMods(modifiers=Meta);
};
interpret Meta_R+Any {
//useModMapMods= level1;
virtualModifier= Meta;
action = SetMods(modifiers=modMapMods);
};
interpret Meta_R {
action = SetMods(modifiers=Meta);
};
// Sets the "Super" virtual modifier
interpret Super_L+Any {
// useModMapMods= level1;
virtualModifier= Super;
action = SetMods(modifiers=modMapMods);
};
interpret Super_L {
action = SetMods(modifiers=Super);
};
interpret Super_R+Any {
//useModMapMods= level1;
virtualModifier= Super;
action = SetMods(modifiers=modMapMods);
};
interpret Super_R {
action = SetMods(modifiers=Super);
};
// Sets the "Hyper" virtual modifier
interpret Hyper_L+Any {
// useModMapMods= level1;
virtualModifier= Hyper;
action = SetMods(modifiers=modMapMods);
};
interpret Hyper_L {
action = SetMods(modifiers=Hyper);
};
interpret Hyper_R+Any {
//useModMapMods= level1;
virtualModifier= Hyper;
action = SetMods(modifiers=modMapMods);
};
interpret Hyper_R {
action = SetMods(modifiers=Hyper);
};
// Sets the "ScrollLock" virtual modifier and
// makes it actually lock when pressed. Sets
// up a map for the scroll lock indicator.
interpret Scroll_Lock+Any {
virtualModifier= ScrollLock;
action = LockMods(modifiers=modMapMods);
};
include "ledscroll"
include "misc(assign_shift_left_action)"
};
partial xkb_compatibility "assign_shift_left_action" {
// Because of the irrevertable modifier mapping in symbols/pc <LFSH> is
// getting bound to the Lock modifier when using
// symbols/shift(both_capslock), creating unwanted behaviour.
// This is a quirk, to circumvent the problem.
interpret Shift_L {
action = LockMods(modifiers = Shift);
};
interpret Shift_R {
action = LockMods(modifiers = Shift);
};
interpret Control_L {
action = LockMods(modifiers = Control);
};
interpret Control_R {
action = LockMods(modifiers = Control);
};
};
Скомпилируйте изменения & amp; обновить изображения initramfs
sudo dpkg-reconfigure xkb-data
sudo update-initramfs -u -k all
Перезагрузить
Ссылки: