Я пытаюсь повторно отобразить ключи, которые, как находят на японской клавиатуре, были Высоким звуком, Супер, Возвратом и Сдвигом. Вот хорошее описание вида клавиатуры, которую я использую. (Я на самом деле использую японскую клавиатуру Filco Majestouch 2 TKL). Идея состоит в том, чтобы иметь совершенно нормальную английскую клавиатуру, где дополнительные ключи под ползунками повторно отображаются на Высоком звуке, Возврате, и т.д. Я делаю это использование xkb в соответствии с Ubuntu.
Нижний ряд клавиатуры похож на это:
<LCTL> <LWIN> <LALT> <MUHE> <SPCE> <HENK> <HKTG> <RALT> <MENU> <RCTL>
Я хотел бы, чтобы это было похоже на это:
<LCTL> <LALT> <LWIN> <LALT> <SPCE> <RALT> <RTRN> <MENU> <RALT> <RCTL>
Переотображение LWIN
, LALT
, RALT
, и MENU
обработанный, но переотображение MUHE
, HENK
, и HKTG
не имеет.
Вдобавок к этому я пытался повторно отобразиться AB11
кому: Shift_R
и AE13
кому: BackSpace
. Результат - это AB11
ничего не делает точно так же, как MUHE
, HENK
, и HKTG
, но AE13
действительно становился повторно отображенным на BackSpace
и работы, как предназначено.
До сих пор я использовал basic
коды клавиши определили (как я понимаю) в /usr/share/X11/xkb/keycodes/xfree86
. Из-за этого, файл символов моей раскладки клавиатуры, запущенный как это:
default
xkb_symbols "basic" {
С тех пор MUHE
, HENK
, HKTG
, AB11
, и AE13
определяются в /usr/share/X11/xkb/keycodes/evdev
, Я предположил, что должен изменить это на evdev
, но это не помогло:
default
xkb_symbols "evdev" {
Есть ли что-либо еще, что я должен сделать для использования MUHE
и т.д.? Я должен удостовериться, что некоторая другая часть входной системы использует evdev? Я не уверен, как сделать это. Я нахожусь на 32-разрядной Ubuntu 14.04, но то же поведение происходит на 18,04 64-разрядных.
Вот полный код, который я использую для переотображения тех ключей (я опустил несвязанные части расположения):
default
xkb_symbols "evdev" {
// Swap Caps Lock and Escape.
key <CAPS> { [ Escape ] };
// key <ESC> { [ Caps_Lock ] };
key <ESC> { type[Group1]="TWO_LEVEL", [ Multi_key, Multi_key ] };
key <LWIN> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_L ]
};
key <LALT> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Super_L ]
};
key <MUHE> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_L ]
};
// placeholder for <SPCE>
key <HENK> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_R ]
};
key <HKTG> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Return ]
};
key <RALT> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Menu ]
};
key <MENU> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Alt_R ]
};
// LSGT is the extra key in the European layout that is found between the
// left Shift and Z.
key <LSGT> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Super_L ]
};
// Japanese keyboard bottom row:
// <LCTL> <LWIN> <LALT> <MUHE> <SPCE> <HENK> <HKTG> <RALT> <MENU> <RCTL>
// Desired bottom row:
// <LCTL> <LALT> <LWIN> <LALT> <SPCE> <RALT> <RTRN> <MENU> <RALT> <RCTL>
// Other extra Japanese keys:
// Between / and right shift: <AB11>
key <AB11> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ Shift_R ]
};
// Between = and Backspace: <AE13>
key <AE13> {
type[Group1]="ONE_LEVEL",
symbols[Group1]=[ BackSpace ]
};
// Modifier numbers:
// Mod1 = Alt
// Mod2 = Num_Lock
// Mod4 = Super
// Mod5 = ISO Level3 Shift
// Shift = Shift
// <AB11> is Shift
modifier_map Shift { Shift_L, Shift_R };
// <LALT> is Super, <LSGT> is Super too
modifier_map Mod4 { Super_L, Super_R };
// <MENU> is Alt, <LWIN> is Alt too
modifier_map Mod1 { Alt_L, Alt_R };
// we map a bunch of keys to ISO Level3 Shift
modifier_map Mod5 { ISO_Level3_Shift };
};
Править: оказывается кодом, который я отправил выше, (главным образом?) корректный, однако некоторый механизм в xkb, который предназначен для включения "мультимедийных" ключей и других "необычных" ключей, ударяет отображения выше. Кнопки нижнего ряда работают теперь, но AB11
ключ все еще не работает как дополнительное Shift
ключ. Однако, это - некоторый прогресс.
Вот описание этого "inet", ударяющего случай. Упоминающие ниже шоу, что это происходит в моем случае, также:
$ setxkbmap ef -print
xkb_keymap {
xkb_keycodes { include "evdev+aliases(qwerty)" };
xkb_types { include "complete" };
xkb_compat { include "complete" };
xkb_symbols { include "pc+ef+inet(evdev)" };
xkb_geometry { include "pc(pc105)" };
};
Отметьте бит, который говорит: xkb_symbols { include "pc+ef+inet(evdev)" };
. Это означает, что сначала применяет нормальное pc
расположение (американский QWERTY), затем безотносительно расположения я выбрал (здесь названный ef
, хотя я не назвал его, что, я предполагаю, что это - просто имя переменной, это снова используется для всех разметок), и затем inet(evdev)
применяется. Внутри symbols/inet
, можно найти этот блок:
xkb_symbols "evdev" {
key <HKTG> { [ Hiragana_Katakana ] };
key <HENK> { [ Henkan ] };
key <MUHE> { [ Muhenkan ] };
и по-видимому это применяется, потому что моя клавиатура "inet клавиатура"; в rules/base
можно найти это:
! $inetkbds = acer_c300 acer_ferrari4k acer_laptop \
...
pc105 \
...
а также далее вниз этот блок:
$inetkbds = +inet(%m)
Таким образом, теперь вопрос состоит в том, как заставить мою клавиатуру не рассматриваться как inet
клавиатура?
Или альтернативно, это могло быть тем, что вызывает его? Внутри rules/evdev
, существует этот блок:
! model = symbols
$evdevkbds = +inet(evdev)+inet(%m)
applealu_jis = +inet(evdev)+macintosh_vndr/jp(alujiskeys)
* = +inet(evdev)
Последняя строка была бы по-видимому средний что, какую клавиатуру Вы имеете при базировании раскладки клавиатуры на evdev
путем выполнения xkb_symbols "evdev" {
, Вы всегда добираетесь inet(evdev)
добавленный в конце, переопределяя Ваши символы.
Я не знаю, что xkb достаточно хорошо знает, который имеет место, таким образом, некоторое руководство значительно ценилось бы.
Я все еще не знаю, почему я не могу повторно отобразиться AB11
. Что-то все еще отсутствует? Я определяю AB11
как Shift_R
и затем дайте его Shift
способность через modifier_map Shift { Shift_L, Shift_R };
. Все же в xev
, когда я нажимаю эту кнопку, это действительно становится распознанным как Shift_R
, но состояние тихо 0x0
(никакие модификаторы), а не 0x1
(Сдвиг), которым это должно быть:
KeyPress event, serial 38, synthetic NO, window 0xdc00001,
root 0x1ef, subw 0x0, time 1701230053, (441,592), root:(444,729),
state 0x0, keycode 97 (keysym 0xffe2, Shift_R), same_screen YES,
XKeysymToKeycode returns keycode: 62
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
Кажется, нет ничего переопределяющего этот ключ (или любой другой ключ с тем же кодом клавиши) в inet(evdev)
.
Спасибо за указание на меня к правильному направлению. Наконец после лужения xkb в течение половины дня я могу заставить его работать. Это - моя конфигурация, корректируйтесь согласно своей потребности:
Это в в символах/нас:
xkb_symbols, "основной" {
...
key <AE13> {[ BackSpace, BackSpace ]};
key <AB11> {[ backslash, bar ]};
key <BKSL> {[ Return]};
};
Это находится в symbols/inet:
key <HKTG> { [ space ] };
key <HENK> { [ space ] };
key <MUHE> { [ space ] };
С наилучшими пожеланиями, победитель