Client-to-Server DMX Extension to the X Protocol

	   $Date$, $Revision$

	       Rickard E. (Rik) Faith (faith@redhat.com)
		    Kevin E. Martin (kem@redhat.com)

    Copyright 2002,2003 Red Hat Inc., Raleigh, North Carolina.

    Permission is hereby granted, free of charge, to any person
    obtaining a copy of this software and associated documentation files
    (the "Software"), to deal in the Software without restriction,
    including without limitation on the rights to use, copy, modify,
    merge, publish, distribute, sublicense, and/or sell copies of the
    Software, and to permit persons to whom the Software is furnished to
    do so, subject to the following conditions:

    The above copyright notice and this permission notice (including the
    next paragraph) shall be included in all copies or substantial
    portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.



1. Overview

    The client-to-server DMX extension to the X protocol (DMX) provides
    normal client applications with the ability to determine information
    about the characteristics of the Xdmx server and the back-end X
    servers that DMX is using.

    The name for this extension is "DMX".



2. Syntactic conventions

    This document uses the same syntactic conventions requests and data
    types as [X11R6.4].



3. Data types

    No new data types are defined by this extension. All data types
    referenced in this document are defined in [X11R6.4].



4. Requests

    DMXQueryVersion
	==>
	majorVersion: CARD32
	minorVersion: CARD32
	patchVersion: CARD32

    The protocol this extension actually supports is indicated by
    majorVersion and minorVersion (patchVersion indicates the
    patchlevel and is for informational purposes only).

    Any incompatible changes to the protocol should be indicated by
    incrementing majorVersion.

    Small, upward-compatible changes should be indicated by incrementing
    minorVersion.

    Servers that support the protocol defined in this document will
    return a majorVersion of 1 and a minorVersion of 1.



    DMXGetScreenCount
	==>
	screenCount: CARD32

    This request returns the number of back-end screens that the Xdmx
    server controls. A back-end screen may be managed as a regular X
    screen in the Xdmx server or may be joined with other back-end
    screens using Xinerama. (The information returned by this request
    does not change while Xdmx is running and may be cached on the
    client side.)



    DMXGetScreenInformation
	physicalScreen: CARD32
	==>
	displayName: STRING8
	width: CARD16
	height: CARD16
	xoffset: INT16
	yoffset: INT16
	logicalScreen: CARD32
	xorigin: INT16
	yorigin: INT16

	Errors: Value

    This request returns information about individual back-end screens.
    The physicalScreen value is between 0 and screenCount-1, inclusive
    (values outside this range will result in a Value error). The
    displayname is the name used to open the display, either from the
    Xdmx command-line or from the configuration file. The width,
    height, xoffset, and yoffset values comprise a geometry
    specification (see X(7x)) for the location of the DMX window on the
    back-end screen. This request will always return non-negative
    (i.e., normalized) values for xoffset and yoffset. The
    logicalScreen value is the value of the screen that that Xdmx server
    exports to clients. When Xinerama is in use, this value is
    typically 0 for all values of physicalScreen. If Xinerama is in
    use, the xorigin and yorigin values specify where the physical
    screen is positioned in the global Xinerama coordinate system.
    Otherwise, these values are set to 0. (The information returned by
    this request does not change while Xdmx is running and may be cached
    on the client side.)



    DMXGetWindowInformation
	window: CARD32
	==>
	screenCount: CARD32
	screens: LISTofCARD32
	windows: LISTofCARD32
	pos: LISTofRECTANGLE
	vis: LISTofRECTANGLE

	Errors: Window, Alloc

    This request computed the return values incorrectly for version 1.0
    of this protocol. Version 1.1 of this protocol conforms to this
    description.

    Given a window ID on the Xdmx server, this request returns data
    about how the window is represented on the back-end X servers. For
    each back-end X server that displays a portion of the window, the
    following information is returned:
	1) the number of the physical screen containing that portion
	   (which can be used with the DMXGetScreenInformation request
	   to obtain more information about the screen),
	2) the window ID on the back-end X server of the window
	   containing that portion,
	3) the position and dimensions of the window on the back-end, in
	   screen coordinates, and
	4) the visible area of the window on the back-end, in
	   window-relative coordinates (all zeros for windows that are
	   not visible)
    Note that DMX allows multiple back-end windows to overlap in their
    view of the DMX logical window. Further, a logical window does not
    have to be completely covered by back-end windows -- there may be
    gaps.

    As an example, consider a 500x500 window that spans the top two
    1024x768 back-end displays (A and B) of a 2048x1536 DMX display
    composed of 4 1024x768 back-end displays arranged in a cube:
	A B
	C D

    In this case, the DMXGetWindowInformation call would return the
    following information for the 500x500 window:

    display A: 500x500 window at 1024-250,0 (relative to back end)
	       with 250x500 visible at 0,0 (relative to window origin)

    display B: 500x500 window at -250,0 (relative to back end)
	       with 250x500 visible at 250,0 (relative to window origin)

    display C: 500x500 window at 1024-250,-768 with 0x0 visible at 0,0

    display D: 500x500 window at -250,-768 with 0x0 visible at 0,0

    Note that if the specified window has not yet been mapped when
    DMXGetWindowInformation is called, then a subsequent XMapWindow call
    might be buffered in xlib while requests directly to the back-end X
    servers are processed. This race condition can be solved by calling
    DMXSync before talking directly to the back-end X servers.


    DMXGetInputCount
	==>
	inputCount: CARD32

    This request was first supported in version 1.1 of this protocol.

    This request returns the number of input devices connected to the
    Xdmx server. This number is the same as that returned by
    XListInputDevices, but is available even when the XInput extension
    is not supported.



    DMXGetInputInformation
	deviceId: CARD32
	==>
	inputType: CARD32
	physicalScreen: CARD32
	physicalId: CARD32
	isCore: BOOL
	sendsCore: BOOL
	name: STRING8

	Errors: Value

    This request was first supported in version 1.1 of this protocol.

    This request returns information about the specified input device
    that cannot be obtained from the XListInputDeivices call. The
    deviceId is the same as that used by the XListInputDevices call, and
    must be in the range 0 to inputCount-1, inclusive (values outside
    this range will result in a Value error).

    The value of inputType will always be value, and will be one of the
    following values:
	0 for local (and dummy) devices,
	1 for console devices, and
	2 for back-end devices.

    For local devices, all other fields returned, except isCore and
    sendsCore, are invalid.

    For console devices, the physicalScreen and physicalID will be
    invalid, and the name will return the name of the X server on which
    the console window is displayed.

    For back-end devices, the physicalScreen will identify the back-end
    display and can be used as an argument to DMXGetScreenInformation to
    obtain more information; the physicalId will be the XInput device id
    on the back-end X server; and the name will be invalid (since it
    does not provide any additional information that cannot be obtained
    with DMXGetScreenInformation).

    If isCore is True, then this device is active as a true core input
    device and will send core events. If sendsCore is True, then this
    device queried an XInput extension device, but sends core events
    instead of extension events. Note that this behavior is different
    from that of XFree86, where XInput extension devices may send both
    extension events and core events.



    DMXForceWindowCreation
	window: CARD32
	==>

	Errors: Window

    This request was first supported in version 1.2 of this protocol.

    When using the lazy window creation optimization, windows are not
    created on the back-end X servers until they are required. This
    request forces the immediate creation of the window requested.



    DMXReconfigureScreen
	screen: CARD32
	x: INT16
	y: INT16
	==>
	status: CARD32

	Errors: Value

    This request was first supported in version 1.3 of this protocol.

    This request reconfigures the screen position to coordinates (x,y)
    when using the Xinerama extension. Otherwise, it is a NOP. Illegal
    values for screen will result in a BadValue error. Other non-fatal
    errors will be returned in status.



    DMXSync
	==>

    This request was first supported in version 1.5 of this protocol.

    This request flushes all pending protocol requests between the Xdmx
    server and each back-end X server. It is used by a client that
    talks directly to back-end X servers

    To ensure proper synchronization semantics, this request has a
    reply, but the reply does not carry any information.



