Skip to content

Commit c0407cc

Browse files
committed
change modifier event semantics to match vm-display-X11 semantics
1 parent 1a369be commit c0407cc

2 files changed

Lines changed: 62 additions & 50 deletions

File tree

platforms/unix/vm-display-fbdev/sqUnixEvdevKeyMouse.c

Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,10 @@ static int getModifierState();
9797
static void updateModifierState(struct input_event* evt);
9898
static void processLibEvdevKeyEvents();
9999
static 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
102105
static void printKeyState(int kind);
103106
#endif
@@ -306,49 +309,60 @@ static int isModifier(int code) {
306309

307310

308311
static 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;

platforms/unix/vm-display-fbdev/sqUnixFBDev.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -207,22 +207,20 @@ static void closeFramebuffer(void)
207207
}
208208

209209

210-
static void enqueueKeyboardEvent(int key, int up, int modifiers)
210+
static void enqueueKeyPressEvent(int key, int down, int modifiers)
211211
{
212212
DPRINTF("KEY %3d %02x %c %s mod %02x\n",
213213
key, key, ((key > 32) && (key < 127)) ? key : ' ',
214-
up ? "UP" : "DOWN", modifiers);
214+
down ? "DOWN" : "UP", modifiers);
215215

216216
modifierState= modifiers;
217-
if (up)
218-
{
219-
recordKeyboardEvent(key, EventKeyUp, modifiers, key);
220-
}
221-
else
222-
{
223-
recordKeyboardEvent(key, EventKeyDown, modifiers, key);
224-
recordKeyboardEvent(key, EventKeyChar, modifiers, key);
225-
}
217+
218+
recordKeyboardEvent(key, down == 0 ? EventKeyUp : EventKeyDown, modifiers, key);
219+
}
220+
221+
static void enqueueKeyCharEvent(int key, int modifiers)
222+
{
223+
recordKeyboardEvent(key, EventKeyChar, modifiers, key);
226224
}
227225

228226
static void openKeyboard(void)

0 commit comments

Comments
 (0)