@@ -97,7 +97,10 @@ static int getModifierState();
9797static void updateModifierState (struct input_event * evt );
9898static void processLibEvdevKeyEvents ();
9999static void enqueueMouseEvent (int b , int dx , int dy );
100- static void enqueueKeyboardEvent (int key , int up , int modifiers );
100+ static void enqueueKeyPressEvent (int key , int down , int modifiers );
101+ static void enqueueKeyCharEvent (int key , int modifiers );
102+ static void setModifierKeyCode (struct input_event * evt , int squeakKeyCode );
103+ static void setCharKeyCode (int eventValue , int squeakKeyCode , int modifiers );
101104#ifdef DEBUG_EVENTS
102105static void printKeyState (int kind );
103106#endif
@@ -306,49 +309,60 @@ static int isModifier(int code) {
306309
307310
308311static void setKeyCode (struct input_event * evt ) {
309- int squeakKeyCode , modifierBits ;
312+
310313 /* NB: possible to get a Key UP _withOUT_ a Key DOWN */
311- if (evt -> type == EV_KEY ) {
312314
313- lastKeyCode = evt -> code ;
314- modifierBits = getModifierState ();
315- squeakKeyCode = keyCode2keyValue ( lastKeyCode ,
315+ int squeakKeyCode , modifierBits ;
316+
317+ if (evt -> type != EV_KEY )
318+ return ;
319+
320+ lastKeyCode = evt -> code ;
321+ modifierBits = getModifierState ();
322+ squeakKeyCode = keyCode2keyValue ( lastKeyCode ,
316323 (modifierBits & ShiftKeyBit ) );
317324
318- if (isModifier (evt -> code )) {
319- /* Track, but do NOT report, modifier-key state. */
320- updateModifierState (evt );
321- setSqueakModifierState ();
322- } else {
325+ if (evt -> value < 0 || evt -> value > 2 ) {
326+
327+ DPRINTF ("Key code: %d with UNKNOWN STATE: (%d) ? (0=up|1=down|2=repeat)\n" , squeakKeyCode , evt -> value );
328+ return ;
329+ }
330+
323331#ifdef DEBUG_KEYBOARD_EVENTS
324332 DPRINTF ("Setting key code: %d from raw: %d\n" , squeakKeyCode , evt -> code );
325333 printKeyState (evt -> value );
326334#endif
327- if (squeakKeyCode == 0 ) return ; /* no mapping for key */
328-
329- switch (evt -> value ) {
330- case 0 : /* keyUp */
331- enqueueKeyboardEvent (squeakKeyCode ,
332- 1 , /* keyUp: C TRUE */
333- modifierBits );
334- clearKeyCode ();
335- break ;
336- case 1 : /* keydown */
337- case 2 : /* repeat */
338- enqueueKeyboardEvent (squeakKeyCode ,
339- 0 , /* keyUp: C FALSE */
340- modifierBits );
341- /* initially cmd-. (command+period) */
342- if ((squeakKeyCode & (modifierBits << 8 )) == getInterruptKeycode ())
343- setInterruptPending (true);
344335
345- break ;
346- default :
347- DPRINTF ("Key code: %d with UNKNOWN STATE: (%d) ? (0=up|1=down|2=repeat)\n" , squeakKeyCode , evt -> value );
348- break ;
349- }
350- }
351- }
336+ if (squeakKeyCode == 0 ) return ; /* no mapping for key */
337+
338+ if (isModifier (evt -> code ))
339+
340+ setModifierKeyCode (evt , squeakKeyCode );
341+ else
342+ setCharKeyCode (evt -> value , squeakKeyCode , getModifierState ());
343+ }
344+
345+ static void setModifierKeyCode (struct input_event * evt , int squeakKeyCode ) {
346+
347+ /* for a modifier we update the modifier state and record up/down events, but not char events. */
348+
349+ updateModifierState (evt );
350+ setSqueakModifierState ();
351+
352+ if (evt -> value < 2 )
353+ enqueueKeyPressEvent (squeakKeyCode ,
354+ evt -> value ,
355+ getModifierState ());
356+ }
357+
358+ static void setCharKeyCode (int eventValue , int squeakKeyCode ,int modifiers ) {
359+
360+ enqueueKeyPressEvent (squeakKeyCode ,
361+ eventValue ,
362+ modifiers );
363+
364+ if (eventValue > 0 ) /* 0 = up */
365+ enqueueKeyCharEvent (squeakKeyCode , modifiers );
352366}
353367
354368#ifdef DEBUG_EVENTS
@@ -658,11 +672,11 @@ static void processLibEvdevMouseEvents() {
658672 arrowCode = 31 ; /* arrow v down */
659673 }
660674 /* Use OR of modifier bits to signal synthesized arrow keys */
661- enqueueKeyboardEvent (arrowCode ,
662- 0 , /* key down */
675+ setCharKeyCode (arrowCode ,
676+ 1 , /* key down */
663677 (CtrlKeyBit |OptionKeyBit |CommandKeyBit |ShiftKeyBit ));
664- enqueueKeyboardEvent (arrowCode ,
665- 1 , /* key up */
678+ setCharKeyCode (arrowCode ,
679+ 0 , /* key up */
666680 (CtrlKeyBit |OptionKeyBit |CommandKeyBit |ShiftKeyBit ));
667681 }
668682 break ;
0 commit comments