5. Events

    No new events are defined by this extension.



6. Errors

    No new events are defined by this extension.



7. Encoding

    DMXQueryVersion
	1 CARD8 opcode (X assigned)
	1 0 DMX opcode (X_DMXQueryVersion)
	2 1 request length
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 0 reply length
	4 CARD32 majorVersion
	4 CARD32 minorVersion
	4 CARD32 patchVersion
	12 unused

    DMXGetScreenCount
	1 CARD8 opcode (X assigned)
	1 1 DMX opcode (X_DMXGetScreenCount)
	2 1 request length
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 0 reply length
	4 CARD32 screenCount
	20 unused

    DMXGetScreenInformation
	1 CARD8 opcode (X assigned)
	1 2 DMX opcode (X_DMXGetScreenInformation)
	2 2 request length
	4 CARD32 physicalScreen
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 n/4+p reply length
	4 n displayNameLength
	2 CARD16 width
	2 CARD16 height
	2 INT16 xoffset
	2 INT16 yoffset
	4 CARD32 logicalScreen
	2 INT16 xorigin
	2 INT16 yorigin
	4 unused
	n displayName
	p pad(n)

    DMXGetWindowInformation
	1 CARD8 opcode (X assigned)
	1 3 DMX opcode (X_DMXGetWindowInformation)
	2 2 request length
	4 CARD32 window
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 n*6 reply length
	4 n screenCount
	20 unused
	n*4 LISTofCARD32 screens
	n*4 LISTofCARD32 windows
	n*8 LISTofRECTANGLE pos
	n*8 LISTofRECTANGLE vis

    DMXGetInputCount
	1 CARD8 opcode (X assigned)
	1 DMX opcode (X_DMXGetInputCount)
	2 1 request length
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 0 reply length
	4 CARD32 inputCount
	20 unused

    DMXGetInputInformation
	1 CARD8 opcode (X assigned)
	1 4 DMX opcode (X_DMXGetInputInformation)
	2 2 request length
	4 CARD32 deviceId
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 n/4+p reply length
	4 CARD32 inputType
	4 CARD32 physicalScreen
	4 CARD32 physicalId
	4 n nameLength
	1 BOOL isCore
	1 BOOL sendsCore
	6 unused
	n name
	p pad(n)

    DMXForceWindowCreation
	1 CARD8 opcode (X assigned)
	1 2 DMX opcode (X_DMXForceWindowCreation)
	2 2 request length
	4 CARD32 window
    ==>

    DMXReconfigureScreen
	1 CARD8 opcode (X assigned)
	1 2 DMX opcode (X_DMXReconfigureScreen)
	2 2 request length
	4 CARD32 screen
	2 INT16 x
	2 INT16 y
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 0 reply length
	4 CARD32 status
	20 unused

    DMXSync
	1 CARD8 opcode (X assigned)
	1 0 DMX opcode (X_DMXSync)
	2 1 request length
    ==>
	1 1 Reply
	1 unused
	2 CARD16 sequence number
	4 0 reply length
	24 unused


8. Changes to existing requests/replies/events

    No changes to existing requests, replies, or events are necessitated
    by this extension.



9. Acknowledgments



10. References

    [X11R6.4] Robert W. Sheifler. X Window System Protocol, X Consortium
	      Standard, X Version 11, Release 6.4. Available from
	      xc/doc/specs/XProtocol and xc/doc/hardcopy/XProtocol.