Мне не нравится прыгать между основной клавиатурой и клавишами перемещения, поэтому я добавил следующее в свой файл макета xkb.
hidden partial xkb_symbols "movement"
{
key <AD08> { [ NoSymbol, NoSymbol, Up, Up ] };
key <AC08> { [ NoSymbol, NoSymbol, Down, Down ] };
key <AC07> { [ NoSymbol, NoSymbol, Left, Left ] };
key <AC09> { [ NoSymbol, NoSymbol, Right, Right ] };
key <AD09> { [ NoSymbol, NoSymbol, Prior, Prior ] };
key <AB09> { [ NoSymbol, NoSymbol, Next, Next ] };
key <AB07> { [ NoSymbol, NoSymbol, Home, Home ] };
key <AB08> { [ NoSymbol, NoSymbol, End, End ] };
key <AC06> { [ NoSymbol, NoSymbol, Delete, Delete ] };
}
Затем я включаю их в макет на более позднем этапе файла. Теперь у меня должны быть клавиши курсора, доступные через AltGr + j, k, l, i (или h, t, n, c, поскольку я использую dvorak) и т. Д. Это работает во многих случаях (например, Firefox, urxvt, Eclipse, основной текстовой области LyX), но некоторые программы ничего не делают, когда я пытаюсь, скажем, переместить курсор с помощью этих «горячих клавиш» (например, диалогов NetBeans и LyX).
Итак, есть ли способ заставить эти другие программы также уважать мои желания? И почему они не работают в первую очередь? Я не использую DE; только Awesome WM.
Редактировать:
- Вот полный, но упрощенный файл раскладки клавиатуры. У меня есть это,
/usr/share/X11/xkb/symbols/nonpop
и я загружаю егоsetxkbmap nonpop
. - Я заметил, что в MonoDevelop передвижение работает, а выбор - нет. То есть, если я нажимаю Shift + вправо, текст выделяется как обычно, но если я нажимаю AltGr + Shift + n, курсор просто перемещается без выбора. Например, в Firefox оба способа могут быть использованы для выбора.
- Здесь, в конце, они говорят о наложениях, которые выглядят как нечто, что может быть решением, но я не понял, как их использовать.
linux
keyboard-layout
xkb
nonpop
источник
источник
Ответы:
Почему они не работают
Согласно статье ArchWiki, которую вы упомянули:
X-сервер получает коды клавиш от устройства ввода и преобразует их в состояние и KeySym .
состояние - это битовая маска модификаторов X (Ctrl / Shift / и т. д.).
KeySym (в соответствии с
/usr/include/X11/keysymdef.h
) целое число, котороеКаждый печатный символ имеет свой собственный символ клавиши, как
plus
,a
,A
илиCyrillic_a
, но другие клавиши также генерируют свои символы клавиш, какShift_L
,Left
илиF1
.Приложение в ключе события нажатия / выпуска получает всю эту информацию.
Некоторые приложения отслеживают ключевые символы подобно
Control_L
себе, другие просто ищут биты модификатора в состоянии .Итак, что происходит, когда вы нажимаете AltGr+ j:
Вы нажимаете AltGr. Приложение получает событие KeyPressed с
<RALT>
ключевым кодом 108 ( ) и keysym 0xfe03 (ISO_Level3_Shift
), состояние 0.Вы нажимаете j(что соответствует «h» в двораке без модификаторов). Приложение получает событие KeyPressed с
<AC07>
кодом клавиши 44 ( ), keysym 0xff51 (Left
) и состоянием 0x80 (модификатор Mod5 включен).Вы отпускаете j. Приложение получает событие KeyRelease для ключа
<AC07>
/Left
с такими же параметрами.Затем отпустите AltGr- событие KeyRelease для AltGr. (Кстати, состояние здесь все еще 0x80, но это не имеет значения.)
Это можно увидеть, если вы запустите
xev
утилиту.Таким образом, все это означает, что, хотя приложение получает тот же код keysym (
Left
), что и от обычного ключа<LEFT>
, оно также получает код keysym и состояние модификатора из AltGr. Скорее всего, те программы, которые не работают, следят за модификаторами и не хотят работать, когда некоторые активны.Как заставить их работать
Очевидно, мы не можем изменить каждую программу, чтобы не искать модификаторы. Тогда единственная возможность избежать этой ситуации - не генерировать ключи и биты состояния модификаторов.
1. Отдельная группа
Единственный способ , который приходит на ум: определить клавиши перемещения курсора в отдельную группу и переключатель, с отдельным нажатием клавиши, к этой группе до нажатия клавиш j, k, l, i(
h
,t
,n
,c
) (группа защелкивания является предпочтительным методом за один раз смена группы, как я понял).Например:
Теперь, если вы сначала нажмете, AltGrа затем (отдельно) одну из клавиш перемещения, это должно работать.
Однако это не очень полезно, более уместно было бы
LockGroup
вместо защелки и нажатия AltGr до и после группового переключения. Еще лучше может бытьSetGroup
- тогда AltGr выберет эту группу только во время нажатия, но это откроет клавише AltGr приложения (ISO_Group_Shift
/ISO_Group_Latch
/ все, что определено) (но состояние модификатора остается чистым).Но ... остается также возможность того, что приложение также считывает коды клавиш (коды реальных ключей). Затем он заметит «поддельные» клавиши курсора.
2. Наложение
Более «низкоуровневым» решением будет оверлей (как описано в той же статье ).
Наложение просто означает, что некоторая (настоящая клавиатура) клавиша возвращает код клавиши другой клавиши. X-сервер изменяет код ключа и вычисляет состояние модификатора и код ключа для этого нового кода ключа, поэтому приложение не должно замечать это изменение.
Но оверлеи очень ограничены:
В остальном реализация очень похожа на метод с отдельной группой:
SetControls
означает изменить бит управления, пока клавиша нажата, и восстановить его при отпускании клавиши. Должна быть похожая функцияLatchControls
, ноxkbcomp
дает мнена компиляции раскладки.
(Кстати, я также использую dvorak, а также переназначил некоторые ключевые символы движения на высокий уровень буквенных клавиш. А также натолкнулся на некоторые неработающие функции (выбор в примечаниях Xfce и переключение рабочего стола с помощью Ctrl-Alt-Left / Right). Благодаря ваш вопрос и этот ответ, теперь я знаю, что такое оверлей :).)
источник
Overlay1_Enable
. У меня есть один и тот же симптом , как здесь: github.com/GalliumOS/galliumos-distro/issues/362У меня точно такая же проблема. Это так больно.
Итак, заголовок «Как заставить все приложения уважать мой измененный макет xkb?». Ну, я думаю, что единственный способ - это исправить все программы, которые делают это неправильно. Давайте сделаем это!
Что ж, после сообщения об этой ошибке в NetBeans ( обновление: я попробовал последнюю версию, и она работает сейчас! ), Я подумал, что буду просто сообщать об этой ошибке для каждого приложения. Следующим приложением в списке был Speedcrunch .
Однако после поиска похожих сообщений об ошибках я обнаружил эту проблему . У кого-то такая же проблема, отлично!
Прочитав комментарии, вы поймете, что эта ошибка должна присутствовать во всех приложениях QT. Вот отчет об ошибке QT . Не решен, но похоже, что проблема решена в Qt5 .
Однако, если вы посмотрите на комментарии, есть обходной путь! Вот как это работает. Если вы делаете это:
Тогда вы можете изменить это на это:
И это действительно решит проблему для некоторых приложений! Например, Speedcrunch теперь работает для меня! Ура!
Резюме
Прямо сейчас любое приложение должно работать правильно. Если это не так, то вы должны использовать
type[Group1]="ONE_LEVEL"
. Если он у вас уже есть, вам нужно обновить программное обеспечение. Если это все еще не работает, то это зависит от приложения, и вы должны отправить отчет об ошибке.ОБНОВЛЕНИЕ (2017-09-23)
На сегодняшний день все приложения соответствуют моей раскладке клавиатуры. Все, кроме одного.
Серьезно, обработка клавиатуры в Chromium - это мусор . Есть несколько проблем с этим:
foo
,bar
и некоторые ключевые делает Backspace вfoo
, то он будет продолжать работать , как Backspace вbar
даже если он переопределен там.В течение многих лет я игнорировал эти проблемы, просто не используя хром. Тем не менее, в настоящее время вещи, как правило, используют Electron , который, к сожалению, построен на хроме.
Правильный способ решить эту проблему - отправить сообщение об ошибке в Chromium и надеяться на лучшее. Я не знаю, сколько времени им понадобится, чтобы решить проблему, которая затрагивает только пару пользователей ... но, похоже, это единственный выход. Проблема в том, что хром на самом деле хорошо работает с
neo(de)
макетом. Нео макет имеет клавиши со стрелками на уровне 5, но я не могу заставить его работать в моем собственном макете.Все еще открытые отчеты об ошибках:
источник
Как заставить их работать - Решение 3
Использование дополнительных уровней и действий RedirectKey
Следующее решение использует левую клавишу Alt для предоставления клавиш курсора на jkli, Home / End / PageUp / PageDown на uopö и Delete на Backspace.
Левая клавиша Alt остается пригодной для других целей для всех остальных клавиш (например, для меню приложения). Левый Alt (Mod1) удаляется из состояния модификатора, когда используется блок курсора, поэтому приложения не могут его видеть.
источник