LINUX.ORG.RU

Как обрабатывать горячие клавиши?

 ,


1

2

Английская «O»
в английской раскладке показывает
keysym = 111
keycode = 32
в русской раскладке показывает
keysym = 1757
keycode = 32

В коде, который видел для обработки используют keysym, при этом, например [Ctrl + O — открыть] или [f — fullscreen] не будут работать в русской раскладке.

Почему не используют keycode, если оно не меняется в зависимости от раскладки?
keycode может быть разным на разных клавиатурах?
Как вообще решается вопрос работы горячих клавиш в альтернативных раскладках?

★★★

В коде, который видел для обработки используют keysym, при этом, например [Ctrl + O — открыть] или [f — fullscreen] не будут работать в русской раскладке.

А при использовании keycode при использовании раскладки, отличной от us (QWERTY), вместо Ctrl+O ты будешь нажимать совсем не O (при использовании Dvorak это будет Ctrl+R, например).

mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Резонно.

Т.е. обрабатывать нужно исключительно keysum типа:

switch (keysum) {
	case 111: //o
	case 79: //O - o с CapsLock
	case 1757: //щ - o на русской раскладке
	case 1789: //Щ - o с CapsLock русской раскладке
	////////////
	case XXX: //o в раскладке на других языках

Других вариантов нет?

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

Зависит от того, чего ты хочешь добиться. С keycode — более универсально, будет работать у всех и на всех раскладках (обычно пользователи знают «смещение» кнопок по своей раскладке относительно QWERTY). С keysym тебе придётся самому разруливать все эти QWERTY, QWERTZ, AZERTY, Dvorak, Workman, Colemak, BÉPO, NEO, русскую, казахскую, украинскую, корейскую, китайскую, японскую и так далее.

Вот тебе два примера:

  • В qutebrowser не работает управление на русской раскладке, также хоткеи с цифрами не работают с Programmer Dvorak (ибо цифры через Shift, а он хандлится браузером отдельно);
  • В simpleviewer-gl работает на любой раскладке, но в QWERTY, вне зависимости от софтварной раскладки.
mord0d ★★★★★
()
Ответ на: комментарий от mord0d

Зависит от того, чего ты хочешь добиться.

Хочу добиться, чтобы, в не зависимости от языка, работали горячие клавиши

Открыть...   Ctrl + O
Сохранить... Ctrl + S
Новое окно   Ctrl + N
.....

С keycode — более универсально, будет работать у всех и на всех раскладках (обычно пользователи знают «смещение» кнопок по своей раскладке относительно QWERTY).

Т.е. есть такая практика, обрабатывать keycode [Ctrl + O] для QWERTY по-умолчанию, не смотря на то, что в Dvorak и т.д. это будет не [Ctrl + O]?

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

Хочу добиться, чтобы, в не зависимости от языка, работали горячие клавиши

Ctrl + S

Это провал. А если нет в языке S?

Попробуй еще раз.

t184256 ★★★★★
()
Ответ на: комментарий от nvl

Хочу добиться, чтобы, в не зависимости от языка, работали горячие клавиши

Тогда keycode.

Т.е. есть такая практика, обрабатывать keycode [Ctrl + O] для QWERTY по-умолчанию, не смотря на то, что в Dvorak и т.д. это будет не [Ctrl + O]?

Лучше так, чем постоянные багрепорты, что в какой-то отдельно взятой раскладке оно работает не так или вообще не работает. А потом исправления могут сломать уже существующий юзкейс.

mord0d ★★★★★
()
Ответ на: комментарий от nvl

Локально у меня keycode = 32, а тут KeyCode: 79

А в VT будет 24.

mord0d ★★★★★
()

В коде, который видел для обработки используют keysym, при этом, например [Ctrl + O — открыть] или [f — fullscreen] не будут работать в русской раскладке.

[f — fullscreen] не будут работать в русской раскладке. А вот[Ctrl + O — открыть] будет работать хоть в русской, хоть в нерусской.

zloy_starper ★★★
()
Ответ на: комментарий от zloy_starper

[Ctrl + O — открыть] будет работать хоть в русской, хоть в нерусской.

Каким образом это может работать если keysym совершенно разные?

printf ("Event:\nkeysym = %u\nkeycode = %u\nmodificator = %d\n ", keysym, keycode, mod);
В английской Ctrl + o:
Event:
keysym = 111
keycode = 32
modificator = 4
В английской Ctrl + o при включенном CapsLock:
Event:
keysym = 79
keycode = 32
modificator = 6
В русской Ctrl + o:
Event:
keysym = 1757
keycode = 32
modificator = 4
В русской Ctrl + o при включенном CapsLock:
Event:
keysym = 1789
keycode = 32
modificator = 6

nvl ★★★
() автор топика
Ответ на: комментарий от nvl

У меня работает так. В английской раскладке для «o» возвращается keysym 0x6f. В английской раскладке для «Ctrl + o» возвращается keysym 0x6f. В русской раскладке для «o» возвращается keysym 0x6dd. В русской раскладке для «Ctrl + o» возвращается keysym 0x6f.

Я не знаю, что конкретно делаете вы, и, возможно, переключения раскладки клавиатуры тоже могут быть по разному настроены. Но, когда удерживается модификатор Ctrl, то нажатия символьных клавиш должны возвращать keysym соответствующих латинских символов независимо от того, какая раскладка текущая. Хотя возможно правильнее было бы сказать, что при удерживании модификатора Ctrl должны возвращаться keysym для основной (первой) раскладки. Но это я не проверял.

Запустите xev, проверьте, убедитесь на практике.

zloy_starper ★★★
()

Потому что нелатинописцы - люди второго сорта и их неудобства нормальных людей не волнуют. По крайней мере об этом долго не задумывались, и теперь поздно. Естественно, правильно было бы смотреть на кейкод, а если кто-то поломал себе кейкоды (хз правда ли это для двораков-колемаков), то это его идиотская проблема, которую надо решать в драйвере, а не в софте. Отказался от S - не сохраняешь через ctrl-S.

anonymous
()
Ответ на: комментарий от zloy_starper

В русской раскладке для «o» возвращается keysym 0x6dd. В русской раскладке для «Ctrl + o» возвращается keysym 0x6f.

Это явно баг xev, а не общая фитча.

nvl ★★★
() автор топика
Ответ на: комментарий от anonymous

если кто-то поломал себе кейкоды (хз правда ли это для двораков-колемаков), то это его идиотская проблема, которую надо решать в драйвере, а не в софте.

Насколько я понял, там не ломали кейкоды, там так же keycode = 32, просто на этой клавише не «O», а «R» и соответственно keysym не 111, а другая.

nvl ★★★
() автор топика

а что если зная симкод, вызываем функцию типа GetKeycodeBySymcode(symcode).(Не знаю есть такая функция и можно ли узнать кейкод по симкоду). И юзаем дальше полученый кейкод нужного нам символа

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.