Столкнулся с довольно странной проблемой. Но сначала предыстория.
Программа сначала была написана с использованием 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:
...
}
}Со временем решил перевести программу под иксы. И обработку клавиатуры сделал:
Код:
XEvent report;
while(1) {
XNextEvent(display,&report); // Взять очередное событие из очереди
switch(report.type) {
case KeyRelease: // Если отпущена клавиша
case KeyPress: // Если нажата клавиша
process_kb_pc(report.xkey.keycode, report.type==KeyPress);
break;
...
}Прошло время, появился 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.