Revision: 4429
          http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4429&view=rev
Author:   ossman_
Date:     2011-05-19 09:35:36 +0000 (Thu, 19 May 2011)

Log Message:
-----------
QEMU protocol extensions

Document three QEMU protocol extensions:

 - Pointer motion mode: Allows switching between relative & absolute
   motion events
 - Extended key event: Allows providing the hardware keycode alongside
   the X11 keysym in key events
 - Audio: Allows client to receive the audio stream associated with
   the virtual desktop.

Documentation provided by Daniel P. Berrange.

Signed-off-by: Pierre Ossman <[email protected]>

Modified Paths:
--------------
    rfbproto/rfbproto.rst

Modified: rfbproto/rfbproto.rst
===================================================================
--- rfbproto/rfbproto.rst       2011-05-17 21:30:11 UTC (rev 4428)
+++ rfbproto/rfbproto.rst       2011-05-19 09:35:36 UTC (rev 4429)
@@ -818,7 +818,7 @@
 =========== ===========================================================
 Number      Name
 =========== ===========================================================
-255         Anthony Liguori
+255         `QEMU Client Message`_
 254, 127    VMWare
 253         `gii Client Message`_
 252         tight
@@ -1099,6 +1099,10 @@
 2               ``U16``                         *y-position*
 =============== ==================== ========== =======================
 
+The `QEMU Pointer Motion Change Psuedo-encoding`_ allows for the
+negotiation of an alternative interpretation for the *x-position*
+and *y-position* fields, as relative deltas.
+
 ClientCutText
 -------------
 
@@ -1469,6 +1473,151 @@
 established that the server supports this extension, by requesting the
 `xvp Pseudo-encoding`_.
 
+QEMU Client Message
+-------------------
+
+This message may only be sent if the client has previously received
+a *FrameBufferUpdate* that confirms support for the intended
+*submessage-type*. Every ``QEMU Client Message`` begins with
+a standard header
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``                          *submessage-type*
+=============== ==================== ========== =======================
+
+This header is then followed by arbitrary data whose format is
+determined by the *submessage-type*. Possible values for
+*submessage-type* and their associated psuedo encodings are
+
+================ ================ ====================
+Submessage Type  Psuedo Encoding  Description
+================ ================ ====================
+0                -258             Extended key events
+1                -259             Audio
+================ ================ ====================
+
+QEMU Extended Key Event Message
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This submessage allows the client to send an extended key event
+containing a keycode, in addition to a keysym. The advantage of
+providing the keycode is that it enables the server to interpret
+the key event independantly of the clients' locale specific
+keymap. This can be important for virtual desktops whose key
+input device requires scancodes, for example, virtual machines
+emulating a PS/2 keycode. Prior to this extension, RFB servers
+for such virtualization software would have to be configured
+with a keymap matching the client. With this extension it is
+sufficient for the guest operating system to be configured with
+the matching keymap. The VNC server is keymap independant.
+
+The full message is:
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``               0          *submessage-type*
+2               ``U16``                         *down-flag*
+4               ``U32``                         *keysym*
+4               ``U32``                         *keycode*
+=============== ==================== ========== =======================
+
+The *keysym* and *down-flag* fields also take the same values as
+described for the `KeyEvent`_ message. Auto repeating behaviour
+of keys is also as described for the `KeyEvent`_ message.
+
+The *keycode* is the XT keycode that produced the *keysym*. An
+XT keycode is an XT make scancode sequence encoded to fit in
+a single ``U32`` quantity. Single byte XT scancodes with a byte
+value less than 0x7f are encoded as is. 2-byte XT scancodes
+whose first byte is 0xe0 and second byte is less than 0x7f are
+encoded with the high bit of the first byte set. Some example
+mappings are
+
+============= ================== ============ ==========
+XT scancode   X11 keysym         RFB keycode  down-flag
+============= ================== ============ ==========
+0x1e          XK_A (0x41)        0x1e         1
+0x9e          XK_A (0x41)        0x1e         0
+0xe0 0x4d     XK_Right (0xff53)  0xcd         1
+0xe0 0xcd     XK_Right (0xff53)  0xcd         0
+============= ================== ============ ==========
+
+
+QEMU Audio Client Message
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This submessage allows the client to control how the audio data
+stream is received. There are three operations that can be invoked
+with this submessage, the payload varies according to which
+operation is requested.
+
+The first operation enables audio capture from the server:
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``               1          *submessage-type*
+2               ``U16``              0          *operation*
+=============== ==================== ========== =======================
+
+After invoking this operation, the client will receive a
+`QEMU Audio Server Message`_ when an audio stream begins.
+
+The second operation is the inverse, to disable audio capture
+on the server:
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``               1          *submessage-type*
+2               ``U16``              1          *operation*
+=============== ==================== ========== =======================
+
+Due to inherant race conditions in the protocol, after invoking this
+operation, the client may still receive further
+`QEMU Audio Server Message`_ messages for a short time.
+
+The third and final operation is to set the audio sample format.
+This should be set before audio capture is enabled on the server,
+otherwise the client will not be able to reliably interpret the
+receiving audio buffers:
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``               1          *submessage-type*
+2               ``U16``              2          *operation*
+1               ``U8``                          *sample-format*
+1               ``U8``                          *nchannels*
+4               ``U32``                         *frequency*
+=============== ==================== ========== =======================
+
+The *sample-format* field must take one of the following values,
+and this describes the number of bytes that each sample will
+consume:
+
+====== ============= =======
+Value  No. of bytes  Type
+====== ============= =======
+0      1             ``U8``
+1      1             ``S8``
+2      2             ``U16``
+3      2             ``S16``
+4      4             ``U32``
+5      4             ``S32``
+====== ============= =======
+
+The *nchannels* field must be either ``1`` (mono) or ``2`` (stereo).
+
+
 Server to Client Messages
 +++++++++++++++++++++++++
 
