On 05/29/2012 07:57 PM, Amos Kong wrote: > On 05/25/2012 09:14 PM, Anthony Liguori wrote: >> On 05/24/2012 10:51 PM, Eric Blake wrote: >>> On 05/24/2012 09:32 PM, Amos Kong wrote: >>>> Convert 'sendkey' to use. do_sendkey() depends on some variables >>>> in monitor.c, so reserve qmp_sendkey() to monitor.c Rename >>>> 'string' to 'keys', rename 'hold_time' to 'hold-time' >>>> >>>> Signed-off-by: Amos Kong<ak...@redhat.com> >>> >>>> +## +# @sendkey: +# +# Send keys to VM. +# +# @keys: key >>>> sequence +# @hold-time: time to delay key up events +# +# >>>> Returns: Nothing on success +# If key is unknown or >>>> redundant, QERR_INVALID_PARAMETER +# If key is invalid, >>>> QERR_INVALID_PARAMETER_VALUE +# +# Notes: Send @var{keys} to the >>>> emulator. @var{keys} could be the name of the +# key or >>>> the raw value in either decimal or hexadecimal format. Use +# >>>> @code{-} to press several keys simultaneously. +# +# Since: >>>> 0.14.0 +## +{ 'command': 'sendkey', 'data': {'keys': 'str', >>>> '*hold-time': 'int'} } >>> >>> Rather than making 'keys' a free-form string where qemu then has >>> to parse '-' to separate keys, should we instead make it a JSON >>> array? For example, >>> >>> { "execute":"sendky", "data":{ "keys":["ctrl", "alt", "del"], >>> "hold-time":200 } } >> >> Actually, we should do:
>> { 'enum': 'KeyCode', 'data': [ 'map', 'exclam', 'at', 'numbersign', >> ...] } >> >> { 'command': 'sendkey', 'data': { 'keys': [ 'KeyCode' ], >> '*hold-time': 'int' } } ^^^ It doesn't work. "KeyCodeList" could not be defined automatically. I try to add a type definition to make it works, is it ok? { 'enum': 'Keycode', 'data': [ 'shift', 'shift_r', 'alt', 'alt_r', 'altgr', 'altgr_r', ...... 'lf', 'help', 'meta_l', 'meta_r', 'compose' ] } { 'type': 'KeyCodes', 'data': { 'name', 'Keycode' } } { 'command': 'sendkey', 'data': { 'keys': ['KeyCodes'], '*hold-time': 'int' } } New problems: special character '<' could not be added to enum, other characters are fine. >> >> That also has the benefit of making it clear what symbolic names of >> the keycodes we support are. > > > Talked with Anthony in IRC, paste a summary. > > There is a definition of supported keys in monitor.c (key_defs[]), > we need to add all the items to enum. > > There is a macro in monitor.c (key_defs[]), just ignore it. > #if defined(TARGET_SPARC) && !defined(TARGET_SPARC64) > > If we use enum, we don't need to check the keycodes in qmp_sendkey(), > and key-names need to be converted to keycodes in hmp_sendkey(). > > The keycodes are not consecutive, enum values do not need to be the > keysym values, use a different table to map enum names to keysym values. > > -- Amos.