--- parser.c 2004-06-20 15:30:49.000000000 +0300 +++ parser.c-vesuri 2004-06-20 15:30:24.000000000 +0300 @@ -158,8 +158,8 @@ gst.logical_min, gst.logical_max, gst.report_size); - if (local_ct && (val & RPT_VAR && - usage++ == loc[k].usage_max || + if (local_ct && ((val & RPT_VAR && + usage++ == loc[k].usage_max) || !(val & RPT_VAR))) { if (k < local_ct - 1) k++; @@ -375,10 +375,14 @@ case 0x0007: /* Keyboard */ //any_keyboard = 1; - if (val && usage & 0xffff) { - butt = hid_to_linux[usage & 0xffff]; - if (butt) - parser->key_down[parser->keys_down++] = butt; + if (val && (usage & 0xffff)) { + if ((usage & 0xffff) == 1) { + parser->keys_down = -1; + } else { + butt = hid_to_linux[usage & 0xffff]; + if (butt) + parser->key_down[parser->keys_down++] = butt; + } } return; @@ -494,7 +498,7 @@ struct hid_report *r = NULL; struct hid_field *f; int prev_key_down[32]; - int prev_keys_down; + int prev_keys_down = 0; if (!parser) return -ENODEV; @@ -519,9 +523,12 @@ return -EINVAL; } - for (i = 0; i < parser->keys_down; i++) - prev_key_down[i] = parser->key_down[i]; - prev_keys_down = parser->keys_down; + if(parser->keys_down >= 0) { + for (i = 0; i < parser->keys_down; i++) { + prev_key_down[i] = parser->key_down[i]; + } + prev_keys_down = parser->keys_down; + } parser->keys_down = 0; for (i = 0; i < r->num_fields; i++) {