This patch adds a new option to the input-linux object: grab-toggle=[key-combo] The key combination can be one of the following: * ctrl-ctrl * alt-alt * meta-meta * scrolllock * ctrl-scrolllock The user can pick any of these key combinations. The VM's grab of the evdev device will be toggled when the key combination is pressed. Any invalid setting will result in an error. No setting will result in the current default of ctrl-ctrl. The right and left ctrl key both work for Ctrl-Scrolllock. If scrolllock is selected as one of the grab-toggle keys, it will be entirely disabled and not passed to the guest at all. This is to prevent enabling it while attempting to leave or enter the VM. On the host, scrolllock can be disabled using xmodmap. First, find the modifier that Scroll_Lock is bound to: $ xmodmap -pm Then, remove Scroll_Lock from it, replacing modX with the modifier: $ xmodmap -e 'remove modX = Scroll_Lock' If Scroll_Lock is not bound to any modifier, it is already disabled. To save the changes, add them to your xinitrc. Ryan El Kochta (1): input-linux: customizable grab toggle keys v5 Signed-off-by: Ryan El Kochta <relkochta@gmail.com> Message-id: 20190123214555.12712-2-relkochta@gmail.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
1129 lines
30 KiB
Python
1129 lines
30 KiB
Python
# -*- Mode: Python -*-
|
|
#
|
|
|
|
##
|
|
# = Remote desktop
|
|
##
|
|
|
|
{ 'include': 'sockets.json' }
|
|
|
|
##
|
|
# @set_password:
|
|
#
|
|
# Sets the password of a remote display session.
|
|
#
|
|
# @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'
|
|
# `fail' to fail the command if clients are connected
|
|
# `disconnect' to disconnect existing clients
|
|
# `keep' to maintain existing clients
|
|
#
|
|
# Returns: Nothing on success
|
|
# If Spice is not enabled, DeviceNotFound
|
|
#
|
|
# Since: 0.14.0
|
|
#
|
|
# Example:
|
|
#
|
|
# -> { "execute": "set_password", "arguments": { "protocol": "vnc",
|
|
# "password": "secret" } }
|
|
# <- { "return": {} }
|
|
#
|
|
##
|
|
{ 'command': 'set_password',
|
|
'data': {'protocol': 'str', 'password': 'str', '*connected': 'str'} }
|
|
|
|
##
|
|
# @expire_password:
|
|
#
|
|
# Expire the password of a remote display server.
|
|
#
|
|
# @protocol: the name of the remote display protocol `vnc' or `spice'
|
|
#
|
|
# @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
|
|
#
|
|
# Returns: Nothing on success
|
|
# If @protocol is `spice' and Spice is not active, DeviceNotFound
|
|
#
|
|
# Since: 0.14.0
|
|
#
|
|
# 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.
|
|
#
|
|
# Example:
|
|
#
|
|
# -> { "execute": "expire_password", "arguments": { "protocol": "vnc",
|
|
# "time": "+60" } }
|
|
# <- { "return": {} }
|
|
#
|
|
##
|
|
{ 'command': 'expire_password', 'data': {'protocol': 'str', 'time': 'str'} }
|
|
|
|
##
|
|
# @screendump:
|
|
#
|
|
# Write a PPM of the VGA screen to a file.
|
|
#
|
|
# @filename: the path of a new PPM 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)
|
|
#
|
|
# Returns: Nothing on success
|
|
#
|
|
# Since: 0.14.0
|
|
#
|
|
# Example:
|
|
#
|
|
# -> { "execute": "screendump",
|
|
# "arguments": { "filename": "/tmp/image" } }
|
|
# <- { "return": {} }
|
|
#
|
|
##
|
|
{ 'command': 'screendump',
|
|
'data': {'filename': 'str', '*device': 'str', '*head': 'int'} }
|
|
|
|
##
|
|
# == 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': 'defined(CONFIG_SPICE)' }
|
|
|
|
##
|
|
# @SpiceServerInfo:
|
|
#
|
|
# Information about a SPICE server
|
|
#
|
|
# @auth: authentication method
|
|
#
|
|
# Since: 2.1
|
|
##
|
|
{ 'struct': 'SpiceServerInfo',
|
|
'base': 'SpiceBasicInfo',
|
|
'data': { '*auth': 'str' },
|
|
'if': 'defined(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.0
|
|
##
|
|
{ 'struct': 'SpiceChannel',
|
|
'base': 'SpiceBasicInfo',
|
|
'data': {'connection-id': 'int', 'channel-type': 'int', 'channel-id': 'int',
|
|
'tls': 'bool'},
|
|
'if': 'defined(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': 'defined(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.0
|
|
##
|
|
{ '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': 'defined(CONFIG_SPICE)' }
|
|
|
|
##
|
|
# @query-spice:
|
|
#
|
|
# Returns information about the current SPICE server
|
|
#
|
|
# Returns: @SpiceInfo
|
|
#
|
|
# Since: 0.14.0
|
|
#
|
|
# Example:
|
|
#
|
|
# -> { "execute": "query-spice" }
|
|
# <- { "return": {
|
|
# "enabled": true,
|
|
# "auth": "spice",
|
|
# "port": 5920,
|
|
# "tls-port": 5921,
|
|
# "host": "0.0.0.0",
|
|
# "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': 'defined(CONFIG_SPICE)' }
|
|
|
|
##
|
|
# @SPICE_CONNECTED:
|
|
#
|
|
# Emitted when a SPICE client establishes a connection
|
|
#
|
|
# @server: server information
|
|
#
|
|
# @client: client information
|
|
#
|
|
# Since: 0.14.0
|
|
#
|
|
# 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': 'defined(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.0
|
|
#
|
|
# 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': 'defined(CONFIG_SPICE)' }
|
|
|
|
##
|
|
# @SPICE_DISCONNECTED:
|
|
#
|
|
# Emitted when the SPICE connection is closed
|
|
#
|
|
# @server: server information
|
|
#
|
|
# @client: client information
|
|
#
|
|
# Since: 0.14.0
|
|
#
|
|
# 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': 'defined(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': 'defined(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': 'defined(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': 'defined(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.0
|
|
##
|
|
{ 'struct': 'VncClientInfo',
|
|
'base': 'VncBasicInfo',
|
|
'data': { '*x509_dname': 'str', '*sasl_username': 'str' },
|
|
'if': 'defined(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.0
|
|
##
|
|
{ 'struct': 'VncInfo',
|
|
'data': {'enabled': 'bool', '*host': 'str',
|
|
'*family': 'NetworkAddressFamily',
|
|
'*service': 'str', '*auth': 'str', '*clients': ['VncClientInfo']},
|
|
'if': 'defined(CONFIG_VNC)' }
|
|
|
|
##
|
|
# @VncPrimaryAuth:
|
|
#
|
|
# vnc primary authentication method.
|
|
#
|
|
# Since: 2.3
|
|
##
|
|
{ 'enum': 'VncPrimaryAuth',
|
|
'data': [ 'none', 'vnc', 'ra2', 'ra2ne', 'tight', 'ultra',
|
|
'tls', 'vencrypt', 'sasl' ],
|
|
'if': 'defined(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': 'defined(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': 'defined(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': 'defined(CONFIG_VNC)' }
|
|
|
|
##
|
|
# @query-vnc:
|
|
#
|
|
# Returns information about the current VNC server
|
|
#
|
|
# Returns: @VncInfo
|
|
#
|
|
# Since: 0.14.0
|
|
#
|
|
# 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"
|
|
# }
|
|
# ]
|
|
# }
|
|
# }
|
|
#
|
|
##
|
|
{ 'command': 'query-vnc', 'returns': 'VncInfo',
|
|
'if': 'defined(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': 'defined(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': 'defined(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.0
|
|
#
|
|
# Example:
|
|
#
|
|
# <- { "event": "VNC_CONNECTED",
|
|
# "data": {
|
|
# "server": { "auth": "sasl", "family": "ipv4",
|
|
# "service": "5901", "host": "0.0.0.0" },
|
|
# "client": { "family": "ipv4", "service": "58425",
|
|
# "host": "127.0.0.1" } },
|
|
# "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
|
|
#
|
|
##
|
|
{ 'event': 'VNC_CONNECTED',
|
|
'data': { 'server': 'VncServerInfo',
|
|
'client': 'VncBasicInfo' },
|
|
'if': 'defined(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.0
|
|
#
|
|
# Example:
|
|
#
|
|
# <- { "event": "VNC_INITIALIZED",
|
|
# "data": {
|
|
# "server": { "auth": "sasl", "family": "ipv4",
|
|
# "service": "5901", "host": "0.0.0.0"},
|
|
# "client": { "family": "ipv4", "service": "46089",
|
|
# "host": "127.0.0.1", "sasl_username": "luiz" } },
|
|
# "timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
|
|
#
|
|
##
|
|
{ 'event': 'VNC_INITIALIZED',
|
|
'data': { 'server': 'VncServerInfo',
|
|
'client': 'VncClientInfo' },
|
|
'if': 'defined(CONFIG_VNC)' }
|
|
|
|
##
|
|
# @VNC_DISCONNECTED:
|
|
#
|
|
# Emitted when the connection is closed
|
|
#
|
|
# @server: server information
|
|
#
|
|
# @client: client information
|
|
#
|
|
# Since: 0.13.0
|
|
#
|
|
# Example:
|
|
#
|
|
# <- { "event": "VNC_DISCONNECTED",
|
|
# "data": {
|
|
# "server": { "auth": "sasl", "family": "ipv4",
|
|
# "service": "5901", "host": "0.0.0.0" },
|
|
# "client": { "family": "ipv4", "service": "58425",
|
|
# "host": "127.0.0.1", "sasl_username": "luiz" } },
|
|
# "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
|
|
#
|
|
##
|
|
{ 'event': 'VNC_DISCONNECTED',
|
|
'data': { 'server': 'VncServerInfo',
|
|
'client': 'VncClientInfo' },
|
|
'if': 'defined(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.0
|
|
##
|
|
{ '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.0
|
|
#
|
|
# 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
|
|
# altgr, altgr_r: dropped in 2.10
|
|
#
|
|
# @muhenkan: since 2.12
|
|
# @katakanahiragana: since 2.12
|
|
#
|
|
# '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.0
|
|
#
|
|
##
|
|
{ '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' ] }
|
|
|
|
##
|
|
# @KeyValue:
|
|
#
|
|
# Represents a keyboard key.
|
|
#
|
|
# Since: 1.3.0
|
|
##
|
|
{ 'union': 'KeyValue',
|
|
'data': {
|
|
'number': 'int',
|
|
'qcode': 'QKeyCode' } }
|
|
|
|
##
|
|
# @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.0
|
|
#
|
|
# 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' ] }
|
|
|
|
##
|
|
# @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' } }
|
|
|
|
##
|
|
# @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',
|
|
'data' : { 'key' : 'InputKeyEvent',
|
|
'btn' : 'InputBtnEvent',
|
|
'rel' : 'InputMoveEvent',
|
|
'abs' : 'InputMoveEvent' } }
|
|
|
|
##
|
|
# @input-send-event:
|
|
#
|
|
# Send input event(s) to guest.
|
|
#
|
|
# @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.
|
|
#
|
|
# 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.
|
|
#
|
|
# 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' ] } }
|
|
|
|
##
|
|
# @GrabToggleKeys:
|
|
#
|
|
# Keys to toggle input-linux between host and guest.
|
|
#
|
|
# Since: 4.0
|
|
#
|
|
##
|
|
{ 'enum': 'GrabToggleKeys',
|
|
'data': [ 'ctrl-ctrl', 'alt-alt', 'meta-meta', 'scrolllock', 'ctrl-scrolllock' ] }
|
|
|
|
##
|
|
# @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' } }
|
|
|
|
##
|
|
# @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' ] }
|
|
|
|
##
|
|
# @DisplayType:
|
|
#
|
|
# Display (user interface) type.
|
|
#
|
|
# Since: 2.12
|
|
#
|
|
##
|
|
{ 'enum' : 'DisplayType',
|
|
'data' : [ 'default', 'none', 'gtk', 'sdl',
|
|
'egl-headless', 'curses', 'cocoa' ] }
|
|
|
|
##
|
|
# @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).
|
|
# @gl: Enable OpenGL support (default: off).
|
|
#
|
|
# Since: 2.12
|
|
#
|
|
##
|
|
{ 'union' : 'DisplayOptions',
|
|
'base' : { 'type' : 'DisplayType',
|
|
'*full-screen' : 'bool',
|
|
'*window-close' : 'bool',
|
|
'*gl' : 'DisplayGLMode' },
|
|
'discriminator' : 'type',
|
|
'data' : { 'gtk' : 'DisplayGTK',
|
|
'egl-headless' : 'DisplayEGLHeadless'} }
|
|
|
|
##
|
|
# @query-display-options:
|
|
#
|
|
# Returns information about display configuration
|
|
#
|
|
# Returns: @DisplayOptions
|
|
#
|
|
# Since: 3.1
|
|
#
|
|
##
|
|
{ 'command': 'query-display-options',
|
|
'returns': 'DisplayOptions' }
|