[squeak-dev] Unix keyboard events lose track when multiple keys pressed or keys held down

tim Rowledge tim at rowledge.org
Sat Jan 16 04:51:16 UTC 2021

> On 2021-01-15, at 5:13 PM, tim Rowledge <tim at rowledge.org> wrote:
> Oh well, add more debugging clutter to the VM...

Well. That tells us - 

(handleEvent)X KeyRelease    state 0x0 raw keycode 38
symbolic, keyCode, ucs4: 4fd530, -1, 0
Skip KeyRelease at keyCode/ucs4 test line 3764

Where line 3764 is fairly obvious in -
	KeySym symbolic;
	int keyCode, ucs4;
	if (XPending(stDisplay))
	    XEvent evt2;
	    XPeekEvent(stDisplay, &evt2);
	    if ((evt2.type == KeyPress) && (evt2.xkey.keycode == evt->xkey.keycode) && ((evt2.xkey.time - evt->xkey.time < 2)))
	    		DCONV_PRINTERR("Skip KeyRelease at XPeekEvent check line 3757");
	keyCode= x2sqKey(&evt->xkey, &symbolic);
	ucs4= xkeysym2ucs4(symbolic);
	DCONV_PRINTERR("symbolic, keyCode, ucs4: %x, %d, %x\n", symbolic, keyCode, ucs4);
	if ((keyCode >= 0) || (ucs4 > 0)) <<<<<<<-------- line 3764
	  recordKeyboardEvent(keyCode, EventKeyUp, modifierState, ucs4);
	else DCONV_PRINTERR("Skip KeyRelease at keyCode/ucs4 test line 3764");

Ah; look at static int x2sqKeyInput() {line 1720} - it carefully does some stuff to track the *single* last key pressed and if the event is a release, tells you what the last press key was and then sets the record of last-press to -1. Thus if we press a second key it destroys any evidence of the prior press and we're screwed.

There's the same stuff in static int x2sqKeyCompositionInput() but *not* in static int x2sqKeyPlain(), though it can still return -1. Might it be that you (Dave) had a VM using that? It looks like we can force use of x2sqKeyPlain() by the cmdline flag '-nointl' and that certainly skips the above problem but unfortunately completely misses the point. The log shows 

(handleEvent)X KeyRelease    state 0x0 raw keycode 38
symbolic, keyCode, ucs4: 1785530, -1, 785530
EVENT (recordKeyboardEvent): time: 126350 key up    ` ' (0 = 0x0) ucs4 7886128
(ioGetNextEvent) KEYBOARD evt: time: 126350 char: 0 utf32: 7886128 

 - where the keyCode is still -1 but the ucs4 value is the left-over value from the prior read event, totally confusing the system and creating a nonsense event to pass to the image. Oh and the utf32 value is sometimes(?) nonsensical on a release but  I suspect that is just a dumb side-effect. 

This really pretty ridiculous stuff. I really hope somebody around here actually understands X event stuff!

tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim
Oyster (n.), a person who sprinkles his conversation with Yiddishisms.

More information about the Squeak-dev mailing list