@@ -1488,7 +1637,7 @@
 =========== ===========================================================
 Number      Name
 =========== ===========================================================
-255         Anthony Liguori
+255         QEMU
 254, 127    VMWare
 253         `gii Server Message`_
 252         tight
@@ -1681,6 +1830,80 @@
 by sending a message with an XVP_FAIL *xvp-message-code*, and the same
 *xvp-extension-version* as included in the client's operation request.
 
+QEMU Server Message
+-------------------
+
+This message may only be sent if the client has previously received
+a *FrameBufferUpdate* that confirms support for the intended
+*submessage-type*. Every ``QEMU Server Message`` begins with
+a standard header
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``                          *submessage-type*
+=============== ==================== ========== =======================
+
+This header is then followed by arbitrary data whose format is
+determined by the *submessage-type*. Possible values for
+*submessage-type* and their associated psuedo encodings are
+
+================ ================ ====================
+Submessage Type  Psuedo Encoding  Description
+================ ================ ====================
+1                -259             Audio
+================ ================ ====================
+
+Submessage type 0 is unused, since the
+`QEMU Extended Key Event Psuedo-encoding`_ does not require any
+server messages.
+
+QEMU Audio Server Message
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This submessage allows the server to send an audio data stream
+to the client. There are three operations that can be invoked
+with this submessage, the payload varies according to which
+operation is requested.
+
+The first operation informs the client that an audio stream is
+about to start
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``               1          *submessage-type*
+2               ``U16``              1          *operation*
+=============== ==================== ========== =======================
+
+The second operation informs the client that an audio stream has
+now finished:
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``               1          *submessage-type*
+2               ``U16``              0          *operation*
+=============== ==================== ========== =======================
+
+The third and final operation is to provide audio data.
+
+=============== ==================== ========== =======================
+No. of bytes    Type                 [Value]    Description
+=============== ==================== ========== =======================
+1               ``U8``               255        *message-type*
+1               ``U8``               1          *submessage-type*
+2               ``U16``              2          *operation*
+4               ``U32``                         *data-length*
+*data-length*   ``U8`` array                    *data*
+=============== ==================== ========== =======================
+
+The *data-length* will be a multiple of (*sample-format* * *nchannels*)
+as requested by the client in an earlier `QEMU Audio Client Message`_.
+
 Encodings
 +++++++++
 
