aboutsummaryrefslogtreecommitdiff
path: root/libX11/specs/libX11/CH11
diff options
context:
space:
mode:
Diffstat (limited to 'libX11/specs/libX11/CH11')
-rw-r--r--libX11/specs/libX11/CH111664
1 files changed, 1664 insertions, 0 deletions
diff --git a/libX11/specs/libX11/CH11 b/libX11/specs/libX11/CH11
new file mode 100644
index 000000000..09d845d35
--- /dev/null
+++ b/libX11/specs/libX11/CH11
@@ -0,0 +1,1664 @@
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1994, 1996 X Consortium
+.\"
+.\" 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:
+.\"
+.\" The above copyright notice and this permission notice 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 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.
+.\"
+.\" 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.
+.\"
+.\" Copyright \(co 1985, 1986, 1987, 1988, 1989, 1990, 1991 by
+.\" Digital Equipment Corporation
+.\"
+.\" Portions Copyright \(co 1990, 1991 by
+.\" Tektronix, Inc.
+.\"
+.\" Permission to use, copy, modify and distribute this documentation for
+.\" any purpose and without fee is hereby granted, provided that the above
+.\" copyright notice appears in all copies and that both that copyright notice
+.\" and this permission notice appear in all copies, and that the names of
+.\" Digital and Tektronix not be used in in advertising or publicity pertaining
+.\" to this documentation without specific, written prior permission.
+.\" Digital and Tektronix makes no representations about the suitability
+.\" of this documentation for any purpose.
+.\" It is provided ``as is'' without express or implied warranty.
+.\"
+\&
+.sp 1
+.ce 3
+\s+1\fBChapter 11\fP\s-1
+
+\s+1\fBEvent Handling Functions\fP\s-1
+.sp 2
+.nr H1 11
+.nr H2 0
+.nr H3 0
+.nr H4 0
+.nr H5 0
+.na
+.LP
+.XS
+Chapter 11: Event Handling Functions
+.XE
+This chapter discusses the Xlib functions you can use to:
+.IP \(bu 5
+Select events
+.IP \(bu 5
+Handle the output buffer and the event queue
+.IP \(bu 5
+Select events from the event queue
+.IP \(bu 5
+Send and get events
+.IP \(bu 5
+Handle protocol errors
+.NT Note
+Some toolkits use their own event-handling functions
+and do not allow you to interchange these event-handling functions
+with those in Xlib.
+For further information,
+see the documentation supplied with the toolkit.
+.NE
+.LP
+Most applications simply are event loops:
+they wait for an event, decide what to do with it,
+execute some amount of code that results in changes to the display,
+and then wait for the next event.
+.NH 2
+Selecting Events
+.XS
+\*(SN Selecting Events
+.XE
+.LP
+There are two ways to select the events you want reported to your client
+application.
+One way is to set the event_mask member of the
+.PN XSetWindowAttributes
+structure when you call
+.PN XCreateWindow
+and
+.PN XChangeWindowAttributes .
+Another way is to use
+.PN XSelectInput .
+.IN "XSelectInput" "" "@DEF@"
+.sM
+.FD 0
+XSelectInput\^(\^\fIdisplay\fP, \fIw\fP\^, \fIevent_mask\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.br
+ long \fIevent_mask\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Wi whose events you are interested in
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.LP
+.eM
+The
+.PN XSelectInput
+function requests that the X server report the events associated with the
+specified event mask.
+Initially, X will not report any of these events.
+Events are reported relative to a window.
+If a window is not interested in a device event, it usually propagates to
+the closest ancestor that is interested,
+unless the do_not_propagate mask prohibits it.
+.IN "Event" "propagation"
+.LP
+Setting the event-mask attribute of a window overrides any previous call
+for the same window but not for other clients.
+Multiple clients can select for the same events on the same window
+with the following restrictions:
+.IP \(bu 5
+Multiple clients can select events on the same window because their event masks
+are disjoint.
+When the X server generates an event, it reports it
+to all interested clients.
+.IP \(bu 5
+Only one client at a time can select
+.PN CirculateRequest ,
+.PN ConfigureRequest ,
+or
+.PN MapRequest
+events, which are associated with
+the event mask
+.PN SubstructureRedirectMask .
+.IP \(bu 5
+Only one client at a time can select
+a
+.PN ResizeRequest
+event, which is associated with
+the event mask
+.PN ResizeRedirectMask .
+.IP \(bu 5
+Only one client at a time can select a
+.PN ButtonPress
+event, which is associated with
+the event mask
+.PN ButtonPressMask .
+.LP
+The server reports the event to all interested clients.
+.LP
+.PN XSelectInput
+can generate a
+.PN BadWindow
+error.
+.NH 2
+Handling the Output Buffer
+.XS
+\*(SN Handling the Output Buffer
+.XE
+.LP
+The output buffer is an area used by Xlib to store requests.
+The functions described in this section flush the output buffer
+if the function would block or not return an event.
+That is, all requests residing in the output buffer that
+have not yet been sent are transmitted to the X server.
+These functions differ in the additional tasks they might perform.
+.LP
+.sp
+To flush the output buffer, use
+.PN XFlush .
+.IN "XFlush" "" "@DEF@"
+.sM
+.FD 0
+XFlush\^(\^\fIdisplay\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.LP
+.eM
+The
+.PN XFlush
+function
+flushes the output buffer.
+Most client applications need not use this function because the output
+buffer is automatically flushed as needed by calls to
+.PN XPending ,
+.PN XNextEvent ,
+and
+.PN XWindowEvent .
+.IN "XPending"
+.IN "XNextEvent"
+.IN "XWindowEvent"
+Events generated by the server may be enqueued into the library's event queue.
+.LP
+.sp
+To flush the output buffer and then wait until all requests have been processed,
+use
+.PN XSync .
+.IN "XSync" "" "@DEF@"
+.sM
+.FD 0
+XSync\^(\^\fIdisplay\fP, \fIdiscard\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Bool \fIdiscard\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIdiscard\fP 1i
+Specifies a Boolean value that indicates whether
+.PN XSync
+discards all events on the event queue.
+.LP
+.eM
+The
+.PN XSync
+function
+flushes the output buffer and then waits until all requests have been received
+and processed by the X server.
+Any errors generated must be handled by the error handler.
+For each protocol error received by Xlib,
+.PN XSync
+calls the client application's error handling routine (see section 11.8.2).
+Any events generated by the server are enqueued into the library's
+event queue.
+.LP
+Finally, if you passed
+.PN False ,
+.PN XSync
+does not discard the events in the queue.
+If you passed
+.PN True ,
+.PN XSync
+discards all events in the queue,
+including those events that were on the queue before
+.PN XSync
+was called.
+Client applications seldom need to call
+.PN XSync .
+.NH 2
+Event Queue Management
+.XS
+\*(SN Event Queue Management
+.XE
+.LP
+Xlib maintains an event queue.
+However, the operating system also may be buffering data
+in its network connection that is not yet read into the event queue.
+.LP
+.sp
+To check the number of events in the event queue, use
+.PN XEventsQueued .
+.IN "XEventsQueued" "" "@DEF@"
+.sM
+.FD 0
+int XEventsQueued\^(\^\fIdisplay\fP, \fImode\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ int \fImode\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fImode\fP 1i
+Specifies the mode.
+You can pass
+.PN QueuedAlready ,
+.PN QueuedAfterFlush ,
+or
+.PN QueuedAfterReading .
+.LP
+.eM
+If mode is
+.PN QueuedAlready ,
+.PN XEventsQueued
+returns the number of events
+already in the event queue (and never performs a system call).
+If mode is
+.PN QueuedAfterFlush ,
+.PN XEventsQueued
+returns the number of events already in the queue if the number is nonzero.
+If there are no events in the queue,
+.PN XEventsQueued
+flushes the output buffer,
+attempts to read more events out of the application's connection,
+and returns the number read.
+If mode is
+.PN QueuedAfterReading ,
+.PN XEventsQueued
+returns the number of events already in the queue if the number is nonzero.
+If there are no events in the queue,
+.PN XEventsQueued
+attempts to read more events out of the application's connection
+without flushing the output buffer and returns the number read.
+.LP
+.PN XEventsQueued
+always returns immediately without I/O if there are events already in the
+queue.
+.PN XEventsQueued
+with mode
+.PN QueuedAfterFlush
+is identical in behavior to
+.PN XPending .
+.PN XEventsQueued
+with mode
+.PN QueuedAlready
+is identical to the
+.PN XQLength
+function.
+.LP
+.sp
+To return the number of events that are pending, use
+.PN XPending .
+.IN "XPending" "" "@DEF@"
+.sM
+.FD 0
+int XPending\^(\^\fIdisplay\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.LP
+.eM
+The
+.PN XPending
+function returns the number of events that have been received from the
+X server but have not been removed from the event queue.
+.PN XPending
+is identical to
+.PN XEventsQueued
+with the mode
+.PN QueuedAfterFlush
+specified.
+.NH 2
+Manipulating the Event Queue
+.XS
+\*(SN Manipulating the Event Queue
+.XE
+.LP
+Xlib provides functions that let you manipulate the event queue.
+This section discusses how to:
+.IP \(bu 5
+Obtain events, in order, and remove them from the queue
+.IP \(bu 5
+Peek at events in the queue without removing them
+.IP \(bu 5
+Obtain events that match the event mask or the arbitrary
+predicate procedures that you provide
+.NH 3
+Returning the Next Event
+.XS
+\*(SN Returning the Next Event
+.XE
+.LP
+To get the next event and remove it from the queue, use
+.PN XNextEvent .
+.IN "XNextEvent" "" "@DEF@"
+.sM
+.FD 0
+XNextEvent\^(\^\fIdisplay\fP, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_return\fP 1i
+Returns the next event in the queue.
+.LP
+.eM
+The
+.PN XNextEvent
+function copies the first event from the event queue into the specified
+.PN XEvent
+structure and then removes it from the queue.
+If the event queue is empty,
+.PN XNextEvent
+flushes the output buffer and blocks until an event is received.
+.LP
+.sp
+To peek at the event queue, use
+.PN XPeekEvent .
+.IN "XPeekEvent" "" "@DEF@"
+.sM
+.FD 0
+XPeekEvent\^(\^\fIdisplay\fP, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_return\fP 1i
+Returns a copy of the matched event's associated structure.
+.LP
+.eM
+The
+.PN XPeekEvent
+function returns the first event from the event queue,
+but it does not remove the event from the queue.
+If the queue is empty,
+.PN XPeekEvent
+flushes the output buffer and blocks until an event is received.
+It then copies the event into the client-supplied
+.PN XEvent
+structure without removing it from the event queue.
+.NH 3
+Selecting Events Using a Predicate Procedure
+.XS
+\*(SN Selecting Events Using a Predicate Procedure
+.XE
+.LP
+Each of the functions discussed in this section requires you to
+pass a predicate procedure that determines if an event matches
+what you want.
+Your predicate procedure must decide if the event is useful
+without calling any Xlib functions.
+If the predicate directly or indirectly causes the state of the event queue
+to change, the result is not defined.
+If Xlib has been initialized for threads, the predicate is called with
+the display locked and the result of a call by the predicate to any
+Xlib function that locks the display is not defined unless the caller
+has first called
+.PN XLockDisplay .
+.LP
+The predicate procedure and its associated arguments are:
+.sM
+.FD 0
+Bool (\^*\fIpredicate\fP\^)\^(\^\fIdisplay\fP, \fIevent\fP, \fIarg\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XEvent *\fIevent\fP\^;
+.br
+ XPointer \fIarg\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent\fP 1i
+Specifies the
+.PN XEvent
+structure.
+.IP \fIarg\fP 1i
+Specifies the argument passed in from the
+.PN XIfEvent ,
+.PN XCheckIfEvent ,
+or
+.PN XPeekIfEvent
+function.
+.LP
+.eM
+The predicate procedure is called once for each
+event in the queue until it finds a match.
+After finding a match, the predicate procedure must return
+.PN True .
+If it did not find a match, it must return
+.PN False .
+.LP
+.sp
+To check the event queue for a matching event
+and, if found, remove the event from the queue, use
+.PN XIfEvent .
+.IN "XIfEvent" "" "@DEF@"
+.sM
+.FD 0
+XIfEvent\^(\^\fIdisplay\fP, \fIevent_return\fP, \fIpredicate\fP, \fIarg\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.br
+ Bool (\^*\fIpredicate\fP\^)\^(\^)\^;
+.br
+ XPointer \fIarg\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.IP \fIpredicate\fP 1i
+Specifies the procedure that is to be called to determine
+if the next event in the queue matches what you want.
+.IP \fIarg\fP 1i
+Specifies the user-supplied argument that will be passed to the predicate procedure.
+.LP
+.eM
+The
+.PN XIfEvent
+function completes only when the specified predicate
+procedure returns
+.PN True
+for an event,
+which indicates an event in the queue matches.
+.PN XIfEvent
+flushes the output buffer if it blocks waiting for additional events.
+.PN XIfEvent
+removes the matching event from the queue
+and copies the structure into the client-supplied
+.PN XEvent
+structure.
+.LP
+.sp
+To check the event queue for a matching event without blocking, use
+.PN XCheckIfEvent .
+.IN "XCheckIfEvent" "" "@DEF@"
+.sM
+.FD 0
+Bool XCheckIfEvent\^(\^\fIdisplay\fP, \fIevent_return\fP, \fIpredicate\fP, \fIarg\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.br
+ Bool (\^*\fIpredicate\fP\^)\^(\^)\^;
+.br
+ XPointer \fIarg\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_return\fP 1i
+Returns a copy of the matched event's associated structure.
+.IP \fIpredicate\fP 1i
+Specifies the procedure that is to be called to determine
+if the next event in the queue matches what you want.
+.IP \fIarg\fP 1i
+Specifies the user-supplied argument that will be passed to the predicate procedure.
+.LP
+.eM
+When the predicate procedure finds a match,
+.PN XCheckIfEvent
+copies the matched event into the client-supplied
+.PN XEvent
+structure and returns
+.PN True .
+(This event is removed from the queue.)
+If the predicate procedure finds no match,
+.PN XCheckIfEvent
+returns
+.PN False ,
+and the output buffer will have been flushed.
+All earlier events stored in the queue are not discarded.
+.LP
+.sp
+To check the event queue for a matching event
+without removing the event from the queue, use
+.PN XPeekIfEvent .
+.IN "XPeekIfEvent" "" "@DEF@"
+.sM
+.FD 0
+XPeekIfEvent\^(\^\fIdisplay\fP, \fIevent_return\fP, \fIpredicate\fP, \fIarg\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.br
+ Bool (\^*\fIpredicate\fP\^)\^(\^)\^;
+.br
+ XPointer \fIarg\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_return\fP 1i
+Returns a copy of the matched event's associated structure.
+.IP \fIpredicate\fP 1i
+Specifies the procedure that is to be called to determine
+if the next event in the queue matches what you want.
+.IP \fIarg\fP 1i
+Specifies the user-supplied argument that will be passed to the predicate procedure.
+.LP
+.eM
+The
+.PN XPeekIfEvent
+function returns only when the specified predicate
+procedure returns
+.PN True
+for an event.
+After the predicate procedure finds a match,
+.PN XPeekIfEvent
+copies the matched event into the client-supplied
+.PN XEvent
+structure without removing the event from the queue.
+.PN XPeekIfEvent
+flushes the output buffer if it blocks waiting for additional events.
+.NH 3
+Selecting Events Using a Window or Event Mask
+.XS
+\*(SN Selecting Events Using a Window or Event Mask
+.XE
+.LP
+The functions discussed in this section let you select events by window
+or event types, allowing you to process events out of order.
+.LP
+.sp
+To remove the next event that matches both a window and an event mask, use
+.PN XWindowEvent .
+.IN "XWindowEvent" "" "@DEF@"
+.sM
+.FD 0
+XWindowEvent\^(\^\fIdisplay\fP, \fIw\fP\^, \fIevent_mask\fP\^, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.br
+ long \fIevent_mask\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Wi whose events you are interested in
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.LP
+.eM
+The
+.PN XWindowEvent
+function searches the event queue for an event that matches both the specified
+window and event mask.
+When it finds a match,
+.PN XWindowEvent
+removes that event from the queue and copies it into the specified
+.PN XEvent
+structure.
+The other events stored in the queue are not discarded.
+If a matching event is not in the queue,
+.PN XWindowEvent
+flushes the output buffer and blocks until one is received.
+.LP
+.sp
+To remove the next event that matches both a window and an event mask (if any),
+use
+.PN XCheckWindowEvent .
+.IN "XCheckWindowEvent"
+This function is similar to
+.PN XWindowEvent
+except that it never blocks and it returns a
+.PN Bool
+indicating if the event was returned.
+.IN "XCheckWindowEvent" "" "@DEF@"
+.sM
+.FD 0
+Bool XCheckWindowEvent\^(\^\fIdisplay\fP, \fIw\fP\^, \fIevent_mask\fP\^, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.br
+ long \fIevent_mask\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.ds Wi whose events you are interested in
+.IP \fIw\fP 1i
+Specifies the window \*(Wi.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.LP
+.eM
+The
+.PN XCheckWindowEvent
+function searches the event queue and then the events available
+on the server connection for the first event that matches the specified window
+and event mask.
+If it finds a match,
+.PN XCheckWindowEvent
+removes that event, copies it into the specified
+.PN XEvent
+structure, and returns
+.PN True .
+The other events stored in the queue are not discarded.
+If the event you requested is not available,
+.PN XCheckWindowEvent
+returns
+.PN False ,
+and the output buffer will have been flushed.
+.LP
+.sp
+To remove the next event that matches an event mask, use
+.PN XMaskEvent .
+.IN "XMaskEvent" "" "@DEF@"
+.sM
+.FD 0
+XMaskEvent\^(\^\fIdisplay\fP, \fIevent_mask\fP\^, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ long \fIevent_mask\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.LP
+.eM
+The
+.PN XMaskEvent
+function searches the event queue for the events associated with the
+specified mask.
+When it finds a match,
+.PN XMaskEvent
+removes that event and copies it into the specified
+.PN XEvent
+structure.
+The other events stored in the queue are not discarded.
+If the event you requested is not in the queue,
+.PN XMaskEvent
+flushes the output buffer and blocks until one is received.
+.LP
+.sp
+To return and remove the next event that matches an event mask (if any), use
+.PN XCheckMaskEvent .
+This function is similar to
+.PN XMaskEvent
+except that it never blocks and it returns a
+.PN Bool
+indicating if the event was returned.
+.IN "XCheckMaskEvent" "" "@DEF@"
+.sM
+.FD 0
+Bool XCheckMaskEvent\^(\^\fIdisplay\fP, \fIevent_mask\fP\^, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ long \fIevent_mask\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.LP
+.eM
+The
+.PN XCheckMaskEvent
+function searches the event queue and then any events available on the
+server connection for the first event that matches the specified mask.
+If it finds a match,
+.PN XCheckMaskEvent
+removes that event, copies it into the specified
+.PN XEvent
+structure, and returns
+.PN True .
+The other events stored in the queue are not discarded.
+If the event you requested is not available,
+.PN XCheckMaskEvent
+returns
+.PN False ,
+and the output buffer will have been flushed.
+.LP
+.sp
+To return and remove the next event in the queue that matches an event type, use
+.PN XCheckTypedEvent .
+.IN "XCheckTypedEvent" "" "@DEF@"
+.sM
+.FD 0
+Bool XCheckTypedEvent\^(\^\fIdisplay\fP, \fIevent_type\fP\^, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ int \fIevent_type\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent_type\fP 1i
+Specifies the event type to be compared.
+
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.LP
+.eM
+The
+.PN XCheckTypedEvent
+function searches the event queue and then any events available
+on the server connection for the first event that matches the specified type.
+If it finds a match,
+.PN XCheckTypedEvent
+removes that event, copies it into the specified
+.PN XEvent
+structure, and returns
+.PN True .
+The other events in the queue are not discarded.
+If the event is not available,
+.PN XCheckTypedEvent
+returns
+.PN False ,
+and the output buffer will have been flushed.
+.LP
+.sp
+To return and remove the next event in the queue that matches an event type
+and a window, use
+.PN XCheckTypedWindowEvent .
+.IN "XCheckTypedWindowEvent" "" "@DEF@"
+.sM
+.FD 0
+Bool XCheckTypedWindowEvent\^(\^\fIdisplay\fP, \fIw\fP\^, \fIevent_type\fP\^, \fIevent_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.br
+ int \fIevent_type\fP\^;
+.br
+ XEvent *\fIevent_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIevent_type\fP 1i
+Specifies the event type to be compared.
+
+.IP \fIevent_return\fP 1i
+Returns the matched event's associated structure.
+.LP
+.eM
+The
+.PN XCheckTypedWindowEvent
+function searches the event queue and then any events available
+on the server connection for the first event that matches the specified
+type and window.
+If it finds a match,
+.PN XCheckTypedWindowEvent
+removes the event from the queue, copies it into the specified
+.PN XEvent
+structure, and returns
+.PN True .
+The other events in the queue are not discarded.
+If the event is not available,
+.PN XCheckTypedWindowEvent
+returns
+.PN False ,
+and the output buffer will have been flushed.
+.NH 2
+Putting an Event Back into the Queue
+.XS
+\*(SN Putting an Event Back into the Queue
+.XE
+.LP
+To push an event back into the event queue, use
+.PN XPutBackEvent .
+.IN "XPutBackEvent" "" "@DEF@"
+.sM
+.FD 0
+XPutBackEvent\^(\^\fIdisplay\fP, \fIevent\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ XEvent *\fIevent\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIevent\fP 1i
+Specifies the event.
+.LP
+.eM
+The
+.PN XPutBackEvent
+function pushes an event back onto the head of the display's event queue
+by copying the event into the queue.
+This can be useful if you read an event and then decide that you
+would rather deal with it later.
+There is no limit to the number of times in succession that you can call
+.PN XPutBackEvent .
+.NH 2
+Sending Events to Other Applications
+.XS
+\*(SN Sending Events to Other Applications
+.XE
+.LP
+To send an event to a specified window, use
+.PN XSendEvent .
+.IN "XSendEvent"
+This function is often used in selection processing.
+For example, the owner of a selection should use
+.PN XSendEvent
+to send a
+.PN SelectionNotify
+event to a requestor when a selection has been converted
+and stored as a property.
+.IN "XSendEvent" "" "@DEF@"
+.sM
+.FD 0
+Status XSendEvent\^(\^\fIdisplay\fP, \fIw\fP\^, \fIpropagate\fP\^, \fIevent_mask\fP\^, \fIevent_send\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.br
+ Bool \fIpropagate\fP\^;
+.br
+ long \fIevent_mask\fP\^;
+.br
+ XEvent *\fIevent_send\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window the event is to be sent to, or
+.PN PointerWindow ,
+or
+.PN InputFocus .
+.IP \fIpropagate\fP 1i
+Specifies a Boolean value.
+.IP \fIevent_mask\fP 1i
+Specifies the event mask.
+.IP \fIevent_send\fP 1i
+Specifies the event that is to be sent.
+.LP
+.eM
+The
+.PN XSendEvent
+function identifies the destination window,
+determines which clients should receive the specified events,
+and ignores any active grabs.
+This function requires you to pass an event mask.
+For a discussion of the valid event mask names,
+see section 10.3.
+This function uses the w argument to identify the destination window as follows:
+.IP \(bu 5
+If w is
+.PN PointerWindow ,
+the destination window is the window that contains the pointer.
+.IP \(bu 5
+If w is
+.PN InputFocus
+and if the focus window contains the pointer,
+the destination window is the window that contains the pointer;
+otherwise, the destination window is the focus window.
+.LP
+To determine which clients should receive the specified events,
+.PN XSendEvent
+uses the propagate argument as follows:
+.IP \(bu 5
+If event_mask is the empty set,
+the event is sent to the client that created the destination window.
+If that client no longer exists,
+no event is sent.
+.IP \(bu 5
+If propagate is
+.PN False ,
+the event is sent to every client selecting on destination any of the event
+types in the event_mask argument.
+.IP \(bu 5
+If propagate is
+.PN True
+and no clients have selected on destination any of
+the event types in event-mask, the destination is replaced with the
+closest ancestor of destination for which some client has selected a
+type in event-mask and for which no intervening window has that type in its
+do-not-propagate-mask.
+If no such window exists or if the window is
+an ancestor of the focus window and
+.PN InputFocus
+was originally specified
+as the destination, the event is not sent to any clients.
+Otherwise, the event is reported to every client selecting on the final
+destination any of the types specified in event_mask.
+.LP
+The event in the
+.PN XEvent
+structure must be one of the core events or one of the events
+defined by an extension (or a
+.PN BadValue
+error results) so that the X server can correctly byte-swap
+the contents as necessary.
+The contents of the event are
+otherwise unaltered and unchecked by the X server except to force send_event to
+.PN True
+in the forwarded event and to set the serial number in the event correctly;
+therefore these fields
+and the display field are ignored by
+.PN XSendEvent .
+.LP
+.PN XSendEvent
+returns zero if the conversion to wire protocol format failed
+and returns nonzero otherwise.
+.LP
+.PN XSendEvent
+can generate
+.PN BadValue
+and
+.PN BadWindow
+errors.
+.NH 2
+Getting Pointer Motion History
+.XS
+\*(SN Getting Pointer Motion History
+.XE
+.LP
+Some X server implementations will maintain a more complete
+history of pointer motion than is reported by event notification.
+The pointer position at each pointer hardware interrupt may be
+stored in a buffer for later retrieval.
+This buffer is called the motion history buffer.
+For example, a few applications, such as paint programs,
+want to have a precise history of where the pointer
+traveled.
+However, this historical information is highly excessive for most applications.
+.LP
+.sp
+To determine the approximate maximum number of elements in the motion buffer,
+use
+.PN XDisplayMotionBufferSize .
+.IN "XDisplayMotionBufferSize" "" "@DEF@"
+.sM
+.FD 0
+unsigned long XDisplayMotionBufferSize\^(\^\fIdisplay\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.LP
+.eM
+The server may retain the recent history of the pointer motion
+and do so to a finer granularity than is reported by
+.PN MotionNotify
+events.
+The
+.PN XGetMotionEvents
+function makes this history available.
+.LP
+.sp
+To get the motion history for a specified window and time, use
+.PN XGetMotionEvents .
+.IN "XGetMotionEvents" "" "@DEF@"
+.sM
+.FD 0
+XTimeCoord *XGetMotionEvents\^(\^\fIdisplay\fP, \fIw\fP\^, \fIstart\fP\^, \fIstop\fP\^, \fInevents_return\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Window \fIw\fP\^;
+.br
+ Time \fIstart\fP\^, \fIstop\fP\^;
+.br
+ int *\fInevents_return\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIw\fP 1i
+Specifies the window.
+.IP \fIstart\fP 1i
+.br
+.ns
+.IP \fIstop\fP 1i
+Specify the time interval in which the events are returned from the motion
+history buffer.
+You can pass a timestamp or
+.PN CurrentTime .
+.IP \fInevents_return\fP 1i
+Returns the number of events from the motion history buffer.
+.LP
+.eM
+The
+.PN XGetMotionEvents
+function returns all events in the motion history buffer that fall between the
+specified start and stop times, inclusive, and that have coordinates
+that lie within the specified window (including its borders) at its present
+placement.
+If the server does not support motion history,
+if the start time is later than the stop time,
+or if the start time is in the future,
+no events are returned;
+.PN XGetMotionEvents
+returns NULL.
+If the stop time is in the future, it is equivalent to specifying
+.PN CurrentTime .
+The return type for this function is a structure defined as follows:
+.LP
+.IN "XTimeCoord" "" "@DEF@"
+.sM
+.Ds 0
+.TA .5i
+.ta .5i
+typedef struct {
+ Time time;
+ short x, y;
+} XTimeCoord;
+.De
+.LP
+.eM
+The time member is set to the time, in milliseconds.
+The x and y members are set to the coordinates of the pointer and
+are reported relative to the origin
+of the specified window.
+To free the data returned from this call, use
+.PN XFree .
+.LP
+.PN XGetMotionEvents
+can generate a
+.PN BadWindow
+error.
+.NH 2
+Handling Protocol Errors
+.XS
+\*(SN Handling Protocol Errors
+.XE
+.LP
+Xlib provides functions that you can use to enable or disable synchronization
+and to use the default error handlers.
+.NH 3
+Enabling or Disabling Synchronization
+.XS
+\*(SN Enabling or Disabling Synchronization
+.XE
+.LP
+When debugging X applications,
+it often is very convenient to require Xlib to behave synchronously
+so that errors are reported as they occur.
+The following function lets you disable or enable synchronous behavior.
+Note that graphics may occur 30 or more times more slowly when
+synchronization is enabled.
+.IN "_Xdebug"
+On POSIX-conformant systems,
+there is also a global variable
+.PN _Xdebug
+that, if set to nonzero before starting a program under a debugger, will force
+synchronous library behavior.
+.LP
+After completing their work,
+all Xlib functions that generate protocol requests call what is known as
+an after function.
+.PN XSetAfterFunction
+sets which function is to be called.
+.IN "XSetAfterFunction" "" "@DEF@"
+.sM
+.FD 0
+int (*XSetAfterFunction\^(\^\fIdisplay\fP, \fIprocedure\fP\^))()
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ int (\^*\^\fIprocedure\fP\^)\^();
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIprocedure\fP 1i
+Specifies the procedure to be called.
+.LP
+.eM
+The specified procedure is called with only a display pointer.
+.PN XSetAfterFunction
+returns the previous after function.
+.LP
+To enable or disable synchronization, use
+.PN XSynchronize .
+.IN "Debugging" "synchronous mode"
+.IN "XSynchronize" "" "@DEF@"
+.sM
+.FD 0
+int (*XSynchronize\^(\^\fIdisplay\fP, \fIonoff\fP\^)\^)()
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ Bool \fIonoff\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIonoff\fP 1i
+Specifies a Boolean value that indicates whether to enable
+or disable synchronization.
+.LP
+.eM
+The
+.PN XSynchronize
+function returns
+the previous after function.
+If onoff is
+.PN True ,
+.PN XSynchronize
+turns on synchronous behavior.
+If onoff is
+.PN False ,
+.PN XSynchronize
+turns off synchronous behavior.
+.NH 3
+Using the Default Error Handlers
+.XS
+\*(SN Using the Default Error Handlers
+.XE
+.LP
+.IN "Debugging" "error handlers"
+.IN "Error" "handlers"
+There are two default error handlers in Xlib:
+one to handle typically fatal conditions (for example,
+the connection to a display server dying because a machine crashed)
+and one to handle protocol errors from the X server.
+These error handlers can be changed to user-supplied routines if you
+prefer your own error handling and can be changed as often as you like.
+If either function is passed a NULL pointer, it will
+reinvoke the default handler.
+The action of the default handlers is to print an explanatory
+message and exit.
+.LP
+.sp
+To set the error handler, use
+.PN XSetErrorHandler .
+.IN "XSetErrorHandler" "" "@DEF@"
+.sM
+.FD 0
+int (*XSetErrorHandler\^(\^\fIhandler\fP\^)\^)\^(\^)
+.br
+ int (\^*\^\fIhandler\fP\^)\^(Display *, XErrorEvent *)
+.FN
+.IP \fIhandler\fP 1i
+Specifies the program's supplied error handler.
+.LP
+.eM
+Xlib generally calls the program's
+supplied error handler whenever an error is received.
+It is not called on
+.PN BadName
+errors from
+.PN OpenFont ,
+.PN LookupColor ,
+or
+.PN AllocNamedColor
+protocol requests or on
+.PN BadFont
+errors from a
+.PN QueryFont
+protocol request.
+These errors generally are reflected back to the program through the
+procedural interface.
+Because this condition is not assumed to be fatal,
+it is acceptable for your error handler to return;
+the returned value is ignored.
+However, the error handler should not
+call any functions (directly or indirectly) on the display
+that will generate protocol requests or that will look for input events.
+The previous error handler is returned.
+.LP
+The
+.PN XErrorEvent
+structure contains:
+.IN "Debugging" "error event"
+.LP
+.IN "XErrorEvent" "" "@DEF"
+.Ds 0
+.TA .5i 2.5i
+.ta .5i 2.5i
+typedef struct {
+ int type;
+ Display *display; /* Display the event was read from */
+ unsigned long serial; /* serial number of failed request */
+ unsigned char error_code; /* error code of failed request */
+ unsigned char request_code; /* Major op-code of failed request */
+ unsigned char minor_code; /* Minor op-code of failed request */
+ XID resourceid; /* resource id */
+} XErrorEvent;
+.De
+.LP
+.IN "Serial Number"
+The serial member is the number of requests, starting from one,
+sent over the network connection since it was opened.
+It is the number that was the value of
+.PN NextRequest
+immediately before the failing call was made.
+The request_code member is a protocol request
+of the procedure that failed, as defined in
+.hN X11/Xproto.h .
+The following error codes can be returned by the functions described in this
+chapter:
+.br
+.ne 13
+.IN "Debugging" "error numbers"
+.IN "Error" "codes"
+.\".CP T 3
+.\"Error Codes
+.IN "BadAccess" "" "@DEF@"
+.IN "BadAlloc" "" "@DEF@"
+.IN "BadAtom" "" "@DEF@"
+.IN "BadColor" "" "@DEF@"
+.IN "BadCursor" "" "@DEF@"
+.IN "BadDrawable" "" "@DEF@"
+.IN "BadFont" "" "@DEF@"
+.IN "BadGC" "" "@DEF@"
+.IN "BadIDChoice" "" "@DEF@"
+.TS H
+l c
+lw(1.75i) lw(4i).
+_
+.sp 6p
+.B
+Error Code Description
+.sp 6p
+_
+.sp 6p
+.TH
+.R
+T{
+.PN BadAccess
+T} T{
+A client attempts to grab a key/button combination already grabbed
+by another client.
+.sp 3p
+A client attempts to free a colormap entry that it had not already allocated
+or to free an entry in a colormap that was created with all entries writable.
+.sp 3p
+A client attempts to store into a read-only or unallocated colormap entry.
+.sp 3p
+A client attempts to modify the access control list from other than the local
+(or otherwise authorized) host.
+.sp 3p
+A client attempts to select an event type that another client
+has already selected.
+T}
+.sp 3p
+T{
+.PN BadAlloc
+T} T{
+The server fails to allocate the requested resource.
+Note that the explicit listing of
+.PN BadAlloc
+errors in requests only covers allocation errors at a very coarse level
+and is not intended to (nor can it in practice hope to) cover all cases of
+a server running out of allocation space in the middle of service.
+The semantics when a server runs out of allocation space are left unspecified,
+but a server may generate a
+.PN BadAlloc
+error on any request for this reason,
+and clients should be prepared to receive such errors and handle or discard
+them.
+T}
+.sp 3p
+T{
+.PN BadAtom
+T} T{
+A value for an atom argument does not name a defined atom.
+T}
+.sp 3p
+T{
+.PN BadColor
+T} T{
+A value for a colormap argument does not name a defined colormap.
+T}
+.sp 3p
+T{
+.PN BadCursor
+T} T{
+A value for a cursor argument does not name a defined cursor.
+T}
+.sp 3p
+T{
+.PN BadDrawable
+T} T{
+A value for a drawable argument does not name a defined window or pixmap.
+T}
+.sp 3p
+T{
+.PN BadFont
+T} T{
+A value for a font argument does not name a defined font (or, in some cases,
+.PN GContext ).
+T}
+.sp 3p
+T{
+.PN BadGC
+T} T{
+A value for a
+.PN GContext
+argument does not name a defined
+.PN GContext .
+T}
+.sp 3p
+T{
+.PN BadIDChoice
+T} T{
+The value chosen for a resource identifier either is not included in the
+range assigned to the client or is already in use.
+Under normal circumstances,
+this cannot occur and should be considered a server or Xlib error.
+T}
+.sp 3p
+T{
+.PN BadImplementation
+T} T{
+The server does not implement some aspect of the request.
+A server that generates this error for a core request is deficient.
+As such, this error is not listed for any of the requests,
+but clients should be prepared to receive such errors
+and handle or discard them.
+T}
+.sp 3p
+T{
+.PN BadLength
+T} T{
+The length of a request is shorter or longer than that required to
+contain the arguments.
+This is an internal Xlib or server error.
+.sp 3p
+The length of a request exceeds the maximum length accepted by the server.
+T}
+.sp 3p
+T{
+.PN BadMatch
+T} T{
+In a graphics request,
+the root and depth of the graphics context do not match those of the drawable.
+.sp 3p
+An
+.PN InputOnly
+window is used as a drawable.
+.sp 3p
+Some argument or pair of arguments has the correct type and range,
+but it fails to match in some other way required by the request.
+.sp 3p
+An
+.PN InputOnly
+window lacks this attribute.
+T}
+.sp 3p
+T{
+.PN BadName
+T} T{
+A font or color of the specified name does not exist.
+T}
+.sp 3p
+T{
+.PN BadPixmap
+T} T{
+A value for a pixmap argument does not name a defined pixmap.
+T}
+.sp 3p
+T{
+.PN BadRequest
+T} T{
+The major or minor opcode does not specify a valid request.
+This usually is an Xlib or server error.
+T}
+.sp 3p
+T{
+.PN BadValue
+T} T{
+Some numeric value falls outside of the range of values accepted
+by the request.
+Unless a specific range is specified for an argument,
+the full range defined by the argument's type is accepted.
+Any argument defined as a set of alternatives typically can generate
+this error (due to the encoding).
+T}
+.sp 3p
+T{
+.PN BadWindow
+T} T{
+A value for a window argument does not name a defined window.
+T}
+.sp 6p
+_
+.TE
+.IN "BadImplementation" "" "@DEF@"
+.IN "BadLength" "" "@DEF@"
+.IN "BadMatch" "" "@DEF@"
+.IN "BadName" "" "@DEF@"
+.IN "BadPixmap" "" "@DEF@"
+.IN "BadRequest" "" "@DEF@"
+.IN "BadValue" "" "@DEF@"
+.IN "BadWindow" "" "@DEF@"
+.NT Note
+The
+.PN BadAtom ,
+.PN BadColor ,
+.PN BadCursor ,
+.PN BadDrawable ,
+.PN BadFont ,
+.PN BadGC ,
+.PN BadPixmap ,
+and
+.PN BadWindow
+errors are also used when the argument type is extended by a set of
+fixed alternatives.
+.NE
+.sp
+.LP
+To obtain textual descriptions of the specified error code, use
+.PN XGetErrorText .
+.IN "XGetErrorText" "" "@DEF@"
+.IN "Debugging" "error message strings"
+.sM
+.FD 0
+XGetErrorText\^(\^\fIdisplay\fP, \fIcode\fP, \fIbuffer_return\fP, \fIlength\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ int \fIcode\fP\^;
+.br
+ char *\fIbuffer_return\fP\^;
+.br
+ int \fIlength\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIcode\fP 1i
+Specifies the error code for which you want to obtain a description.
+.IP \fIbuffer_return\fP 1i
+Returns the error description.
+.IP \fIlength\fP 1i
+Specifies the size of the buffer.
+.LP
+.eM
+The
+.PN XGetErrorText
+function copies a null-terminated string describing the specified error code
+into the specified buffer.
+The returned text is in the encoding of the current locale.
+It is recommended that you use this function to obtain an error description
+because extensions to Xlib may define their own error codes
+and error strings.
+.LP
+.sp
+To obtain error messages from the error database, use
+.PN XGetErrorDatabaseText .
+.IN "XGetErrorDatabaseText" "" "@DEF@"
+.sM
+.FD 0
+XGetErrorDatabaseText\^(\^\fIdisplay\fP, \fIname\fP, \fImessage\fP, \fIdefault_string\fP, \fIbuffer_return\fP, \fIlength\fP\^)
+.br
+ Display *\fIdisplay\fP\^;
+.br
+ char *\fIname\fP, *\fImessage\fP\^;
+.br
+ char *\fIdefault_string\fP\^;
+.br
+ char *\fIbuffer_return\fP\^;
+.br
+ int \fIlength\fP\^;
+.FN
+.IP \fIdisplay\fP 1i
+Specifies the connection to the X server.
+.IP \fIname\fP 1i
+Specifies the name of the application.
+.IP \fImessage\fP 1i
+Specifies the type of the error message.
+.IP \fIdefault_string\fP 1i
+Specifies the default error message if none is found in the database.
+.IP \fIbuffer_return\fP 1i
+Returns the error description.
+.IP \fIlength\fP 1i
+Specifies the size of the buffer.
+.LP
+.eM
+The
+.PN XGetErrorDatabaseText
+function returns a null-terminated message
+(or the default message) from the error message
+database.
+Xlib uses this function internally to look up its error messages.
+The text in the default_string argument is assumed
+to be in the encoding of the current locale,
+and the text stored in the buffer_return argument
+is in the encoding of the current locale.
+.LP
+The name argument should generally be the name of your application.
+The message argument should indicate which type of error message you want.
+If the name and message are not in the Host Portable Character Encoding,
+the result is implementation-dependent.
+Xlib uses three predefined ``application names'' to report errors.
+In these names,
+uppercase and lowercase matter.
+.IP XProtoError 1i
+The protocol error number is used as a string for the message argument.
+.IP XlibMessage 1i
+These are the message strings that are used internally by the library.
+.IP XRequest 1i
+For a core protocol request,
+the major request protocol number is used for the message argument.
+For an extension request,
+the extension name (as given by
+.PN InitExtension )
+followed by a period (\.) and the minor request protocol number
+is used for the message argument.
+If no string is found in the error database,
+the default_string is returned to the buffer argument.
+.LP
+.sp
+To report an error to the user when the requested display does not exist, use
+.PN XDisplayName .
+.IN "XDisplayName" "" "@DEF@"
+.sM
+.FD 0
+char *XDisplayName\^(\^\fIstring\fP\^)
+.br
+ char *\fIstring\fP\^;
+.FN
+.IP \fIstring\fP 1i
+Specifies the character string.
+.LP
+.eM
+The
+.PN XDisplayName
+function returns the name of the display that
+.PN XOpenDisplay
+would attempt to use.
+If a NULL string is specified,
+.PN XDisplayName
+looks in the environment for the display and returns the display name that
+.PN XOpenDisplay
+would attempt to use.
+This makes it easier to report to the user precisely which display the
+program attempted to open when the initial connection attempt failed.
+.LP
+.sp
+To handle fatal I/O errors, use
+.PN XSetIOErrorHandler .
+.IN "XSetIOErrorHandler" "" "@DEF@"
+.sM
+.FD 0
+int (*XSetIOErrorHandler\^(\^\fIhandler\fP\^)\^)\^(\^)
+.br
+ int (\^*\^\fIhandler\fP\^)(Display *);
+.FN
+.IP \fIhandler\fP 1i
+Specifies the program's supplied error handler.
+.LP
+.eM
+The
+.PN XSetIOErrorHandler
+sets the fatal I/O error handler.
+Xlib calls the program's supplied error handler if any sort of system call
+error occurs (for example, the connection to the server was lost).
+This is assumed to be a fatal condition,
+and the called routine should not return.
+If the I/O error handler does return,
+the client process exits.
+.LP
+Note that the previous error handler is returned.
+.bp