Re-used event objects (was: Re: [kaffe] java.lang.reflect.Method virtual method call bug (CVS))

Benja Fallenstein b.fallenstein@gmx.de
Sat, 28 Dec 2002 21:27:58 +0100


Benja Fallenstein wrote:

> Not completely; it starts up, but something in our call hierarchy eats 
> simple key events like single characters, spaces or returns; more 
> complex things like function keys, Tab or PgUp/PgDn are processed 
> correctly. We do recieve the events, apparently, but something eats 
> them. I haven't seen this on the proprietary JVMs, so I guess there 
> must be some kind of incompatibility (trying to process key events 
> across Javas is **icky**). I'll tell if I find out what's causing this.


I have isolated the incompatibility: Kaffe re-uses KeyEvent objects; 
after issuing a KEY_PRESSED event, it issues a KEY_TYPED event which is 
the same object, with a field value changed inside. Interestingly, the 
KEY_RELEASED events seem to be separate objects. Gzz implements its own 
event queue to coordinate event processing with animation; this is 
implemented by putting the KeyEvent objects in a LinkedList. As it 
happens, Gzz by default only reacts to KEY_TYPED events, and as it 
happens, all three KEY_* events are usually queued before any of them is 
processed. This means that at the time we get around to processing the 
key events, we have two KEY_TYPED and one KEY_RELEASED event in the 
queue (because the original KEY_PRESSED event was changed to KEY_TYPED 
by Kaffe).

Gzz might be able to work around this, but I suggest that Kaffe not 
re-use KeyEvent objects, as code like the above works fine on the 
proprietary Javas and breaks on Kaffe in nonobvious ways. (Caching by 
using weak references might be an option, but I wouldn't think it's 
worth it...)

- Benja