From: Miguel A. Figueroa-V. <mi...@ie...> - 2006-06-10 22:13:58
|
Hi Karen, thanks for replying! (Comments below...) On 6/9/06, Karen McGaul <mc...@gm...> wrote: > Hi, I changed the keyboard events to their current form because people kept > defining impossible events and then wondering why their code didn't work. > > So, it used to be that the 'key' would be what is called 'key_press' now. > People were doing things like making an event like this: > key = 'a' (instead of the required 'A') > modifier = vgui_SHIFT > > It wasn't exactly clear how best to stop this happening. In the end I > thought it would be easiest to convert the 'key' to a value that indicated > which actual key had been pressed (so 'a', 'A' and '^a' should all have the > same value for 'key' whatever that might be). This is what I understood from the comments in the code, which seems good to me. What wasn't clear is whether or not the non-alpha characters were supposed to be "lowercased", which is not done for qt/gtk toolkits, but it is done for the MFC (contrary to what we thought :) )... so, the documentation is right, but I have my reservations with this choice. I think that doing the same in the MFC toolkit would be the "lesser evil". That is, get the ascii code for "ascii_char" (as is done now) and to get the "key" send that value through the vgui_event::set_key(ascii_char) (as is done in qt/gtk). Currently, set_key only lowercases the alpha values, but we could add logic to also make ascii_char's in the range of 1-31 to lowercase alpha and force the modifier to vgui_CTRL (as is done in the vgui_event_condition). > When the return key is pressed, this should also end up converted to a > CTRL+m event also (in theory anyway) and thus match the event condition: > vgui_event_condition(vgui_RETURN, vgui_MODIFIER_NULL). I > was working mostly on MFC so maybe this doesn't work properly for Qt/gtk???? It is not working in MFC either :(... the thing is that if it is a RETURN key press it has no modifier set. So in the case of vgui_ESC, vgui_TAB, vgui_RETURN you get key equal to 27/^[, 9/^I, and 13/^M and no modifier set... This *would* be solved if we add the logic described above to the set_key function and use it in vgui_mfc too. > I think you are right that the documentation is wrong for the '?' key. In > the end I decided just to leave non-letter events as they were because they > weren't causing as much confusion like the letter presses. I wasn't exactly right... but I do think it is the best thing to do (to limit the lowercasing to alpha chars). If there are no objections, I'll go ahead with the changes to the documentation (book and doxy), vgui_event::set_key, and vgui_mfc_adaptor::mfc_key... Thanks again, Miguel > On 6/9/06, Mi guel A. Figueroa-Villanueva <mi...@ie...> wrote: > 2. Some problems with vgui keyboard events: The book > (http://paine.wiau.man.ac.uk/pub/doc_vxl/books/core/book_10.html#SEC123 > ) > explains that for the given key-presses modifier,key, and ascii_char > will have the following: > > key_press | modifier |key| ascii_char > ----------------------------------------- > a | vgui_NULL | a | a > CTRL+a | vgui_CTRL | a | ^a > SHIFT+a | vgui_SHIFT | a | A > / | vgui_NULL | / | / > ? | vgui_SHIFT | / | ? > > However, qt and gtk (not sure what mfc does) both get the ASCII > character of the event and do: > > key = set_key(ASCII) // this make an upper case letter [A-Z] lowercase > [a-z] > ascii_char = ASCII > > As I understand it, this means that the last line would be (key would > still have the ascii value): > > ? | vgui_SHIFT | ? | ? > > So, which is it? I think that the way qt/gtk does it is better because > lower-casing a ?,<,etc is not independent of the keyboard layout... > and it might be hard to do and not much to gain. Let me know what is > the correct way and I'll update the book or my wxWidgets code, which > incidently does the same as qt/gtk/mfc? ;) > > Also, in vgui_event_condition::init key values in the [1-31] range are > made lowercase letters and forced to have the vgui_CTRL modifier: > > // key should always be lower case. > if (k > 0 && k < 32) > { > // Convert control character to lower case and force the control > modifier. > key = vgui_key(k + 'a' -1); > modifier = vgui_CTRL; > } > > while this makes sense most of the time, it means that the events: > vgui_ESC, vgui_TAB, vgui_RETURN, and vgui_NEWLINE can't be used as > event conditions. A client might do: > > vgui_event_condition(vgui_RETURN, vgui_MODIFIER_NULL); > > and then the only way to activate the condition is with "ctrl+m", > which is not exactly the "enter" key... So, is this a bug? or feature? > > If it is a bug... I'm not sure what is the best solution, but it seems > that doing something like the following would be easiest: > > // key should always be lower case. > if (k > 0 && k < 32 && k != vgui_ESC && k != vgui_TAB ...) > { > // Convert control character to lower case and force the control > modifier. > key = vgui_key(k + 'a' -1); > modifier = vgui_CTRL; > } |