9eafdeeac3
The "-display sdl" option still uses a hand-crafted parser for its parameters since we didn't want to drag an interface we considered somewhat flawed into the QAPI schema. Since the flaws are gone now, it's time to QAPIfy. This introduces the new "DisplaySDL" QAPI struct that is used to hold the parameters that are unique to the SDL display. The only specific parameter is currently "grab-mod" that is used to specify the required modifier keys to escape from the mouse grabbing mode. Message-Id: <20220519155625.1414365-3-thuth@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
1536 lines
39 KiB
Python
1536 lines
39 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 procotol.
|
|
#
|
|
# @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.
|
|
#
|
|
# Returns: - Nothing on success
|
|
# - 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 procotol.
|
|
#
|
|
# @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.
|
|
#
|
|
# Returns: - Nothing on success
|
|
# - 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)
|
|
#
|
|
# Returns: Nothing on success
|
|
#
|
|
# Since: 0.14
|
|
#
|
|
# Example:
|
|
#
|
|
# -> { "execute": "screendump",
|
|
# "arguments": { "filename": "/tmp/image" } }
|
|
# <- { "return": {} }
|
|
#
|
|
##
|
|
{ 'command': 'screendump',
|
|
'data': {'filename': 'str', '*device': 'str', '*head': 'int',
|
|
'*format': 'ImageFormat'},
|
|
'coroutine': true }
|
|
|
|
##
|
|
# == 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
|
|
# },
|
|
# [ ... more channels follow ... ]
|
|
# ]
|
|
# }
|
|
# }
|
|
#
|
|
##
|
|
{ '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
|
|
#
|
|
# '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' ] }
|
|
|
|
##
|
|
# @KeyValueKind:
|
|
#
|
|
# Since: 1.3
|
|
##
|
|
{ 'enum': 'KeyValueKind',
|
|
'data': [ 'number', 'qcode' ] }
|
|
|
|
##
|
|
# @IntWrapper:
|
|
#
|
|
# Since: 1.3
|
|
##
|
|
{ 'struct': 'IntWrapper',
|
|
'data': { 'data': 'int' } }
|
|
|
|
##
|
|
# @QKeyCodeWrapper:
|
|
#
|
|
# Since: 1.3
|
|
##
|
|
{ 'struct': 'QKeyCodeWrapper',
|
|
'data': { 'data': 'QKeyCode' } }
|
|
|
|
##
|
|
# @KeyValue:
|
|
#
|
|
# Represents a keyboard key.
|
|
#
|
|
# 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
|
|
#
|
|
# Returns: - Nothing on success
|
|
# - If key is unknown or redundant, InvalidParameter
|
|
#
|
|
# 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)
|
|
#
|
|
# Since: 2.0
|
|
##
|
|
{ 'enum' : 'InputButton',
|
|
'data' : [ 'left', 'middle', 'right', 'wheel-up', 'wheel-down', 'side',
|
|
'extra', 'wheel-left', 'wheel-right' ] }
|
|
|
|
##
|
|
# @InputAxis:
|
|
#
|
|
# Position axis of a pointer input device (mouse, tablet).
|
|
#
|
|
# Since: 2.0
|
|
##
|
|
{ 'enum' : 'InputAxis',
|
|
'data' : [ 'x', 'y' ] }
|
|
|
|
##
|
|
# @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' } }
|
|
|
|
##
|
|
# @InputEventKind:
|
|
#
|
|
# Since: 2.0
|
|
##
|
|
{ 'enum': 'InputEventKind',
|
|
'data': [ 'key', 'btn', 'rel', 'abs' ] }
|
|
|
|
##
|
|
# @InputKeyEventWrapper:
|
|
#
|
|
# Since: 2.0
|
|
##
|
|
{ 'struct': 'InputKeyEventWrapper',
|
|
'data': { 'data': 'InputKeyEvent' } }
|
|
|
|
##
|
|
# @InputBtnEventWrapper:
|
|
#
|
|
# Since: 2.0
|
|
##
|
|
{ 'struct': 'InputBtnEventWrapper',
|
|
'data': { 'data': 'InputBtnEvent' } }
|
|
|
|
##
|
|
# @InputMoveEventWrapper:
|
|
#
|
|
# Since: 2.0
|
|
##
|
|
{ 'struct': 'InputMoveEventWrapper',
|
|
'data': { 'data': 'InputMoveEvent' } }
|
|
|
|
##
|
|
# @InputEvent:
|
|
#
|
|
# Input event union.
|
|
#
|
|
# @type: the input type, one of:
|
|
#
|
|
# - 'key': Input event of Keyboard
|
|
# - 'btn': Input event of pointer buttons
|
|
# - 'rel': Input event of relative pointer motion
|
|
# - 'abs': Input event of absolute pointer motion
|
|
#
|
|
# Since: 2.0
|
|
##
|
|
{ 'union' : 'InputEvent',
|
|
'base': { 'type': 'InputEventKind' },
|
|
'discriminator': 'type',
|
|
'data' : { 'key' : 'InputKeyEventWrapper',
|
|
'btn' : 'InputBtnEventWrapper',
|
|
'rel' : 'InputMoveEventWrapper',
|
|
'abs' : 'InputMoveEventWrapper' } }
|
|
|
|
##
|
|
# @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.
|
|
#
|
|
# Returns: Nothing on success.
|
|
#
|
|
# 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.
|
|
#
|
|
# Example:
|
|
#
|
|
# 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
|
|
#
|
|
# Since: 2.12
|
|
##
|
|
{ 'struct' : 'DisplayGTK',
|
|
'data' : { '*grab-on-hover' : 'bool',
|
|
'*zoom-to-fit' : '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)
|
|
#
|
|
# Since: 7.0
|
|
##
|
|
{ 'struct': 'DisplayCocoa',
|
|
'data': {
|
|
'*left-command-key': 'bool',
|
|
'*full-grab': 'bool',
|
|
'*swap-opt-cmd': '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': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } },
|
|
{ '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': { 'all': ['CONFIG_OPENGL', 'CONFIG_GBM'] } },
|
|
'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.
|
|
#
|
|
# Returns: Nothing on success.
|
|
#
|
|
# 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.
|
|
#
|
|
# Returns: Nothing on success.
|
|
#
|
|
# 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 }
|