Seba, This is not a problem with the Flash engine, as I am running under the DHTML runtime. This is definitely a problem with the keyboard kernel. Also, if you read the description, the problem is with the keyboard down events, not keyboard up events. I have found that it works the same way with the alt and control keys as well. With the functionality the way it is, there is simply no way to write your app so that it can distinguish between a button being pressed by itself and a button being pressed as a combination. Sure, you will eventually get the combination event, or the keydown event for the shift, control or alt keys, but not until *after* you get the keydown event for the other key that is being pressed, so you cannot tell your app "do one thing if this key is pressed, but do something different if this key is pressed in combination with the shift key".
You can easily see this in action with any implementation of the grid object. Hit "tab" a few times to focus on subsequent cells, and then start hitting "shift + tab" combination; the first time you hit shift + tab, the grid will go on to the *next* focus, and only on subsequent presses will it start focusing *previous* elements like it is supposed to. Even easier, you can write a handler for all keyboard down events from lz.Keys and output the keycode to the debug console. You will see that the shift, control and alt keys do not fire a keydown event until the key is lifted, while every other key on the keyboard fires a down event right when it is depressed. I think this is a browser-specific issue, because I am using Chrome but if I use Firefox the events do fire when the key goes down. However, using the method above, I can see that even though the shift key fires the first time you press it down in Firefox, it does not fire on subsequent presses until you hit another button. Apparently the keyboard kernel is simply messed up. I would open a problem ticket on this, but official support for OL seems to have all but vanished. J On Sat, Jun 9, 2012 at 2:15 AM, [email protected] <[email protected]> wrote: > Hi Justin, > > the same problem persists if you for example have key combos with multiple > keys and then suddenly change the focus to another application on your > desktop (for example with Alt+Tab). > > There is not fix for that, it is a problem related to the Flash Player from > my point of view. You simply can't rely on getting all keyUpEvents 100%. > > You can however possibly workaround that if you concentrate on the keydown > events only. For example you implement a listener for onkeydown events and > then add a listener for xxx milliseconds listening if another keydown was > called in that period. If yes, you can trigger your key-combo-event, if no > you just clear the keyDownArray. That way you don't need any keyUpEvent at > all. > > Sebastian > > > > > 2012/6/8 Justin Ellis <[email protected]> >> >> Hi all, >> >> Somewhat related to my last, invalid question since I am trying to >> make a grid recognize shift+key combos. The problem is that, when I >> catch an onkeydown event in my grid and check to see if the shift key >> is down using "lz.Keys.isKeyDown('shift')", the first time I try it >> with the shift key down the "isKeyDown" method returns "false," and >> then only returns "true" if I keep the shift key down and enter in >> subsequent key presses. To test, I added an "onkeydown" handler in my >> canvas that looks like this: >> >> <handler name="onkeydown" reference="lz.Keys" args="kc"> >> Debug.write("Key: " + kc); >> </handler> >> >> Here is what happens: >> >> <I press the "Shift" key> - Nothing happens >> <I release the "Shift key> - Debug Message: "Key: 16" >> <I press the "Shift" key> - Nothing happens >> <I press the "Down Arrow" key> - Debug Message: "Key 40", Debug >> Message: "Key 16" >> <I release and then press the "Down Arrow" key again> - Debug Message: >> "Key 40" >> >> So basically the lz.Keys object does not register when "Shift" is >> pressed until either (a) "Shift" is lifted, or (b) Another key is >> pressed, at which time it registers the "Shift" press *after* the >> other key is pressed, so a handler catching that key press will return >> false for "lz.Keys.isKeyDown('shift')". >> >> Is there any way to fix this? >> >> -- >> Justin Ellis >> 646-783-9387 >> Fax: 866-448-6503 >> [email protected] >> www.LightBulbLaw.com > > > > > -- > Sebastian Wagner > https://twitter.com/#!/dead_lock > http://www.openmeetings.de > http://www.webbase-design.de > http://www.wagner-sebastian.com > [email protected] -- Justin Ellis 646-783-9387 Fax: 866-448-6503 [email protected] www.LightBulbLaw.com
