From: Gonglei <arei.gong...@huawei.com> Example QMP command of Change VNC keyboard layout:
-> { "execute": "change", "arguments": { "device": "vnc", "target": "keymap", "arg": "de" } } <- { "return": {} } Signed-off-by: Gonglei <arei.gong...@huawei.com> --- qapi-schema.json | 8 +++++--- qmp.c | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/qapi-schema.json b/qapi-schema.json index 9ffdcf8..8c02a9f 100644 --- a/qapi-schema.json +++ b/qapi-schema.json @@ -1552,13 +1552,15 @@ # # @target: If @device is a block device, then this is the new filename. # If @device is 'vnc', then if the value 'password' selects the vnc -# change password command. Otherwise, this specifies a new server URI +# change password command, if the value 'keymap'selects the vnc change +# keyboard layout command. Otherwise, this specifies a new server URI # address to listen to for VNC connections. # # @arg: If @device is a block device, then this is an optional format to open # the device with. -# If @device is 'vnc' and @target is 'password', this is the new VNC -# password to set. If this argument is an empty string, then no future +# If @device is 'vnc' and if @target is 'password', this is the new VNC +# password to set; if @target is 'keymap', this is the new VNC keyboard +# layout to set. If this argument is an empty string, then no future # logins will be allowed. # # Returns: Nothing on success. diff --git a/qmp.c b/qmp.c index 3fda973..044cd34 100644 --- a/qmp.c +++ b/qmp.c @@ -366,6 +366,13 @@ void qmp_change_vnc_password(const char *password, Error **errp) } } +static void qmp_change_vnc_kbd_layout(const char *kbd_layout, Error **errp) +{ + if (vnc_display_kbd_layout(NULL, kbd_layout) < 0) { + error_setg(errp, "keyboard layout '%s' set failed", kbd_layout); + } +} + static void qmp_change_vnc_listen(const char *target, Error **errp) { QemuOptsList *olist = qemu_find_opts("vnc"); @@ -393,6 +400,12 @@ static void qmp_change_vnc(const char *target, bool has_arg, const char *arg, } else { qmp_change_vnc_password(arg, errp); } + } else if (strcmp(target, "keymap") == 0) { + if (!has_arg) { + error_set(errp, QERR_MISSING_PARAMETER, "keymap"); + } else { + qmp_change_vnc_kbd_layout(arg, errp); + } } else { qmp_change_vnc_listen(target, errp); } @@ -402,6 +415,10 @@ void qmp_change_vnc_password(const char *password, Error **errp) { error_set(errp, QERR_FEATURE_DISABLED, "vnc"); } +static void qmp_change_vnc_kbd_layout(const char *kbd_layout, Error **errp) +{ + error_set(errp, QERR_FEATURE_DISABLED, "vnc"); +} static void qmp_change_vnc(const char *target, bool has_arg, const char *arg, Error **errp) { -- 1.7.12.4