Как правильно обрабатывать клавиатуру в иксовых программах? (На сколько совместимы разные дебианы?)

Модератор: Модераторы разделов

MiK13
Сообщения: 1281
ОС: Linux Debian

Как правильно обрабатывать клавиатуру в иксовых программах?

Сообщение MiK13 »

Здравствуйте!
Столкнулся с довольно странной проблемой. Но сначала предыстория.
Программа сначала была написана с использованием svgalib, через которую происходил вывод графики и обработка клавиш, которая выполнялась следующим образом: указывалась функция process_kb_pc(int code, int pressed), в которой и шла обработка типа:

Код: Выделить всё

process_kb_pc(int code, int pressed) {
  switch(code) {
    case SCANCODE_A:
             ...
    case SCANCODE_CURSORBLOCKUP:
             ...
    case SCANCODE_F5:
             ...
  }
}
Значения SCANCODE_... брались из файла /usr/include/vgakeyboard.h.
Со временем решил перевести программу под иксы. И обработку клавиатуры сделал:

Код:

XEvent report; while(1) { XNextEvent(display,&report); // Взять очередное событие из очереди switch(report.type) { case KeyRelease: // Если отпущена клавиша case KeyPress: // Если нажата клавиша process_kb_pc(report.xkey.keycode, report.type==KeyPress); break; ... }
Правда, оказалось, что коды некоторых клавиш изменились. Проблема решилась модификацией файла /usr/include/vgakeyboard.h и размещением его в каталоге проекта.
Прошло время, появился Squeeze и оказалось, что программа под ним не захотела нормально работать. Т.е. все буквы, Fn, Ctrl, Shift, Alt, Tab обрабатываются нормально, а вот на стрелки программа не реагирует. Оказалось, что у них стали другие коды. Т.е. если в Etch и Lenny стрелки ↑←↓→ генерируют коды 98, 100, 104, 102, то в Squeeze они стали генерировать 111, 113, 116, 114.
Поэтому и возник вопрос: Как правильно получить код нажатой (или отпущенной) клавиши?
Возник и ещё один вопрос -- как вообще определить момент реального отпускания клавиши под иксами? Но с этим буду разбираться отдельно.
А по поводу кодов: нашёл файл /usr/include/linux/input.h -- он является аналогом /usr/include/vgakeyboard.h (только другие имена), но эти коды отличаются от того, что вызов XNextEvent(display,&report) помещает в report.xkey.keycode.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: Как правильно обрабатывать клавиатуру в иксовых программах?

Сообщение /dev/random »

В иксах принято использовать не keycode, а keysym - зависимые от раскладки обозначения. Их список есть в X11/keysym.h.

Если нужна независимость от раскладки, то можно использовать функцию XGetKeyboardMapping, которая вернёт для указанного keycode список keysym'ов в разных раскладках; первая из них - латиница без шифта, т.е. как правило именно то, что вам нужно.
Спасибо сказали: