qemu/qapi/ui.json
John Snow 9f2b848857 qapi: fix non-compliant JSON examples
The new QMP documentation generator wants to parse all examples as
"QMP". We have an existing QMP lexer in docs/sphinx/qmp_lexer.py (Seen
in-use here: https://qemu-project.gitlab.io/qemu/interop/bitmaps.html)
that allows the use of "->", "<-" and "..." tokens to denote QMP
protocol flow with elisions, but otherwise defers to the JSON lexer.

To utilize this lexer for the existing QAPI documentation, we need them
to conform to a standard so that they lex and render correctly. Once the
QMP lexer is active for examples, errant QMP/JSON will produce warning
messages and fail the build.

Fix any invalid JSON found in QAPI documentation (identified by
attempting to lex all examples as QMP; see subsequent
commits). Additionally, elisions must be standardized for the QMP lexer;
they must be represented as the value "...", so three examples have been
adjusted to support that format here.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240626222128.406106-9-jsnow@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
2024-07-06 08:58:24 +02:00

1718 lines
42 KiB
Python

# -*- Mode: Python -*-
# vim: filetype=python
#
##
# = Remote desktop
##
{ 'include': 'common.json' }
{ 'include': 'sockets.json' }
##
# @DisplayProtocol:
#
# Display protocols which support changing password options.
#
# Since: 7.0
##
{ 'enum': 'DisplayProtocol',
'data': [ 'vnc', 'spice' ] }
##
# @SetPasswordAction:
#
# An action to take on changing a password on a connection with active
# clients.
#
# @keep: maintain existing clients
#
# @fail: fail the command if clients are connected
#
# @disconnect: disconnect existing clients
#
# Since: 7.0
##
{ 'enum': 'SetPasswordAction',
'data': [ 'keep', 'fail', 'disconnect' ] }
##
# @SetPasswordOptions:
#
# Options for set_password.
#
# @protocol:
# - 'vnc' to modify the VNC server password
# - 'spice' to modify the Spice server password
#
# @password: the new password
#
# @connected: How to handle existing clients when changing the
# password. If nothing is specified, defaults to 'keep'. For VNC,
# only 'keep' is currently implemented.
#
# Since: 7.0
##
{ 'union': 'SetPasswordOptions',
'base': { 'protocol': 'DisplayProtocol',
'password': 'str',
'*connected': 'SetPasswordAction' },
'discriminator': 'protocol',
'data': { 'vnc': 'SetPasswordOptionsVnc' } }
##
# @SetPasswordOptionsVnc:
#
# Options for set_password specific to the VNC protocol.
#
# @display: The id of the display where the password should be
# changed. Defaults to the first.
#
# Since: 7.0
##
{ 'struct': 'SetPasswordOptionsVnc',
'data': { '*display': 'str' } }
##
# @set_password:
#
# Set the password of a remote display server.
#
# Errors:
# - If Spice is not enabled, DeviceNotFound
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "set_password", "arguments": { "protocol": "vnc",
# "password": "secret" } }
# <- { "return": {} }
##
{ 'command': 'set_password', 'boxed': true, 'data': 'SetPasswordOptions' }
##
# @ExpirePasswordOptions:
#
# General options for expire_password.
#
# @protocol:
# - 'vnc' to modify the VNC server expiration
# - 'spice' to modify the Spice server expiration
#
# @time: when to expire the password.
#
# - 'now' to expire the password immediately
# - 'never' to cancel password expiration
# - '+INT' where INT is the number of seconds from now (integer)
# - 'INT' where INT is the absolute time in seconds
#
# Notes: Time is relative to the server and currently there is no way
# to coordinate server time with client time. It is not
# recommended to use the absolute time version of the @time
# parameter unless you're sure you are on the same machine as the
# QEMU instance.
#
# Since: 7.0
##
{ 'union': 'ExpirePasswordOptions',
'base': { 'protocol': 'DisplayProtocol',
'time': 'str' },
'discriminator': 'protocol',
'data': { 'vnc': 'ExpirePasswordOptionsVnc' } }
##
# @ExpirePasswordOptionsVnc:
#
# Options for expire_password specific to the VNC protocol.
#
# @display: The id of the display where the expiration should be
# changed. Defaults to the first.
#
# Since: 7.0
##
{ 'struct': 'ExpirePasswordOptionsVnc',
'data': { '*display': 'str' } }
##
# @expire_password:
#
# Expire the password of a remote display server.
#
# Errors:
# - If @protocol is 'spice' and Spice is not active,
# DeviceNotFound
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "expire_password", "arguments": { "protocol": "vnc",
# "time": "+60" } }
# <- { "return": {} }
##
{ 'command': 'expire_password', 'boxed': true, 'data': 'ExpirePasswordOptions' }
##
# @ImageFormat:
#
# Supported image format types.
#
# @png: PNG format
#
# @ppm: PPM format
#
# Since: 7.1
##
{ 'enum': 'ImageFormat',
'data': ['ppm', 'png'] }
##
# @screendump:
#
# Capture the contents of a screen and write it to a file.
#
# @filename: the path of a new file to store the image
#
# @device: ID of the display device that should be dumped. If this
# parameter is missing, the primary display will be used. (Since
# 2.12)
#
# @head: head to use in case the device supports multiple heads. If
# this parameter is missing, head #0 will be used. Also note that
# the head can only be specified in conjunction with the device
# ID. (Since 2.12)
#
# @format: image format for screendump. (default: ppm) (Since 7.1)
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "screendump",
# "arguments": { "filename": "/tmp/image" } }
# <- { "return": {} }
##
{ 'command': 'screendump',
'data': {'filename': 'str', '*device': 'str', '*head': 'int',
'*format': 'ImageFormat'},
'coroutine': true,
'if': 'CONFIG_PIXMAN' }
##
# == Spice
##
##
# @SpiceBasicInfo:
#
# The basic information for SPICE network connection
#
# @host: IP address
#
# @port: port number
#
# @family: address family
#
# Since: 2.1
##
{ 'struct': 'SpiceBasicInfo',
'data': { 'host': 'str',
'port': 'str',
'family': 'NetworkAddressFamily' },
'if': 'CONFIG_SPICE' }
##
# @SpiceServerInfo:
#
# Information about a SPICE server
#
# @auth: authentication method
#
# Since: 2.1
##
{ 'struct': 'SpiceServerInfo',
'base': 'SpiceBasicInfo',
'data': { '*auth': 'str' },
'if': 'CONFIG_SPICE' }
##
# @SpiceChannel:
#
# Information about a SPICE client channel.
#
# @connection-id: SPICE connection id number. All channels with the
# same id belong to the same SPICE session.
#
# @channel-type: SPICE channel type number. "1" is the main control
# channel, filter for this one if you want to track spice sessions
# only
#
# @channel-id: SPICE channel ID number. Usually "0", might be
# different when multiple channels of the same type exist, such as
# multiple display channels in a multihead setup
#
# @tls: true if the channel is encrypted, false otherwise.
#
# Since: 0.14
##
{ 'struct': 'SpiceChannel',
'base': 'SpiceBasicInfo',
'data': {'connection-id': 'int', 'channel-type': 'int', 'channel-id': 'int',
'tls': 'bool'},
'if': 'CONFIG_SPICE' }
##
# @SpiceQueryMouseMode:
#
# An enumeration of Spice mouse states.
#
# @client: Mouse cursor position is determined by the client.
#
# @server: Mouse cursor position is determined by the server.
#
# @unknown: No information is available about mouse mode used by the
# spice server.
#
# Note: spice/enums.h has a SpiceMouseMode already, hence the name.
#
# Since: 1.1
##
{ 'enum': 'SpiceQueryMouseMode',
'data': [ 'client', 'server', 'unknown' ],
'if': 'CONFIG_SPICE' }
##
# @SpiceInfo:
#
# Information about the SPICE session.
#
# @enabled: true if the SPICE server is enabled, false otherwise
#
# @migrated: true if the last guest migration completed and spice
# migration had completed as well, false otherwise (since 1.4)
#
# @host: The hostname the SPICE server is bound to. This depends on
# the name resolution on the host and may be an IP address.
#
# @port: The SPICE server's port number.
#
# @compiled-version: SPICE server version.
#
# @tls-port: The SPICE server's TLS port number.
#
# @auth: the current authentication type used by the server
#
# - 'none' if no authentication is being used
# - 'spice' uses SASL or direct TLS authentication, depending on
# command line options
#
# @mouse-mode: The mode in which the mouse cursor is displayed
# currently. Can be determined by the client or the server, or
# unknown if spice server doesn't provide this information.
# (since: 1.1)
#
# @channels: a list of @SpiceChannel for each active spice channel
#
# Since: 0.14
##
{ 'struct': 'SpiceInfo',
'data': {'enabled': 'bool', 'migrated': 'bool', '*host': 'str', '*port': 'int',
'*tls-port': 'int', '*auth': 'str', '*compiled-version': 'str',
'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel']},
'if': 'CONFIG_SPICE' }
##
# @query-spice:
#
# Returns information about the current SPICE server
#
# Returns: @SpiceInfo
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "query-spice" }
# <- { "return": {
# "enabled": true,
# "auth": "spice",
# "port": 5920,
# "migrated":false,
# "tls-port": 5921,
# "host": "0.0.0.0",
# "mouse-mode":"client",
# "channels": [
# {
# "port": "54924",
# "family": "ipv4",
# "channel-type": 1,
# "connection-id": 1804289383,
# "host": "127.0.0.1",
# "channel-id": 0,
# "tls": true
# },
# {
# "port": "36710",
# "family": "ipv4",
# "channel-type": 4,
# "connection-id": 1804289383,
# "host": "127.0.0.1",
# "channel-id": 0,
# "tls": false
# },
# ...
# ]
# }
# }
##
{ 'command': 'query-spice', 'returns': 'SpiceInfo',
'if': 'CONFIG_SPICE' }
##
# @SPICE_CONNECTED:
#
# Emitted when a SPICE client establishes a connection
#
# @server: server information
#
# @client: client information
#
# Since: 0.14
#
# Example:
#
# <- { "timestamp": {"seconds": 1290688046, "microseconds": 388707},
# "event": "SPICE_CONNECTED",
# "data": {
# "server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"},
# "client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"}
# }}
##
{ 'event': 'SPICE_CONNECTED',
'data': { 'server': 'SpiceBasicInfo',
'client': 'SpiceBasicInfo' },
'if': 'CONFIG_SPICE' }
##
# @SPICE_INITIALIZED:
#
# Emitted after initial handshake and authentication takes place (if
# any) and the SPICE channel is up and running
#
# @server: server information
#
# @client: client information
#
# Since: 0.14
#
# Example:
#
# <- { "timestamp": {"seconds": 1290688046, "microseconds": 417172},
# "event": "SPICE_INITIALIZED",
# "data": {"server": {"auth": "spice", "port": "5921",
# "family": "ipv4", "host": "127.0.0.1"},
# "client": {"port": "49004", "family": "ipv4", "channel-type": 3,
# "connection-id": 1804289383, "host": "127.0.0.1",
# "channel-id": 0, "tls": true}
# }}
##
{ 'event': 'SPICE_INITIALIZED',
'data': { 'server': 'SpiceServerInfo',
'client': 'SpiceChannel' },
'if': 'CONFIG_SPICE' }
##
# @SPICE_DISCONNECTED:
#
# Emitted when the SPICE connection is closed
#
# @server: server information
#
# @client: client information
#
# Since: 0.14
#
# Example:
#
# <- { "timestamp": {"seconds": 1290688046, "microseconds": 388707},
# "event": "SPICE_DISCONNECTED",
# "data": {
# "server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"},
# "client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"}
# }}
##
{ 'event': 'SPICE_DISCONNECTED',
'data': { 'server': 'SpiceBasicInfo',
'client': 'SpiceBasicInfo' },
'if': 'CONFIG_SPICE' }
##
# @SPICE_MIGRATE_COMPLETED:
#
# Emitted when SPICE migration has completed
#
# Since: 1.3
#
# Example:
#
# <- { "timestamp": {"seconds": 1290688046, "microseconds": 417172},
# "event": "SPICE_MIGRATE_COMPLETED" }
##
{ 'event': 'SPICE_MIGRATE_COMPLETED',
'if': 'CONFIG_SPICE' }
##
# == VNC
##
##
# @VncBasicInfo:
#
# The basic information for vnc network connection
#
# @host: IP address
#
# @service: The service name of the vnc port. This may depend on the
# host system's service database so symbolic names should not be
# relied on.
#
# @family: address family
#
# @websocket: true in case the socket is a websocket (since 2.3).
#
# Since: 2.1
##
{ 'struct': 'VncBasicInfo',
'data': { 'host': 'str',
'service': 'str',
'family': 'NetworkAddressFamily',
'websocket': 'bool' },
'if': 'CONFIG_VNC' }
##
# @VncServerInfo:
#
# The network connection information for server
#
# @auth: authentication method used for the plain (non-websocket) VNC
# server
#
# Since: 2.1
##
{ 'struct': 'VncServerInfo',
'base': 'VncBasicInfo',
'data': { '*auth': 'str' },
'if': 'CONFIG_VNC' }
##
# @VncClientInfo:
#
# Information about a connected VNC client.
#
# @x509_dname: If x509 authentication is in use, the Distinguished
# Name of the client.
#
# @sasl_username: If SASL authentication is in use, the SASL username
# used for authentication.
#
# Since: 0.14
##
{ 'struct': 'VncClientInfo',
'base': 'VncBasicInfo',
'data': { '*x509_dname': 'str', '*sasl_username': 'str' },
'if': 'CONFIG_VNC' }
##
# @VncInfo:
#
# Information about the VNC session.
#
# @enabled: true if the VNC server is enabled, false otherwise
#
# @host: The hostname the VNC server is bound to. This depends on the
# name resolution on the host and may be an IP address.
#
# @family:
# - 'ipv6' if the host is listening for IPv6 connections
# - 'ipv4' if the host is listening for IPv4 connections
# - 'unix' if the host is listening on a unix domain socket
# - 'unknown' otherwise
#
# @service: The service name of the server's port. This may depends
# on the host system's service database so symbolic names should
# not be relied on.
#
# @auth: the current authentication type used by the server
#
# - 'none' if no authentication is being used
# - 'vnc' if VNC authentication is being used
# - 'vencrypt+plain' if VEncrypt is used with plain text
# authentication
# - 'vencrypt+tls+none' if VEncrypt is used with TLS and no
# authentication
# - 'vencrypt+tls+vnc' if VEncrypt is used with TLS and VNC
# authentication
# - 'vencrypt+tls+plain' if VEncrypt is used with TLS and plain
# text auth
# - 'vencrypt+x509+none' if VEncrypt is used with x509 and no auth
# - 'vencrypt+x509+vnc' if VEncrypt is used with x509 and VNC auth
# - 'vencrypt+x509+plain' if VEncrypt is used with x509 and plain
# text auth
# - 'vencrypt+tls+sasl' if VEncrypt is used with TLS and SASL auth
# - 'vencrypt+x509+sasl' if VEncrypt is used with x509 and SASL
# auth
#
# @clients: a list of @VncClientInfo of all currently connected
# clients
#
# Since: 0.14
##
{ 'struct': 'VncInfo',
'data': {'enabled': 'bool', '*host': 'str',
'*family': 'NetworkAddressFamily',
'*service': 'str', '*auth': 'str', '*clients': ['VncClientInfo']},
'if': 'CONFIG_VNC' }
##
# @VncPrimaryAuth:
#
# vnc primary authentication method.
#
# Since: 2.3
##
{ 'enum': 'VncPrimaryAuth',
'data': [ 'none', 'vnc', 'ra2', 'ra2ne', 'tight', 'ultra',
'tls', 'vencrypt', 'sasl' ],
'if': 'CONFIG_VNC' }
##
# @VncVencryptSubAuth:
#
# vnc sub authentication method with vencrypt.
#
# Since: 2.3
##
{ 'enum': 'VncVencryptSubAuth',
'data': [ 'plain',
'tls-none', 'x509-none',
'tls-vnc', 'x509-vnc',
'tls-plain', 'x509-plain',
'tls-sasl', 'x509-sasl' ],
'if': 'CONFIG_VNC' }
##
# @VncServerInfo2:
#
# The network connection information for server
#
# @auth: The current authentication type used by the servers
#
# @vencrypt: The vencrypt sub authentication type used by the servers,
# only specified in case auth == vencrypt.
#
# Since: 2.9
##
{ 'struct': 'VncServerInfo2',
'base': 'VncBasicInfo',
'data': { 'auth' : 'VncPrimaryAuth',
'*vencrypt' : 'VncVencryptSubAuth' },
'if': 'CONFIG_VNC' }
##
# @VncInfo2:
#
# Information about a vnc server
#
# @id: vnc server name.
#
# @server: A list of @VncBasincInfo describing all listening sockets.
# The list can be empty (in case the vnc server is disabled). It
# also may have multiple entries: normal + websocket, possibly
# also ipv4 + ipv6 in the future.
#
# @clients: A list of @VncClientInfo of all currently connected
# clients. The list can be empty, for obvious reasons.
#
# @auth: The current authentication type used by the non-websockets
# servers
#
# @vencrypt: The vencrypt authentication type used by the servers,
# only specified in case auth == vencrypt.
#
# @display: The display device the vnc server is linked to.
#
# Since: 2.3
##
{ 'struct': 'VncInfo2',
'data': { 'id' : 'str',
'server' : ['VncServerInfo2'],
'clients' : ['VncClientInfo'],
'auth' : 'VncPrimaryAuth',
'*vencrypt' : 'VncVencryptSubAuth',
'*display' : 'str' },
'if': 'CONFIG_VNC' }
##
# @query-vnc:
#
# Returns information about the current VNC server
#
# Returns: @VncInfo
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "query-vnc" }
# <- { "return": {
# "enabled":true,
# "host":"0.0.0.0",
# "service":"50402",
# "auth":"vnc",
# "family":"ipv4",
# "clients":[
# {
# "host":"127.0.0.1",
# "service":"50401",
# "family":"ipv4",
# "websocket":false
# }
# ]
# }
# }
##
{ 'command': 'query-vnc', 'returns': 'VncInfo',
'if': 'CONFIG_VNC' }
##
# @query-vnc-servers:
#
# Returns a list of vnc servers. The list can be empty.
#
# Returns: a list of @VncInfo2
#
# Since: 2.3
##
{ 'command': 'query-vnc-servers', 'returns': ['VncInfo2'],
'if': 'CONFIG_VNC' }
##
# @change-vnc-password:
#
# Change the VNC server password.
#
# @password: the new password to use with VNC authentication
#
# Since: 1.1
#
# Notes: An empty password in this command will set the password to
# the empty string. Existing clients are unaffected by executing
# this command.
##
{ 'command': 'change-vnc-password',
'data': { 'password': 'str' },
'if': 'CONFIG_VNC' }
##
# @VNC_CONNECTED:
#
# Emitted when a VNC client establishes a connection
#
# @server: server information
#
# @client: client information
#
# Note: This event is emitted before any authentication takes place,
# thus the authentication ID is not provided
#
# Since: 0.13
#
# Example:
#
# <- { "event": "VNC_CONNECTED",
# "data": {
# "server": { "auth": "sasl", "family": "ipv4", "websocket": false,
# "service": "5901", "host": "0.0.0.0" },
# "client": { "family": "ipv4", "service": "58425",
# "host": "127.0.0.1", "websocket": false } },
# "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
##
{ 'event': 'VNC_CONNECTED',
'data': { 'server': 'VncServerInfo',
'client': 'VncBasicInfo' },
'if': 'CONFIG_VNC' }
##
# @VNC_INITIALIZED:
#
# Emitted after authentication takes place (if any) and the VNC
# session is made active
#
# @server: server information
#
# @client: client information
#
# Since: 0.13
#
# Example:
#
# <- { "event": "VNC_INITIALIZED",
# "data": {
# "server": { "auth": "sasl", "family": "ipv4", "websocket": false,
# "service": "5901", "host": "0.0.0.0"},
# "client": { "family": "ipv4", "service": "46089", "websocket": false,
# "host": "127.0.0.1", "sasl_username": "luiz" } },
# "timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
##
{ 'event': 'VNC_INITIALIZED',
'data': { 'server': 'VncServerInfo',
'client': 'VncClientInfo' },
'if': 'CONFIG_VNC' }
##
# @VNC_DISCONNECTED:
#
# Emitted when the connection is closed
#
# @server: server information
#
# @client: client information
#
# Since: 0.13
#
# Example:
#
# <- { "event": "VNC_DISCONNECTED",
# "data": {
# "server": { "auth": "sasl", "family": "ipv4", "websocket": false,
# "service": "5901", "host": "0.0.0.0" },
# "client": { "family": "ipv4", "service": "58425", "websocket": false,
# "host": "127.0.0.1", "sasl_username": "luiz" } },
# "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
##
{ 'event': 'VNC_DISCONNECTED',
'data': { 'server': 'VncServerInfo',
'client': 'VncClientInfo' },
'if': 'CONFIG_VNC' }
##
# = Input
##
##
# @MouseInfo:
#
# Information about a mouse device.
#
# @name: the name of the mouse device
#
# @index: the index of the mouse device
#
# @current: true if this device is currently receiving mouse events
#
# @absolute: true if this device supports absolute coordinates as
# input
#
# Since: 0.14
##
{ 'struct': 'MouseInfo',
'data': {'name': 'str', 'index': 'int', 'current': 'bool',
'absolute': 'bool'} }
##
# @query-mice:
#
# Returns information about each active mouse device
#
# Returns: a list of @MouseInfo for each device
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "query-mice" }
# <- { "return": [
# {
# "name":"QEMU Microsoft Mouse",
# "index":0,
# "current":false,
# "absolute":false
# },
# {
# "name":"QEMU PS/2 Mouse",
# "index":1,
# "current":true,
# "absolute":true
# }
# ]
# }
##
{ 'command': 'query-mice', 'returns': ['MouseInfo'] }
##
# @QKeyCode:
#
# An enumeration of key name.
#
# This is used by the @send-key command.
#
# @unmapped: since 2.0
#
# @pause: since 2.0
#
# @ro: since 2.4
#
# @kp_comma: since 2.4
#
# @kp_equals: since 2.6
#
# @power: since 2.6
#
# @hiragana: since 2.9
#
# @henkan: since 2.9
#
# @yen: since 2.9
#
# @sleep: since 2.10
#
# @wake: since 2.10
#
# @audionext: since 2.10
#
# @audioprev: since 2.10
#
# @audiostop: since 2.10
#
# @audioplay: since 2.10
#
# @audiomute: since 2.10
#
# @volumeup: since 2.10
#
# @volumedown: since 2.10
#
# @mediaselect: since 2.10
#
# @mail: since 2.10
#
# @calculator: since 2.10
#
# @computer: since 2.10
#
# @ac_home: since 2.10
#
# @ac_back: since 2.10
#
# @ac_forward: since 2.10
#
# @ac_refresh: since 2.10
#
# @ac_bookmarks: since 2.10
#
# @muhenkan: since 2.12
#
# @katakanahiragana: since 2.12
#
# @lang1: since 6.1
#
# @lang2: since 6.1
#
# @f13: since 8.0
#
# @f14: since 8.0
#
# @f15: since 8.0
#
# @f16: since 8.0
#
# @f17: since 8.0
#
# @f18: since 8.0
#
# @f19: since 8.0
#
# @f20: since 8.0
#
# @f21: since 8.0
#
# @f22: since 8.0
#
# @f23: since 8.0
#
# @f24: since 8.0
#
# 'sysrq' was mistakenly added to hack around the fact that the ps2
# driver was not generating correct scancodes sequences when
# 'alt+print' was pressed. This flaw is now fixed and the 'sysrq' key
# serves no further purpose. Any further use of 'sysrq' will be
# transparently changed to 'print', so they are effectively synonyms.
#
# Since: 1.3
##
{ 'enum': 'QKeyCode',
'data': [ 'unmapped',
'shift', 'shift_r', 'alt', 'alt_r', 'ctrl',
'ctrl_r', 'menu', 'esc', '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', 'minus', 'equal', 'backspace', 'tab', 'q', 'w', 'e',
'r', 't', 'y', 'u', 'i', 'o', 'p', 'bracket_left', 'bracket_right',
'ret', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'semicolon',
'apostrophe', 'grave_accent', 'backslash', 'z', 'x', 'c', 'v', 'b',
'n', 'm', 'comma', 'dot', 'slash', 'asterisk', 'spc', 'caps_lock',
'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10',
'num_lock', 'scroll_lock', 'kp_divide', 'kp_multiply',
'kp_subtract', 'kp_add', 'kp_enter', 'kp_decimal', 'sysrq', 'kp_0',
'kp_1', 'kp_2', 'kp_3', 'kp_4', 'kp_5', 'kp_6', 'kp_7', 'kp_8',
'kp_9', 'less', 'f11', 'f12', 'print', 'home', 'pgup', 'pgdn', 'end',
'left', 'up', 'down', 'right', 'insert', 'delete', 'stop', 'again',
'props', 'undo', 'front', 'copy', 'open', 'paste', 'find', 'cut',
'lf', 'help', 'meta_l', 'meta_r', 'compose', 'pause',
'ro', 'hiragana', 'henkan', 'yen', 'muhenkan', 'katakanahiragana',
'kp_comma', 'kp_equals', 'power', 'sleep', 'wake',
'audionext', 'audioprev', 'audiostop', 'audioplay', 'audiomute',
'volumeup', 'volumedown', 'mediaselect',
'mail', 'calculator', 'computer',
'ac_home', 'ac_back', 'ac_forward', 'ac_refresh', 'ac_bookmarks',
'lang1', 'lang2','f13','f14','f15','f16','f17','f18','f19','f20','f21','f22','f23','f24' ] }
##
# @KeyValueKind:
#
# Since: 1.3
##
{ 'enum': 'KeyValueKind',
'data': [ 'number', 'qcode' ] }
##
# @IntWrapper:
#
# @data: a numeric key code
#
# Since: 1.3
##
{ 'struct': 'IntWrapper',
'data': { 'data': 'int' } }
##
# @QKeyCodeWrapper:
#
# @data: An enumeration of key name
#
# Since: 1.3
##
{ 'struct': 'QKeyCodeWrapper',
'data': { 'data': 'QKeyCode' } }
##
# @KeyValue:
#
# Represents a keyboard key.
#
# @type: key encoding
#
# Since: 1.3
##
{ 'union': 'KeyValue',
'base': { 'type': 'KeyValueKind' },
'discriminator': 'type',
'data': {
'number': 'IntWrapper',
'qcode': 'QKeyCodeWrapper' } }
##
# @send-key:
#
# Send keys to guest.
#
# @keys: An array of @KeyValue elements. All @KeyValues in this array
# are simultaneously sent to the guest. A @KeyValue.number value
# is sent directly to the guest, while @KeyValue.qcode must be a
# valid @QKeyCode value
#
# @hold-time: time to delay key up events, milliseconds. Defaults to
# 100
#
# Errors:
# - If key is unknown or redundant, GenericError
#
# Since: 1.3
#
# Example:
#
# -> { "execute": "send-key",
# "arguments": { "keys": [ { "type": "qcode", "data": "ctrl" },
# { "type": "qcode", "data": "alt" },
# { "type": "qcode", "data": "delete" } ] } }
# <- { "return": {} }
##
{ 'command': 'send-key',
'data': { 'keys': ['KeyValue'], '*hold-time': 'int' } }
##
# @InputButton:
#
# Button of a pointer input device (mouse, tablet).
#
# @side: front side button of a 5-button mouse (since 2.9)
#
# @extra: rear side button of a 5-button mouse (since 2.9)
#
# @touch: screen contact on a multi-touch device (since 8.1)
#
# Since: 2.0
##
{ 'enum' : 'InputButton',
'data' : [ 'left', 'middle', 'right', 'wheel-up', 'wheel-down', 'side',
'extra', 'wheel-left', 'wheel-right', 'touch' ] }
##
# @InputAxis:
#
# Position axis of a pointer input device (mouse, tablet).
#
# Since: 2.0
##
{ 'enum' : 'InputAxis',
'data' : [ 'x', 'y' ] }
##
# @InputMultiTouchType:
#
# Type of a multi-touch event.
#
# @begin: A new touch event sequence has just started.
#
# @update: A touch event sequence has been updated.
#
# @end: A touch event sequence has finished.
#
# @cancel: A touch event sequence has been canceled.
#
# @data: Absolute position data.
#
# Since: 8.1
##
{ 'enum' : 'InputMultiTouchType',
'data' : [ 'begin', 'update', 'end', 'cancel', 'data' ] }
##
# @InputKeyEvent:
#
# Keyboard input event.
#
# @key: Which key this event is for.
#
# @down: True for key-down and false for key-up events.
#
# Since: 2.0
##
{ 'struct' : 'InputKeyEvent',
'data' : { 'key' : 'KeyValue',
'down' : 'bool' } }
##
# @InputBtnEvent:
#
# Pointer button input event.
#
# @button: Which button this event is for.
#
# @down: True for key-down and false for key-up events.
#
# Since: 2.0
##
{ 'struct' : 'InputBtnEvent',
'data' : { 'button' : 'InputButton',
'down' : 'bool' } }
##
# @InputMoveEvent:
#
# Pointer motion input event.
#
# @axis: Which axis is referenced by @value.
#
# @value: Pointer position. For absolute coordinates the valid range
# is 0 -> 0x7ffff
#
# Since: 2.0
##
{ 'struct' : 'InputMoveEvent',
'data' : { 'axis' : 'InputAxis',
'value' : 'int' } }
##
# @InputMultiTouchEvent:
#
# MultiTouch input event.
#
# @type: The type of multi-touch event.
#
# @slot: Which slot has generated the event.
#
# @tracking-id: ID to correlate this event with previously generated
# events.
#
# @axis: Which axis is referenced by @value.
#
# @value: Contact position.
#
# Since: 8.1
##
{ 'struct' : 'InputMultiTouchEvent',
'data' : { 'type' : 'InputMultiTouchType',
'slot' : 'int',
'tracking-id': 'int',
'axis' : 'InputAxis',
'value' : 'int' } }
##
# @InputEventKind:
#
# @key: a keyboard input event
#
# @btn: a pointer button input event
#
# @rel: a relative pointer motion input event
#
# @abs: an absolute pointer motion input event
#
# @mtt: a multi-touch input event
#
# Since: 2.0
##
{ 'enum': 'InputEventKind',
'data': [ 'key', 'btn', 'rel', 'abs', 'mtt' ] }
##
# @InputKeyEventWrapper:
#
# @data: Keyboard input event
#
# Since: 2.0
##
{ 'struct': 'InputKeyEventWrapper',
'data': { 'data': 'InputKeyEvent' } }
##
# @InputBtnEventWrapper:
#
# @data: Pointer button input event
#
# Since: 2.0
##
{ 'struct': 'InputBtnEventWrapper',
'data': { 'data': 'InputBtnEvent' } }
##
# @InputMoveEventWrapper:
#
# @data: Pointer motion input event
#
# Since: 2.0
##
{ 'struct': 'InputMoveEventWrapper',
'data': { 'data': 'InputMoveEvent' } }
##
# @InputMultiTouchEventWrapper:
#
# @data: MultiTouch input event
#
# Since: 8.1
##
{ 'struct': 'InputMultiTouchEventWrapper',
'data': { 'data': 'InputMultiTouchEvent' } }
##
# @InputEvent:
#
# Input event union.
#
# @type: the type of input event
#
# Since: 2.0
##
{ 'union' : 'InputEvent',
'base': { 'type': 'InputEventKind' },
'discriminator': 'type',
'data' : { 'key' : 'InputKeyEventWrapper',
'btn' : 'InputBtnEventWrapper',
'rel' : 'InputMoveEventWrapper',
'abs' : 'InputMoveEventWrapper',
'mtt' : 'InputMultiTouchEventWrapper' } }
##
# @input-send-event:
#
# Send input event(s) to guest.
#
# The @device and @head parameters can be used to send the input event
# to specific input devices in case (a) multiple input devices of the
# same kind are added to the virtual machine and (b) you have
# configured input routing (see docs/multiseat.txt) for those input
# devices. The parameters work exactly like the device and head
# properties of input devices. If @device is missing, only devices
# that have no input routing config are admissible. If @device is
# specified, both input devices with and without input routing config
# are admissible, but devices with input routing config take
# precedence.
#
# @device: display device to send event(s) to.
#
# @head: head to send event(s) to, in case the display device supports
# multiple scanouts.
#
# @events: List of InputEvent union.
#
# Since: 2.6
#
# Note: The consoles are visible in the qom tree, under
# /backend/console[$index]. They have a device link and head
# property, so it is possible to map which console belongs to
# which device and display.
#
# Examples:
#
# 1. Press left mouse button.
#
# -> { "execute": "input-send-event",
# "arguments": { "device": "video0",
# "events": [ { "type": "btn",
# "data" : { "down": true, "button": "left" } } ] } }
# <- { "return": {} }
#
# -> { "execute": "input-send-event",
# "arguments": { "device": "video0",
# "events": [ { "type": "btn",
# "data" : { "down": false, "button": "left" } } ] } }
# <- { "return": {} }
#
# 2. Press ctrl-alt-del.
#
# -> { "execute": "input-send-event",
# "arguments": { "events": [
# { "type": "key", "data" : { "down": true,
# "key": {"type": "qcode", "data": "ctrl" } } },
# { "type": "key", "data" : { "down": true,
# "key": {"type": "qcode", "data": "alt" } } },
# { "type": "key", "data" : { "down": true,
# "key": {"type": "qcode", "data": "delete" } } } ] } }
# <- { "return": {} }
#
# 3. Move mouse pointer to absolute coordinates (20000, 400).
#
# -> { "execute": "input-send-event" ,
# "arguments": { "events": [
# { "type": "abs", "data" : { "axis": "x", "value" : 20000 } },
# { "type": "abs", "data" : { "axis": "y", "value" : 400 } } ] } }
# <- { "return": {} }
##
{ 'command': 'input-send-event',
'data': { '*device': 'str',
'*head' : 'int',
'events' : [ 'InputEvent' ] } }
##
# @DisplayGTK:
#
# GTK display options.
#
# @grab-on-hover: Grab keyboard input on mouse hover.
#
# @zoom-to-fit: Zoom guest display to fit into the host window. When
# turned off the host window will be resized instead. In case the
# display device can notify the guest on window resizes
# (virtio-gpu) this will default to "on", assuming the guest will
# resize the display to match the window size then. Otherwise it
# defaults to "off". (Since 3.1)
#
# @show-tabs: Display the tab bar for switching between the various
# graphical interfaces (e.g. VGA and virtual console character
# devices) by default. (Since 7.1)
#
# @show-menubar: Display the main window menubar. Defaults to "on".
# (Since 8.0)
#
# Since: 2.12
##
{ 'struct' : 'DisplayGTK',
'data' : { '*grab-on-hover' : 'bool',
'*zoom-to-fit' : 'bool',
'*show-tabs' : 'bool',
'*show-menubar' : 'bool' } }
##
# @DisplayEGLHeadless:
#
# EGL headless display options.
#
# @rendernode: Which DRM render node should be used. Default is the
# first available node on the host.
#
# Since: 3.1
##
{ 'struct' : 'DisplayEGLHeadless',
'data' : { '*rendernode' : 'str' } }
##
# @DisplayDBus:
#
# DBus display options.
#
# @addr: The D-Bus bus address (default to the session bus).
#
# @rendernode: Which DRM render node should be used. Default is the
# first available node on the host.
#
# @p2p: Whether to use peer-to-peer connections (accepted through
# @add_client).
#
# @audiodev: Use the specified DBus audiodev to export audio.
#
# Since: 7.0
##
{ 'struct' : 'DisplayDBus',
'data' : { '*rendernode' : 'str',
'*addr': 'str',
'*p2p': 'bool',
'*audiodev': 'str' } }
##
# @DisplayGLMode:
#
# Display OpenGL mode.
#
# @off: Disable OpenGL (default).
#
# @on: Use OpenGL, pick context type automatically. Would better be
# named 'auto' but is called 'on' for backward compatibility with
# bool type.
#
# @core: Use OpenGL with Core (desktop) Context.
#
# @es: Use OpenGL with ES (embedded systems) Context.
#
# Since: 3.0
##
{ 'enum' : 'DisplayGLMode',
'data' : [ 'off', 'on', 'core', 'es' ] }
##
# @DisplayCurses:
#
# Curses display options.
#
# @charset: Font charset used by guest (default: CP437).
#
# Since: 4.0
##
{ 'struct' : 'DisplayCurses',
'data' : { '*charset' : 'str' } }
##
# @DisplayCocoa:
#
# Cocoa display options.
#
# @left-command-key: Enable/disable forwarding of left command key to
# guest. Allows command-tab window switching on the host without
# sending this key to the guest when "off". Defaults to "on"
#
# @full-grab: Capture all key presses, including system combos. This
# requires accessibility permissions, since it performs a global
# grab on key events. (default: off) See
# https://support.apple.com/en-in/guide/mac-help/mh32356/mac
#
# @swap-opt-cmd: Swap the Option and Command keys so that their key
# codes match their position on non-Mac keyboards and you can use
# Meta/Super and Alt where you expect them. (default: off)
#
# @zoom-to-fit: Zoom guest display to fit into the host window. When
# turned off the host window will be resized instead. Defaults to
# "off". (Since 8.2)
#
# @zoom-interpolation: Apply interpolation to smooth output when
# zoom-to-fit is enabled. Defaults to "off". (Since 9.0)
#
# Since: 7.0
##
{ 'struct': 'DisplayCocoa',
'data': {
'*left-command-key': 'bool',
'*full-grab': 'bool',
'*swap-opt-cmd': 'bool',
'*zoom-to-fit': 'bool',
'*zoom-interpolation': 'bool'
} }
##
# @HotKeyMod:
#
# Set of modifier keys that need to be held for shortcut key actions.
#
# Since: 7.1
##
{ 'enum' : 'HotKeyMod',
'data' : [ 'lctrl-lalt', 'lshift-lctrl-lalt', 'rctrl' ] }
##
# @DisplaySDL:
#
# SDL2 display options.
#
# @grab-mod: Modifier keys that should be pressed together with the
# "G" key to release the mouse grab.
#
# Since: 7.1
##
{ 'struct' : 'DisplaySDL',
'data' : { '*grab-mod' : 'HotKeyMod' } }
##
# @DisplayType:
#
# Display (user interface) type.
#
# @default: The default user interface, selecting from the first
# available of gtk, sdl, cocoa, and vnc.
#
# @none: No user interface or video output display. The guest will
# still see an emulated graphics card, but its output will not be
# displayed to the QEMU user.
#
# @gtk: The GTK user interface.
#
# @sdl: The SDL user interface.
#
# @egl-headless: No user interface, offload GL operations to a local
# DRI device. Graphical display need to be paired with VNC or
# Spice. (Since 3.1)
#
# @curses: Display video output via curses. For graphics device
# models which support a text mode, QEMU can display this output
# using a curses/ncurses interface. Nothing is displayed when the
# graphics device is in graphical mode or if the graphics device
# does not support a text mode. Generally only the VGA device
# models support text mode.
#
# @cocoa: The Cocoa user interface.
#
# @spice-app: Set up a Spice server and run the default associated
# application to connect to it. The server will redirect the
# serial console and QEMU monitors. (Since 4.0)
#
# @dbus: Start a D-Bus service for the display. (Since 7.0)
#
# Since: 2.12
##
{ 'enum' : 'DisplayType',
'data' : [
{ 'name': 'default' },
{ 'name': 'none' },
{ 'name': 'gtk', 'if': 'CONFIG_GTK' },
{ 'name': 'sdl', 'if': 'CONFIG_SDL' },
{ 'name': 'egl-headless', 'if': 'CONFIG_OPENGL' },
{ 'name': 'curses', 'if': 'CONFIG_CURSES' },
{ 'name': 'cocoa', 'if': 'CONFIG_COCOA' },
{ 'name': 'spice-app', 'if': 'CONFIG_SPICE' },
{ 'name': 'dbus', 'if': 'CONFIG_DBUS_DISPLAY' }
]
}
##
# @DisplayOptions:
#
# Display (user interface) options.
#
# @type: Which DisplayType qemu should use.
#
# @full-screen: Start user interface in fullscreen mode
# (default: off).
#
# @window-close: Allow to quit qemu with window close button
# (default: on).
#
# @show-cursor: Force showing the mouse cursor (default: off).
# (since: 5.0)
#
# @gl: Enable OpenGL support (default: off).
#
# Since: 2.12
##
{ 'union' : 'DisplayOptions',
'base' : { 'type' : 'DisplayType',
'*full-screen' : 'bool',
'*window-close' : 'bool',
'*show-cursor' : 'bool',
'*gl' : 'DisplayGLMode' },
'discriminator' : 'type',
'data' : {
'gtk': { 'type': 'DisplayGTK', 'if': 'CONFIG_GTK' },
'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' },
'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' },
'egl-headless': { 'type': 'DisplayEGLHeadless',
'if': 'CONFIG_OPENGL' },
'dbus': { 'type': 'DisplayDBus', 'if': 'CONFIG_DBUS_DISPLAY' },
'sdl': { 'type': 'DisplaySDL', 'if': 'CONFIG_SDL' }
}
}
##
# @query-display-options:
#
# Returns information about display configuration
#
# Returns: @DisplayOptions
#
# Since: 3.1
##
{ 'command': 'query-display-options',
'returns': 'DisplayOptions' }
##
# @DisplayReloadType:
#
# Available DisplayReload types.
#
# @vnc: VNC display
#
# Since: 6.0
##
{ 'enum': 'DisplayReloadType',
'data': ['vnc'] }
##
# @DisplayReloadOptionsVNC:
#
# Specify the VNC reload options.
#
# @tls-certs: reload tls certs or not.
#
# Since: 6.0
##
{ 'struct': 'DisplayReloadOptionsVNC',
'data': { '*tls-certs': 'bool' } }
##
# @DisplayReloadOptions:
#
# Options of the display configuration reload.
#
# @type: Specify the display type.
#
# Since: 6.0
##
{ 'union': 'DisplayReloadOptions',
'base': {'type': 'DisplayReloadType'},
'discriminator': 'type',
'data': { 'vnc': 'DisplayReloadOptionsVNC' } }
##
# @display-reload:
#
# Reload display configuration.
#
# Since: 6.0
#
# Example:
#
# -> { "execute": "display-reload",
# "arguments": { "type": "vnc", "tls-certs": true } }
# <- { "return": {} }
##
{ 'command': 'display-reload',
'data': 'DisplayReloadOptions',
'boxed' : true }
##
# @DisplayUpdateType:
#
# Available DisplayUpdate types.
#
# @vnc: VNC display
#
# Since: 7.1
##
{ 'enum': 'DisplayUpdateType',
'data': ['vnc'] }
##
# @DisplayUpdateOptionsVNC:
#
# Specify the VNC reload options.
#
# @addresses: If specified, change set of addresses to listen for
# connections. Addresses configured for websockets are not
# touched.
#
# Since: 7.1
##
{ 'struct': 'DisplayUpdateOptionsVNC',
'data': { '*addresses': ['SocketAddress'] } }
##
# @DisplayUpdateOptions:
#
# Options of the display configuration reload.
#
# @type: Specify the display type.
#
# Since: 7.1
##
{ 'union': 'DisplayUpdateOptions',
'base': {'type': 'DisplayUpdateType'},
'discriminator': 'type',
'data': { 'vnc': 'DisplayUpdateOptionsVNC' } }
##
# @display-update:
#
# Update display configuration.
#
# Since: 7.1
#
# Example:
#
# -> { "execute": "display-update",
# "arguments": { "type": "vnc", "addresses":
# [ { "type": "inet", "host": "0.0.0.0",
# "port": "5901" } ] } }
# <- { "return": {} }
##
{ 'command': 'display-update',
'data': 'DisplayUpdateOptions',
'boxed' : true }
##
# @client_migrate_info:
#
# Set migration information for remote display. This makes the server
# ask the client to automatically reconnect using the new parameters
# once migration finished successfully. Only implemented for SPICE.
#
# @protocol: must be "spice"
#
# @hostname: migration target hostname
#
# @port: spice tcp port for plaintext channels
#
# @tls-port: spice tcp port for tls-secured channels
#
# @cert-subject: server certificate subject
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "client_migrate_info",
# "arguments": { "protocol": "spice",
# "hostname": "virt42.lab.kraxel.org",
# "port": 1234 } }
# <- { "return": {} }
##
{ 'command': 'client_migrate_info',
'data': { 'protocol': 'str', 'hostname': 'str', '*port': 'int',
'*tls-port': 'int', '*cert-subject': 'str' } }