xref: /openbmc/qemu/qapi/ui.json (revision 14b48aaa)
1# -*- Mode: Python -*-
2# vim: filetype=python
3#
4
5##
6# = Remote desktop
7##
8
9{ 'include': 'common.json' }
10{ 'include': 'sockets.json' }
11
12##
13# @DisplayProtocol:
14#
15# Display protocols which support changing password options.
16#
17# Since: 7.0
18##
19{ 'enum': 'DisplayProtocol',
20  'data': [ 'vnc', 'spice' ] }
21
22##
23# @SetPasswordAction:
24#
25# An action to take on changing a password on a connection with active
26# clients.
27#
28# @keep: maintain existing clients
29#
30# @fail: fail the command if clients are connected
31#
32# @disconnect: disconnect existing clients
33#
34# Since: 7.0
35##
36{ 'enum': 'SetPasswordAction',
37  'data': [ 'keep', 'fail', 'disconnect' ] }
38
39##
40# @SetPasswordOptions:
41#
42# Options for set_password.
43#
44# @protocol:
45#     - 'vnc' to modify the VNC server password
46#     - 'spice' to modify the Spice server password
47#
48# @password: the new password
49#
50# @connected: How to handle existing clients when changing the
51#     password.  If nothing is specified, defaults to 'keep'. For VNC,
52#     only 'keep' is currently implemented.
53#
54# Since: 7.0
55##
56{ 'union': 'SetPasswordOptions',
57  'base': { 'protocol': 'DisplayProtocol',
58            'password': 'str',
59            '*connected': 'SetPasswordAction' },
60  'discriminator': 'protocol',
61  'data': { 'vnc': 'SetPasswordOptionsVnc' } }
62
63##
64# @SetPasswordOptionsVnc:
65#
66# Options for set_password specific to the VNC protocol.
67#
68# @display: The id of the display where the password should be
69#     changed.  Defaults to the first.
70#
71# Since: 7.0
72##
73{ 'struct': 'SetPasswordOptionsVnc',
74  'data': { '*display': 'str' } }
75
76##
77# @set_password:
78#
79# Set the password of a remote display server.
80#
81# Errors:
82#     - If Spice is not enabled, DeviceNotFound
83#
84# Since: 0.14
85#
86# .. qmp-example::
87#
88#     -> { "execute": "set_password", "arguments": { "protocol": "vnc",
89#                                                    "password": "secret" } }
90#     <- { "return": {} }
91##
92{ 'command': 'set_password', 'boxed': true, 'data': 'SetPasswordOptions' }
93
94##
95# @ExpirePasswordOptions:
96#
97# General options for expire_password.
98#
99# @protocol:
100#     - 'vnc' to modify the VNC server expiration
101#     - 'spice' to modify the Spice server expiration
102#
103# @time: when to expire the password.
104#
105#     - 'now' to expire the password immediately
106#     - 'never' to cancel password expiration
107#     - '+INT' where INT is the number of seconds from now (integer)
108#     - 'INT' where INT is the absolute time in seconds
109#
110# .. note:: Time is relative to the server and currently there is no way
111#    to coordinate server time with client time.  It is not recommended
112#    to use the absolute time version of the @time parameter unless
113#    you're sure you are on the same machine as the QEMU instance.
114#
115# Since: 7.0
116##
117{ 'union': 'ExpirePasswordOptions',
118  'base': { 'protocol': 'DisplayProtocol',
119            'time': 'str' },
120  'discriminator': 'protocol',
121  'data': { 'vnc': 'ExpirePasswordOptionsVnc' } }
122
123##
124# @ExpirePasswordOptionsVnc:
125#
126# Options for expire_password specific to the VNC protocol.
127#
128# @display: The id of the display where the expiration should be
129#     changed.  Defaults to the first.
130#
131# Since: 7.0
132##
133{ 'struct': 'ExpirePasswordOptionsVnc',
134  'data': { '*display': 'str' } }
135
136##
137# @expire_password:
138#
139# Expire the password of a remote display server.
140#
141# Errors:
142#     - If @protocol is 'spice' and Spice is not active,
143#       DeviceNotFound
144#
145# Since: 0.14
146#
147# .. qmp-example::
148#
149#     -> { "execute": "expire_password", "arguments": { "protocol": "vnc",
150#                                                       "time": "+60" } }
151#     <- { "return": {} }
152##
153{ 'command': 'expire_password', 'boxed': true, 'data': 'ExpirePasswordOptions' }
154
155##
156# @ImageFormat:
157#
158# Supported image format types.
159#
160# @png: PNG format
161#
162# @ppm: PPM format
163#
164# Since: 7.1
165##
166{ 'enum': 'ImageFormat',
167  'data': ['ppm', 'png'] }
168
169##
170# @screendump:
171#
172# Capture the contents of a screen and write it to a file.
173#
174# @filename: the path of a new file to store the image
175#
176# @device: ID of the display device that should be dumped.  If this
177#     parameter is missing, the primary display will be used.  (Since
178#     2.12)
179#
180# @head: head to use in case the device supports multiple heads.  If
181#     this parameter is missing, head #0 will be used.  Also note that
182#     the head can only be specified in conjunction with the device
183#     ID.  (Since 2.12)
184#
185# @format: image format for screendump.  (default: ppm) (Since 7.1)
186#
187# Since: 0.14
188#
189# .. qmp-example::
190#
191#     -> { "execute": "screendump",
192#          "arguments": { "filename": "/tmp/image" } }
193#     <- { "return": {} }
194##
195{ 'command': 'screendump',
196  'data': {'filename': 'str', '*device': 'str', '*head': 'int',
197           '*format': 'ImageFormat'},
198  'coroutine': true,
199  'if': 'CONFIG_PIXMAN' }
200
201##
202# == Spice
203##
204
205##
206# @SpiceBasicInfo:
207#
208# The basic information for SPICE network connection
209#
210# @host: IP address
211#
212# @port: port number
213#
214# @family: address family
215#
216# Since: 2.1
217##
218{ 'struct': 'SpiceBasicInfo',
219  'data': { 'host': 'str',
220            'port': 'str',
221            'family': 'NetworkAddressFamily' },
222  'if': 'CONFIG_SPICE' }
223
224##
225# @SpiceServerInfo:
226#
227# Information about a SPICE server
228#
229# @auth: authentication method
230#
231# Since: 2.1
232##
233{ 'struct': 'SpiceServerInfo',
234  'base': 'SpiceBasicInfo',
235  'data': { '*auth': 'str' },
236  'if': 'CONFIG_SPICE' }
237
238##
239# @SpiceChannel:
240#
241# Information about a SPICE client channel.
242#
243# @connection-id: SPICE connection id number.  All channels with the
244#     same id belong to the same SPICE session.
245#
246# @channel-type: SPICE channel type number.  "1" is the main control
247#     channel, filter for this one if you want to track spice sessions
248#     only
249#
250# @channel-id: SPICE channel ID number.  Usually "0", might be
251#     different when multiple channels of the same type exist, such as
252#     multiple display channels in a multihead setup
253#
254# @tls: true if the channel is encrypted, false otherwise.
255#
256# Since: 0.14
257##
258{ 'struct': 'SpiceChannel',
259  'base': 'SpiceBasicInfo',
260  'data': {'connection-id': 'int', 'channel-type': 'int', 'channel-id': 'int',
261           'tls': 'bool'},
262  'if': 'CONFIG_SPICE' }
263
264##
265# @SpiceQueryMouseMode:
266#
267# An enumeration of Spice mouse states.
268#
269# @client: Mouse cursor position is determined by the client.
270#
271# @server: Mouse cursor position is determined by the server.
272#
273# @unknown: No information is available about mouse mode used by the
274#     spice server.
275#
276# Since: 1.1
277##
278{ 'enum': 'SpiceQueryMouseMode',
279  'data': [ 'client', 'server', 'unknown' ],
280  'if': 'CONFIG_SPICE' }
281
282##
283# @SpiceInfo:
284#
285# Information about the SPICE session.
286#
287# @enabled: true if the SPICE server is enabled, false otherwise
288#
289# @migrated: true if the last guest migration completed and spice
290#     migration had completed as well, false otherwise (since 1.4)
291#
292# @host: The hostname the SPICE server is bound to.  This depends on
293#     the name resolution on the host and may be an IP address.
294#
295# @port: The SPICE server's port number.
296#
297# @compiled-version: SPICE server version.
298#
299# @tls-port: The SPICE server's TLS port number.
300#
301# @auth: the current authentication type used by the server
302#
303#     - 'none' if no authentication is being used
304#     - 'spice' uses SASL or direct TLS authentication, depending on
305#       command line options
306#
307# @mouse-mode: The mode in which the mouse cursor is displayed
308#     currently.  Can be determined by the client or the server, or
309#     unknown if spice server doesn't provide this information.
310#     (since: 1.1)
311#
312# @channels: a list of @SpiceChannel for each active spice channel
313#
314# Since: 0.14
315##
316{ 'struct': 'SpiceInfo',
317  'data': {'enabled': 'bool', 'migrated': 'bool', '*host': 'str', '*port': 'int',
318           '*tls-port': 'int', '*auth': 'str', '*compiled-version': 'str',
319           'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel']},
320  'if': 'CONFIG_SPICE' }
321
322##
323# @query-spice:
324#
325# Returns information about the current SPICE server
326#
327# Returns: @SpiceInfo
328#
329# Since: 0.14
330#
331# .. qmp-example::
332#
333#     -> { "execute": "query-spice" }
334#     <- { "return": {
335#              "enabled": true,
336#              "auth": "spice",
337#              "port": 5920,
338#              "migrated":false,
339#              "tls-port": 5921,
340#              "host": "0.0.0.0",
341#              "mouse-mode":"client",
342#              "channels": [
343#                 {
344#                    "port": "54924",
345#                    "family": "ipv4",
346#                    "channel-type": 1,
347#                    "connection-id": 1804289383,
348#                    "host": "127.0.0.1",
349#                    "channel-id": 0,
350#                    "tls": true
351#                 },
352#                 {
353#                    "port": "36710",
354#                    "family": "ipv4",
355#                    "channel-type": 4,
356#                    "connection-id": 1804289383,
357#                    "host": "127.0.0.1",
358#                    "channel-id": 0,
359#                    "tls": false
360#                 },
361#                 ...
362#              ]
363#           }
364#        }
365##
366{ 'command': 'query-spice', 'returns': 'SpiceInfo',
367  'if': 'CONFIG_SPICE' }
368
369##
370# @SPICE_CONNECTED:
371#
372# Emitted when a SPICE client establishes a connection
373#
374# @server: server information
375#
376# @client: client information
377#
378# Since: 0.14
379#
380# .. qmp-example::
381#
382#     <- { "timestamp": {"seconds": 1290688046, "microseconds": 388707},
383#          "event": "SPICE_CONNECTED",
384#          "data": {
385#            "server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"},
386#            "client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"}
387#        }}
388##
389{ 'event': 'SPICE_CONNECTED',
390  'data': { 'server': 'SpiceBasicInfo',
391            'client': 'SpiceBasicInfo' },
392  'if': 'CONFIG_SPICE' }
393
394##
395# @SPICE_INITIALIZED:
396#
397# Emitted after initial handshake and authentication takes place (if
398# any) and the SPICE channel is up and running
399#
400# @server: server information
401#
402# @client: client information
403#
404# Since: 0.14
405#
406# .. qmp-example::
407#
408#     <- { "timestamp": {"seconds": 1290688046, "microseconds": 417172},
409#          "event": "SPICE_INITIALIZED",
410#          "data": {"server": {"auth": "spice", "port": "5921",
411#                              "family": "ipv4", "host": "127.0.0.1"},
412#                   "client": {"port": "49004", "family": "ipv4", "channel-type": 3,
413#                              "connection-id": 1804289383, "host": "127.0.0.1",
414#                              "channel-id": 0, "tls": true}
415#        }}
416##
417{ 'event': 'SPICE_INITIALIZED',
418  'data': { 'server': 'SpiceServerInfo',
419            'client': 'SpiceChannel' },
420  'if': 'CONFIG_SPICE' }
421
422##
423# @SPICE_DISCONNECTED:
424#
425# Emitted when the SPICE connection is closed
426#
427# @server: server information
428#
429# @client: client information
430#
431# Since: 0.14
432#
433# .. qmp-example::
434#
435#     <- { "timestamp": {"seconds": 1290688046, "microseconds": 388707},
436#          "event": "SPICE_DISCONNECTED",
437#          "data": {
438#            "server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"},
439#            "client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"}
440#        }}
441##
442{ 'event': 'SPICE_DISCONNECTED',
443  'data': { 'server': 'SpiceBasicInfo',
444            'client': 'SpiceBasicInfo' },
445  'if': 'CONFIG_SPICE' }
446
447##
448# @SPICE_MIGRATE_COMPLETED:
449#
450# Emitted when SPICE migration has completed
451#
452# Since: 1.3
453#
454# .. qmp-example::
455#
456#     <- { "timestamp": {"seconds": 1290688046, "microseconds": 417172},
457#          "event": "SPICE_MIGRATE_COMPLETED" }
458##
459{ 'event': 'SPICE_MIGRATE_COMPLETED',
460  'if': 'CONFIG_SPICE' }
461
462##
463# == VNC
464##
465
466##
467# @VncBasicInfo:
468#
469# The basic information for vnc network connection
470#
471# @host: IP address
472#
473# @service: The service name of the vnc port.  This may depend on the
474#     host system's service database so symbolic names should not be
475#     relied on.
476#
477# @family: address family
478#
479# @websocket: true in case the socket is a websocket (since 2.3).
480#
481# Since: 2.1
482##
483{ 'struct': 'VncBasicInfo',
484  'data': { 'host': 'str',
485            'service': 'str',
486            'family': 'NetworkAddressFamily',
487            'websocket': 'bool' },
488  'if': 'CONFIG_VNC' }
489
490##
491# @VncServerInfo:
492#
493# The network connection information for server
494#
495# @auth: authentication method used for the plain (non-websocket) VNC
496#     server
497#
498# Since: 2.1
499##
500{ 'struct': 'VncServerInfo',
501  'base': 'VncBasicInfo',
502  'data': { '*auth': 'str' },
503  'if': 'CONFIG_VNC' }
504
505##
506# @VncClientInfo:
507#
508# Information about a connected VNC client.
509#
510# @x509_dname: If x509 authentication is in use, the Distinguished
511#     Name of the client.
512#
513# @sasl_username: If SASL authentication is in use, the SASL username
514#     used for authentication.
515#
516# Since: 0.14
517##
518{ 'struct': 'VncClientInfo',
519  'base': 'VncBasicInfo',
520  'data': { '*x509_dname': 'str', '*sasl_username': 'str' },
521  'if': 'CONFIG_VNC' }
522
523##
524# @VncInfo:
525#
526# Information about the VNC session.
527#
528# @enabled: true if the VNC server is enabled, false otherwise
529#
530# @host: The hostname the VNC server is bound to.  This depends on the
531#     name resolution on the host and may be an IP address.
532#
533# @family:
534#     - 'ipv6' if the host is listening for IPv6 connections
535#     - 'ipv4' if the host is listening for IPv4 connections
536#     - 'unix' if the host is listening on a unix domain socket
537#     - 'unknown' otherwise
538#
539# @service: The service name of the server's port.  This may depends
540#     on the host system's service database so symbolic names should
541#     not be relied on.
542#
543# @auth: the current authentication type used by the server
544#
545#     - 'none' if no authentication is being used
546#     - 'vnc' if VNC authentication is being used
547#     - 'vencrypt+plain' if VEncrypt is used with plain text
548#       authentication
549#     - 'vencrypt+tls+none' if VEncrypt is used with TLS and no
550#       authentication
551#     - 'vencrypt+tls+vnc' if VEncrypt is used with TLS and VNC
552#       authentication
553#     - 'vencrypt+tls+plain' if VEncrypt is used with TLS and plain
554#       text auth
555#     - 'vencrypt+x509+none' if VEncrypt is used with x509 and no auth
556#     - 'vencrypt+x509+vnc' if VEncrypt is used with x509 and VNC auth
557#     - 'vencrypt+x509+plain' if VEncrypt is used with x509 and plain
558#       text auth
559#     - 'vencrypt+tls+sasl' if VEncrypt is used with TLS and SASL auth
560#     - 'vencrypt+x509+sasl' if VEncrypt is used with x509 and SASL
561#       auth
562#
563# @clients: a list of @VncClientInfo of all currently connected
564#     clients
565#
566# Since: 0.14
567##
568{ 'struct': 'VncInfo',
569  'data': {'enabled': 'bool', '*host': 'str',
570           '*family': 'NetworkAddressFamily',
571           '*service': 'str', '*auth': 'str', '*clients': ['VncClientInfo']},
572  'if': 'CONFIG_VNC' }
573
574##
575# @VncPrimaryAuth:
576#
577# vnc primary authentication method.
578#
579# Since: 2.3
580##
581{ 'enum': 'VncPrimaryAuth',
582  'data': [ 'none', 'vnc', 'ra2', 'ra2ne', 'tight', 'ultra',
583            'tls', 'vencrypt', 'sasl' ],
584  'if': 'CONFIG_VNC' }
585
586##
587# @VncVencryptSubAuth:
588#
589# vnc sub authentication method with vencrypt.
590#
591# Since: 2.3
592##
593{ 'enum': 'VncVencryptSubAuth',
594  'data': [ 'plain',
595            'tls-none',  'x509-none',
596            'tls-vnc',   'x509-vnc',
597            'tls-plain', 'x509-plain',
598            'tls-sasl',  'x509-sasl' ],
599  'if': 'CONFIG_VNC' }
600
601##
602# @VncServerInfo2:
603#
604# The network connection information for server
605#
606# @auth: The current authentication type used by the servers
607#
608# @vencrypt: The vencrypt sub authentication type used by the servers,
609#     only specified in case auth == vencrypt.
610#
611# Since: 2.9
612##
613{ 'struct': 'VncServerInfo2',
614  'base': 'VncBasicInfo',
615  'data': { 'auth'      : 'VncPrimaryAuth',
616            '*vencrypt' : 'VncVencryptSubAuth' },
617  'if': 'CONFIG_VNC' }
618
619##
620# @VncInfo2:
621#
622# Information about a vnc server
623#
624# @id: vnc server name.
625#
626# @server: A list of @VncBasincInfo describing all listening sockets.
627#     The list can be empty (in case the vnc server is disabled). It
628#     also may have multiple entries: normal + websocket, possibly
629#     also ipv4 + ipv6 in the future.
630#
631# @clients: A list of @VncClientInfo of all currently connected
632#     clients.  The list can be empty, for obvious reasons.
633#
634# @auth: The current authentication type used by the non-websockets
635#     servers
636#
637# @vencrypt: The vencrypt authentication type used by the servers,
638#     only specified in case auth == vencrypt.
639#
640# @display: The display device the vnc server is linked to.
641#
642# Since: 2.3
643##
644{ 'struct': 'VncInfo2',
645  'data': { 'id'        : 'str',
646            'server'    : ['VncServerInfo2'],
647            'clients'   : ['VncClientInfo'],
648            'auth'      : 'VncPrimaryAuth',
649            '*vencrypt' : 'VncVencryptSubAuth',
650            '*display'  : 'str' },
651  'if': 'CONFIG_VNC' }
652
653##
654# @query-vnc:
655#
656# Returns information about the current VNC server
657#
658# Returns: @VncInfo
659#
660# Since: 0.14
661#
662# .. qmp-example::
663#
664#     -> { "execute": "query-vnc" }
665#     <- { "return": {
666#              "enabled":true,
667#              "host":"0.0.0.0",
668#              "service":"50402",
669#              "auth":"vnc",
670#              "family":"ipv4",
671#              "clients":[
672#                 {
673#                    "host":"127.0.0.1",
674#                    "service":"50401",
675#                    "family":"ipv4",
676#                    "websocket":false
677#                 }
678#              ]
679#           }
680#        }
681##
682{ 'command': 'query-vnc', 'returns': 'VncInfo',
683  'if': 'CONFIG_VNC' }
684##
685# @query-vnc-servers:
686#
687# Returns a list of vnc servers.  The list can be empty.
688#
689# Returns: a list of @VncInfo2
690#
691# Since: 2.3
692##
693{ 'command': 'query-vnc-servers', 'returns': ['VncInfo2'],
694  'if': 'CONFIG_VNC' }
695
696##
697# @change-vnc-password:
698#
699# Change the VNC server password.
700#
701# @password: the new password to use with VNC authentication
702#
703# Since: 1.1
704#
705# .. note:: An empty password in this command will set the password to
706#    the empty string.  Existing clients are unaffected by executing
707#    this command.
708##
709{ 'command': 'change-vnc-password',
710  'data': { 'password': 'str' },
711  'if': 'CONFIG_VNC' }
712
713##
714# @VNC_CONNECTED:
715#
716# Emitted when a VNC client establishes a connection
717#
718# @server: server information
719#
720# @client: client information
721#
722# .. note:: This event is emitted before any authentication takes place,
723#    thus the authentication ID is not provided.
724#
725# Since: 0.13
726#
727# .. qmp-example::
728#
729#     <- { "event": "VNC_CONNECTED",
730#          "data": {
731#                "server": { "auth": "sasl", "family": "ipv4", "websocket": false,
732#                            "service": "5901", "host": "0.0.0.0" },
733#                "client": { "family": "ipv4", "service": "58425",
734#                            "host": "127.0.0.1", "websocket": false } },
735#          "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
736##
737{ 'event': 'VNC_CONNECTED',
738  'data': { 'server': 'VncServerInfo',
739            'client': 'VncBasicInfo' },
740  'if': 'CONFIG_VNC' }
741
742##
743# @VNC_INITIALIZED:
744#
745# Emitted after authentication takes place (if any) and the VNC
746# session is made active
747#
748# @server: server information
749#
750# @client: client information
751#
752# Since: 0.13
753#
754# .. qmp-example::
755#
756#     <-  { "event": "VNC_INITIALIZED",
757#           "data": {
758#                "server": { "auth": "sasl", "family": "ipv4", "websocket": false,
759#                            "service": "5901", "host": "0.0.0.0"},
760#                "client": { "family": "ipv4", "service": "46089", "websocket": false,
761#                            "host": "127.0.0.1", "sasl_username": "luiz" } },
762#           "timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
763##
764{ 'event': 'VNC_INITIALIZED',
765  'data': { 'server': 'VncServerInfo',
766            'client': 'VncClientInfo' },
767  'if': 'CONFIG_VNC' }
768
769##
770# @VNC_DISCONNECTED:
771#
772# Emitted when the connection is closed
773#
774# @server: server information
775#
776# @client: client information
777#
778# Since: 0.13
779#
780# .. qmp-example::
781#
782#     <- { "event": "VNC_DISCONNECTED",
783#          "data": {
784#                "server": { "auth": "sasl", "family": "ipv4", "websocket": false,
785#                            "service": "5901", "host": "0.0.0.0" },
786#                "client": { "family": "ipv4", "service": "58425", "websocket": false,
787#                            "host": "127.0.0.1", "sasl_username": "luiz" } },
788#          "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
789##
790{ 'event': 'VNC_DISCONNECTED',
791  'data': { 'server': 'VncServerInfo',
792            'client': 'VncClientInfo' },
793  'if': 'CONFIG_VNC' }
794
795##
796# = Input
797##
798
799##
800# @MouseInfo:
801#
802# Information about a mouse device.
803#
804# @name: the name of the mouse device
805#
806# @index: the index of the mouse device
807#
808# @current: true if this device is currently receiving mouse events
809#
810# @absolute: true if this device supports absolute coordinates as
811#     input
812#
813# Since: 0.14
814##
815{ 'struct': 'MouseInfo',
816  'data': {'name': 'str', 'index': 'int', 'current': 'bool',
817           'absolute': 'bool'} }
818
819##
820# @query-mice:
821#
822# Returns information about each active mouse device
823#
824# Returns: a list of @MouseInfo for each device
825#
826# Since: 0.14
827#
828# .. qmp-example::
829#
830#     -> { "execute": "query-mice" }
831#     <- { "return": [
832#              {
833#                 "name":"QEMU Microsoft Mouse",
834#                 "index":0,
835#                 "current":false,
836#                 "absolute":false
837#              },
838#              {
839#                 "name":"QEMU PS/2 Mouse",
840#                 "index":1,
841#                 "current":true,
842#                 "absolute":true
843#              }
844#           ]
845#        }
846##
847{ 'command': 'query-mice', 'returns': ['MouseInfo'] }
848
849##
850# @QKeyCode:
851#
852# An enumeration of key name.
853#
854# This is used by the @send-key command.
855#
856# @unmapped: since 2.0
857#
858# @pause: since 2.0
859#
860# @ro: since 2.4
861#
862# @kp_comma: since 2.4
863#
864# @kp_equals: since 2.6
865#
866# @power: since 2.6
867#
868# @hiragana: since 2.9
869#
870# @henkan: since 2.9
871#
872# @yen: since 2.9
873#
874# @sleep: since 2.10
875#
876# @wake: since 2.10
877#
878# @audionext: since 2.10
879#
880# @audioprev: since 2.10
881#
882# @audiostop: since 2.10
883#
884# @audioplay: since 2.10
885#
886# @audiomute: since 2.10
887#
888# @volumeup: since 2.10
889#
890# @volumedown: since 2.10
891#
892# @mediaselect: since 2.10
893#
894# @mail: since 2.10
895#
896# @calculator: since 2.10
897#
898# @computer: since 2.10
899#
900# @ac_home: since 2.10
901#
902# @ac_back: since 2.10
903#
904# @ac_forward: since 2.10
905#
906# @ac_refresh: since 2.10
907#
908# @ac_bookmarks: since 2.10
909#
910# @muhenkan: since 2.12
911#
912# @katakanahiragana: since 2.12
913#
914# @lang1: since 6.1
915#
916# @lang2: since 6.1
917#
918# @f13: since 8.0
919#
920# @f14: since 8.0
921#
922# @f15: since 8.0
923#
924# @f16: since 8.0
925#
926# @f17: since 8.0
927#
928# @f18: since 8.0
929#
930# @f19: since 8.0
931#
932# @f20: since 8.0
933#
934# @f21: since 8.0
935#
936# @f22: since 8.0
937#
938# @f23: since 8.0
939#
940# @f24: since 8.0
941#
942# 'sysrq' was mistakenly added to hack around the fact that the ps2
943# driver was not generating correct scancodes sequences when
944# 'alt+print' was pressed.  This flaw is now fixed and the 'sysrq' key
945# serves no further purpose.  Any further use of 'sysrq' will be
946# transparently changed to 'print', so they are effectively synonyms.
947#
948# Since: 1.3
949##
950{ 'enum': 'QKeyCode',
951  'data': [ 'unmapped',
952            'shift', 'shift_r', 'alt', 'alt_r', 'ctrl',
953            'ctrl_r', 'menu', 'esc', '1', '2', '3', '4', '5', '6', '7', '8',
954            '9', '0', 'minus', 'equal', 'backspace', 'tab', 'q', 'w', 'e',
955            'r', 't', 'y', 'u', 'i', 'o', 'p', 'bracket_left', 'bracket_right',
956            'ret', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'semicolon',
957            'apostrophe', 'grave_accent', 'backslash', 'z', 'x', 'c', 'v', 'b',
958            'n', 'm', 'comma', 'dot', 'slash', 'asterisk', 'spc', 'caps_lock',
959            'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10',
960            'num_lock', 'scroll_lock', 'kp_divide', 'kp_multiply',
961            'kp_subtract', 'kp_add', 'kp_enter', 'kp_decimal', 'sysrq', 'kp_0',
962            'kp_1', 'kp_2', 'kp_3', 'kp_4', 'kp_5', 'kp_6', 'kp_7', 'kp_8',
963            'kp_9', 'less', 'f11', 'f12', 'print', 'home', 'pgup', 'pgdn', 'end',
964            'left', 'up', 'down', 'right', 'insert', 'delete', 'stop', 'again',
965            'props', 'undo', 'front', 'copy', 'open', 'paste', 'find', 'cut',
966            'lf', 'help', 'meta_l', 'meta_r', 'compose', 'pause',
967            'ro', 'hiragana', 'henkan', 'yen', 'muhenkan', 'katakanahiragana',
968            'kp_comma', 'kp_equals', 'power', 'sleep', 'wake',
969            'audionext', 'audioprev', 'audiostop', 'audioplay', 'audiomute',
970            'volumeup', 'volumedown', 'mediaselect',
971            'mail', 'calculator', 'computer',
972            'ac_home', 'ac_back', 'ac_forward', 'ac_refresh', 'ac_bookmarks',
973            'lang1', 'lang2','f13','f14','f15','f16','f17','f18','f19','f20','f21','f22','f23','f24' ] }
974
975##
976# @KeyValueKind:
977#
978# Since: 1.3
979##
980{ 'enum': 'KeyValueKind',
981  'data': [ 'number', 'qcode' ] }
982
983##
984# @IntWrapper:
985#
986# @data: a numeric key code
987#
988# Since: 1.3
989##
990{ 'struct': 'IntWrapper',
991  'data': { 'data': 'int' } }
992
993##
994# @QKeyCodeWrapper:
995#
996# @data: An enumeration of key name
997#
998# Since: 1.3
999##
1000{ 'struct': 'QKeyCodeWrapper',
1001  'data': { 'data': 'QKeyCode' } }
1002
1003##
1004# @KeyValue:
1005#
1006# Represents a keyboard key.
1007#
1008# @type: key encoding
1009#
1010# Since: 1.3
1011##
1012{ 'union': 'KeyValue',
1013  'base': { 'type': 'KeyValueKind' },
1014  'discriminator': 'type',
1015  'data': {
1016    'number': 'IntWrapper',
1017    'qcode': 'QKeyCodeWrapper' } }
1018
1019##
1020# @send-key:
1021#
1022# Send keys to guest.
1023#
1024# @keys: An array of @KeyValue elements.  All @KeyValues in this array
1025#     are simultaneously sent to the guest.  A @KeyValue.number value
1026#     is sent directly to the guest, while @KeyValue.qcode must be a
1027#     valid @QKeyCode value
1028#
1029# @hold-time: time to delay key up events, milliseconds.  Defaults to
1030#     100
1031#
1032# Errors:
1033#     - If key is unknown or redundant, GenericError
1034#
1035# Since: 1.3
1036#
1037# .. qmp-example::
1038#
1039#     -> { "execute": "send-key",
1040#          "arguments": { "keys": [ { "type": "qcode", "data": "ctrl" },
1041#                                   { "type": "qcode", "data": "alt" },
1042#                                   { "type": "qcode", "data": "delete" } ] } }
1043#     <- { "return": {} }
1044##
1045{ 'command': 'send-key',
1046  'data': { 'keys': ['KeyValue'], '*hold-time': 'int' } }
1047
1048##
1049# @InputButton:
1050#
1051# Button of a pointer input device (mouse, tablet).
1052#
1053# @side: front side button of a 5-button mouse (since 2.9)
1054#
1055# @extra: rear side button of a 5-button mouse (since 2.9)
1056#
1057# @touch: screen contact on a multi-touch device (since 8.1)
1058#
1059# Since: 2.0
1060##
1061{ 'enum'  : 'InputButton',
1062  'data'  : [ 'left', 'middle', 'right', 'wheel-up', 'wheel-down', 'side',
1063  'extra', 'wheel-left', 'wheel-right', 'touch' ] }
1064
1065##
1066# @InputAxis:
1067#
1068# Position axis of a pointer input device (mouse, tablet).
1069#
1070# Since: 2.0
1071##
1072{ 'enum'  : 'InputAxis',
1073  'data'  : [ 'x', 'y' ] }
1074
1075##
1076# @InputMultiTouchType:
1077#
1078# Type of a multi-touch event.
1079#
1080# @begin: A new touch event sequence has just started.
1081#
1082# @update: A touch event sequence has been updated.
1083#
1084# @end: A touch event sequence has finished.
1085#
1086# @cancel: A touch event sequence has been canceled.
1087#
1088# @data: Absolute position data.
1089#
1090# Since: 8.1
1091##
1092{ 'enum'  : 'InputMultiTouchType',
1093  'data'  : [ 'begin', 'update', 'end', 'cancel', 'data' ] }
1094
1095
1096##
1097# @InputKeyEvent:
1098#
1099# Keyboard input event.
1100#
1101# @key: Which key this event is for.
1102#
1103# @down: True for key-down and false for key-up events.
1104#
1105# Since: 2.0
1106##
1107{ 'struct'  : 'InputKeyEvent',
1108  'data'  : { 'key'     : 'KeyValue',
1109              'down'    : 'bool' } }
1110
1111##
1112# @InputBtnEvent:
1113#
1114# Pointer button input event.
1115#
1116# @button: Which button this event is for.
1117#
1118# @down: True for key-down and false for key-up events.
1119#
1120# Since: 2.0
1121##
1122{ 'struct'  : 'InputBtnEvent',
1123  'data'  : { 'button'  : 'InputButton',
1124              'down'    : 'bool' } }
1125
1126##
1127# @InputMoveEvent:
1128#
1129# Pointer motion input event.
1130#
1131# @axis: Which axis is referenced by @value.
1132#
1133# @value: Pointer position.  For absolute coordinates the valid range
1134#     is 0 -> 0x7ffff
1135#
1136# Since: 2.0
1137##
1138{ 'struct'  : 'InputMoveEvent',
1139  'data'  : { 'axis'    : 'InputAxis',
1140              'value'   : 'int' } }
1141
1142##
1143# @InputMultiTouchEvent:
1144#
1145# MultiTouch input event.
1146#
1147# @type: The type of multi-touch event.
1148#
1149# @slot: Which slot has generated the event.
1150#
1151# @tracking-id: ID to correlate this event with previously generated
1152#     events.
1153#
1154# @axis: Which axis is referenced by @value.
1155#
1156# @value: Contact position.
1157#
1158# Since: 8.1
1159##
1160{ 'struct'  : 'InputMultiTouchEvent',
1161  'data'  : { 'type'       : 'InputMultiTouchType',
1162              'slot'       : 'int',
1163              'tracking-id': 'int',
1164              'axis'       : 'InputAxis',
1165              'value'      : 'int' } }
1166
1167##
1168# @InputEventKind:
1169#
1170# @key: a keyboard input event
1171#
1172# @btn: a pointer button input event
1173#
1174# @rel: a relative pointer motion input event
1175#
1176# @abs: an absolute pointer motion input event
1177#
1178# @mtt: a multi-touch input event
1179#
1180# Since: 2.0
1181##
1182{ 'enum': 'InputEventKind',
1183  'data': [ 'key', 'btn', 'rel', 'abs', 'mtt' ] }
1184
1185##
1186# @InputKeyEventWrapper:
1187#
1188# @data: Keyboard input event
1189#
1190# Since: 2.0
1191##
1192{ 'struct': 'InputKeyEventWrapper',
1193  'data': { 'data': 'InputKeyEvent' } }
1194
1195##
1196# @InputBtnEventWrapper:
1197#
1198# @data: Pointer button input event
1199#
1200# Since: 2.0
1201##
1202{ 'struct': 'InputBtnEventWrapper',
1203  'data': { 'data': 'InputBtnEvent' } }
1204
1205##
1206# @InputMoveEventWrapper:
1207#
1208# @data: Pointer motion input event
1209#
1210# Since: 2.0
1211##
1212{ 'struct': 'InputMoveEventWrapper',
1213  'data': { 'data': 'InputMoveEvent' } }
1214
1215##
1216# @InputMultiTouchEventWrapper:
1217#
1218# @data: MultiTouch input event
1219#
1220# Since: 8.1
1221##
1222{ 'struct': 'InputMultiTouchEventWrapper',
1223  'data': { 'data': 'InputMultiTouchEvent' } }
1224
1225##
1226# @InputEvent:
1227#
1228# Input event union.
1229#
1230# @type: the type of input event
1231#
1232# Since: 2.0
1233##
1234{ 'union' : 'InputEvent',
1235  'base': { 'type': 'InputEventKind' },
1236  'discriminator': 'type',
1237  'data'  : { 'key'     : 'InputKeyEventWrapper',
1238              'btn'     : 'InputBtnEventWrapper',
1239              'rel'     : 'InputMoveEventWrapper',
1240              'abs'     : 'InputMoveEventWrapper',
1241              'mtt'     : 'InputMultiTouchEventWrapper' } }
1242
1243##
1244# @input-send-event:
1245#
1246# Send input event(s) to guest.
1247#
1248# The @device and @head parameters can be used to send the input event
1249# to specific input devices in case (a) multiple input devices of the
1250# same kind are added to the virtual machine and (b) you have
1251# configured input routing (see docs/multiseat.txt) for those input
1252# devices.  The parameters work exactly like the device and head
1253# properties of input devices.  If @device is missing, only devices
1254# that have no input routing config are admissible.  If @device is
1255# specified, both input devices with and without input routing config
1256# are admissible, but devices with input routing config take
1257# precedence.
1258#
1259# @device: display device to send event(s) to.
1260#
1261# @head: head to send event(s) to, in case the display device supports
1262#     multiple scanouts.
1263#
1264# @events: List of InputEvent union.
1265#
1266# Since: 2.6
1267#
1268# .. note:: The consoles are visible in the qom tree, under
1269#    ``/backend/console[$index]``. They have a device link and head
1270#    property, so it is possible to map which console belongs to which
1271#    device and display.
1272#
1273# Examples:
1274#
1275#     1. Press left mouse button.
1276#
1277#     -> { "execute": "input-send-event",
1278#         "arguments": { "device": "video0",
1279#                        "events": [ { "type": "btn",
1280#                        "data" : { "down": true, "button": "left" } } ] } }
1281#     <- { "return": {} }
1282#
1283#     -> { "execute": "input-send-event",
1284#         "arguments": { "device": "video0",
1285#                        "events": [ { "type": "btn",
1286#                        "data" : { "down": false, "button": "left" } } ] } }
1287#     <- { "return": {} }
1288#
1289#     2. Press ctrl-alt-del.
1290#
1291#     -> { "execute": "input-send-event",
1292#          "arguments": { "events": [
1293#             { "type": "key", "data" : { "down": true,
1294#               "key": {"type": "qcode", "data": "ctrl" } } },
1295#             { "type": "key", "data" : { "down": true,
1296#               "key": {"type": "qcode", "data": "alt" } } },
1297#             { "type": "key", "data" : { "down": true,
1298#               "key": {"type": "qcode", "data": "delete" } } } ] } }
1299#     <- { "return": {} }
1300#
1301#     3. Move mouse pointer to absolute coordinates (20000, 400).
1302#
1303#     -> { "execute": "input-send-event" ,
1304#       "arguments": { "events": [
1305#                    { "type": "abs", "data" : { "axis": "x", "value" : 20000 } },
1306#                    { "type": "abs", "data" : { "axis": "y", "value" : 400 } } ] } }
1307#     <- { "return": {} }
1308##
1309{ 'command': 'input-send-event',
1310  'data': { '*device': 'str',
1311            '*head'  : 'int',
1312            'events' : [ 'InputEvent' ] } }
1313
1314##
1315# @DisplayGTK:
1316#
1317# GTK display options.
1318#
1319# @grab-on-hover: Grab keyboard input on mouse hover.
1320#
1321# @zoom-to-fit: Zoom guest display to fit into the host window.  When
1322#     turned off the host window will be resized instead.  In case the
1323#     display device can notify the guest on window resizes
1324#     (virtio-gpu) this will default to "on", assuming the guest will
1325#     resize the display to match the window size then.  Otherwise it
1326#     defaults to "off".  (Since 3.1)
1327#
1328# @show-tabs: Display the tab bar for switching between the various
1329#     graphical interfaces (e.g. VGA and virtual console character
1330#     devices) by default.  (Since 7.1)
1331#
1332# @show-menubar: Display the main window menubar.  Defaults to "on".
1333#     (Since 8.0)
1334#
1335# Since: 2.12
1336##
1337{ 'struct'  : 'DisplayGTK',
1338  'data'    : { '*grab-on-hover' : 'bool',
1339                '*zoom-to-fit'   : 'bool',
1340                '*show-tabs'     : 'bool',
1341                '*show-menubar'  : 'bool'  } }
1342
1343##
1344# @DisplayEGLHeadless:
1345#
1346# EGL headless display options.
1347#
1348# @rendernode: Which DRM render node should be used.  Default is the
1349#     first available node on the host.
1350#
1351# Since: 3.1
1352##
1353{ 'struct'  : 'DisplayEGLHeadless',
1354  'data'    : { '*rendernode' : 'str' } }
1355
1356##
1357# @DisplayDBus:
1358#
1359# DBus display options.
1360#
1361# @addr: The D-Bus bus address (default to the session bus).
1362#
1363# @rendernode: Which DRM render node should be used.  Default is the
1364#     first available node on the host.
1365#
1366# @p2p: Whether to use peer-to-peer connections (accepted through
1367#     @add_client).
1368#
1369# @audiodev: Use the specified DBus audiodev to export audio.
1370#
1371# Since: 7.0
1372##
1373{ 'struct'  : 'DisplayDBus',
1374  'data'    : { '*rendernode' : 'str',
1375                '*addr': 'str',
1376                '*p2p': 'bool',
1377                '*audiodev': 'str' } }
1378
1379##
1380# @DisplayGLMode:
1381#
1382# Display OpenGL mode.
1383#
1384# @off: Disable OpenGL (default).
1385#
1386# @on: Use OpenGL, pick context type automatically.  Would better be
1387#     named 'auto' but is called 'on' for backward compatibility with
1388#     bool type.
1389#
1390# @core: Use OpenGL with Core (desktop) Context.
1391#
1392# @es: Use OpenGL with ES (embedded systems) Context.
1393#
1394# Since: 3.0
1395##
1396{ 'enum'    : 'DisplayGLMode',
1397  'data'    : [ 'off', 'on', 'core', 'es' ] }
1398
1399##
1400# @DisplayCurses:
1401#
1402# Curses display options.
1403#
1404# @charset: Font charset used by guest (default: CP437).
1405#
1406# Since: 4.0
1407##
1408{ 'struct'  : 'DisplayCurses',
1409  'data'    : { '*charset'       : 'str' } }
1410
1411##
1412# @DisplayCocoa:
1413#
1414# Cocoa display options.
1415#
1416# @left-command-key: Enable/disable forwarding of left command key to
1417#     guest.  Allows command-tab window switching on the host without
1418#     sending this key to the guest when "off". Defaults to "on"
1419#
1420# @full-grab: Capture all key presses, including system combos.  This
1421#     requires accessibility permissions, since it performs a global
1422#     grab on key events.  (default: off) See
1423#     https://support.apple.com/en-in/guide/mac-help/mh32356/mac
1424#
1425# @swap-opt-cmd: Swap the Option and Command keys so that their key
1426#     codes match their position on non-Mac keyboards and you can use
1427#     Meta/Super and Alt where you expect them.  (default: off)
1428#
1429# @zoom-to-fit: Zoom guest display to fit into the host window.  When
1430#     turned off the host window will be resized instead.  Defaults to
1431#     "off".  (Since 8.2)
1432#
1433# @zoom-interpolation: Apply interpolation to smooth output when
1434#     zoom-to-fit is enabled. Defaults to "off".  (Since 9.0)
1435#
1436# Since: 7.0
1437##
1438{ 'struct': 'DisplayCocoa',
1439  'data': {
1440      '*left-command-key': 'bool',
1441      '*full-grab': 'bool',
1442      '*swap-opt-cmd': 'bool',
1443      '*zoom-to-fit': 'bool',
1444      '*zoom-interpolation': 'bool'
1445  } }
1446
1447##
1448# @HotKeyMod:
1449#
1450# Set of modifier keys that need to be held for shortcut key actions.
1451#
1452# Since: 7.1
1453##
1454{ 'enum'  : 'HotKeyMod',
1455  'data'  : [ 'lctrl-lalt', 'lshift-lctrl-lalt', 'rctrl' ] }
1456
1457##
1458# @DisplaySDL:
1459#
1460# SDL2 display options.
1461#
1462# @grab-mod: Modifier keys that should be pressed together with the
1463#     "G" key to release the mouse grab.
1464#
1465# Since: 7.1
1466##
1467{ 'struct'  : 'DisplaySDL',
1468  'data'    : { '*grab-mod'   : 'HotKeyMod' } }
1469
1470##
1471# @DisplayType:
1472#
1473# Display (user interface) type.
1474#
1475# @default: The default user interface, selecting from the first
1476#     available of gtk, sdl, cocoa, and vnc.
1477#
1478# @none: No user interface or video output display.  The guest will
1479#     still see an emulated graphics card, but its output will not be
1480#     displayed to the QEMU user.
1481#
1482# @gtk: The GTK user interface.
1483#
1484# @sdl: The SDL user interface.
1485#
1486# @egl-headless: No user interface, offload GL operations to a local
1487#     DRI device.  Graphical display need to be paired with VNC or
1488#     Spice.  (Since 3.1)
1489#
1490# @curses: Display video output via curses.  For graphics device
1491#     models which support a text mode, QEMU can display this output
1492#     using a curses/ncurses interface.  Nothing is displayed when the
1493#     graphics device is in graphical mode or if the graphics device
1494#     does not support a text mode.  Generally only the VGA device
1495#     models support text mode.
1496#
1497# @cocoa: The Cocoa user interface.
1498#
1499# @spice-app: Set up a Spice server and run the default associated
1500#     application to connect to it.  The server will redirect the
1501#     serial console and QEMU monitors.  (Since 4.0)
1502#
1503# @dbus: Start a D-Bus service for the display.  (Since 7.0)
1504#
1505# Since: 2.12
1506##
1507{ 'enum'    : 'DisplayType',
1508  'data'    : [
1509    { 'name': 'default' },
1510    { 'name': 'none' },
1511    { 'name': 'gtk', 'if': 'CONFIG_GTK' },
1512    { 'name': 'sdl', 'if': 'CONFIG_SDL' },
1513    { 'name': 'egl-headless', 'if': 'CONFIG_OPENGL' },
1514    { 'name': 'curses', 'if': 'CONFIG_CURSES' },
1515    { 'name': 'cocoa', 'if': 'CONFIG_COCOA' },
1516    { 'name': 'spice-app', 'if': 'CONFIG_SPICE' },
1517    { 'name': 'dbus', 'if': 'CONFIG_DBUS_DISPLAY' }
1518  ]
1519}
1520
1521##
1522# @DisplayOptions:
1523#
1524# Display (user interface) options.
1525#
1526# @type: Which DisplayType qemu should use.
1527#
1528# @full-screen: Start user interface in fullscreen mode
1529#     (default: off).
1530#
1531# @window-close: Allow to quit qemu with window close button
1532#     (default: on).
1533#
1534# @show-cursor: Force showing the mouse cursor (default: off).
1535#     (since: 5.0)
1536#
1537# @gl: Enable OpenGL support (default: off).
1538#
1539# Since: 2.12
1540##
1541{ 'union'   : 'DisplayOptions',
1542  'base'    : { 'type'           : 'DisplayType',
1543                '*full-screen'   : 'bool',
1544                '*window-close'  : 'bool',
1545                '*show-cursor'   : 'bool',
1546                '*gl'            : 'DisplayGLMode' },
1547  'discriminator' : 'type',
1548  'data'    : {
1549      'gtk': { 'type': 'DisplayGTK', 'if': 'CONFIG_GTK' },
1550      'cocoa': { 'type': 'DisplayCocoa', 'if': 'CONFIG_COCOA' },
1551      'curses': { 'type': 'DisplayCurses', 'if': 'CONFIG_CURSES' },
1552      'egl-headless': { 'type': 'DisplayEGLHeadless',
1553                        'if': 'CONFIG_OPENGL' },
1554      'dbus': { 'type': 'DisplayDBus', 'if': 'CONFIG_DBUS_DISPLAY' },
1555      'sdl': { 'type': 'DisplaySDL', 'if': 'CONFIG_SDL' }
1556  }
1557}
1558
1559##
1560# @query-display-options:
1561#
1562# Returns information about display configuration
1563#
1564# Returns: @DisplayOptions
1565#
1566# Since: 3.1
1567##
1568{ 'command': 'query-display-options',
1569  'returns': 'DisplayOptions' }
1570
1571##
1572# @DisplayReloadType:
1573#
1574# Available DisplayReload types.
1575#
1576# @vnc: VNC display
1577#
1578# Since: 6.0
1579##
1580{ 'enum': 'DisplayReloadType',
1581  'data': ['vnc'] }
1582
1583##
1584# @DisplayReloadOptionsVNC:
1585#
1586# Specify the VNC reload options.
1587#
1588# @tls-certs: reload tls certs or not.
1589#
1590# Since: 6.0
1591##
1592{ 'struct': 'DisplayReloadOptionsVNC',
1593  'data': { '*tls-certs': 'bool' } }
1594
1595##
1596# @DisplayReloadOptions:
1597#
1598# Options of the display configuration reload.
1599#
1600# @type: Specify the display type.
1601#
1602# Since: 6.0
1603##
1604{ 'union': 'DisplayReloadOptions',
1605  'base': {'type': 'DisplayReloadType'},
1606  'discriminator': 'type',
1607  'data': { 'vnc': 'DisplayReloadOptionsVNC' } }
1608
1609##
1610# @display-reload:
1611#
1612# Reload display configuration.
1613#
1614# Since: 6.0
1615#
1616# .. qmp-example::
1617#
1618#     -> { "execute": "display-reload",
1619#          "arguments": { "type": "vnc", "tls-certs": true  } }
1620#     <- { "return": {} }
1621##
1622{ 'command': 'display-reload',
1623  'data': 'DisplayReloadOptions',
1624  'boxed' : true }
1625
1626##
1627# @DisplayUpdateType:
1628#
1629# Available DisplayUpdate types.
1630#
1631# @vnc: VNC display
1632#
1633# Since: 7.1
1634##
1635{ 'enum': 'DisplayUpdateType',
1636  'data': ['vnc'] }
1637
1638##
1639# @DisplayUpdateOptionsVNC:
1640#
1641# Specify the VNC reload options.
1642#
1643# @addresses: If specified, change set of addresses to listen for
1644#     connections.  Addresses configured for websockets are not
1645#     touched.
1646#
1647# Since: 7.1
1648##
1649{ 'struct': 'DisplayUpdateOptionsVNC',
1650  'data': { '*addresses': ['SocketAddress'] } }
1651
1652##
1653# @DisplayUpdateOptions:
1654#
1655# Options of the display configuration reload.
1656#
1657# @type: Specify the display type.
1658#
1659# Since: 7.1
1660##
1661{ 'union': 'DisplayUpdateOptions',
1662  'base': {'type': 'DisplayUpdateType'},
1663  'discriminator': 'type',
1664  'data': { 'vnc': 'DisplayUpdateOptionsVNC' } }
1665
1666##
1667# @display-update:
1668#
1669# Update display configuration.
1670#
1671# Since: 7.1
1672#
1673# .. qmp-example::
1674#
1675#     -> { "execute": "display-update",
1676#          "arguments": { "type": "vnc", "addresses":
1677#                         [ { "type": "inet", "host": "0.0.0.0",
1678#                             "port": "5901" } ] } }
1679#     <- { "return": {} }
1680##
1681{ 'command': 'display-update',
1682  'data': 'DisplayUpdateOptions',
1683  'boxed' : true }
1684
1685##
1686# @client_migrate_info:
1687#
1688# Set migration information for remote display.  This makes the server
1689# ask the client to automatically reconnect using the new parameters
1690# once migration finished successfully.  Only implemented for SPICE.
1691#
1692# @protocol: must be "spice"
1693#
1694# @hostname: migration target hostname
1695#
1696# @port: spice tcp port for plaintext channels
1697#
1698# @tls-port: spice tcp port for tls-secured channels
1699#
1700# @cert-subject: server certificate subject
1701#
1702# Since: 0.14
1703#
1704# .. qmp-example::
1705#
1706#     -> { "execute": "client_migrate_info",
1707#          "arguments": { "protocol": "spice",
1708#                         "hostname": "virt42.lab.kraxel.org",
1709#                         "port": 1234 } }
1710#     <- { "return": {} }
1711##
1712{ 'command': 'client_migrate_info',
1713  'data': { 'protocol': 'str', 'hostname': 'str', '*port': 'int',
1714            '*tls-port': 'int', '*cert-subject': 'str' } }
1715