|
|
|
|
@ -508,59 +508,56 @@ static long process_descriptor(struct keyboard *kbd, uint8_t code, |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (kbd->delayedphase == 1) { |
|
|
|
|
switch (kbd->delayedphase) { |
|
|
|
|
case 1: |
|
|
|
|
if (pressed) { |
|
|
|
|
// Another key is pressed; queue the event… how can I queue
|
|
|
|
|
// the event here?
|
|
|
|
|
dbg("pressed second key"); |
|
|
|
|
kbd->delayedcode1 = code; |
|
|
|
|
kbd->delayeddescriptor1 = *d; |
|
|
|
|
kbd->delayedphase = 2; |
|
|
|
|
/// should now bail out
|
|
|
|
|
return 0; |
|
|
|
|
} else { |
|
|
|
|
kbd->delayedphase = 3; |
|
|
|
|
kbd->delayedphase = 3; // resolve the delay
|
|
|
|
|
// special processing: we declare that the previous press is
|
|
|
|
|
// not meant to be a modifier; so we replay it, but frozen.
|
|
|
|
|
kbd->keyfrozenstate[kbd->delayedcode0] = 1; |
|
|
|
|
dbg("1 and release: freeze and press"); |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode0, |
|
|
|
|
&kbd->delayeddescriptor0, dl, 1, time); |
|
|
|
|
&kbd->delayeddescriptor0, dl, 1, time); |
|
|
|
|
// since the keypress was treated as frozen, the (eventual)
|
|
|
|
|
// keyrelease should also be treated as frozen
|
|
|
|
|
kbd->keyfrozenstate[kbd->delayedcode0] = 1; |
|
|
|
|
kbd->delayedphase = 0; |
|
|
|
|
dbg("1 and release: freeze and run"); |
|
|
|
|
// then let everybody run free
|
|
|
|
|
} |
|
|
|
|
} else if (kbd->delayedphase == 2) { |
|
|
|
|
// special processing
|
|
|
|
|
dbg("resolve the delay"); |
|
|
|
|
kbd->delayedphase = 3; |
|
|
|
|
break; |
|
|
|
|
case 2: |
|
|
|
|
kbd->delayedphase = 3; // resolve the delay
|
|
|
|
|
if (!pressed && code == kbd->delayedcode0) { |
|
|
|
|
// this is the whole point of the delayed business
|
|
|
|
|
dbg("supposedly not wanting to use it as a mod"); |
|
|
|
|
kbd->keyfrozenstate[kbd->delayedcode0] = 1; |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode0, |
|
|
|
|
&kbd->delayeddescriptor0, dl, 1, time); |
|
|
|
|
kbd->keyfrozenstate[kbd->delayedcode0] = 1; |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode0, |
|
|
|
|
&kbd->delayeddescriptor0, dl, 0, time); |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode1, |
|
|
|
|
&kbd->delayeddescriptor1, dl, 1, time); |
|
|
|
|
kbd->delayedphase = 0; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} else { |
|
|
|
|
dbg("supposedly wanted to use it as a modifier"); |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode0, |
|
|
|
|
&kbd->delayeddescriptor0, dl, 1, time); |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode1, |
|
|
|
|
&kbd->delayeddescriptor1, dl, 1, time); |
|
|
|
|
//.. and let go with processing of the current event
|
|
|
|
|
} |
|
|
|
|
// this is the whole point of the delayed business
|
|
|
|
|
dbg("supposedly not wanting to use it as a mod"); |
|
|
|
|
kbd->keyfrozenstate[kbd->delayedcode0] = 1; |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode0, |
|
|
|
|
&kbd->delayeddescriptor0, dl, 1, time); |
|
|
|
|
kbd->keyfrozenstate[kbd->delayedcode0] = 1; |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode0, |
|
|
|
|
&kbd->delayeddescriptor0, dl, 0, time); |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode1, |
|
|
|
|
&kbd->delayeddescriptor1, dl, 1, time); |
|
|
|
|
kbd->delayedphase = 0; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} else { |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode0, |
|
|
|
|
&kbd->delayeddescriptor0, dl, 1, time); |
|
|
|
|
process_descriptor(kbd, kbd->delayedcode1, |
|
|
|
|
&kbd->delayeddescriptor1, dl, 1, time); |
|
|
|
|
//.. and let go with processing of the current event
|
|
|
|
|
} |
|
|
|
|
kbd->delayedphase = 0; |
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch (d->op) { |
|
|
|
|
|