@@ -1703,6 +1926,9 @@
 -224         `LastRect Pseudo-encoding`_
 -239         `Cursor Pseudo-encoding`_
 -247 to -256 `Compression Level Pseudo-encoding`_
+-257         `QEMU Pointer Motion Change Psuedo-encoding`_
+-258         `QEMU Extended Key Event Psuedo-encoding`_
+-259         `QEMU Audio Psuedo-encoding`_
 -305         `gii Pseudo-encoding`_
 -307         `DesktopName Pseudo-encoding`_
 -308         `ExtendedDesktopSize Pseudo-encoding`_
@@ -1720,7 +1946,7 @@
 -33 to -222                 Tight options
 -225 to -238                Tight options
 -240 to -246                Tight options
--257 to -272                Anthony Liguori
+-260 to -272                QEMU
 -273 to -304                VMWare
 -306                        popa
 -412 to -512                TurboVNC fine-grained quality level
@@ -2535,6 +2761,67 @@
 just a hint for the server, and there is no specification for what a
 specific compression level means.
 
+QEMU Pointer Motion Change Psuedo-encoding
+------------------------------------------
+
+A client that supports this encoding declares that is able to send
+pointer motion events either as absolute coordinates, or relative
+deltas. The server can switch between different pointer motion modes
+by sending a `FrameBufferUpdate`_ message. If the *x-position* in
+the update is 1, the server is requesting absolute coordinates, which
+is the RFB protocol default when this encoding is not supported. If
+the *x-position* in the update is 0, the server is requesting relative
+deltas.
+
+When relative delta mode is active, the semantics of the
+`PointerEvent`_ message are changed. The *x-position* and *y-position*
+fields are to be treated as ``S16`` quantities, denoting the delta
+from the last position. A client can compute the signed deltas with
+the logic::
+
+  uint16 dx = x + 0x7FFF - last_x
+  uint16 dy = y + 0x7FFF - last_y
+
+If the client needs to send an updated *button-mask* without
+any associated motion, it should use the value 0x7FFF in the
+*x-position* and *y-position* fields of the `PointerEvent`_
+
+Servers are advised to implement this psuedo-encoding if the virtual
+desktop is associated a input device that expects relative coordinates,
+for example, a virtual machine with a PS/2 mouse. Prior to this
+extension, a server with such a input device would have to perform the
+absolute to relative delta conversion itself. This can result in the
+client pointer hitting an "invisible wall".
+
+Clients are advised that when generating events in relative pointer
+mode, they should grab and hide the local pointer. When the local
+pointer hits any edge of the client window, it should be warped
+back by 100 pixels. This ensures that continued movement of the
+user's input device will continue to generate relative deltas and
+thus avoid the "invisible wall" problem.
+
+QEMU Extended Key Event Psuedo-encoding
+---------------------------------------
+
+A client that supports this encoding is indicating that it is able
+to provide raw keycodes as an alternative to keysyms. If a server
+wishes to receive raw keycodes it will send a `FrameBufferUpdate`_
+with the matching psuedo-encoding and the *num-rectanges* field
+set to 1, however, no rectanges will actually be sent. After receiving
+this notification, clients may optionally use the
+`QEMU Extended Key Event Message`_ to send key events, in preference
+to the traditional `KeyEvent`_ message.
+
+QEMU Audio Psuedo-encoding
+--------------------------
+
+A client that supports this encoding is indicating that it is able
+to receive an audio data stream. If a server wishes to send audio
+data it will send a `FrameBufferUpdate`_ with the matching
+psuedo-encoding and the *num-rectangles* field set to 1, however, no
+rectangles will actually be sent. After receiving this notification,
+clients may optionally use the `QEMU Audio Client Message`_.
+
 gii Pseudo-encoding
 -------------------
 


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------
What Every C/C++ and Fortran developer Should Know!
Read this article and learn how Intel has extended the reach of its 
next-generation tools to help Windows* and Linux* C/C++ and Fortran 
developers boost performance applications - including clusters. 
http://p.sf.net/sfu/intel-dev2devmay
_______________________________________________
Tigervnc-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tigervnc-commits

Reply via email to