OnKeyDown: getting the charcater value from key
-
Dan,
It does not work, and for two good reasons:
-
EnableVCB?
is not checked continuously but only after a click -
onUserText
fires when you have type Enter, not before. To keep the same workflow, the VCB psuedo input box has to appear 'naturally when typing characters.
My original question was about the logic in key and flags on
onKeyDown/Up
events, but apparently this is not an obvious one.@TIG: Currently, I am just trying to trap and decode a few characters: numeric and arithmetic signs, whether typed on the main keyboard or numpad. I know for TAB and always use it on key Up (in general, I prefer to trigger actions on key up, to avoid pending events).
Fredo
-
-
@fredo6 said:
It does not work, and for two good reasons:
-
EnableVCB?
is not checked continuously but only after a click -
onUserText
fires when you have type Enter, not before. To keep the same workflow, the VCB psuedo input box has to appear 'naturally when typing characters.
These "rules" should be IN the API dictioanry.
-
-
@fredo6 said:
My original question was about the logic in key and flags on
onKeyDown/Up
events, but apparently this is not an obvious one.This kind of thing was discussed years ago, in a topic that Jim posted his key inspector tool.
Jim's tool:
https://sites.google.com/site/jimfoltz/my-sketchup-plugins/key-code-tool/jf_KeyTool.rbSee:
[url=http://sketchucation.com/forums/viewtopic.php?f=180%26amp;t=34002:24695zr7]My Apple Keyboard VK_KEYS[/url:24695zr7][url=http://sketchucation.com/forums/viewtopic.php?f=180%26amp;t=37217%26amp;p=328264:24695zr7]very difficult key codes![/url:24695zr7]
[url=http://sketchucation.com/forums/viewtopic.php?f=180%26amp;t=18860:24695zr7]flags on onKeyDown?[/url:24695zr7]
[url=http://sketchucation.com/forums/viewtopic.php?f=180%26amp;t=12642:24695zr7]keycodes intelmac[/url:24695zr7]
- Jim's KeyTool.rb is also posted in this topic thread, but not sure if it is the latest version ?
[url=http://sketchucation.com/forums/viewtopic.php?f=180%26amp;t=2012:24695zr7]Key sequence in ruby[/url:24695zr7]
-
could this be adapted for SU ruby?
https://gist.github.com/acook/4190379 -
@driven said:
could this be adapted for SU ruby?
https://gist.github.com/acook/4190379Thanks. Unfortunately, I did not find a way to get anything out of $stdin. The problem is that the class Tool is based on events and therefore, the class is notified about keys, once entered, and cannot get the key.
Fredo
-
@dan rathbun said:
This kind of thing was discussed years ago, in a topic that Jim posted his key inspector tool.
Dan,
I had already browsed some of these threads. Thanks.
I think for tracking Shoft, Ctrl and arrows, it is clear.
But what I am trying to do is simplyget a natural character(like the digits [0-9)) and I really do not understand the logic.
- the key seems to be the ascii value, but only on main keyboard and for the main key (i.e. ignoring the Shift state)
- the flag value is for me totally cryptic (in addition it is very different on keydown and keyup for the same key).
I guess there must be some logic encoded Under the Hood and that's what I am trying to understand.
Fredo
-
@fredo6 said:
- the flag value is for me totally cryptic (in addition it is very different on keydown and keyup for the same key).
Oh yes it is quite clear that there are issues, and it IS a pain in the butt.
I remember vaguely someone explaining how the flag bit masks worked, and how to
|
and&
them properly.It would be nicve if the API creates a
KeyFlag
subclass of integer with methods like:
.shift? .control? .command? .alt?
... etc. -
@fredo6 said:
But what I am trying to do is simplyget a natural character(like the digits [0-9)) and I really do not understand the logic.
@fredo6 said:
My goal was to see if the keys could be transformed into characters in order to trap the 0-9, =, +, -, *, / characters.
The tool onKeyDown method returns virtual key constant value, key repeat, key flags, and view instance.
Here is the list of Virtual Key Codes on Windows: http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
key.chr
will return the character of the value.
for instance 87.chr returns 'W'You can filter the keys like this:
def onKeyDown(key, repeat, flags, view) if %w(1 2 3 4 5 6 7 8 9 0 = + - * /).include?(key.chr) # process code here else return end end
How to convert numeric decimal to hexadecimal:
87.to_s(16) # => '57'
or 0x57 which can be found in the virtual key codes list.When viewing flags you might first want to convert them to hexadecimal.
The flags don't give you anything special about the key.
Here is what they give: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx#_win32_Keystroke_Message_Flags -
Apparently
key.chr
doesn't return proper characters for all values. For that, we might want to sett up a hash of values and characters.CHARS = { # Standard keys 0x30 => '0' 0x31 => '1' 0x32 => '2' 0x33 => '3' 0x34 => '4' 0x35 => '5' 0x36 => '6' 0x37 => '7' 0x38 => '8' 0x39 => '9' 0xBD => '-' 0xBB => '+' 0x0D => '=' # use enter key for = # Numpads 0x60 => '0' 0x61 => '1' 0x62 => '2' 0x63 => '3' 0x64 => '4' 0x65 => '5' 0x66 => '6' 0x67 => '7' 0x68 => '8' 0x69 => '9' 0x6B => '+' 0x6D => '-' 0x6A => '*' 0x6F => '/' }
So the filter set up would look like this now.
def onKeyDown(key, repeat, flags, view) key_char = CHARS[key] return unless key_char # process end
This technique should work on Windows. I don't know about Macs though.
-
Anton,
Thanks very much.
I have the virtual keycodes on Mac too.The main issue is that these map physical keys, so it will be very difficult to have a reliable result for non-US keyboards for the the digits for instance, which may require a Shift (like on French keyboard).
And you are right that
flags
does not bring much info.Fredo
-
Yea, the Tool class return key codes, not character codes. And they are system dependant.
I'm not sure how you'd get the resulting character that would be produced, though should think there should be some system API for this. I'd have to search for that.
-
@Anton: Would using ToUnicode() be better than ToAscii() ?
-
@dan rathbun said:
@Anton: Would using ToUnicode() be better than ToAscii() ?
I just tested and seen no difference. I think it doesn't matter much.
-
@dan rathbun said:
@Anton: Would using ToUnicode() be better than ToAscii() ?
Indeed this appear to be the correct function to use:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646320(v=vs.85.aspx@unknownuser said:
Translates the specified virtual-key code and keyboard state to the corresponding Unicode character or characters.
Though, it probably produce a UTF-16LE string, transposing to UTF-8 would probably be best for interoperability with the rest of the SketchUp environment.
-
Nah, both of them are encoded in US-ASCII.
addingchar.force_encoding('UTF-8')
should do the tick, aint it? -
@anton_s said:
Nah, both of them are encoded in US-ASCII.
You're talking about
ToAscii
?
I was looking atToUnicode
.@anton_s said:
adding
char.force_encoding('UTF-8')
should do the tick, aint it?I'd be careful with
force_encoding
- it should only be used if you have raw binary data representing a string or if you know the string is incorrectly encoded. Otherwise one should transpose the en encoding.
foo = bar.encode("UTF-8")
-
@tt_su said:
You're talking about ToAscii?
I was looking at ToUnicode.Yes, the ToUnicode and ToAscii both return same formatted Ruby strings, but on the actual approach they don't. When I initially created a buffer
char = 0.chr*2
it was already formatted in US-ASCII. TheToUnicode
andToAscii
simply fills the the specified buffer with ascii/unicode characters without changing the format of the Ruby string.Changing
char = 0.chr*2
tochar= ' '
will initially create a UTF-8 formatted string, rather than the US-ASCII. The format remains unchanged when the ToUnicode/ToAscii functions fills thechar
string.@tt_su said:
I'd be careful with force_encoding...
For some reason
force_encoding
even managed to crash SketchUp at some points when testing key_test. -
Ya'all need to be careful where testing string encoding, until MR1 comes out.
The correct default encoding is not properly set in MR0. -
@dan rathbun said:
The correct default encoding is not properly set in MR0.
if anyones prepared to admit it...
the other issue is why these things are so difficult on a mac...
apple doesn't support key logging and goes out of it's way to prevent it occurring...
apple does allow it IF it's for assistive devices to aid those with disabilities...
if you want to use 'assistive devices api' to do ordinary tasks, you need to connivence the 'admin' user to turn it on.
mac folk are reluctant to do this as it's system wide, and would enable malicious 'key loggers' to, key-log...
john
-
Err.. found a Ruby Core bug.
Even after settingEncoding::default_internal="UTF-8"
theInteger#chr()
method does not return a string in the default internal encoding... however there is a workaround. Ruby 2.0's
Integer#chr()
method now takes an encoding argument, so, this:
char = 0.chr(Encoding::default_internal)*2
or this:
char = 0.chr("UTF-8")*2
WILL work.
Advertisement