1517 lines
51 KiB
XML
1517 lines
51 KiB
XML
|
<?xml version="1.0" encoding="UTF-8" ?>
|
|||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
|||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
|
|||
|
|
|||
|
|
|||
|
<!-- lifted from troff+ms+XMan by doclifter -->
|
|||
|
<book id="recordlib">
|
|||
|
|
|||
|
<bookinfo>
|
|||
|
<title>X Record Extension Library</title>
|
|||
|
<subtitle>X Consortium Standard</subtitle>
|
|||
|
<releaseinfo>X Version 11, Release 6.7</releaseinfo>
|
|||
|
<authorgroup>
|
|||
|
<author>
|
|||
|
<firstname>Martha</firstname><surname>Zimet</surname>
|
|||
|
</author>
|
|||
|
</authorgroup>
|
|||
|
<corpname>Network Computing Devices, Inc.</corpname>
|
|||
|
<copyright><year>1994</year><holder>Network Computing Devices, Inc.</holder></copyright>
|
|||
|
<copyright><year>1995</year><holder>X Consortium</holder></copyright>
|
|||
|
<releaseinfo>Version 1.13</releaseinfo>
|
|||
|
<affiliation><orgname>X Consortium</orgname></affiliation>
|
|||
|
<productnumber>X Version 11, Release 6.7</productnumber>
|
|||
|
<editor>
|
|||
|
<firstname>Stephen</firstname><surname>Gildea</surname>
|
|||
|
<affiliation><orgname>X Consortium</orgname></affiliation>
|
|||
|
</editor>
|
|||
|
|
|||
|
<legalnotice>
|
|||
|
|
|||
|
<para>
|
|||
|
Permission to use, copy, modify, distribute, and sell this
|
|||
|
documentation for any purpose is hereby granted without fee,
|
|||
|
provided that the above copyright notice and this permission
|
|||
|
notice appear in all copies. Network Computing Devices, Inc.
|
|||
|
makes no representations about the suitability for any purpose
|
|||
|
of the information in this document. This documentation is
|
|||
|
provided "as is" without express or implied warranty.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
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 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:
|
|||
|
</para>
|
|||
|
|
|||
|
<para>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 NONINFRINGEMENT.
|
|||
|
IN NO EVENT SHALL THE X CONSORTIUM 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.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
Except as contained in this notice, the name of the X Consortium shall
|
|||
|
not be used in advertising or otherwise to promote the sale, use or other
|
|||
|
dealings in this Software without prior written authorization from the
|
|||
|
X Consortium.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>X Window System is a trademark of The Open Group.</para>
|
|||
|
</legalnotice>
|
|||
|
</bookinfo>
|
|||
|
|
|||
|
<chapter id="record_extension_overview">
|
|||
|
<title>Record Extension Overview</title>
|
|||
|
<para>
|
|||
|
The purpose of this extension is to support the recording and reporting of
|
|||
|
all core X protocol and arbitrary X extension protocol. This first section
|
|||
|
gives an overview of the Record extension. The following sections describe
|
|||
|
how to use the Record extension library.
|
|||
|
</para>
|
|||
|
|
|||
|
<sect1 id="synchronous_playback">
|
|||
|
<title>Synchronous Playback</title>
|
|||
|
<para>
|
|||
|
Environment information is generally provided to an X-based playback
|
|||
|
mechanism, which might use the XTest extension to synthesize input
|
|||
|
events. This synchronization information defines the X state prior to
|
|||
|
event synthesis (for example, location of the cursor, window locations
|
|||
|
and sizes, installed colormap, window manager running, and so on) and
|
|||
|
the consequences that occur after the playback mechanism synthesizes
|
|||
|
the event. If the user moves the mouse into the icon window and presses
|
|||
|
and releases a mouse button, the device events
|
|||
|
<function>MotionNotify</function>, <function>ButtonPress</function>,
|
|||
|
and <function>ButtonRelease</function> are generated by the X server.
|
|||
|
Because X follows an
|
|||
|
event-driven model, there are consequences that follow from the user
|
|||
|
actions, or device events, that are in the form of X protocol. As a result
|
|||
|
of the previous user actions, the client could generate requests such as
|
|||
|
<function>ImageText8</function> and <function>PolyLine</function> to the
|
|||
|
X server, or the X server could send non-device events such as
|
|||
|
<function>Expose</function> and <function>MapNotify</function> to the
|
|||
|
client window. Both the
|
|||
|
requests and non-device events that result from user actions are known
|
|||
|
as consequences, which can be used as a synchronization, or control point,
|
|||
|
during playback. That is, the playback mechanism does not generate a specific
|
|||
|
synthesized event until its matching synchronization condition occurs
|
|||
|
(for example, the window is mapped or unmapped, the cursor changes, a text
|
|||
|
string displays, and so on)
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
Because it cannot be predicted what synchronization information is required
|
|||
|
during playback, the Record extension makes no assumptions about the intended
|
|||
|
use of the recorded data. Facilities exist to record any core X protocol or
|
|||
|
X extension protocol. Therefore, Record does not enforce a specific
|
|||
|
synchronization methodology.
|
|||
|
</para>
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id="design_approach">
|
|||
|
<title>Design Approach</title>
|
|||
|
<para>
|
|||
|
The design approach of the extension is to record core X protocol and
|
|||
|
arbitrary X extension protocol entirely within the X server itself. When
|
|||
|
the extension has been requested to record specific protocol by one or more
|
|||
|
recording clients, the protocol data is formatted and returned to the
|
|||
|
recording clients. The extension provides a mechanism for capturing all
|
|||
|
events, including input device events that do not go to any clients.
|
|||
|
</para>
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id="record_clients">
|
|||
|
<title>Record Clients</title>
|
|||
|
<para>
|
|||
|
The recommended communication model for a Record application is to open two
|
|||
|
connections to the server—one connection for recording control and one
|
|||
|
connection for reading recorded protocol data.
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
Information about recording (for example, what clients to record, what
|
|||
|
protocol to record for each client, and so on) is stored in resources
|
|||
|
called record contexts (type <function>XRecordContext</function>). Most
|
|||
|
Record extension functions take a record context as an argument. Although
|
|||
|
in theory it is possible to share record contexts between applications,
|
|||
|
it is expected that applications will use their own context when performing
|
|||
|
recording operations.
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
A client that wishes to record X protocol does so through the library
|
|||
|
functions defined in
|
|||
|
<link linkend="library_extension_requests">
|
|||
|
<xref linkend="library_extension_requests"></xref></link>
|
|||
|
A typical sequence of requests that a client would make is as follows:
|
|||
|
</para>
|
|||
|
<itemizedlist>
|
|||
|
<listitem>
|
|||
|
<para>
|
|||
|
<function>XRecordQueryVersion</function>
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
query the extension protocol version.
|
|||
|
</para>
|
|||
|
</listitem>
|
|||
|
<listitem>
|
|||
|
<para>
|
|||
|
<function>XRecordCreateContext</function>
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
request that the server create a record context for access by this client,
|
|||
|
and express interest in clients and protocol to be recorded. This request
|
|||
|
returns an <function>XRecord-Context</function>, which is an XID that is
|
|||
|
used by most other extension requests to identify the specified context.
|
|||
|
</para>
|
|||
|
</listitem>
|
|||
|
<listitem>
|
|||
|
<para>
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
begin the recording and reporting of protocol data.
|
|||
|
</para>
|
|||
|
</listitem>
|
|||
|
<listitem>
|
|||
|
<para>
|
|||
|
<function>XRecordDisableContext</function>
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
end the recording and reporting of protocol data.
|
|||
|
</para>
|
|||
|
</listitem>
|
|||
|
<listitem>
|
|||
|
<para>
|
|||
|
<function>XRecordFreeContext</function>
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
free the record context.
|
|||
|
</para>
|
|||
|
</listitem>
|
|||
|
</itemizedlist>
|
|||
|
|
|||
|
<para>
|
|||
|
The header for this library is
|
|||
|
<<function>X11/extensions/record.h</function>>. All identifiers defined
|
|||
|
in the interface are supplied by this header and are prefixed with "XRecord".
|
|||
|
The <function>Xtst</function> library contains the
|
|||
|
<function>XRecord</function> functions.
|
|||
|
</para>
|
|||
|
|
|||
|
</sect1>
|
|||
|
</chapter>
|
|||
|
|
|||
|
<chapter id="common_arguments">
|
|||
|
<title>Common Arguments</title>
|
|||
|
<para>
|
|||
|
The Record extension functions <function>XRecordCreateContext</function>
|
|||
|
and <function>XRecordRegisterClients</function> allow applications to
|
|||
|
specify the following:
|
|||
|
</para>
|
|||
|
<itemizedlist>
|
|||
|
<listitem>
|
|||
|
<para>
|
|||
|
Individual clients or sets of clients to record
|
|||
|
</para>
|
|||
|
</listitem>
|
|||
|
<listitem>
|
|||
|
<para>
|
|||
|
Ranges of core X protocol and X extension protocol to record for each client
|
|||
|
</para>
|
|||
|
</listitem>
|
|||
|
</itemizedlist>
|
|||
|
<para>
|
|||
|
Protocol in the ranges specified by the recording client will be recorded
|
|||
|
by the server. The device_events protocol type can be specified by a
|
|||
|
recording client although it may not be sent to a recorded client. The
|
|||
|
device_events type differs from delivered_events, which also can be
|
|||
|
specified by a recording client; delivered_events are actually delivered to
|
|||
|
one or more clients. These event types are discussed in
|
|||
|
<link linkend="protocol_ranges">
|
|||
|
<xref linkend="protocol_ranges"></xref></link>
|
|||
|
</para>
|
|||
|
|
|||
|
|
|||
|
<para>
|
|||
|
The Record extension functions <function>XRecordCreateContext</function>
|
|||
|
and <function>XRecordRegisterClients</function> have the common arguments
|
|||
|
datum_flags, clients, and ranges, which specify whether server time
|
|||
|
and/or client sequence number should precede protocol elements, the
|
|||
|
clients or client set to record, and the protocol ranges to record,
|
|||
|
respectively. These are discussed in the following sections.
|
|||
|
</para>
|
|||
|
|
|||
|
<sect1 id="datum_flags">
|
|||
|
<title>Datum Flags</title>
|
|||
|
<para>
|
|||
|
The datum_flags argument is a set of flags OR’ed together to specify options
|
|||
|
for the record context. Specify zero to disable all the options.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The <function>XRecordFromServerTime</function> flag specifies that
|
|||
|
<function>XRecordInterceptData</function> structures with a category of
|
|||
|
<function>XRecordFromServer</function> will have a server_time field specific to each
|
|||
|
protocol element.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The <function>XRecordFromClientTime</function> flag specifies that
|
|||
|
<function>XRecordInterceptData</function> structures with a category of
|
|||
|
<function>XRecordFromClient</function> will have a server_time field specific
|
|||
|
to each protocol element.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The <function>XRecordFromClientSequence</function> flag specifies that
|
|||
|
<function>XRecordInterceptData</function> structures with a category of
|
|||
|
<function>XRecordFromClient</function> or
|
|||
|
<function>XRecordClientDied</function> will have a valid client_seq field.
|
|||
|
</para>
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id="selecting_clients">
|
|||
|
<title>Selecting Clients</title>
|
|||
|
|
|||
|
<para>
|
|||
|
The clients argument is a pointer to an array of
|
|||
|
<function>XRecordClientSpec</function>.
|
|||
|
<function>XRecordClientSpec</function> is an integral type that holds a
|
|||
|
resource ID, a client resource ID base, or one of the client set constants
|
|||
|
defined below.
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
Duplicate elements in the array are ignored by the functions, and if any
|
|||
|
element in the array is not valid, a
|
|||
|
<function>BadMatch</function>
|
|||
|
error results. A resource ID references the client that created that
|
|||
|
resource. The client set may be one of the following constants:
|
|||
|
<function>XRecordCurrentClients</function>,
|
|||
|
<function>XRecordFutureClients</function>, or
|
|||
|
<function>XRecordAllClients</function>.
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
If the element in the array identifies a particular client, protocol
|
|||
|
specified by the ranges argument will be recorded by the server. The
|
|||
|
recorded protocol data will not be returned to the recording client until
|
|||
|
the record context has been enabled. This is described in
|
|||
|
<link linkend="data_transfer">
|
|||
|
<xref linkend="data_transfer"></xref></link>
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
If the element is <function>XRecordCurrentClients</function>, the protocol
|
|||
|
ranges specified by the ranges argument, except for device_events, are
|
|||
|
associated with each current client connection. If the element is
|
|||
|
<function>XRecordFutureClients</function>, the
|
|||
|
protocol ranges specified by the ranges argument are associated with each new
|
|||
|
client connection. If the element is
|
|||
|
<function>XRecordAllClients</function>,
|
|||
|
the protocol ranges specified by the ranges argument are associated with
|
|||
|
each current client connection and with each new client connection.
|
|||
|
When the context is enabled, the data connection is unregistered if it
|
|||
|
was registered. If the context is enabled,
|
|||
|
<function>XRecordCurrentClients</function> and
|
|||
|
<function>XRecordAllClients</function>
|
|||
|
silently exclude the recording data connection. It is an error to explicitly
|
|||
|
register the data connection.
|
|||
|
</para>
|
|||
|
</sect1>
|
|||
|
<sect1 id="protocol_ranges">
|
|||
|
<title>Protocol Ranges</title>
|
|||
|
|
|||
|
<para>
|
|||
|
The functions <function>XRecordCreateContext</function> and
|
|||
|
<function>XRecordRegisterClients</function> have another common argument,
|
|||
|
ranges, which is an array of pointers to <function>XRecordRange</function>
|
|||
|
structures. Each structure contains ranges of numeric values for each of
|
|||
|
the protocol types that can be specified and recorded individually by the
|
|||
|
Record extension. An <function>XRecordRange</function> structure must be
|
|||
|
allocated by the Record library using the
|
|||
|
<function>XRecordAllocRange</function> function.
|
|||
|
</para>
|
|||
|
<para>
|
|||
|
The <function>XRecordRange</function> typedef is a structure with the
|
|||
|
following members:
|
|||
|
</para>
|
|||
|
|
|||
|
<literallayout remap='Ds'>
|
|||
|
XRecordRange:
|
|||
|
XRecordRange8 core_requests /* core X requests */
|
|||
|
XRecordRange8 core_replies /* core X replies */
|
|||
|
XRecordExtRange ext_requests /* extension requests */
|
|||
|
XRecordExtRange ext_replies /* extension replies */
|
|||
|
XRecordRange8 delivered_events /* delivered core and ext events */
|
|||
|
XRecordRange8 device_events /* all core and ext device events */
|
|||
|
XRecordRange8 errors /* core X and X ext errors */
|
|||
|
Bool client_started /* connection setup reply from server */
|
|||
|
Bool client_died /* notification of client disconnect */
|
|||
|
</literallayout>
|
|||
|
|
|||
|
<para>
|
|||
|
The types used in
|
|||
|
<function>XRecordRange</function>
|
|||
|
members are defined as follows. The
|
|||
|
<function>XRecordRange8</function>
|
|||
|
typedef is a structure with the following members:
|
|||
|
</para>
|
|||
|
|
|||
|
<literallayout remap='Ds'>
|
|||
|
XRecordRange8:
|
|||
|
unsigned char first
|
|||
|
unsigned char last
|
|||
|
</literallayout>
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordRange16</function>
|
|||
|
typedef is a structure with the following members:
|
|||
|
</para>
|
|||
|
|
|||
|
<literallayout remap='Ds'>
|
|||
|
XRecordRange16:
|
|||
|
unsigned short first
|
|||
|
unsigned short last
|
|||
|
</literallayout>
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordExtRange</function>
|
|||
|
typedef is a structure with the following members:
|
|||
|
</para>
|
|||
|
|
|||
|
<literallayout remap='Ds'>
|
|||
|
XRecordExtRange:
|
|||
|
XRecordRange8 ext_major
|
|||
|
XRecordRange16 ext_minor
|
|||
|
</literallayout>
|
|||
|
|
|||
|
<para>
|
|||
|
If any of the values specified in
|
|||
|
<function>XRecordRange</function>
|
|||
|
is invalid, a
|
|||
|
<function>BadValue</function>
|
|||
|
error results.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The core_requests member specifies the range of core X protocol
|
|||
|
requests to record. Core X protocol requests with a major opcode
|
|||
|
that is between first and last, inclusive, will be
|
|||
|
recorded. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results if the value of first is greater than the value of last.
|
|||
|
If the values of both first and last are zero, no core
|
|||
|
X protocol requests will be recorded.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The core_replies member specifies the range of replies resulting
|
|||
|
from core X protocol requests to record. Replies that result from
|
|||
|
core X protocol requests with a major opcode between first
|
|||
|
and last, inclusive, will be recorded. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results if the value of first is greater than the value of last.
|
|||
|
If the values of both first and last are zero, no core X protocol
|
|||
|
replies will be recorded.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The ext_requests member specifies the range of X extension
|
|||
|
requests to record. X extension requests with a major opcode
|
|||
|
between ext_major.first and ext_major.last, and with a
|
|||
|
minor opcode
|
|||
|
between ext_minor.first and ext_minor.last, inclusive, will be
|
|||
|
recorded. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results
|
|||
|
if the value of ext_major.first is greater than the value of
|
|||
|
ext_major.last or if the value of ext_minor.first is
|
|||
|
greater than the value of ext_minor.last. If the values of both
|
|||
|
ext_major.first
|
|||
|
and ext_major.last are zero,
|
|||
|
no X extension requests will be recorded.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The ext_replies member specifies the range of replies resulting
|
|||
|
from X extension requests to record. Replies that result from an X
|
|||
|
extension request with a major opcode between
|
|||
|
ext_major.first and
|
|||
|
ext_major.last, and a minor opcode that is between
|
|||
|
ext_minor.first and ext_minor.last will be recorded. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results
|
|||
|
if the value of ext_major.first is greater than the value of
|
|||
|
ext_major.last or if the value of ext_minor.first is greater than
|
|||
|
the value of ext_minor.last. If the values of both
|
|||
|
ext_major.first and ext_major.last are zero, no X extension
|
|||
|
replies will be recorded.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The delivered_events member specifies the range of both core
|
|||
|
X events and X extension events to record. These events are
|
|||
|
delivered to at least one client. Core X events and X extension events
|
|||
|
with a code value between first and last inclusive will be recorded. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results if the value of first is greater than the value of last.
|
|||
|
If the values of first and last are zero, no events will be recorded.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The device_events member specifies the range of both core X device
|
|||
|
events and X extension device events to record. These events may or
|
|||
|
may not be delivered to a client. Core X device events and X extension
|
|||
|
device events with a code value between first and last inclusive that
|
|||
|
are not delivered to any clients will be recorded. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results if the value of first is greater than the value of last. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results if first is less than two or last is less than two, except
|
|||
|
that if first and last are zero, no events will be recorded.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The errors member specifies the range of both core X errors and X
|
|||
|
extension errors to record. Core X errors and X extension errors with
|
|||
|
a code value between first and last inclusive will be
|
|||
|
recorded. A
|
|||
|
<function>BadValue</function>
|
|||
|
error results if the value of first is greater than the value of last.
|
|||
|
If the values of first and last are zero, no errors will be recorded.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
A value of
|
|||
|
<function>True</function>
|
|||
|
for the client_started member specifies the
|
|||
|
connection setup reply from the server to new clients. If
|
|||
|
<function>False</function>
|
|||
|
the connection setup reply is not specified by this
|
|||
|
<function>XRecordRange</function>
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
A value of
|
|||
|
<function>True</function>
|
|||
|
for the client_died member specifies
|
|||
|
notification when a client disconnects. If
|
|||
|
<function>False</function>
|
|||
|
notification when a client disconnects is not specified by this
|
|||
|
<function>XRecordRange</function>
|
|||
|
</para>
|
|||
|
</sect1>
|
|||
|
</chapter>
|
|||
|
|
|||
|
<chapter id='library_extension_requests'>
|
|||
|
<title>Library Extension Requests</title>
|
|||
|
|
|||
|
<para>
|
|||
|
Recording operations are accessed by programs through the use of
|
|||
|
new protocol requests. The following functions are provided as extensions
|
|||
|
to Xlib. An Xlib error results if
|
|||
|
an extension request is made to an X server that does not support the
|
|||
|
Record extension. Note that any of the extension protocol requests may generate
|
|||
|
<function>BadAlloc</function>
|
|||
|
or
|
|||
|
<function>BadLength</function>
|
|||
|
errors.
|
|||
|
</para>
|
|||
|
|
|||
|
<sect1 id='query_extension_version'>
|
|||
|
<title>Query Extension Version</title>
|
|||
|
|
|||
|
<para>
|
|||
|
An application uses the
|
|||
|
<function>XRecordQueryVersion</function>
|
|||
|
function to determine
|
|||
|
the version of the Record extension protocol supported by an X server.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordQueryVersion</function></funcdef>
|
|||
|
<paramdef>Display <parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> cmajor_return</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> cminor_return</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Returns the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>cmajor_return</emphasis></term>
|
|||
|
<listitem><para>Returns the extension protocol major version in use.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>cminor_return</emphasis></term>
|
|||
|
<listitem><para>Returns the extension protocol minor version in use.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordQueryVersion</function>
|
|||
|
function returns the major and minor protocol version numbers supported by
|
|||
|
the server.
|
|||
|
<function>XRecordQueryVersion</function>
|
|||
|
returns nonzero (success) only if the returned version numbers are
|
|||
|
common to both the library and the server; otherwise, it returns zero.
|
|||
|
</para>
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id='create_and_modify_context'>
|
|||
|
<title>Create and Modify Context</title>
|
|||
|
|
|||
|
<para>
|
|||
|
An application uses the
|
|||
|
<function>XRecordCreateContext</function>
|
|||
|
function to create a record context. At the time the record context is
|
|||
|
created by the recording client, the clients to be recorded and the
|
|||
|
protocol to record for each client may be specified.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>XRecordContext <function>XRecordCreateContext</function></funcdef>
|
|||
|
<paramdef>Display <parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> datum_flags</parameter></paramdef>
|
|||
|
<paramdef>XRecordClientSpec <parameter> *clients</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> nclients</parameter></paramdef>
|
|||
|
<paramdef>XRecordRange <parameter> *ranges</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> nranges</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Returns the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>datum_flags</emphasis></term>
|
|||
|
<listitem><para>Specifies whether detailed time or sequence info should be sent.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>clients</emphasis></term>
|
|||
|
<listitem><para>Specifies the clients to record.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>nclients</emphasis></term>
|
|||
|
<listitem><para>Specifies the number of clients.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>ranges</emphasis></term>
|
|||
|
<listitem><para>Specifies the protocol ranges to record.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>nranges</emphasis></term>
|
|||
|
<listitem><para>Specifies the number of protocol ranges.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordCreateContext</function>
|
|||
|
function creates a record context and returns an
|
|||
|
<function>XRecordContext</function>
|
|||
|
which is then used in the other Record library calls. This request is
|
|||
|
typically executed by the recording client over its control connection to
|
|||
|
the X server. The datum_flags specifies whether server time and/or client
|
|||
|
sequence number should precede protocol elements recorded by context (
|
|||
|
<link linkend="datum_flags">
|
|||
|
<xref linkend="datum_flags"></xref></link>
|
|||
|
). When a clients element identifies a particular client, the client is added
|
|||
|
to the context and the protocol to record for that client is set to the
|
|||
|
union of all ranges. When a clients element is
|
|||
|
<function>XRecordCurrentClients</function>
|
|||
|
<function>XRecordFutureClients</function>
|
|||
|
or
|
|||
|
<function>XRecordAllClients</function>
|
|||
|
the actions described in
|
|||
|
<link linkend="selecting_clients">
|
|||
|
<xref linkend="selecting_clients"></xref></link>
|
|||
|
are performed.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordCreateContext</function>
|
|||
|
returns zero if the request failed.
|
|||
|
<function>XRecordCreateContext</function>
|
|||
|
can generate
|
|||
|
<function>BadIDChoice</function>
|
|||
|
<function>BadMatch</function>
|
|||
|
and
|
|||
|
<function>BadValue</function>
|
|||
|
errors.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>The ranges argument is an
|
|||
|
<function>XRecordRange</function>
|
|||
|
array, that is, an array
|
|||
|
of pointers. The structures the elements point to shall be allocated
|
|||
|
by calling
|
|||
|
<function>XRecordAllocRange</function></para>
|
|||
|
|
|||
|
<literallayout remap='FD'>
|
|||
|
XRecordRange *
|
|||
|
XRecordAllocRange(void)
|
|||
|
</literallayout> <!-- remap='FN' -->
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordAllocRange</function>
|
|||
|
function
|
|||
|
allocates and returns an
|
|||
|
<function>XRecordRange</function>
|
|||
|
structure.
|
|||
|
The structure is initialized to specify no protocol.
|
|||
|
The function returns NULL if the structure allocation fails.
|
|||
|
The application can free the structure by calling
|
|||
|
<function>XFree</function>
|
|||
|
</para>
|
|||
|
|
|||
|
<sect2 id='additions'>
|
|||
|
<title>Additions</title>
|
|||
|
|
|||
|
<para>
|
|||
|
An application uses the
|
|||
|
<function>XRecordRegisterClients</function>
|
|||
|
function to modify a previously created
|
|||
|
record context, by adding clients or modifying the recorded protocol,
|
|||
|
typically over its control connection to the X server.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordRegisterClients</function></funcdef>
|
|||
|
<paramdef>Display <parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>XRecordContext <parameter> context</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> datum_flags</parameter></paramdef>
|
|||
|
<paramdef>XRecordClientSpec <parameter> *clients</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> nclients</parameter></paramdef>
|
|||
|
<paramdef>XRecordRange <parameter> *ranges</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> nranges</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Returns the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>context</emphasis></term>
|
|||
|
<listitem><para>Specifies the record context to modify.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>datum_flags</emphasis></term>
|
|||
|
<listitem><para>Specifies whether detailed time or sequence info should be sent.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>clients</emphasis></term>
|
|||
|
<listitem><para>Specifies the clients to record.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>nclients</emphasis></term>
|
|||
|
<listitem><para>Specifies the number of clients.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>ranges</emphasis></term>
|
|||
|
<listitem><para>Specifies the protocol ranges to record.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>nranges</emphasis></term>
|
|||
|
<listitem><para>Specifies the number of protocol ranges.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
The datum_flags specifies whether server time and/or client sequence number
|
|||
|
should precede protocol elements for all clients recorded by context (See
|
|||
|
<link linkend="datum_flags">
|
|||
|
<xref linkend="datum_flags"></xref></link>
|
|||
|
). When a clients element identifies a particular client and the client is
|
|||
|
not yet targeted for recording in the given context, the client is added
|
|||
|
to the set of clients to record, and the protocol to record for that client
|
|||
|
is set to the union of all ranges. When the client is
|
|||
|
already targeted for recording, the protocol to record for that client
|
|||
|
is set to the union of all ranges. When the element is
|
|||
|
<function>XRecordCurrentClients</function>
|
|||
|
<function>XRecordFutureClients</function>
|
|||
|
or
|
|||
|
<function>XRecordAllClients</function>
|
|||
|
the actions described in
|
|||
|
<link linkend="selecting_clients">
|
|||
|
<xref linkend="selecting_clients"></xref></link>
|
|||
|
are performed.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordRegisterClients</function>
|
|||
|
returns zero if the request failed; otherwise, it
|
|||
|
returns nonzero.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordRegisterClients</function>
|
|||
|
can generate
|
|||
|
<function>XRecordBadContext</function>
|
|||
|
<function>BadMatch</function>
|
|||
|
and
|
|||
|
<function>BadValue</function>
|
|||
|
errors.
|
|||
|
</para>
|
|||
|
</sect2>
|
|||
|
|
|||
|
<sect2 id='deletions'>
|
|||
|
<title>Deletions</title>
|
|||
|
|
|||
|
<para>
|
|||
|
An application uses the
|
|||
|
<function>XRecordUnregisterClients</function>
|
|||
|
function to delete clients from a previously created
|
|||
|
record context, typically over its control connection to the X server.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordUnRegisterClients</function></funcdef>
|
|||
|
<paramdef>Display <parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>XRecordContext <parameter> context</parameter></paramdef>
|
|||
|
<paramdef>XRecordClientSpec <parameter> *clients</parameter></paramdef>
|
|||
|
<paramdef>int <parameter> nclients</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Returns the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>context</emphasis></term>
|
|||
|
<listitem><para>Specifies the record context to modify.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>clients</emphasis></term>
|
|||
|
<listitem><para>Specifies the clients to stop recording.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>nclients</emphasis></term>
|
|||
|
<listitem><para>Specifies the number of clients.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
When an element in clients identifies a particular client, and the
|
|||
|
specified client is already targeted for recording in the given
|
|||
|
context, the client and the set of protocol to record for that
|
|||
|
client are deleted from the context. If the specified client is not
|
|||
|
targeted for recording, then no action is performed.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
When the element is
|
|||
|
<function>XRecordCurrentClients</function>
|
|||
|
all clients currently targeted for recording in context and their
|
|||
|
corresponding sets of protocol to record are deleted from context.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
When the item is
|
|||
|
<function>XRecordFutureClients</function>
|
|||
|
any future client connections will not automatically be targeted for
|
|||
|
recording in context.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
When the element is
|
|||
|
<function>XRecordAllClients</function>
|
|||
|
all clients currently targeted for recording in context and their
|
|||
|
corresponding sets of protocol to record are deleted from context.
|
|||
|
Any future client connections will not automatically be targeted
|
|||
|
for recording in context.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordUnregisterClients</function>
|
|||
|
returns zero if the request failed; otherwise, it returns nonzero.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordUnregisterClients</function>
|
|||
|
can generate
|
|||
|
<function>XRecordBadContext</function>
|
|||
|
<function>BadMatch</function>
|
|||
|
and
|
|||
|
<function>BadValue</function>
|
|||
|
errors.</para>
|
|||
|
</sect2>
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id='query_context_state'>
|
|||
|
<title>Query Context State</title>
|
|||
|
|
|||
|
<para>
|
|||
|
An application uses the
|
|||
|
<function>XRecordGetContext</function>
|
|||
|
function to query the current state of a record context, typically over
|
|||
|
its control connection to the X server.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordGetContext</function></funcdef>
|
|||
|
<paramdef>Display <parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>XRecordContext <parameter> context</parameter></paramdef>
|
|||
|
<paramdef>XRecordState <parameter> **state_return</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Specifies the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>context</emphasis></term>
|
|||
|
<listitem><para>Specifies the record context to query.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>state_return</emphasis></term>
|
|||
|
<listitem><para>Specifies the address of a variable into which
|
|||
|
the function stores a pointer to the current state of the record context.
|
|||
|
</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordState</function>
|
|||
|
typedef returned by
|
|||
|
<function>XRecordGetContext</function>
|
|||
|
is a structure with the following members:
|
|||
|
</para>
|
|||
|
|
|||
|
<literallayout remap='Ds'>
|
|||
|
XRecordState:
|
|||
|
Bool enabled
|
|||
|
int datum_flags
|
|||
|
unsigned long nclients
|
|||
|
XRecordClientInfo **client_info
|
|||
|
</literallayout>
|
|||
|
|
|||
|
<para>
|
|||
|
The enabled member is set to the state of data transfer and is
|
|||
|
<function>True</function>
|
|||
|
when the recording client has asked that recorded data be sent;
|
|||
|
otherwise it is
|
|||
|
<function>False</function>
|
|||
|
The datum_flags member is set to the value of these flags for this context.
|
|||
|
The nclients member is set to the number of
|
|||
|
<function>XRecordClientInfo</function>
|
|||
|
structures returned. The client_info member is an array of pointers to
|
|||
|
<function>XRecordClientInfo</function>
|
|||
|
structures that contain the protocol to record for each targeted client. The
|
|||
|
<function>XRecordClientInfo</function>
|
|||
|
typedef is a structure with the following members:
|
|||
|
</para>
|
|||
|
|
|||
|
<literallayout remap='Ds'>
|
|||
|
XRecordClientInfo:
|
|||
|
XRecordClientSpec client
|
|||
|
unsigned long nranges
|
|||
|
XRecordRange **ranges
|
|||
|
</literallayout>
|
|||
|
|
|||
|
<para>
|
|||
|
The client member either identifies a client targeted for recording
|
|||
|
or is set to
|
|||
|
<function>XRecordFutureClients</function>
|
|||
|
to describe how future clients will be automatically targeted for recording.
|
|||
|
The nranges member is set to the number of protocol
|
|||
|
ranges to be recorded for the specified client. The ranges member
|
|||
|
is an array of pointers to
|
|||
|
<function>XRecordRange</function>
|
|||
|
structures, which specify the protocol ranges to record.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordGetContext</function>
|
|||
|
returns zero if the request failed; otherwise, it returns nonzero.
|
|||
|
The context argument must specify a valid
|
|||
|
<function>XRecordContext</function>
|
|||
|
or a
|
|||
|
<function>XRecordBadContext</function>
|
|||
|
error results.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
Recording clients should use the
|
|||
|
<function>XRecordFreeState</function>
|
|||
|
function to free the state data returned by
|
|||
|
<function>XRecordGetContext</function>
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>void <function>XRecordFreeState</function></funcdef>
|
|||
|
<paramdef>XRecordState <parameter> *state</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>state</emphasis></term>
|
|||
|
<listitem><para>Specifies the structure that is to be freed.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordFreeState</function>
|
|||
|
frees the data pointed to by state. If the argument does not match an
|
|||
|
<function>XRecordState</function>
|
|||
|
pointer returned from a successful call to
|
|||
|
<function>XRecordGetContext</function>
|
|||
|
or if
|
|||
|
<function>XRecordFreeState</function>
|
|||
|
has already been called with it, the behavior is undefined.
|
|||
|
</para>
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id='data_transfer'>
|
|||
|
<title>Data Transfer</title>
|
|||
|
|
|||
|
<para>
|
|||
|
An application uses the
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
and
|
|||
|
<function>XRecordDisableContext</function>
|
|||
|
functions to change the state of data transfer
|
|||
|
between the X server and the recording client. These functions allow
|
|||
|
the application to start recording and reporting of protocol data
|
|||
|
and to stop recording and reporting of protocol data, respectively.
|
|||
|
</para>
|
|||
|
|
|||
|
<sect2 id='enable_context'>
|
|||
|
<title>Enable Context</title>
|
|||
|
|
|||
|
<para>
|
|||
|
To direct the X server to record and report protocol, a program uses
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
typically over its data connection to the X
|
|||
|
server. The reporting of recorded protocol back to the recording client
|
|||
|
is handled by the following data structures and procedure definitions.
|
|||
|
Each recorded protocol element is reported to the recording client through an
|
|||
|
<function>XRecordInterceptData</function>
|
|||
|
typedef, a structure with the following members:
|
|||
|
</para>
|
|||
|
|
|||
|
<literallayout remap='Ds'>
|
|||
|
XRecordInterceptData:
|
|||
|
XID id_base
|
|||
|
Time server_time
|
|||
|
unsigned long client_seq
|
|||
|
int category
|
|||
|
Bool client_swapped
|
|||
|
unsigned char *data
|
|||
|
unsigned long data_len
|
|||
|
</literallayout>
|
|||
|
|
|||
|
<para>
|
|||
|
The id_base member is set to the resource identifier base sent to the
|
|||
|
client in the connection setup reply and therefore identifies the client
|
|||
|
being recorded, except when the recorded protocol data is a device
|
|||
|
event that may have not been delivered to a client. In this case,
|
|||
|
id_base is set to zero. The server_time member
|
|||
|
is set to the time of the server when the protocol was recorded.
|
|||
|
It is the time that was attached to this protocol element in the reply,
|
|||
|
if so specified by datum_flags,
|
|||
|
or else the time from the header of the reply that contained
|
|||
|
this protocol element.
|
|||
|
The client_seq member is the sequence number of the recorded
|
|||
|
client's most recent request processed by the server at the time this
|
|||
|
protocol element was recorded, if this information were included in the
|
|||
|
recorded data; otherwise client_seq is 0.
|
|||
|
The category member is set to one of the following values:
|
|||
|
<function>XRecordStartOfData</function>
|
|||
|
<function>XRecordFromServer</function>
|
|||
|
<function>XRecordFromClient</function>
|
|||
|
<function>XRecordClientStarted</function>
|
|||
|
<function>XRecordClientDied</function>
|
|||
|
or
|
|||
|
<function>XRecordEndOfData</function>
|
|||
|
<function>XRecordStartOfData</function>
|
|||
|
is immediately sent as the first reply to confirm that the context is enabled.
|
|||
|
<function>XRecordFromClient</function>
|
|||
|
indicates the protocol
|
|||
|
data is from the recorded client to the server (requests).
|
|||
|
<function>XRecordFromServer</function>
|
|||
|
indicates the protocol data is from the server to the recorded client
|
|||
|
(replies, errors, events, or device events).
|
|||
|
<function>XRecordClientStarted</function>
|
|||
|
indicates that the protocol data is the connection setup reply from the server.
|
|||
|
<function>XRecordClientDied</function>
|
|||
|
indicates that the recorded client has closed its connection
|
|||
|
to the X server; there is no protocol data.
|
|||
|
<function>XRecordEndOfData</function>
|
|||
|
indicates that the context has been disabled and that
|
|||
|
this is the last datum. It does not correspond to any protocol or
|
|||
|
state change in a recorded client. There is no protocol data.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The client_swapped member is set to
|
|||
|
<function>True</function>
|
|||
|
if the byte order of the client being recorded is swapped relative to
|
|||
|
the recording client; otherwise, it is set to
|
|||
|
<function>False</function>
|
|||
|
All recorded protocol data is returned in the byte order of the recorded
|
|||
|
client. Therefore, recording clients are responsible for all byte swapping,
|
|||
|
if required. Device events are in the byte order of the recording client.
|
|||
|
For replies of category
|
|||
|
<function>XRecordStartOfData</function>
|
|||
|
and
|
|||
|
<function>XRecordEndOfData</function>
|
|||
|
client_swapped is set according
|
|||
|
to the byte order of the server relative to the recording client.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
The data member contains the actual recorded protocol data.
|
|||
|
When category is set to
|
|||
|
<function>XRecordStartOfData</function>
|
|||
|
<function>XRecordClientDied</function>
|
|||
|
or
|
|||
|
<function>XRecordEndOfData</function>
|
|||
|
no protocol data are contained in data.
|
|||
|
</para>
|
|||
|
|
|||
|
|
|||
|
<!-- copied exactly from the protocol document -->
|
|||
|
<para>
|
|||
|
For the core X events
|
|||
|
<function>KeyPress</function>
|
|||
|
<function>KeyRelease</function>
|
|||
|
<function>ButtonPress</function>
|
|||
|
and
|
|||
|
<function>ButtonRelease</function>,
|
|||
|
the fields of a device event that contain
|
|||
|
valid information are time and detail. For the core X event
|
|||
|
<function>MotionNotify</function>
|
|||
|
the fields of a device event that contain valid information are time, root,
|
|||
|
root-x and root-y.
|
|||
|
The time field refers to the time the event was generated by the device.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>For the extension input device events
|
|||
|
<function>DeviceKeyPress</function>
|
|||
|
<function>DeviceKeyRelease</function>
|
|||
|
<function>DeviceButtonPress</function>
|
|||
|
and
|
|||
|
<function>DeviceButtonRelease</function>
|
|||
|
the fields of a device event that contain valid information are
|
|||
|
device, time, and detail. For
|
|||
|
<function>DeviceMotionNotify</function>
|
|||
|
the valid device event fields are device and time.
|
|||
|
For the extension input device events
|
|||
|
<function>ProximityIn</function>
|
|||
|
and
|
|||
|
<function>ProximityOut</function>
|
|||
|
the fields of a device event that contain valid
|
|||
|
information are device and time. For the extension input device event
|
|||
|
<function>DeviceValuator</function>
|
|||
|
the fields of a device event that contain valid information are
|
|||
|
device, num_valuators, first_valuator, and valuators.
|
|||
|
The time field refers to the time the event was generated by the device.
|
|||
|
</para>
|
|||
|
|
|||
|
|
|||
|
<para>
|
|||
|
The data_len member is set to the length of the actual recorded protocol
|
|||
|
data in 4-byte units.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
When the context has been enabled, protocol data the recording client has
|
|||
|
previously expressed interest in is recorded and returned to the
|
|||
|
recording client via multiple replies. Because the X server batches
|
|||
|
the recorded data, more than one protocol element may be contained
|
|||
|
in the same reply packet. When a reply is received, a procedure of type
|
|||
|
<function>XRecordInterceptProc</function>
|
|||
|
is called for each protocol element in the reply.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>typedef void <function>(*XRecordInterceptProc)</function></funcdef>
|
|||
|
<paramdef>XPointer<parameter> closure</parameter></paramdef>
|
|||
|
<paramdef>XRecordInterceptData<parameter> *recorded_data</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>closure</emphasis></term>
|
|||
|
<listitem><para>Pointer that was passed in when the context was enabled.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>recorded_data</emphasis></term>
|
|||
|
<listitem><para>A protocol element recorded by the server extension.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
This callback may use the control display connection (or any display
|
|||
|
connection other than the data connection).
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
Recording clients should use the
|
|||
|
<function>XRecordFreeData</function>
|
|||
|
function to free the
|
|||
|
<function>XRecordInterceptData</function>
|
|||
|
structure.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordEnableContext</function></funcdef>
|
|||
|
<paramdef>Display<parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>XRecordContext<parameter> context</parameter></paramdef>
|
|||
|
<paramdef>XRecordInterceptProc<parameter> callback</parameter></paramdef>
|
|||
|
<paramdef>XPointer<parameter> closure</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Specifies the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>context</emphasis></term>
|
|||
|
<listitem><para>Specifies the record context to enable.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>callback</emphasis></term>
|
|||
|
<listitem><para>Specifies the function to be called for each protocol element received.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>closure</emphasis></term>
|
|||
|
<listitem><para>Specifies data passed to callback.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
enables data transfer between the recording client and
|
|||
|
the X server. All core and extension protocol received from or sent to
|
|||
|
targeted clients that the recording client has expressed
|
|||
|
interest in will be recorded and reported to the recording client.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
returns zero if the request failed; otherwise, it
|
|||
|
returns nonzero. The context argument must specify a valid
|
|||
|
<function>XRecordContext</function>
|
|||
|
or a
|
|||
|
<function>XRecordBadContext</function>
|
|||
|
error results. The error
|
|||
|
<function>BadMatch</function>
|
|||
|
results when data transfer is already enabled on the given context.
|
|||
|
</para>
|
|||
|
</sect2>
|
|||
|
|
|||
|
<sect2 id='enable_context_asynchronously'>
|
|||
|
<title>Enable Context Asynchronously</title>
|
|||
|
|
|||
|
<para>Because
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
does not return until
|
|||
|
<function>XRecordDisableContext</function>
|
|||
|
is executed on the control connection, a nonblocking interface in
|
|||
|
addition to
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
is provided. This interface also
|
|||
|
enables data transfer; however, it does not block.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
This interface is defined as follows:
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordEnableContextAsync</function></funcdef>
|
|||
|
<paramdef>Display<parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>XRecordContext<parameter> context</parameter></paramdef>
|
|||
|
<paramdef>XRecordInterceptProc<parameter> callback</parameter></paramdef>
|
|||
|
<paramdef>XPointer<parameter> closure</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Specifies the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>context</emphasis></term>
|
|||
|
<listitem><para>Specifies the record context to enable.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>callback</emphasis></term>
|
|||
|
<listitem><para>Specifies the function to be called for each protocol element received.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>closure</emphasis></term>
|
|||
|
<listitem><para>Specifies data passed to callback.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordEnableContextAsync</function>
|
|||
|
enables data transfer between the recording
|
|||
|
client and the X server just as
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
does. Unlike
|
|||
|
<function>XRecordEnableContext</function>
|
|||
|
it does not wait for the context to be disabled
|
|||
|
before returning;
|
|||
|
<function>XRecordEnableContextAsync</function>
|
|||
|
returns as soon as the
|
|||
|
<function>XRecordStartOfData</function>
|
|||
|
reply has been received and processed.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordEnableContextAsync</function>
|
|||
|
returns zero if it could not allocate the
|
|||
|
necessary memory and nonzero if it sent the request successfully to
|
|||
|
the server. The context argument must specify a valid
|
|||
|
<function>XRecordContext</function>
|
|||
|
or a
|
|||
|
<function>XRecordBadContext</function>
|
|||
|
error results. The error
|
|||
|
<function>BadMatch</function>
|
|||
|
results when data transfer is already enabled.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
Each time it reads data from the server connection, Xlib will check
|
|||
|
for incoming replies and call <emphasis remap='I'>callback</emphasis>
|
|||
|
as necessary. The application may direct Xlib explicitly to check
|
|||
|
for Record data with the
|
|||
|
<function>XRecordProcessReplies</function>
|
|||
|
function.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>void <function>XRecordProcessReplies</function></funcdef>
|
|||
|
<paramdef>Display<parameter> *display</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Specifies the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordProcessReplies</function>
|
|||
|
will check for any replies that have not yet
|
|||
|
been processed by the application. The asynchronous callback will be called
|
|||
|
as appropriate.
|
|||
|
<function>XRecordProcessReplies</function>
|
|||
|
returns when all immediately
|
|||
|
available replies have been processed. It does not block.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>To free the data passed to the
|
|||
|
<function>XRecordInterceptProc</function>
|
|||
|
callback, use
|
|||
|
<function>XRecordFreeData</function></para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>void <function>XRecordFreeData</function></funcdef>
|
|||
|
<paramdef>XRecordInterceptData<parameter> *data</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>data</emphasis></term>
|
|||
|
<listitem><para>Specifies the structure that is to be freed.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordFreeData</function>
|
|||
|
frees the data pointed to by data. If the argument does not match an
|
|||
|
<function>XRecordInterceptData</function>
|
|||
|
pointer earlier passed to an
|
|||
|
<function>XRecordInterceptProc</function>
|
|||
|
callback or if
|
|||
|
<function>XRecordFreeData</function>
|
|||
|
has already been called with it, the behavior is undefined.
|
|||
|
</para>
|
|||
|
</sect2>
|
|||
|
|
|||
|
<sect2 id='disable_context'>
|
|||
|
<title>Disable Context</title>
|
|||
|
|
|||
|
<para>
|
|||
|
To direct the X server to halt the reporting of recorded protocol, the
|
|||
|
program executes
|
|||
|
<function>XRecordDisableContext</function>
|
|||
|
typically over its control connection to the X server.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordDisableContext</function></funcdef>
|
|||
|
<paramdef>Display<parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>XRecordContext<parameter> context</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Specifies the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>context</emphasis></term>
|
|||
|
<listitem><para>Specifies the record context to disable.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordDisableContext</function>
|
|||
|
function disables context, stopping all recording over its data connection.
|
|||
|
Any complete protocol elements for context that were buffered in the
|
|||
|
server will be sent to the recording client rather than being discarded.
|
|||
|
If a program attempts to disable an
|
|||
|
<function>XRecordContext</function>
|
|||
|
that has not been enabled, no action will take place.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordDisableContext</function>
|
|||
|
returns zero if the request failed; otherwise, it
|
|||
|
returns nonzero. The context argument must specify a valid
|
|||
|
<function>XRecordContext</function>
|
|||
|
or an
|
|||
|
<function>XRecordBadContext</function>
|
|||
|
error results.
|
|||
|
</para>
|
|||
|
</sect2>
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id='id_base_mask'><title>ID Base Mask</title>
|
|||
|
|
|||
|
<para>
|
|||
|
To determine the mask the server uses for the client ID base, use
|
|||
|
<function>XRecordIdBaseMask</function></para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>XID <function>XRecordIdBaseMask</function></funcdef>
|
|||
|
<paramdef>Display<parameter> *display</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Specifies the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordIdBaseMask</function>
|
|||
|
function returns the resource ID mask passed to the client by the
|
|||
|
server at connection setup.
|
|||
|
</para>
|
|||
|
|
|||
|
</sect1>
|
|||
|
|
|||
|
<sect1 id='free_context'>
|
|||
|
<title>Free Context</title>
|
|||
|
|
|||
|
<para>
|
|||
|
Before terminating, the program should request that the server
|
|||
|
free the record context. This is done with the
|
|||
|
<function>XRecordFreeContext</function>
|
|||
|
function, typically over the record client's control connection
|
|||
|
to the X server.
|
|||
|
</para>
|
|||
|
|
|||
|
<funcsynopsis>
|
|||
|
<funcprototype>
|
|||
|
<funcdef>Status <function>XRecordFreeContext</function></funcdef>
|
|||
|
<paramdef>Display<parameter> *display</parameter></paramdef>
|
|||
|
<paramdef>XRecordContext<parameter> context</parameter></paramdef>
|
|||
|
</funcprototype>
|
|||
|
</funcsynopsis>
|
|||
|
|
|||
|
<variablelist remap='IP'>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>display</emphasis></term>
|
|||
|
<listitem><para>Specifies the connection to the X server.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
<varlistentry>
|
|||
|
<term><emphasis remap='I'>context</emphasis></term>
|
|||
|
<listitem><para>Specifies the record context to free.</para></listitem>
|
|||
|
</varlistentry>
|
|||
|
</variablelist>
|
|||
|
|
|||
|
<para>
|
|||
|
The
|
|||
|
<function>XRecordFreeContext</function>
|
|||
|
function frees the given context for the
|
|||
|
requesting client. Freeing a record context releases the clients
|
|||
|
targeted for recording and their respective protocol ranges to
|
|||
|
record. If protocol data is being reported to the recording client,
|
|||
|
generally over the data connection to the X server, the reporting
|
|||
|
ceases as if
|
|||
|
<function>XRecordDisableContext</function>
|
|||
|
had been called on the given context. When a program terminates
|
|||
|
without freeing its record context, the X server will automatically
|
|||
|
free that context on behalf of the client.
|
|||
|
</para>
|
|||
|
|
|||
|
<para>
|
|||
|
<function>XRecordFreeContext</function>
|
|||
|
returns zero if the request failed; otherwise,it
|
|||
|
returns nonzero. The context argument must specify a valid
|
|||
|
<function>XRecordContext</function>
|
|||
|
or a
|
|||
|
<function>XRecordBadContext</function>
|
|||
|
error results.
|
|||
|
</para>
|
|||
|
|
|||
|
</sect1>
|
|||
|
</chapter>
|
|||
|
</book>
|