On Feb 14, 7:31 pm, Jim Douglas <[email protected]> wrote:
> Thomas,
>
> Alan is writing low level code that needs to deal correctly with key
> repeats in all browsers.

OK, sorry. The real issue is with repeats then, and more specifically
Opera. But Alan titled his message "get keycode from KeyDownHandler,
KeyUpHandler" and talks about IE; and there I see absolutely no issue
at all.

> Sadly, this requires writing browser-
> specific code that does some detailed parsing of the keydown and
> keypress events.

Only in Opera actually, because it only repeats KeyPress events
(whereas it shouldn't even fire them in the first place in case of
arrow keys which do not generate text)

> This article provides some good background:
>
> http://unixpapa.com/js/key.html
>
> And the associated test page is a convenient way to see what events a
> browser fires for each key:
>
> http://unixpapa.com/js/testkey.html
>
> One simple example:
>
> Open that page in Firefox.
> Press the right arrow key long enough to trigger key-repeat.
> Note the stream of events.
> Do the same in Chrome; note the different stream of events.

Firefox only adds KeyPress events. The issue is Opera here, and *only*
Opera.

> PPK's notes are out of date, but still useful:
>
> http://www.quirksmode.org/js/keys.html

They do not deal with repeats.

> Bottom line:  Writing low level JavaScript code to manage keystrokes
> is a challenge.  The GWT documentation notes that there are no
> coherent browser standards in this area:
>
> http://google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/g...
> "The native keyboard events are somewhat a mess 
> (http://www.quirksmode.org/js/keys.html), we do some trivial normalization
> here, but do not attempt any complex patching, so user be warned."

See:
http://code.google.com/p/google-web-toolkit/issues/detail?id=3753
http://groups.google.fr/group/Google-Web-Toolkit-Contributors/t/e705905e2cc78408
and http://gwt-code-reviews.appspot.com/142801/show

So, as I said, the only issue here is Opera (Firefox behavior is a
PITA too, but workable). So, either:
 - do yourself a favor, don't support repeats in Opera (they'll
probably change behavior sooner or later given that DOM3EVENTS lead
towards IE/Safari behavior [1])
 - use deferred binding to special-case Opera (store
KeyDownEvent::getNativeKeyCode and check repeats in KeyPress *instead*
of KeyDown while KeyPressEvent::getCharCode() ==
KeyDownEvent::getNativeKeyCode(); because in current GWT versions,
KeyPressEvent::getCharCode will give you the arrow "codes", in both
Opera and Firefox BTW); which would be an almost equivalent to the
code you proposed, just far simpler:

private int keyCode;

public void onKeyDown(KeyDownEvent event) {
   keyCode = event.getNativeKeyCode();
   // given that registering/unregistering event handlers in Opera is
very fast
   // you could even only register the KeyPressHandler when keyCode
needs
   // repeats-processing!
}

public void onKeyPress(KeyPressEvent event) {
   if (keyCode == event.getCharCode()) {
     // process this keypress as if it were a keydown in other
browsers
   }
}

It of course becomes more complex if you also have to deal with keys
that are *expected* to generate keypress (I assume IE/Safari behavior
here).

[1] http://www.w3.org/TR/DOM-Level-3-Events/

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to