как выяснилось, в драйвере pipe-клавиатуры kbd_pipe.c бага!
Читается из pipe и заполняется в переменной MWKEY* buf только младший байт, а старшие - как придется:
Цитата
static int
soft_Read(MWKEY* buf, MWKEYMOD* modifiers, MWSCANCODE* scancode)
{
int cc;
*modifiers = 0; /* no modifiers yet */
*scancode = 0; /* no scancode yet */
cc = read(kbd_fd, buf, 1); /* this is NON BLOCKING read */
if (cc > 0) {
if(*buf == 0x1b)
return -2; /* special case ESC*/
#if _SOFT_DEBUG
EPRINTF("kbd_soft.c: soft_Read(): read '%c', cc = %d\n",
buf[0], cc);
fflush(NULL);
#endif
return 1;
}
return 0;
}
Что интересно, пока до pthread_create не доходит, работало нормально. Наверное компилятор переменные по умолчанию нулями инициализирует.
пришлось подправить:
Цитата
static int
soft_Read(MWKEY* kbuf, MWKEYMOD* modifiers, MWSCANCODE* scancode)
{
unsigned char buf[1];
MWKEY mwkey;
int cc;
*modifiers = 0; /* no modifiers yet */
*scancode = 0; /* no scancode yet */
cc = read(kbd_fd, buf, 1); /* this is NON BLOCKING read */
if (cc > 0) {
mwkey = buf[0];
if(mwkey == 0x1b)
return -2; /* special case ESC*/
#if _SOFT_DEBUG
EPRINTF("kbd_soft.c: soft_Read(): read '%c', cc = %d\n",
mwkey, cc);
fflush(NULL);
#endif
*kbuf = mwkey;
return 1;
}
return 0;
}