summaryrefslogtreecommitdiff
path: root/specs/CH07
diff options
context:
space:
mode:
Diffstat (limited to 'specs/CH07')
-rw-r--r--specs/CH073555
1 files changed, 0 insertions, 3555 deletions
diff --git a/specs/CH07 b/specs/CH07
deleted file mode 100644
index d55598f..0000000
--- a/specs/CH07
+++ /dev/null
@@ -1,3555 +0,0 @@
-.\" $Xorg: CH07,v 1.4 2000/08/17 19:42:45 cpqbld Exp $
-.\" Copyright \(co 1985, 1986, 1987, 1988, 1991, 1994
-.\" 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, 1991, 1994
-.\" Digital Equipment Corporation, Maynard, Massachusetts.
-.\"
-.\" 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 supporting documentation, and that the name of
-.\" Digital not be used in in advertising or publicity pertaining
-.\" to distribution of the software without specific, written prior permission.
-.\" Digital makes no representations about the suitability of the
-.\" software described herein for any purpose.
-.\" It is provided ``as is'' without express or implied warranty.
-.\"
-\&
-.sp 1
-.ce 3
-\s+1\fBChapter 7\fP\s-1
-
-\s+1\fBEvent Management\fP\s-1
-.sp 2
-.nr H1 7
-.nr H2 0
-.nr H3 0
-.nr H4 0
-.nr H5 0
-.LP
-.XS
-Chapter 7 \(em Event Management
-.XE
-While Xlib allows the reading and processing of events anywhere in an application,
-widgets in the \*(tk neither directly read events
-nor grab the server or pointer.
-Widgets register procedures that are to be called
-when an event or class of events occurs in that widget.
-.LP
-A typical application consists of startup code followed by an event loop
-that reads events and dispatches them by calling
-the procedures that widgets have registered.
-The default event loop provided by the \*(xI is
-.PN XtAppMainLoop .
-.LP
-The event manager is a collection of functions to perform the following tasks:
-.IP \(bu 5
-Add or remove event sources other than X server events (in particular,
-timer interrupts, file input, or POSIX signals).
-.IP \(bu 5
-Query the status of event sources.
-.IP \(bu 5
-Add or remove procedures to be called when an event occurs for a particular
-widget.
-.IP \(bu 5
-Enable and
-disable the dispatching of user-initiated events (keyboard and pointer events)
-for a particular widget.
-.IP \(bu 5
-Constrain the dispatching of events to a cascade of pop-up widgets.
-.IP \(bu 5
-Register procedures to be called when specific events arrive.
-.IP \(bu 5
-Register procedures to be called when the \*(xI will block.
-.IP \(bu 5
-Enable safe operation in a multi-threaded environment.
-.LP
-Most widgets do not need to call any of the event handler functions explicitly.
-The normal interface to X events is through the higher-level
-translation manager,
-which maps sequences of X events, with modifiers, into procedure calls.
-Applications rarely use any of the event manager routines besides
-.PN XtAppMainLoop .
-
-.NH 2
-Adding and Deleting Additional Event Sources
-.XS
-\fB\*(SN Adding and Deleting Additional Event Sources\fP
-.XE
-.LP
-While most applications are driven only by X events,
-some applications need to incorporate other sources of input
-into the \*(xI event-handling mechanism.
-The event manager provides routines to integrate notification of timer events
-and file data pending into this mechanism.
-.LP
-The next section describes functions that provide input gathering from files.
-The application registers the files with the \*(xI read routine.
-When input is pending on one of the files,
-the registered callback procedures are invoked.
-
-.NH 3
-Adding and Removing Input Sources
-.XS
-\fB\*(SN Adding and Removing Input Sources\fP
-.XE
-.LP
-To register a new file as an input source for a given application context, use
-.PN XtAppAddInput .
-.LP
-.IN "XtAppAddInput" "" "@DEF@"
-.sM
-.FD 0
-XtInputId XtAppAddInput(\fIapp_context\fP, \fIsource\fP, \fIcondition\fP, \
-\fIproc\fP, \fIclient_data\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- int \fIsource\fP;
-.br
- XtPointer \fIcondition\fP;
-.br
- XtInputCallbackProc \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application.
-.IP \fIsource\fP 1i
-Specifies the source file descriptor on a POSIX-based system
-or other operating-system-dependent device specification.
-.IP \fIcondition\fP 1i
-Specifies the mask that indicates a read, write, or exception condition
-or some other operating-system-dependent condition.
-.IP \fIproc\fP 1i
-Specifies the procedure to be called when the condition is found.
-.IP \fIclient_data\fP 1i
-Specifies an argument passed to the specified procedure
-when it is called.
-.LP
-.eM
-The
-.PN XtAppAddInput
-function registers with the \*(xI read routine a new source of events,
-which is usually file input but can also be file output.
-Note that \fIfile\fP should be loosely interpreted to mean any sink
-or source of data.
-.PN XtAppAddInput
-also specifies the conditions under which the source can generate events.
-When an event is pending on this source,
-the callback procedure is called.
-.LP
-The legal values for the \fIcondition\fP argument are operating-system-dependent.
-On a POSIX-based system,
-\fIsource\fP is a file number and the condition is some union of the following:
-.IN "XtInputReadMask" "" "@DEF@"
-.IP \fBXtInputReadMask\fR 1.5i
-Specifies that \fIproc\fP is to be called when \fIsource\fP has data to be read.
-.IN "XtInputWriteMask" "" "@DEF@"
-.IP \fBXtInputWriteMask\fR 1.5i
-Specifies that \fIproc\fP is to be called when \fIsource\fP is ready
-for writing.
-.IN "XtInputExceptMask" "" "@DEF@"
-.IP \fBXtInputExceptMask\fR 1.5i
-Specifies that \fIproc\fP is to be called when \fIsource\fP has
-exception data.
-.LP
-Callback procedure pointers used to handle file events are of
-type
-.PN XtInputCallbackProc .
-.LP
-.IN "XtInputCallbackProc" "" "@DEF@"
-.sM
-.FD 0
-typedef void (*XtInputCallbackProc)(XtPointer, int*, XtInputId*);
-.br
- XtPointer \fIclient_data\fP;
-.br
- int *\fIsource\fP;
-.br
- XtInputId *\fIid\fP;
-.FN
-.IP \fIclient_data\fP 1i
-Passes the client data argument that was registered for this procedure in
-.PN XtApp\%AddInput .
-.IP \fIsource\fP 1i
-Passes the source file descriptor generating the event.
-.IP \fIid\fP 1i
-Passes the id returned from the corresponding
-.PN XtAppAddInput
-call.
-.LP
-.eM
-See Section 7.12 for information regarding the use of
-.PN XtAppAddInput
-in multiple threads.
-.sp
-.LP
-To discontinue a source of input, use
-.PN XtRemoveInput .
-.LP
-.IN "XtRemoveInput" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveInput(\fIid\fP)
-.br
- XtInputId \fIid\fP;
-.FN
-.IP \fIid\fP 1i
-Specifies the id returned from the corresponding
-.PN XtAppAddInput
-call.
-.LP
-.eM
-The
-.PN XtRemoveInput
-function causes the \*(xI read routine to stop watching for events
-from the file source specified by \fIid\fP.
-.LP
-See Section 7.12 for information regarding the use of
-.PN XtRemoveInput
-in multiple threads.
-
-.NH 3
-Adding and Removing Blocking Notifications
-.XS
-\fB\*(SN Adding and Removing Blocking Notifications\fP
-.XE
-.LP
-Occasionally it is desirable for an application to receive notification
-when the \*(xI event manager detects no pending input from file sources
-and no pending input from X server event sources and is about to block
-in an operating system call.
-.sp
-.LP
-To register a hook that is called immediately prior to event blocking, use
-.PN XtAppAddBlockHook .
-.LP
-.IN "XtAppAddBlockHook" "" "@DEF@"
-.sM
-.FD 0
-XtBlockHookId XtAppAddBlockHook(\fIapp_context\fP, \fIproc\fP, \
-\fIclient_data\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- XtBlockHookProc \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application.
-.IP \fIproc\fP 1i
-Specifies the procedure to be called before blocking.
-.IP \fIclient_data\fP 1i
-Specifies an argument passed to the specified procedure when it is called.
-.LP
-.eM
-The
-.PN XtAppAddBlockHook
-function registers the specified procedure and returns an identifier for it.
-The hook procedure \fIproc\fP is called at any time in the future when
-the \*(xI are about to block pending some input.
-.LP
-The procedure pointers used to provide notification of event blocking
-are of type
-.PN XtBlockHookProc .
-.LP
-.IN "XtBlockHookProc" "" "@DEF@"
-.sM
-.FD 0
-typedef void (*XtBlockHookProc)(XtPointer);
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIclient_data\fP 1i
-Passes the client data argument that was registered for this procedure in
-.PN XtApp\%AddBlockHook .
-.LP
-.eM
-To discontinue the use of a procedure for blocking notification, use
-.PN XtRemoveBlockHook .
-.LP
-.IN "XtRemoveBlockHook" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveBlockHook(\fIid\fP)
-.br
- XtBlockHookId \fIid\fP;
-.FN
-.IP \fIid\fP 1i
-Specifies the identifier returned from the corresponding call to
-.PN XtAppAddBlockHook .
-.LP
-.eM
-The
-.PN XtRemoveBlockHook
-function removes the specified procedure from the list of procedures
-that are called by the \*(xI read routine before blocking on event sources.
-
-.NH 3
-Adding and Removing Timeouts
-.XS
-\fB\*(SN Adding and Removing Timeouts\fP
-.XE
-.LP
-The timeout facility notifies the application or the widget
-through a callback procedure that a specified time interval has elapsed.
-Timeout values are uniquely identified by an interval id.
-.sp
-.LP
-To register a timeout callback, use
-.PN XtAppAddTimeOut .
-.LP
-.IN "XtAppAddTimeOut" "" "@DEF@"
-.sM
-.FD 0
-XtIntervalId XtAppAddTimeOut(\fIapp_context\fP, \fIinterval\fP, \fIproc\fP, \
-\fIclient_data\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- unsigned long \fIinterval\fP;
-.br
- XtTimerCallbackProc \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context for which the timer is to be set.
-.IP \fIinterval\fP 1i
-Specifies the time interval in milliseconds.
-.IP \fIproc\fP 1i
-Specifies the procedure to be called when the time expires.
-.IP \fIclient_data\fP 1i
-Specifies an argument passed to the specified procedure
-when it is called.
-.LP
-.eM
-The
-.PN XtAppAddTimeOut
-function creates a timeout and returns an identifier for it.
-The timeout value is set to \fIinterval\fP.
-The callback procedure \fIproc\fP is called when
-.PN XtAppNextEvent
-or
-.PN XtAppProcessEvent
-is next called after the time interval elapses,
-and then the timeout is removed.
-.LP
-Callback procedure pointers used with timeouts are of
-type
-.PN XtTimerCallbackProc .
-.LP
-.IN "XtTimerCallbackProc" "" "@DEF@"
-.sM
-.FD 0
-typedef void (*XtTimerCallbackProc)(XtPointer, XtIntervalId*);
-.br
- XtPointer \fIclient_data\fP;
-.br
- XtIntervalId *\fItimer\fP;
-.FN
-.IP \fIclient_data\fP 1i
-Passes the client data argument that was registered for this procedure in
-.PN XtApp\%AddTimeOut .
-.IP \fItimer\fP 1i
-Passes the id returned from the corresponding
-.PN XtAppAddTimeOut
-call.
-.LP
-.eM
-See Section 7.12 for information regarding the use of
-.PN XtAppAddTimeOut
-in multiple threads.
-.sp
-.LP
-To clear a timeout value, use
-.PN XtRemoveTimeOut .
-.LP
-.IN "XtRemoveTimeOut" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveTimeOut(\fItimer\fP)
-.br
- XtIntervalId \fItimer\fP;
-.FN
-.IP \fItimer\fP 1i
-Specifies the id for the timeout request to be cleared.
-.LP
-.eM
-The
-.PN XtRemoveTimeOut
-function removes the pending timeout.
-Note that timeouts are automatically removed once they trigger.
-.LP
-Please refer to Section 7.12 for information regarding the use of
-.PN XtRemoveTimeOut
-in multiple threads.
-
-.NH 3
-Adding and Removing Signal Callbacks
-.XS
-\fB\*(SN Adding and Removing Signal Callbacks\fP
-.XE
-.LP
-The signal facility notifies the application or the widget through a
-callback procedure that a signal or other external asynchronous event
-has occurred. The registered callback procedures are uniquely identified
-by a signal id.
-.sp
-.LP
-Prior to establishing a signal handler, the application or widget should
-call
-.PN XtAppAddSignal
-and store the resulting identifier in a place accessible to the signal
-handler. When a signal arrives, the signal handler should call
-.PN XtNoticeSignal
-to notify the \*(xI that a signal has occured. To register a signal
-callback use
-.PN XtAppAddSignal .
-.LP
-.IN "XtAppAddSignal" "" "@DEF@"
-.sM
-.FD 0
-XtSignalId XtAppAddSignal(\fIapp_context\fP, \fIproc\fP, \fIclient_data\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- XtSignalCallbackProc \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application.
-.IP \fIproc\fP 1i
-Specifies the procedure to be called when the signal is noticed.
-.IP \fIclient_data\fP 1i
-Specifies an argument passed to the specified procedure when it is called.
-.LP
-.eM
-The callback procedure pointers used to handle signal events are of type
-.PN XtSignalCallbackProc .
-.LP
-.IN "XtSignalCallbackProc" "" "@DEF@"
-.sM
-.FD 0
-typedef void (*XtSignalCallbackProc)(XtPointer, XtSignalId*);
-.br
- XtPointer \fIclient_data\fP;
-.br
- XtSignalId *\fIid\fP;
-.FN
-.IP \fIclient_data\fP 1i
-Passes the client data argument that was registered for this procedure in
-.PN XtAppAddSignal .
-.IP \fIid\fP 1i
-Passes the id returned from the corresponding
-.PN XtAppAddSignal
-call.
-.LP
-.eM
-To notify the \*(xI that a signal has occured, use
-.PN XtNoticeSignal .
-.LP
-.IN "XtNoticeSignal" "" "@DEF@"
-.sp
-.sM
-.FD 0
-void XtNoticeSignal(\fIid\fP)
-.br
- XtSignalId \fIid\fP;
-.FN
-.IP \fIid\fP 1i
-Specifies the id returned from the corresponding
-.PN XtAppAddSignal
-call.
-.LP
-.eM
-On a POSIX-based system,
-.PN XtNoticeSignal
-is the only \*(xI function that can safely be called from a signal handler.
-If
-.PN XtNoticeSignal
-is invoked multiple times before the \*(xI are able to invoke the
-registered callback, the callback is only called once.
-Logically, the \*(xI maintain ``pending'' flag for each registered callback.
-This flag is initially
-.PN False
-and is set to
-.PN True
-by
-.PN XtNoticeSignal .
-When
-.PN XtAppNextEvent
-or
-.PN XtAppProcessEvent
-(with a mask including
-.PN XtIMSignal )
-is called, all registered callbacks with ``pending''
-.PN True
-are invoked and the flags are reset to
-.PN False .
-.LP
-If the signal handler wants to track how many times the signal has been
-raised, it can keep its own private counter. Typically the handler would
-not do any other work; the callback does the actual processing for the
-signal. The \*(xI never block signals from being raised, so if a given
-signal can be raised multiple times before the \*(xI can invoke the
-callback for that signal, the callback must be designed to deal with
-this. In another case, a signal might be raised just after the \*(xI
-sets the pending flag to
-.PN False
-but before the callback can get control, in which case the pending flag
-will still be
-.PN True
-after the callback returns, and the \*(xI will invoke the callback
-again, even though all of the signal raises have been handled. The
-callback must also be prepared to handle this case.
-.LP
-To remove a registered signal callback, call
-.PN XtRemoveSignal .
-.LP
-.IN "XtRemoveSignal" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveSignal(\fIid\fP)
-.br
- XtSignalId \fIid\fP;
-.FN
-.IP \fIid\fP 1i
-Specifies the id returned by the corresponding call to
-.PN XtAppAddSignal .
-.LP
-.eM
-The client should typically disable the source of the signal before calling
-.PN XtRemoveSignal .
-If the signal could have been raised again before the source was disabled
-and the client wants to process it, then after disabling the source but
-before calling
-.PN XtRemoveSignal
-the client can test for signals with
-.PN XtAppPending
-and process them by calling
-.PN XtAppProcessEvent
-with the mask
-.PN XtIMSignal .
-
-.NH 2
-Constraining Events to a Cascade of Widgets
-.XS
-\fB\*(SN Constraining Events to a Cascade of Widgets\fP
-.XE
-.LP
-.IN "Grabbing Input"
-.IN "Input Grabbing"
-Modal widgets are widgets that, except for the input directed to them,
-lock out user input to the application.
-.LP
-When a modal menu or modal dialog box is popped up using
-.PN XtPopup ,
-user events (keyboard and pointer events) that occur outside the modal
-widget should be delivered to the modal widget or ignored.
-In no case will user events be delivered to a widget outside
-the modal widget.
-.LP
-Menus can pop up submenus, and dialog boxes can pop up further dialog
-boxes to create a pop-up cascade.
-In this case,
-user events may be delivered to one of several modal widgets in the cascade.
-.LP
-Display-related events should be delivered outside the modal cascade so that
-exposure events and the like keep the application's display up-to-date.
-Any event that occurs within the cascade is delivered as usual.
-The user events delivered to the most recent spring-loaded shell
-in the cascade when they occur outside the cascade are called remap events
-and are
-.PN KeyPress ,
-.PN KeyRelease ,
-.PN ButtonPress ,
-and
-.PN ButtonRelease .
-The user events ignored when they occur outside the cascade are
-.PN MotionNotify
-and
-.PN EnterNotify .
-All other events are delivered normally.
-In particular, note that this is one
-way in which widgets can receive
-.PN LeaveNotify
-events without first receiving
-.PN EnterNotify
-events; they should be prepared to deal with
-this, typically by ignoring any unmatched
-.PN LeaveNotify
-events.
-.LP
-.PN XtPopup
-uses the
-.PN XtAddGrab
-and
-.PN XtRemoveGrab
-functions to constrain user events to a modal cascade
-and subsequently to remove a grab when the modal widget is popped down.
-
-.sp
-.LP
-To constrain or redirect user input to a modal widget, use
-.PN XtAddGrab .
-.LP
-.IN "XtAddGrab" "" "@DEF@"
-.sM
-.FD 0
-void XtAddGrab(\fIw\fP, \fIexclusive\fP, \fIspring_loaded\fP)
-.br
- Widget \fIw\fP;
-.br
- Boolean \fIexclusive\fP;
-.br
- Boolean \fIspring_loaded\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget to add to the modal cascade. \*(cI
-.IP \fIexclusive\fP 1i
-Specifies whether user events should be dispatched exclusively to this widget
-or also to previous widgets in the cascade.
-.IP \fIspring_loaded\fP 1i
-Specifies whether this widget was popped up because the user pressed
-a pointer button.
-.LP
-.eM
-The
-.PN XtAddGrab
-function appends the widget to the modal cascade
-and checks that \fIexclusive\fP is
-.PN True
-if \fIspring_loaded\fP is
-.PN True .
-If this condition is not met,
-.PN XtAddGrab
-generates a warning message.
-.LP
-The modal cascade is used by
-.PN XtDispatchEvent
-when it tries to dispatch a user event.
-When at least one modal widget is in the widget cascade,
-.PN XtDispatchEvent
-first determines if the event should be delivered.
-It starts at the most recent cascade entry and follows the cascade up to and
-including the most recent cascade entry added with the \fIexclusive\fP parameter
-.PN True .
-.LP
-This subset of the modal cascade along with all descendants of these widgets
-comprise the active subset.
-User events that occur outside the widgets in this subset are ignored
-or remapped.
-Modal menus with submenus generally add a submenu widget to the cascade
-with \fIexclusive\fP
-.PN False .
-Modal dialog boxes that need to restrict user input to the most deeply nested
-dialog box add a subdialog widget to the cascade with \fIexclusive\fP
-.PN True .
-User events that occur within the active subset are delivered to the
-appropriate widget, which is usually a child or further descendant of the modal
-widget.
-.LP
-Regardless of where in the application they occur,
-remap events are always delivered to the most recent widget in the active
-subset of the cascade registered with \fIspring_loaded\fP
-.PN True ,
-if any such widget exists.
-If the event
-occurred in the active subset of the cascade but outside the
-spring-loaded widget, it is delivered normally before being
-delivered also to the spring-loaded widget.
-Regardless of where it is dispatched, the \*(xI do not modify
-the contents of the event.
-.sp
-.LP
-To remove the redirection of user input to a modal widget, use
-.PN XtRemoveGrab .
-.LP
-.IN "XtRemoveGrab" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveGrab(\fIw\fP)
-.br
- Widget \fIw\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget to remove from the modal cascade.
-.LP
-.eM
-The
-.PN XtRemoveGrab
-function removes widgets from the modal cascade starting
-at the most recent widget up to and including the specified widget.
-It issues a warning if the specified widget is not on the modal cascade.
-
-.NH 3
-Requesting Key and Button Grabs
-.XS
-\fB\*(SN Requesting Key and Button Grabs\fP
-.XE
-.LP
-The \*(xI provide a set of key and button grab interfaces that
-are parallel to those provided by Xlib and that allow the \*(xI
-to modify event dispatching when necessary. \*(tk applications and
-widgets that need to passively grab keys or buttons or actively grab
-the keyboard or pointer should use the
-following \*(xI routines rather than the corresponding Xlib
-routines.
-.sp
-.LP
-To passively grab a single key of the keyboard, use
-.PN XtGrabKey .
-.LP
-.IN "XtGrabKey" "" "@DEF@"
-.sM
-.FD 0
-void XtGrabKey(\fIwidget\fP, \fIkeycode\fP, \fImodifiers\fP, \
-\fIowner_events\fP, \fIpointer_mode\fP, \fIkeyboard_mode\fP)
-.br
- Widget \fIwidget\fP;
-.br
- KeyCode \fIkeycode\fP;
-.br
- Modifiers \fImodifiers\fP;
-.br
- Boolean \fIowner_events\fP;
-.br
- int \fIpointer_mode\fP, \fIkeyboard_mode\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget in whose window the key is to be grabbed. \*(cI
-.sp 6p
-.IP \fIkeycode\fP
-.br
-.ns
-.IP \fImodifiers\fP
-.br
-.ns
-.IP \fIowner_events\fP
-.br
-.ns
-.IP \fIpointer_mode\fP
-.br
-.ns
-.IP \fIkeyboard_mode\fP 1i
-Specify arguments to
-.PN XGrabKey ;
-see Section 12.2 in \fI\*(xL\fP.
-.LP
-.eM
-.PN XtGrabKey
-calls
-.PN XGrabKey
-specifying the widget's window as the grab
-window if the widget is realized. The remaining arguments are exactly
-as for
-.PN XGrabKey .
-If the widget is not realized, or is later unrealized, the call to
-.PN XGrabKey
-is performed (again) when
-the widget is realized and its window becomes mapped. In the future,
-if
-.PN XtDispatchEvent
-is called with a
-.PN KeyPress
-event matching the specified keycode and modifiers (which may be
-.PN AnyKey
-or
-.PN AnyModifier ,
-respectively) for the
-widget's window, the \*(xI will call
-.PN XtUngrabKeyboard
-with the timestamp from the
-.PN KeyPress
-event if either of the following conditions is true:
-.IP \(bu 3
-There is a modal cascade and the widget is not in
-the active subset of the cascade and the keyboard was not previously
-grabbed, or
-.IP \(bu 3
-.PN XFilterEvent
-returns
-.PN True .
-
-.sp
-.LP
-To cancel a passive key grab, use
-.PN XtUngrabKey .
-.LP
-.IN "XtUngrabKey" "" "@DEF@"
-.sM
-.FD 0
-void XtUngrabKey(\fIwidget\fP, \fIkeycode\fP\fI, modifiers\fP)
-.br
- Widget \fIwidget\fP;
-.br
- KeyCode \fIkeycode\fP;
-.br
- Modifiers \fImodifiers\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget in whose window the key was grabbed.
-.sp 6p
-.IP \fIkeycode\fP
-.br
-.ns
-.IP \fImodifiers\fP 1i
-Specify arguments to
-.PN XUngrabKey ;
-see Section 12.2 in \fI\*(xL\fP.
-.LP
-.eM
-The
-.PN XtUngrabKey
-procedure calls
-.PN XUngrabKey
-specifying the widget's
-window as the ungrab window if the widget is realized. The remaining
-arguments are exactly as for
-.PN XUngrabKey .
-If the widget is not realized,
-.PN XtUngrabKey
-removes a deferred
-.PN XtGrabKey
-request, if any, for the specified widget, keycode, and modifiers.
-.sp
-.LP
-To actively grab the keyboard, use
-.PN XtGrabKeyboard .
-.LP
-.IN "XtGrabKeyboard" "" "@DEF@"
-.sM
-.FD 0
-int XtGrabKeyboard(\fIwidget\fP, \fIowner_events\fP, \fIpointer_mode\fP, \
-\fIkeyboard_mode\fP, \fItime\fP)
-.br
- Widget \fIwidget\fP;
-.br
- Boolean \fIowner_events\fP;
-.br
- int \fIpointer_mode\fP, \fIkeyboard_mode\fP;
-.br
- Time \fItime\fP;
-.br
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget for whose window the keyboard is to be grabbed.
-\*(cI
-.sp 6p
-.IP \fIowner_events\fP
-.br
-.ns
-.IP \fIpointer_mode\fP
-.br
-.ns
-.IP \fIkeyboard_mode\fP
-.br
-.ns
-.IP \fItime\fP 1i
-Specify arguments to
-.PN XGrabKeyboard ;
-see Section 12.2 in \fI\*(xL\fP.
-.LP
-.eM
-If the specified widget is realized,
-.PN XtGrabKeyboard
-calls
-.PN XGrabKeyboard
-specifying the widget's window as the grab window. The remaining
-arguments and return value are exactly as for
-.PN XGrabKeyboard .
-If the widget is not realized,
-.PN XtGrabKeyboard
-immediately returns
-.PN GrabNotViewable .
-No future automatic ungrab is implied by
-.PN XtGrabKeyboard .
-.sp
-.LP
-To cancel an active keyboard grab, use
-.PN XtUngrabKeyboard .
-.LP
-.IN "XtUngrabKeyboard" "" "@DEF@"
-.sM
-.FD 0
-void XtUngrabKeyboard(\fIwidget\fP, \fItime\fP)
-.br
- Widget \fIwidget\fP;
-.br
- Time \fItime\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget that has the active keyboard grab.
-.IP \fItime\fP 1i
-Specifies the additional argument to
-.PN XUngrabKeyboard ;
-see Section 12.2 in \fI\*(xL\fP.
-.LP
-.eM
-.PN XtUngrabKeyboard
-calls
-.PN XUngrabKeyboard
-with the specified time.
-.sp
-.LP
-To passively grab a single pointer button, use
-.PN XtGrabButton .
-.LP
-.IN "XtGrabButton" "" "@DEF@"
-.sM
-.FD 0
-void XtGrabButton(\fIwidget\fP, \fIbutton\fP, \fImodifiers\fP, \
-\fIowner_events\fP, \fIevent_mask\fP, \fIpointer_mode\fP,
- \fIkeyboard_mode\fP, \fIconfine_to\fP, \fIcursor\fP)
-.br
- Widget \fIwidget\fP;
-.br
- int \fIbutton\fP;
-.br
- Modifiers \fImodifiers\fP;
-.br
- Boolean \fIowner_events\fP;
-.br
- unsigned int \fIevent_mask\fP;
-.br
- int \fIpointer_mode\fP, \fIkeyboard_mode\fP;
-.br
- Window \fIconfine_to\fP;
-.br
- Cursor \fIcursor\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget in whose window the button is to be grabbed. \*(cI
-.sp 6p
-.IP \fIbutton\fP
-.br
-.ns
-.IP \fImodifiers\fP
-.br
-.ns
-.IP \fIowner_events\fP
-.br
-.ns
-.IP \fIevent_mask\fP
-.br
-.ns
-.IP \fIpointer_mode\fP
-.br
-.ns
-.IP \fIkeyboard_mode\fP
-.br
-.ns
-.IP \fIconfine_to\fP
-.br
-.ns
-.IP \fIcursor\fP 1i
-Specify arguments to
-.PN XGrabButton ;
-see Section 12.1 in \fI\*(xL\fP.
-.LP
-.eM
-.PN XtGrabButton
-calls
-.PN XGrabButton
-specifying the widget's window as the
-grab window if the widget is realized. The remaining arguments are
-exactly as for
-.PN XGrabButton .
-If the widget is not realized, or is later unrealized, the call to
-.PN XGrabButton
-is performed (again)
-when the widget is realized and its window becomes mapped. In the
-future, if
-.PN XtDispatchEvent
-is called with a
-.PN ButtonPress
-event matching the specified button and modifiers (which may be
-.PN AnyButton
-or
-.PN AnyModifier ,
-respectively)
-for the widget's window, the \*(xI will call
-.PN XtUngrabPointer
-with the timestamp from the
-.PN ButtonPress
-event if either of the following conditions is true:
-.IP \(bu 3
-There is a modal cascade and the
-widget is not in the active subset of the cascade and the pointer was
-not previously grabbed, or
-.IP \(bu 3
-.PN XFilterEvent
-returns
-.PN True .
-
-.sp
-.LP
-To cancel a passive button grab, use
-.PN XtUngrabButton .
-.LP
-.IN "XtUngrabButton" "" "@DEF@"
-.sM
-.FD 0
-void XtUngrabButton(\fIwidget\fP, \fIbutton\fP, \fImodifiers\fP)
-.br
- Widget \fIwidget\fP;
-.br
- unsigned int \fIbutton\fP;
-.br
- Modifiers \fImodifiers\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget in whose window the button was grabbed.
-.IP \fIbutton\fP
-.br
-.ns
-.IP \fImodifiers\fP 1i
-Specify arguments to
-.PN XUngrabButton ;
-see Section 12.1 in \fI\*(xL\fP.
-.LP
-.eM
-The
-.PN XtUngrabButton
-procedure calls
-.PN XUngrabButton
-specifying the
-widget's window as the ungrab window if the widget is realized. The
-remaining arguments are exactly as for
-.PN XUngrabButton .
-If the widget is not realized,
-.PN XtUngrabButton
-removes a deferred
-.PN XtGrabButton
-request, if any, for the specified widget, button, and modifiers.
-.sp
-.LP
-To actively grab the pointer, use
-.PN XtGrabPointer .
-.LP
-.IN "XtGrabPointer" "" "@DEF@"
-.sM
-.FD 0
-int XtGrabPointer(\fIwidget\fP, \fIowner_events\fP, \fIevent_mask\fP, \
-\fIpointer_mode\fP, \fIkeyboard_mode\fP,
- \fIconfine_to\fP, \fIcursor\fP, \fItime\fP)
-.br
- Widget \fIwidget\fP;
-.br
- Boolean \fIowner_events\fP;
-.br
- unsigned int \fIevent_mask\fP;
-.br
- int \fIpointer_mode\fP, \fIkeyboard_mode\fP;
-.br
- Window \fIconfine_to\fP;
-.br
- Cursor \fIcursor\fP;
-.br
- Time \fItime\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget for whose window the pointer is to be grabbed. \*(cI
-.sp 6p
-.IP \fIowner_events\fP
-.br
-.ns
-.IP \fIevent_mask\fP
-.br
-.ns
-.IP \fIpointer_mode\fP
-.br
-.ns
-.IP \fIkeyboard_mode\fP
-.br
-.ns
-.IP \fIconfine_to\fP
-.br
-.ns
-.IP \fIcursor\fP
-.br
-.ns
-.IP \fItime\fP 1i
-Specify arguments to
-.PN XGrabPointer ;
-see Section 12.1 in \fI\*(xL\fP.
-.LP
-.eM
-If the specified widget is realized,
-.PN XtGrabPointer
-calls
-.PN XGrabPointer ,
-specifying the widget's window as the grab window. The remaining
-arguments and return value are exactly as for
-.PN XGrabPointer .
-If the widget is not realized,
-.PN XtGrabPointer
-immediately returns
-.PN GrabNotViewable .
-No future automatic ungrab is implied by
-.PN XtGrabPointer .
-.sp
-.LP
-To cancel an active pointer grab, use
-.PN XtUngrabPointer .
-.LP
-.IN "XtUngrabPointer" "" "@DEF@"
-.sM
-.FD 0
-void XtUngrabPointer(\fIwidget\fP, \fItime\fP)
-.br
- Widget \fIwidget\fP;
-.br
- Time \fItime\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget that has the active pointer grab.
-.IP \fItime\fP 1i
-Specifies the time argument to
-.PN XUngrabPointer ;
-see Section 12.1 in \fI\*(xL\fP.
-.LP
-.eM
-.PN XtUngrabPointer
-calls
-.PN XUngrabPointer
-with the specified time.
-
-.NH 2
-Focusing Events on a Child
-.XS
-\fB\*(SN Focusing Events on a Child\fP
-.XE
-.LP
-To redirect keyboard input to a normal descendant of a
-widget without calling
-.PN XSetInputFocus ,
-use
-.PN XtSetKeyboardFocus .
-.LP
-.IN "XtSetKeyboardFocus" "" "@DEF@"
-.sM
-.FD 0
-void XtSetKeyboardFocus(\fIsubtree\fP\, \fIdescendant\fP)
-.br
- Widget \fIsubtree\fP, \fIdescendant\fP;
-.FN
-.IP \fIsubtree\fP 1i
-Specifies the subtree of the hierarchy for which the keyboard focus is
-to be set. \*(cI
-.IP \fIdescendant\fP 1i
-Specifies either the normal (non-pop-up) descendant of \fIsubtree\fP to which
-keyboard events are logically directed, or
-.PN None .
-It is not an error to specify
-.PN None
-when no input focus was previously set. \*(oI
-.LP
-.eM
-.PN XtSetKeyboardFocus
-causes
-.PN XtDispatchEvent
-to remap keyboard events occurring within the specified subtree
-and dispatch them to the specified descendant widget or to an ancestor.
-If the descendant's class is not a subclass of Core, the descendant is
-replaced by its closest windowed ancestor.
-.LP
-When there is no modal cascade, keyboard events can be dispatched
-to a widget in one of five ways. Assume the server delivered the
-event to the window for widget E (because of X input focus, key or
-keyboard grabs, or pointer position).
-.IP \(bu 3
-If neither E nor any of E's ancestors have redirected the keyboard
-focus, or if the event activated a grab for E as specified by a call
-to
-.PN XtGrabKey
-with any value of \fIowner_events\fP, or
-if the keyboard is actively grabbed by E with \fIowner_events\fP
-.PN False
-via
-.PN XtGrabKeyboard
-or
-.PN XtGrabKey
-on a previous key press, the event is dispatched to E.
-.IP \(bu 3
-Beginning with the ancestor of E closest to the root that has
-redirected the keyboard focus or E if no such ancestor exists, if
-the target of that focus redirection has in turn redirected the
-keyboard focus, recursively follow this focus chain to find a widget
-F that has not redirected focus.
-.RS
-.IP \- 3
-If E is the final focus target widget F or a descendant of F, the
-event is dispatched to E.
-.IP \- 3
-If E is not F, an ancestor of F, or a descendant of F, and the event
-activated a grab for E as specified by a call to
-.PN XtGrabKey
-for E,
-.PN XtUngrabKeyboard
-is called.
-.IP \- 3
-If E is an ancestor of F, and the event is a key press, and either
-.RS
-.IP + 3
-E has grabbed the key with
-.PN XtGrabKey
-and \fIowner_events\fP
-.PN False ,
-or
-.IP + 3
-E has grabbed the key with
-.PN XtGrabKey
-and \fIowner_events\fP
-.PN True ,
-and the coordinates of the event are outside the rectangle specified
-by E's geometry,
-.RE
-then the event is dispatched to E.
-.IP \- 3
-Otherwise, define A as the closest common ancestor of E and F:
-.RS
-.IP + 3
-If there is an active keyboard grab for any widget via either
-.PN XtGrabKeyboard
-or
-.PN XtGrabKey
-on a previous key press, or
-if no widget between F and A (noninclusive) has grabbed
-the key and modifier combination with
-.PN XtGrabKey
-and any value of \fIowner_events\fP, the event is dispatched to F.
-.IP + 3
-Else, the event is dispatched to the ancestor of F closest to A
-that has grabbed the key and modifier combination with
-.PN XtGrabKey .
-.RE
-.RE
-.LP
-When there is a modal cascade, if the final destination widget as
-identified above is in the active subset of the cascade, the event is
-dispatched; otherwise the event is remapped to a spring-loaded shell
-or discarded.
-Regardless of where it is dispatched, the \*(xI do not modify
-the contents of the event.
-.LP
-When \fIsubtree\fP or one of its descendants acquires the X input focus
-or the pointer moves into the subtree such that keyboard events would
-now be delivered to the subtree, a
-.PN FocusIn
-event is generated for the descendant if
-.PN FocusChange
-events have been selected by the descendant.
-Similarly, when \fIsubtree\fP loses the X input focus
-or the keyboard focus for one of its ancestors, a
-.PN FocusOut
-event is generated for descendant if
-.PN FocusChange
-events have been selected by the descendant.
-.sp
-.LP
-A widget tree may also actively manage the X server input focus. To
-do so, a widget class specifies an accept_focus procedure.
-.LP
-.IN "accept_focus procedure"
-The accept_focus procedure pointer is of type
-.PN XtAcceptFocusProc .
-.LP
-.IN "XtAcceptFocusProc" "" "@DEF@"
-.sM
-.FD 0
-typedef Boolean (*XtAcceptFocusProc)(Widget, Time*);
-.br
- Widget \fIw\fP;
-.br
- Time *\fItime\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget.
-.IP \fItime\fP 1i
-Specifies the X time of the event causing the accept focus.
-.LP
-.eM
-Widgets that need the input focus can call
-.PN XSetInputFocus
-explicitly, pursuant to the restrictions of the \fI\*(xC\fP.
-To allow outside agents, such as the parent,
-to cause a widget to take the input focus,
-every widget exports an accept_focus procedure.
-The widget returns a value indicating
-whether it actually took the focus or not,
-so that the parent can give the focus to another widget.
-Widgets that need to know when they lose the input focus must use
-the Xlib focus notification mechanism explicitly
-(typically by specifying translations for
-.PN FocusIn
-and
-.PN FocusOut
-events).
-Widgets classes that never want the input focus should set the
-\fIaccept_focus\fP field to NULL.
-.sp
-.LP
-To call a widget's accept_focus procedure, use
-.PN XtCallAcceptFocus .
-.LP
-.IN "XtCallAcceptFocus" "" "@DEF@"
-.sM
-.FD 0
-Boolean XtCallAcceptFocus(\fIw\fP, \fItime\fP)
-.br
- Widget \fIw\fP;
-.br
- Time *\fItime\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget. \*(cI
-.IP \fItime\fP 1i
-Specifies the X time of the event that is causing the focus change.
-.LP
-.eM
-The
-.PN XtCallAcceptFocus
-function calls the specified widget's accept_focus procedure,
-passing it the specified widget and time, and returns what the accept_focus
-procedure returns.
-If \fIaccept_focus\fP is NULL,
-.PN XtCallAcceptFocus
-returns
-.PN False .
-
-.NH 3
-Events for Drawables That Are Not a Widget's Window
-.XS
-\fB\*(SN Events for Drawables That Are Not a Widget's Window\fP
-.XE
-.LP
-Sometimes an application must handle events for drawables that are not
-associated with widgets in its widget tree. Examples include handling
-.PN GraphicsExpose
-and
-.PN NoExpose
-events on Pixmaps, and handling
-.PN PropertyNotify
-events on the root window.
-.LP
-To register a drawable with the \*(xI event dispatching, use
-.PN XtRegisterDrawable .
-.LP
-.IN "XtRegisterDrawable" "" "@DEF@"
-.sM
-.FD 0
-void XtRegisterDrawable(\fIdisplay\fP, \fIdrawable\fP, \fIwidget\fP)
-.br
- Display *\fIdisplay\fP;
-.br
- Drawable \fIdrawable\fP;
-.br
- Widget \fIwidget\fP;
-.FN
-.IP \fIdisplay\fP 1i
-Specifies the drawable's display.
-.IP \fIdrawable\fP 1i
-Specifies the drawable to register.
-.IP \fIwidget\fP 1i
-Specifies the widget to register the drawable for.
-.LP
-.eM
-.PN XtRegisterDrawable
-associates the specified drawable with the specified widget
-so that future calls to
-.PN XtWindowToWidget
-with the drawable will return the widget.
-The default event dispatcher will dispatch future events that
-arrive for the drawable to the widget in the same manner as
-events that contain the widget's window.
-.LP
-If the drawable is already registered with another widget, or if the
-drawable is the window of a widget in the client's widget tree, the
-results of calling
-.PN XtRegisterDrawable
-are undefined.
-
-.LP
-To unregister a drawable with the Intrinsics event dispatching, use
-.PN XtUnregisterDrawable .
-.LP
-.IN "XtUnregisterDrawable" "" "@DEF@"
-.sM
-.FD 0
-void XtUnregisterDrawable(\fIdisplay\fP, \fIdrawable\fP)
-.br
- Display *\fIdisplay\fP;
-.br
- Drawable \fIdrawable\fP;
-.FN
-.IP \fIdisplay\fP 1i
-Specifies the drawable's display.
-.IP \fIdrawable\fP 1i
-Specifies the drawable to unregister.
-.LP
-.eM
-.PN XtUnregisterDrawable
-removes an association created with
-.PN XtRegisterDrawable .
-If the drawable is the window of a widget in the client's widget tree
-the results of calling
-.PN XtUnregisterDrawable
-are undefined.
-
-.NH 2
-Querying Event Sources
-.XS
-\fB\*(SN Querying Event Sources\fP
-.XE
-.LP
-The event manager provides several functions to examine and read events
-(including file and timer events) that are in the queue.
-The next three functions are \*(xI equivalents of the
-.PN XPending ,
-.PN XPeekEvent ,
-and
-.PN XNextEvent
-Xlib calls.
-.sp
-.LP
-.IN "Events"
-To determine if there are any events on the input queue for a given application,
-use
-.PN XtAppPending .
-.LP
-.IN "XtAppPending" "" "@DEF@"
-.sM
-.FD 0
-XtInputMask XtAppPending(\fIapp_context\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application to check.
-.LP
-.eM
-The
-.PN XtAppPending
-function returns a nonzero value if there are
-events pending from the X server, timer pending, other input sources
-pending, or signal sources pending. The
-value returned is a bit mask that is the OR of
-.PN XtIMXEvent ,
-.PN XtIMTimer ,
-.PN XtIMAlternateInput ,
-and
-.PN XtIMSignal
-(see
-.PN XtAppProcessEvent ).
-If there are no events pending,
-.PN XtAppPending
-flushes the output buffers of each Display in the application context
-and returns zero.
-.sp
-.LP
-To return the event from the head of a given application's input queue
-without removing input from the queue, use
-.PN XtAppPeekEvent .
-.LP
-.IN "XtAppPeekEvent" "" "@DEF@"
-.sM
-.FD 0
-Boolean XtAppPeekEvent(\fIapp_context\fP, \fIevent_return\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- XEvent *\fIevent_return\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application.
-.IP \fIevent_return\fP 1i
-Returns the event information to the specified event structure.
-.LP
-.eM
-If there is an X event in the queue,
-.PN XtAppPeekEvent
-copies it into \fIevent_return\fP and returns
-.PN True .
-If no X input is on the queue,
-.PN XtAppPeekEvent
-flushes the output buffers of each Display in the application context
-and blocks until some input is available
-(possibly calling some timeout callbacks in the interim).
-If the next available input is an X event,
-.PN XtAppPeekEvent
-fills in \fIevent_return\fP and returns
-.PN True .
-Otherwise, the input is for an input source
-registered with
-.PN XtAppAddInput ,
-and
-.PN XtAppPeekEvent
-returns
-.PN False .
-.FS
-The sample implementations provides XtAppPeekEvent as described. Timeout callbacks
-are called while blocking for input. If some input for an input source is
-available,
-.PN XtAppPeekEvent
-will return
-.PN True
-without returning an event.
-.FE
-.sp
-.LP
-To remove and return the event
-from the head of a given application's X event queue,
-use
-.PN XtAppNextEvent .
-.LP
-.IN "XtAppNextEvent" "" "@DEF@"
-.sM
-.FD 0
-void XtAppNextEvent(\fIapp_context\fP, \fIevent_return\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- XEvent *\fIevent_return\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application.
-.IP \fIevent_return\fP 1i
-Returns the event information to the specified event structure.
-.LP
-.eM
-If the X event queue is empty,
-.PN XtAppNextEvent
-flushes the X output buffers of each Display in the application context
-and waits for an X event while looking at the other input sources
-and timeout values and calling any callback procedures triggered by them.
-This wait time can be used for background processing;
-see Section 7.8.
-
-.NH 2
-Dispatching Events
-.XS
-\fB\*(SN Dispatching Events\fP
-.XE
-.LP
-The \*(xI provide functions that dispatch events
-to widgets or other application code.
-Every client interested in X events on a widget uses
-.PN XtAddEventHandler
-to register which events it is
-interested in and a procedure (event handler) to be called
-when the event happens in that window.
-The translation manager automatically registers event handlers for widgets
-that use translation tables; see Chapter 10.
-.sp
-.LP
-Applications that need direct control of the processing of different types
-of input should use
-.PN XtAppProcessEvent .
-.LP
-.IN "XtAppProcessEvent" "" "@DEF@"
-.sM
-.FD 0
-void XtAppProcessEvent(\fIapp_context\fP, \fImask\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- XtInputMask \fImask\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the
-application for which to process input.
-.IP \fImask\fP 1i
-Specifies what types of events to process.
-The mask is the bitwise inclusive OR of any combination of
-.PN XtIMXEvent ,
-.PN XtIMTimer ,
-.PN XtIMAlternateInput ,
-and
-.PN XtIMSignal .
-As a convenience,
-.PN Intrinsic.h
-defines the symbolic name
-.PN XtIMAll
-to be the bitwise inclusive OR of these four event types.
-.LP
-.eM
-The
-.PN XtAppProcessEvent
-function processes one timer, input source, signal source, or X event.
-If there is no event or input of the appropriate type to process, then
-.PN XtAppProcessEvent
-blocks until there is.
-If there is more than one type of input available to process,
-it is undefined which will get processed.
-Usually, this procedure is not called by client applications; see
-.PN XtAppMainLoop .
-.PN XtAppProcessEvent
-processes timer events by calling any appropriate timer callbacks,
-input sources by calling any appropriate input callbacks,
-signal source by calling any appropriate signal callbacks,
-and X events by
-calling
-.PN XtDispatchEvent .
-.LP
-When an X event is received,
-it is passed to
-.PN XtDispatchEvent ,
-which calls the appropriate event handlers
-and passes them the widget, the event, and client-specific data
-registered with each procedure.
-If no handlers for that event are registered,
-the event is ignored and the dispatcher simply returns.
-
-.sp
-.LP
-To dispatch an event returned by
-.PN XtAppNextEvent ,
-retrieved directly from the Xlib queue, or synthetically constructed,
-to any registered event filters or event handlers, call
-.PN XtDispatchEvent .
-.LP
-.IN "XtDispatchEvent" "" "@DEF@"
-.sM
-.FD 0
-Boolean XtDispatchEvent(\fIevent\fP)
-.br
- XEvent *\fIevent\fP;
-.FN
-.IP \fIevent\fP 1i
-Specifies a pointer to the event structure to be dispatched
-to the appropriate event handlers.
-.LP
-.eM
-The
-.PN XtDispatchEvent
-function first calls
-.PN XFilterEvent
-with the \fIevent\fP and the window of the widget to which the
-\*(xI intend to dispatch the event, or the event window if
-the \*(xI would not dispatch the event to any handlers.
-If
-.PN XFilterEvent
-returns
-.PN True
-and the event activated a server grab as identified
-by a previous call to
-.PN XtGrabKey
-or
-.PN XtGrabButton ,
-.PN XtDispatchEvent
-calls
-.PN XtUngrabKeyboard
-or
-.PN XtUngrabPointer
-with the timestamp from the event and immediately returns
-.PN True .
-If
-.PN XFilterEvent
-returns
-.PN True
-and a grab was not activated,
-.PN XtDispatchEvent
-just immediately returns
-.PN True .
-Otherwise,
-.PN XtDispatchEvent
-sends the event to the event handler functions that
-have been previously registered with the dispatch routine.
-.PN XtDispatchEvent
-returns
-.PN True
-if
-.PN XFilterEvent
-returned
-.PN True ,
-or if the event was dispatched to some handler, and
-.PN False
-if it found no handler to which to dispatch the event.
-.PN XtDispatchEvent
-records the last timestamp in any event that
-contains a timestamp (see
-.PN XtLastTimestampProcessed ),
-regardless of whether it was filtered or dispatched.
-If a modal cascade is active with \fIspring_loaded\fP
-.PN True ,
-and if the event is a remap event as defined by
-.PN XtAddGrab ,
-.PN XtDispatchEvent
-may dispatch the event a second time. If it does so,
-.PN XtDispatchEvent
-will call
-.PN XFilterEvent
-again with the window of the spring-loaded widget prior to the second
-dispatch, and if
-.PN XFilterEvent
-returns
-.PN True ,
-the second dispatch will not be performed.
-
-.NH 2
-The Application Input Loop
-.XS
-\fB\*(SN The Application Input Loop\fP
-.XE
-.LP
-To process all input from a given application in a continuous loop,
-use the convenience procedure
-.PN XtAppMainLoop .
-.LP
-.IN "XtAppMainLoop" "" "@DEF@"
-.sM
-.FD 0
-void XtAppMainLoop(\fIapp_context\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application.
-.LP
-.eM
-The
-.PN XtAppMainLoop
-function first reads the next incoming X event by calling
-.PN XtAppNextEvent
-and then dispatches the event to the appropriate registered procedure
-by calling
-.PN XtDispatchEvent .
-This constitutes the main loop of \*(tk applications.
-There is nothing special about
-.PN XtAppMainLoop ;
-it simply calls
-.PN XtAppNextEvent
-and then
-.PN XtDispatchEvent
-in a conditional loop.
-At the bottom of the loop, it checks to see if the specified
-application context's destroy flag is set.
-If the flag is set, the loop breaks.
-The whole loop is enclosed between a matching
-.PN XtAppLock
-and
-.PN XtAppUnlock .
-.LP
-Applications can provide their own version of this loop,
-which tests some global termination flag or tests that the number
-of top-level widgets is larger than zero before circling back to the call to
-.PN XtAppNextEvent .
-
-.NH 2
-Setting and Checking the Sensitivity State of a Widget
-.XS
-\fB\*(SN Setting and Checking the Sensitivity State of a Widget\fP
-.XE
-.LP
-Many widgets have a mode in which they assume a different appearance
-(for example, are grayed out or stippled), do not respond to user events,
-and become dormant.
-.LP
-When dormant,
-a widget is considered to be insensitive.
-If a widget is insensitive,
-the event manager does not dispatch any events to the widget
-with an event type of
-.PN KeyPress ,
-.PN KeyRelease ,
-.PN ButtonPress ,
-.PN ButtonRelease ,
-.PN MotionNotify ,
-.PN EnterNotify ,
-.PN LeaveNotify ,
-.PN FocusIn ,
-or
-.PN FocusOut .
-.LP
-A widget can be insensitive because its \fIsensitive\fP field is
-.PN False
-or because one of its ancestors is insensitive and thus the widget's
-\fIancestor_sensitive\fP field also is
-.PN False .
-A widget can but does not need to distinguish these two cases visually.
-.NT
-Pop-up shells will have
-\fIancestor_sensitive\fP
-.PN False
-if the parent was insensitive when the shell
-was created. Since
-.PN XtSetSensitive
-on the parent will not
-modify the resource of the pop-up child, clients are advised to include
-a resource specification of the form
-``*TransientShell.ancestorSensitive: True''
-in the application defaults resource file or to
-otherwise ensure that the parent is
-sensitive when creating pop-up shells.
-.NE
-.sp
-.LP
-To set the sensitivity state of a widget, use
-.PN XtSetSensitive .
-.LP
-.IN "XtSetSensitive" "" "@DEF@"
-.sM
-.FD 0
-void XtSetSensitive(\fIw\fP, \fIsensitive\fP)
-.br
- Widget \fIw\fP;
-.br
- Boolean \fIsensitive\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget. \*(rI
-.IP \fIsensitive\fP 1i
-Specifies whether the widget should receive
-keyboard, pointer, and focus events.
-.LP
-.eM
-The
-.PN XtSetSensitive
-function first calls
-.PN XtSetValues
-on the current widget with an argument list specifying the
-XtNsensitive resource and the new value.
-If \fIsensitive\fP is
-.PN False
-and the widget's class is a subclass of
-Composite,
-.PN XtSetSensitive
-recursively propagates the new value
-down the child tree by calling
-.PN XtSetValues
-on each child to set \fIancestor_sensitive\fP to
-.PN False .
-If \fIsensitive\fP is
-.PN True
-and the widget's class is a subclass of
-Composite
-and the widget's \fIancestor_sensitive\fP field is
-.PN True ,
-.PN XtSetSensitive
-sets the \fIancestor_sensitive\fP of each child to
-.PN True
-and then recursively calls
-.PN XtSetValues
-on each normal descendant that is now sensitive to set
-\fIancestor_sensitive\fP to
-.PN True .
-.LP
-.PN XtSetSensitive
-calls
-.PN XtSetValues
-to change the \fIsensitive\fP and \fIancestor_sensitive\fP fields
-of each affected widget.
-Therefore, when one of these changes,
-the widget's set_values procedure should
-take whatever display actions are needed
-(for example, graying out or stippling the widget).
-.LP
-.PN XtSetSensitive
-maintains the invariant that, if the parent has either \fIsensitive\fP
-or \fIancestor_sensitive\fP
-.PN False ,
-then all children have \fIancestor_sensitive\fP
-.PN False .
-.sp
-.LP
-To check the current sensitivity state of a widget,
-use
-.PN XtIsSensitive .
-.LP
-.IN "XtIsSensitive" "" "@DEF@"
-.sM
-.FD 0
-Boolean XtIsSensitive(\fIw\fP)
-.br
- Widget \fIw\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the object. \*(oI
-.LP
-.eM
-The
-.PN XtIsSensitive
-function returns
-.PN True
-or
-.PN False
-to indicate whether user input events are being dispatched.
-If object's class is a subclass of RectObj and
-both \fIsensitive\fP and \fIancestor_sensitive\fP are
-.PN True ,
-.PN XtIsSensitive
-returns
-.PN True ;
-otherwise, it returns
-.PN False .
-
-.NH 2
-Adding Background Work Procedures
-.XS
-\fB\*(SN Adding Background Work Procedures\fP
-.XE
-.LP
-The \*(xI have some limited support for background processing.
-Because most applications spend most of their time waiting for input,
-you can register an idle-time work procedure
-that is called when the toolkit would otherwise block in
-.PN XtAppNextEvent
-or
-.PN XtAppProcessEvent .
-Work procedure pointers are of type
-.PN XtWorkProc .
-.LP
-.IN "XtWorkProc" "" "@DEF@"
-.sM
-.FD 0
-typedef Boolean (*XtWorkProc)(XtPointer);
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIclient_data\fP 1i
-Passes the client data specified when the work procedure was registered.
-.LP
-.eM
-This procedure should return
-.PN True
-when it is done to indicate that it
-should be removed.
-If the procedure returns
-.PN False ,
-it will remain registered and called again when the
-application is next idle.
-Work procedures should be very judicious about how much they do.
-If they run for more than a small part of a second,
-interactive feel is likely to suffer.
-.sp
-.LP
-To register a work procedure for a given application, use
-.PN XtAppAddWorkProc .
-.LP
-.IN "XtAppAddWorkProc" "" "@DEF@"
-.sM
-.FD 0
-XtWorkProcId XtAppAddWorkProc(\fIapp_context\fP, \fIproc\fP, \fIclient_data\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.br
- XtWorkProc \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that identifies the application.
-.IP \fIproc\fP 1i
-Specifies the procedure to be called when the application is idle.
-.IP \fIclient_data\fP 1i
-Specifies the argument passed to the specified procedure
-when it is called.
-.LP
-.eM
-The
-.PN XtAppAddWorkProc
-function adds the specified work procedure for the application identified
-by \fIapp_context\fP
-and returns an opaque unique identifier for this work procedure.
-Multiple work procedures can be registered,
-and the most recently added one is always the one that is called.
-However, if a work procedure adds another work procedure,
-the newly added one has lower priority than the current one.
-.sp
-.LP
-To remove a work procedure, either return
-.PN True
-from the procedure when it is called or use
-.PN XtRemoveWorkProc
-outside of the procedure.
-.LP
-.IN "XtRemoveWorkProc" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveWorkProc(\fIid\fP)
-.br
- XtWorkProcId \fIid\fP;
-.FN
-.IP \fIid\fP 1i
-Specifies which work procedure to remove.
-.LP
-.eM
-The
-.PN XtRemoveWorkProc
-function explicitly removes the specified background work procedure.
-
-.NH 2
-X Event Filters
-.XS
-\*(SN X Event Filters
-.XE
-.LP
-The event manager provides filters that can be applied to
-specific X events.
-The filters, which screen out events that are redundant or are temporarily
-unwanted, handle
-pointer motion compression,
-enter/leave compression, and
-exposure compression.
-
-.NH 3
-Pointer Motion Compression
-.XS
-\*(SN Pointer Motion Compression
-.XE
-.LP
-Widgets can have a hard time keeping up with a rapid stream of
-pointer motion events. Furthermore,
-they usually do not care about every motion event. To throw out
-redundant motion events, the widget class field \fIcompress_motion\fP should be
-.PN True .
-.IN "compress_motion field"
-When a request for an event would return a motion event,
-the \*(xI check if there are any other motion events
-for the same widget immediately
-following the current one and, if so, skip all but the last of them.
-
-.NH 3
-Enter/Leave Compression
-.XS
-\*(SN Enter/Leave Compression
-.XE
-.LP
-To throw out pairs of enter and leave events that have no intervening events,
-as can happen when the user moves the pointer across a widget
-without stopping in it,
-the widget class field \fIcompress_enterleave\fP should be
-.PN True .
-.IN "compress_enterleave field"
-These enter and leave events are not delivered to the client
-if they are found together in the input queue.
-
-.NH 3
-Exposure Compression
-.XS
-\*(SN Exposure Compression
-.XE
-.LP
-.IN "compress_expose field"
-Many widgets prefer to process a series of exposure events as a
-single expose region rather than as individual rectangles. Widgets
-with complex displays might use the expose region as a clip list
-in a graphics context, and widgets with simple displays might
-ignore the region entirely and redisplay their whole window or
-might get the bounding box from the region and redisplay only that
-rectangle.
-.LP
-In either case, these widgets do not care about getting partial exposure events.
-The \fIcompress_exposure\fP field in the widget class
-structure specifies the type and number of exposure events that are
-dispatched to the widget's expose procedure. This field must be
-initialized to one of the following values:
-.sp
-.sM
-.Ds 0
-.TA 3i
-.ta 3i
-#define XtExposeNoCompress ((XtEnum)False)
-#define XtExposeCompressSeries ((XtEnum)True)
-#define XtExposeCompressMultiple <implementation-defined>
-#define XtExposeCompressMaximal <implementation-defined>
-.De
-.LP
-.eM
-optionally ORed with any combination of the following flags (all with
-implementation-defined values):
-.PN XtExposeGraphicsExpose ,
-.PN XtExposeGraphicsExposeMerged ,
-.PN XtExposeNoExpose ,
-and
-.PN XtExposeNoRegion .
-
-.LP
-If the \fIcompress_exposure\fP field in the widget class structure does not
-specify
-.PN XtExposeNoCompress ,
-the event manager calls the widget's expose procedure only
-once for a series of exposure events.
-In this case, all
-.PN Expose
-or
-.PN GraphicsExpose
-events are accumulated into a region.
-When the final event is received,
-the event manager replaces the rectangle in the event with the
-bounding box for the region
-and calls the widget's expose procedure,
-passing the modified exposure event and (unless
-.PN XtExposeNoRegion
-is specified) the region.
-For more information on regions, see Section 16.5 in \fI\*(xL\fP.)
-.LP
-The values have the following interpretation:
-.sp
-.LP
-.PN XtExposeNoCompress
-.IN "XtExposeNoCompress" "" "@DEF@"
-.IP
-No exposure compression is performed; every selected event is
-individually dispatched to the expose procedure with a \fIregion\fP
-argument of NULL.
-.sp
-.LP
-.PN XtExposeCompressSeries
-.IN "XtExposeCompressSeries" "" "@DEF@"
-.IP
-Each series of exposure events is coalesced into a single event,
-which is dispatched
-when an exposure event with count equal to zero is reached.
-.sp
-.LP
-.PN XtExposeCompressMultiple
-.IN "XtExposeCompressMultiple" "" "@DEF@"
-.IP
-Consecutive series of exposure events are coalesced into a single
-event, which is dispatched
-when an exposure event with count equal to zero is reached and either
-the event queue is empty or the next event is not an exposure event
-for the same widget.
-.sp
-.LP
-.PN XtExposeCompressMaximal
-.IN "XtExposeCompressMaximal" "" "@DEF"
-.IP
-All expose series currently in the queue for the widget
-are coalesced into a single
-event without regard to intervening nonexposure events. If a
-partial series is in the end of the queue, the \*(xI will
-block until the end of the series is received.
-.sp
-.LP
-The additional flags have the following meaning:
-.sp
-.LP
-.PN XtExposeGraphicsExpose
-.IN "XtExposeGraphicsExpose" "" "@DEF@"
-.IP
-Specifies that
-.PN GraphicsExpose
-events are also to be dispatched to
-the expose procedure.
-.PN GraphicsExpose
-events are compressed, if specified, in the same manner as
-.PN Expose
-events.
-.sp
-.LP
-.PN XtExposeGraphicsExposeMerged
-.IN "XtExposeGraphicsExposeMerged" "" "@DEF@"
-.IP
-Specifies in the case of
-.PN XtExposeCompressMultiple
-and
-.PN XtExposeCompressMaximal
-that series of
-.PN GraphicsExpose
-and
-.PN Expose
-events are to be compressed together, with the final event type
-determining the type of the event passed to the expose procedure.
-If this flag is not set, then only series of the same event type
-as the event at the head of the queue are coalesced. This flag
-also implies
-.PN XtExposeGraphicsExpose .
-.sp
-.LP
-.PN XtExposeNoExpose
-.IN "XtExposeNoExpose" "" "@DEF@"
-.IP
-Specifies that
-.PN NoExpose
-events are also to be dispatched to the expose procedure.
-.PN NoExpose
-events are never coalesced with
-other exposure events or with each other.
-.sp
-.LP
-.PN XtExposeNoRegion
-.IN "XtExposeNoRegion" "" "@DEF"
-.IP
-Specifies that the final region argument passed to the expose
-procedure is NULL. The rectangle in the event will still
-contain bounding box information for the entire series of
-compressed exposure events. This option saves processing time when the
-region is not needed by the widget.
-
-.NH 2
-Widget Exposure and Visibility
-.XS
-\*(SN Widget Exposure and Visibility
-.XE
-.LP
-Every primitive widget and some composite widgets display data on the screen
-by means of direct Xlib calls.
-Widgets cannot simply write to the screen and forget what they have done.
-They must keep enough state to redisplay the window or parts
-of it if a portion is obscured and then reexposed.
-
-.NH 3
-Redisplay of a Widget: The expose Procedure
-.XS
-\*(SN Redisplay of a Widget: The expose Procedure
-.XE
-.IN "expose procedure"
-.LP
-The expose procedure pointer in a widget class is of type
-.PN XtExposeProc .
-.LP
-.IN "XtExposeProc" "" "@DEF@"
-.sM
-.FD 0
-typedef void (*XtExposeProc)(Widget, XEvent*, Region);
-.br
- Widget \fIw\fP;
-.br
- XEvent *\fIevent\fP;
-.br
- Region \fIregion\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget instance requiring redisplay.
-.IP \fIevent\fP 1i
-Specifies the exposure event giving the rectangle requiring redisplay.
-.IP \fIregion\fP 1i
-Specifies the union of all rectangles in this exposure sequence.
-.LP
-.eM
-The redisplay of a widget upon exposure is the responsibility of the
-expose procedure in the widget's class record.
-If a widget has no display semantics,
-it can specify NULL for the \fIexpose\fP field.
-Many composite widgets serve only as containers for their children
-and have no expose procedure.
-.NT
-If the \fIexpose\fP procedure is NULL,
-.PN XtRealizeWidget
-fills in a default bit gravity of
-.PN NorthWestGravity
-before it calls the widget's realize procedure.
-.NE
-.LP
-If the widget's \fIcompress_exposure\fP class field specifies
-.PN XtExposeNoCompress
-or
-.PN XtExposeNoRegion ,
-or if the event type is
-.PN NoExpose
-(see Section 7.9.3),
-\fIregion\fP is NULL. If
-.PN XtExposeNoCompress
-is not specified and the event type is not
-.PN NoExpose ,
-the event is the final event in the compressed series
-but \fIx\fP, \fIy\fP, \fIwidth\fP, and \fIheight\fP contain
-the bounding box for all the compressed events.
-The region is created and destroyed by the \*(xI, but
-the widget is permitted to modify the region contents.
-.LP
-A small simple widget (for example, Label) can ignore the bounding box
-information in the event and redisplay the entire window.
-A more complicated widget (for example, Text) can use the bounding box
-information to minimize the amount of calculation and redisplay it does.
-A very complex widget uses the region as a clip list in a GC and
-ignores the event information.
-The expose procedure is not chained and is therefore
-responsible for exposure of all superclass data
-as well as its own.
-.LP
-However,
-it often is possible to anticipate the display needs of several levels
-of subclassing.
-For example, rather than implement separate display procedures for
-the widgets Label, Pushbutton, and Toggle,
-you could write a single display routine in Label that uses display state
-fields like
-.LP
-.DS
-Boolean invert;
-Boolean highlight;
-Dimension highlight_width;
-.DE
-Label would have \fIinvert\fP and \fIhighlight\fP always
-.PN False
-and \fIhighlight_width\fP zero.
-Pushbutton would dynamically set \fIhighlight\fP and \fIhighlight_width\fP,
-but it would leave \fIinvert\fP always
-.PN False .
-Finally, Toggle would dynamically set all three.
-In this case,
-the expose procedures for Pushbutton and Toggle inherit
-their superclass's expose procedure;
-see Section 1.6.10.
-
-.NH 3
-Widget Visibility
-.XS
-\*(SN Widget Visibility
-.XE
-.LP
-Some widgets may use substantial computing resources to produce the
-data they will display.
-However, this effort is wasted if the widget is not actually visible
-on the screen, that is, if the widget is obscured by another application
-or is iconified.
-.LP
-.IN "Visibility"
-The \fIvisible\fP field in the
-core
-widget structure provides a hint to the widget that it need not compute
-display data.
-This field is guaranteed to be
-.PN True
-by the time an
-exposure
-event is processed if any part of the widget is visible,
-but is
-.PN False
-if the widget is fully obscured.
-.LP
-Widgets can use or ignore the \fIvisible\fP hint.
-If they ignore it,
-they should have \fIvisible_interest\fP in their widget class record set
-.PN False .
-In such cases,
-the \fIvisible\fP field is initialized
-.PN True
-and never changes.
-If \fIvisible_interest\fP is
-.PN True ,
-the event manager asks for
-.PN VisibilityNotify
-events for the widget and sets \fIvisible\fP to
-.PN True
-on
-.PN VisibilityUnobscured
-or
-.PN VisibilityPartiallyObscured
-.IN VisibilityNotify
-events and
-.PN False
-on
-.PN VisibilityFullyObscured
-events.
-
-.NH 2
-X Event Handlers
-.XS
-\*(SN X Event Handlers
-.XE
-.LP
-Event handlers are procedures called when specified events
-occur in a widget.
-Most widgets need not use event handlers explicitly.
-Instead, they use the \*(xI translation manager.
-Event handler procedure pointers are of the type
-.PN XtEventHandler .
-.LP
-.IN "XtEventHandler" "" "@DEF@"
-.sM
-.FD 0
-typedef void (*XtEventHandler)(Widget, XtPointer, XEvent*, Boolean*);
-.br
- Widget \fIw\fP;
-.br
- XtPointer \fIclient_data\fP;
-.br
- XEvent *\fIevent\fP;
-.br
- Boolean *\fIcontinue_to_dispatch\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget for which the event arrived.
-.IP \fIclient_data\fP 1i
-Specifies any client-specific information registered with the event handler.
-.IP \fIevent\fP 1i
-Specifies the triggering event.
-.IP \fIcontinue_to_dispatch\fP 1i
-Specifies whether the remaining event
-handlers registered for the current event
-should be called.
-.LP
-.eM
-After receiving an event and before calling any event handlers, the
-Boolean pointed to by \fIcontinue_to_dispatch\fP is initialized to
-.PN True .
-When an event handler is called, it may decide that further processing
-of the event is not desirable and may store
-.PN False
-in this Boolean, in
-which case any handlers remaining to be called for the event are
-ignored.
-.LP
-The circumstances under which the \*(xI may add event handlers
-to a widget are currently implementation-dependent. Clients must
-therefore be aware that storing
-.PN False
-into the \fIcontinue_to_dispatch\fP argument can lead to portability problems.
-
-.NH 3
-Event Handlers That Select Events
-.XS
-\*(SN Event Handlers That Select Events
-.XE
-.LP
-To register an event handler procedure with the dispatch mechanism, use
-.PN XtAddEventHandler .
-.LP
-.IN "XtAddEventHandler" "" "@DEF@"
-.sM
-.FD 0
-void XtAddEventHandler(\fIw\fP, \fIevent_mask\fP, \fInonmaskable\fP, \
-\fIproc\fP, \fIclient_data\fP)
-.br
- Widget \fIw\fP;
-.br
- EventMask \fIevent_mask\fP;
-.br
- Boolean \fInonmaskable\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget for which this event handler is being registered. \*(cI
-.IP \fIevent_mask\fP 1i
-Specifies the event mask for which to call this procedure.
-.IP \fInonmaskable\fP 1i
-Specifies whether this procedure should be
-called on the nonmaskable events
-.Pn ( GraphicsExpose ,
-.PN NoExpose ,
-.PN SelectionClear ,
-.PN SelectionRequest ,
-.PN SelectionNotify ,
-.PN ClientMessage ,
-and
-.PN MappingNotify ).
-.IP \fIproc\fP 1i
-Specifies the procedure to be called.
-.IP \fIclient_data\fP 1i
-Specifies additional data to be passed to the event handler.
-.LP
-.eM
-The
-.PN XtAddEventHandler
-function registers a procedure with the dispatch mechanism that is
-to be called when an event that matches the mask occurs on the specified
-widget.
-Each widget has a single registered event handler list, which will
-contain any procedure/client_data pair exactly once regardless of
-the manner in which it is registered.
-If the procedure is already registered with the same \fIclient_data\fP
-value,
-the specified mask augments the existing mask.
-If the widget is realized,
-.PN XtAddEventHandler
-calls
-.PN XSelectInput ,
-if necessary.
-The order in which this procedure is called relative to other handlers
-registered for the same event is not defined.
-.sp
-.LP
-To remove a previously registered event handler, use
-.PN XtRemoveEventHandler .
-.LP
-.IN "XtRemoveEventHandler" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveEventHandler(\fIw\fP, \fIevent_mask\fP, \fInonmaskable\fP, \
-\fIproc\fP, \fIclient_data\fP)
-.br
- Widget \fIw\fP;
-.br
- EventMask \fIevent_mask\fP;
-.br
- Boolean \fInonmaskable\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget for which this procedure is registered. \*(cI
-.IP \fIevent_mask\fP 1i
-Specifies the event mask for which to unregister this procedure.
-.IP \fInonmaskable\fP 1i
-Specifies whether this procedure should be
-removed on the nonmaskable events
-.Pn ( GraphicsExpose ,
-.PN NoExpose ,
-.PN SelectionClear ,
-.PN SelectionRequest ,
-.PN SelectionNotify ,
-.PN ClientMessage ,
-and
-.PN MappingNotify ).
-.IP \fIproc\fP 1i
-Specifies the procedure to be removed.
-.IP \fIclient_data\fP 1i
-Specifies the registered client data.
-.LP
-.eM
-The
-.PN XtRemoveEventHandler
-function unregisters an event handler registered with
-.PN XtAddEventHandler
-or
-.PN XtInsertEventHandler
-for the specified events.
-The request is ignored if \fIclient_data\fP does not match the value given
-when the handler was registered.
-If the widget is realized and no other event handler requires the event,
-.PN XtRemoveEventHandler
-calls
-.PN XSelectInput .
-If the specified procedure has not been registered
-or if it has been registered with a different value of \fIclient_data\fP,
-.PN XtRemoveEventHandler
-returns without reporting an error.
-.LP
-To stop a procedure registered with
-.PN XtAddEventHandler
-or
-.PN XtInsertEventHandler
-from receiving all selected events, call
-.PN XtRemoveEventHandler
-with an \fIevent_mask\fP of
-.PN XtAllEvents
-and \fInonmaskable\fP
-.PN True .
-The procedure will continue to receive any events
-that have been specified in calls to
-.PN XtAddRawEventHandler
-or
-.PN XtInsertRawEventHandler .
-.sp
-.LP
-To register an event handler procedure that receives events before or
-after all previously registered event handlers, use
-.PN XtInsertEventHandler .
-.LP
-.IN "XtListPosition" "" "@DEF@"
-.IN "XtInsertEventHandler" "" "@DEF@"
-.sM
-.Ds 0
-typedef enum {XtListHead, XtListTail} XtListPosition;
-.De
-.LP
-.FD 0
-void XtInsertEventHandler(\fIw\fP, \fIevent_mask\fP, \fInonmaskable\fP, \
-\fIproc\fP, \fIclient_data\fP, \fIposition\fP)
-.br
- Widget \fIw\fP;
-.br
- EventMask \fIevent_mask\fP;
-.br
- Boolean \fInonmaskable\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.br
- XtListPosition \fIposition\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget for which this event handler is being registered. \*(cI
-.IP \fIevent_mask\fP 1i
-Specifies the event mask for which to call this procedure.
-.IP \fInonmaskable\fP 1i
-Specifies whether this procedure should be
-called on the nonmaskable events
-.Pn ( GraphicsExpose ,
-.PN NoExpose ,
-.PN SelectionClear ,
-.PN SelectionRequest ,
-.PN SelectionNotify ,
-.PN ClientMessage ,
-and
-.PN MappingNotify ).
-.IP \fIproc\fP 1i
-Specifies the procedure to be called.
-.IP \fIclient_data\fP 1i
-Specifies additional data to be passed to the client's event handler.
-.IP \fIposition\fP 1i
-Specifies when the event handler is to be called
-relative to other previously registered handlers.
-.LP
-.eM
-.PN XtInsertEventHandler
-is identical to
-.PN XtAddEventHandler
-with the additional \fIposition\fP argument. If \fIposition\fP is
-.PN XtListHead ,
-the event
-handler is registered so that it is called before any event
-handlers that were previously registered for the same widget. If
-\fIposition\fP is
-.PN XtListTail ,
-the event handler is registered to be called
-after any previously registered event handlers. If the procedure is
-already registered with the same \fIclient_data\fP value, the specified mask
-augments the existing mask and the procedure is repositioned in
-the list.
-
-.NH 3
-Event Handlers That Do Not Select Events
-.XS
-\*(SN Event Handlers That Do Not Select Events
-.XE
-.LP
-On occasion,
-clients need to register an event handler procedure with the
-dispatch mechanism without explicitly
-causing the X server to select for that event.
-To do this, use
-.PN XtAddRawEventHandler .
-.LP
-.IN "XtAddRawEventHandler" "" "@DEF@"
-.sM
-.FD 0
-void XtAddRawEventHandler(\fIw\fP, \fIevent_mask\fP, \fInonmaskable\fP, \
-\fIproc\fP, \fIclient_data\fP)
-.br
- Widget \fIw\fP;
-.br
- EventMask \fIevent_mask\fP;
-.br
- Boolean \fInonmaskable\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget for which this event handler is being registered. \*(cI
-.IP \fIevent_mask\fP 1i
-Specifies the event mask for which to call this procedure.
-.IP \fInonmaskable\fP 1i
-Specifies whether this procedure should be
-called on the nonmaskable events
-.Pn ( GraphicsExpose ,
-.PN NoExpose ,
-.PN SelectionClear ,
-.PN SelectionRequest ,
-.PN SelectionNotify ,
-.PN ClientMessage ,
-and
-.PN MappingNotify ).
-.IP \fIproc\fP 1i
-Specifies the procedure to be called.
-.IP \fIclient_data\fP 1i
-Specifies additional data to be passed to the client's event handler.
-.LP
-.eM
-The
-.PN XtAddRawEventHandler
-function is similar to
-.PN XtAddEventHandler
-except that it does not affect the widget's event mask and never causes an
-.PN XSelectInput
-for its events.
-Note that the widget might already have those mask bits set
-because of other nonraw event handlers registered on it.
-If the procedure is already registered with the same \fIclient_data\fP,
-the specified mask augments the existing mask.
-The order in which this procedure is called relative to other handlers
-registered for the same event is not defined.
-.sp
-.LP
-To remove a previously registered raw event handler, use
-.PN XtRemoveRawEventHandler .
-.LP
-.IN "XtRemoveRawEventHandler" "" "@DEF@"
-.sM
-.FD 0
-void XtRemoveRawEventHandler(\fIw\fP, \fIevent_mask\fP, \fInonmaskable\fP, \
-\fIproc\fP, \fIclient_data\fP)
-.br
- Widget \fIw\fP;
-.br
- EventMask \fIevent_mask\fP;
-.br
- Boolean \fInonmaskable\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget for which this procedure is registered. \*(cI
-.IP \fIevent_mask\fP 1i
-Specifies the event mask for which to unregister this procedure.
-.IP \fInonmaskable\fP 1i
-Specifies whether this procedure should be
-removed on the nonmaskable events
-.Pn ( GraphicsExpose ,
-.PN NoExpose ,
-.PN SelectionClear ,
-.PN SelectionRequest ,
-.PN SelectionNotify ,
-.PN ClientMessage ,
-and
-.PN MappingNotify ).
-.IP \fIproc\fP 1i
-Specifies the procedure to be registered.
-.IP \fIclient_data\fP 1i
-Specifies the registered client data.
-.LP
-.eM
-The
-.PN XtRemoveRawEventHandler
-function unregisters an event handler registered with
-.PN XtAddRawEventHandler
-or
-.PN XtInsertRawEventHandler
-for the specified events without changing
-the window event mask.
-The request is ignored if \fIclient_data\fP does not match the value given
-when the handler was registered.
-If the specified procedure has not been registered
-or if it has been registered with a different value of \fIclient_data\fP,
-.PN XtRemoveRawEventHandler
-returns without reporting an error.
-.LP
-To stop a procedure
-registered with
-.PN XtAddRawEventHandler
-or
-.PN XtInsertRawEventHandler
-from receiving all nonselected events, call
-.PN XtRemoveRawEventHandler
-with an \fIevent_mask\fP of
-.PN XtAllEvents
-and \fInonmaskable\fP
-.PN True .
-The procedure
-will continue to receive any events that have been specified in calls to
-.PN XtAddEventHandler
-or
-.PN XtInsertEventHandler .
-.sp
-.LP
-To register an event handler procedure that receives events before or
-after all previously registered event handlers without selecting for
-the events, use
-.PN XtInsertRawEventHandler .
-.LP
-.IN "XtInsertRawEventHandler" "" "@DEF@"
-.sM
-.FD 0
-void XtInsertRawEventHandler(\fIw\fP, \fIevent_mask\fP, \fInonmaskable\fP, \
-\fIproc\fP, \fIclient_data\fP, \fIposition\fP)
-.br
- Widget \fIw\fP;
-.br
- EventMask \fIevent_mask\fP;
-.br
- Boolean \fInonmaskable\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.br
- XtListPosition \fIposition\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget for which this event handler is being registered. \*(cI
-.IP \fIevent_mask\fP 1i
-Specifies the event mask for which to call this procedure.
-.IP \fInonmaskable\fP 1i
-Specifies whether this procedure should be
-called on the nonmaskable events
-.Pn ( GraphicsExpose ,
-.PN NoExpose ,
-.PN SelectionClear ,
-.PN SelectionRequest ,
-.PN SelectionNotify ,
-.PN ClientMessage ,
-and
-.PN MappingNotify ).
-.IP \fIproc\fP 1i
-Specifies the procedure to be registered.
-.IP \fIclient_data\fP 1i
-Specifies additional data to be passed to the client's event handler.
-.IP \fIposition\fP 1i
-Specifies when the event handler is to be called
-relative to other previously registered handlers.
-.LP
-.eM
-The
-.PN XtInsertRawEventHandler
-function is similar to
-.PN XtInsertEventHandler
-except that it does not modify the widget's event
-mask and never causes an
-.PN XSelectInput
-for the specified events. If
-the procedure is already registered with the same \fIclient_data\fP
-value, the
-specified mask augments the existing mask and the procedure is
-repositioned in the list.
-
-.NH 3
-Current Event Mask
-.XS
-\*(SN Current Event Mask
-.XE
-.LP
-To retrieve the event mask for a given widget, use
-.PN XtBuildEventMask .
-.LP
-.IN "XtBuildEventMask" "" "@DEF@"
-.sM
-.FD 0
-EventMask XtBuildEventMask(\fIw\fP)
-.br
- Widget \fIw\fP;
-.FN
-.IP \fIw\fP 1i
-Specifies the widget. \*(cI
-.LP
-.eM
-The
-.PN XtBuildEventMask
-function returns the event mask representing the logical OR
-of all event masks for event handlers registered on the widget with
-.PN XtAddEventHandler
-and
-.PN XtInsertEventHandler
-and all event translations, including accelerators,
-installed on the widget.
-This is the same event mask stored into the
-.PN XSetWindowAttributes
-structure by
-.PN XtRealizeWidget
-and sent to the server when event handlers and translations are installed or
-removed on the realized widget.
-
-.NH 3
-Event Handlers for X11 Protocol Extensions
-.XS
-\fB\*(SN Event Handlers for X11 Protocol Extensions\fP
-.XE
-.LP
-To register an event handler procedure with the \*(xI dispatch
-mechanism according to an event type, use
-.PN XtInsertEventTypeHandler .
-.LP
-.IN "XtInsertEventTypeHandler" "" "@DEF"
-.sM
-.FD 0
-void XtInsertEventTypeHandler(\fIwidget\fP, \fIevent_type\fP, \
-\fIselect_data\fP, \fIproc\fP, \fIclient_data\fP, \fIposition\fP)
-.br
- Widget \fIwidget\fP;
-.br
- int \fIevent_type\fP;
-.br
- XtPointer \fIselect_data\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.br
- XtListPosition \fIposition\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget for which this event handler is being registered. \*(cI
-.IP \fIevent_type\fP 1i
-Specifies the event type for which to call this event handler.
-.IP \fIselect_data\fP 1i
-Specifies data used to request events of the specified type from the server,
-or NULL.
-.IP \fIproc\fP 1i
-Specifies the event handler to be called.
-.IP \fIclient_data\fP 1i
-Specifies additional data to be passed to the event handler.
-.IP \fIposition\fP 1i
-Specifies when the event handler is to be called relative to other
-previously registered handlers.
-.LP
-.eM
-.PN XtInsertEventTypeHandler
-registers a procedure with the
-dispatch mechanism that is to be called when an event that matches the
-specified \fIevent_type\fP is dispatched to the specified \fIwidget\fP.
-.LP
-If \fIevent_type\fP specifies one of the core X protocol events, then
-\fIselect_data\fP must be a pointer to a value of type
-.PN EventMask ,
-indicating
-the event mask to be used to select for the desired event. This event
-mask is included in the value returned by
-.PN XtBuildEventMask .
-If the widget is realized,
-.PN XtInsertEventTypeHandler
-calls
-.PN XSelectInput
-if necessary. Specifying NULL for \fIselect_data\fP is equivalent to
-specifying a pointer to an event mask containing 0. This is similar
-to the
-.PN XtInsertRawEventHandler
-function.
-.LP
-If \fIevent_type\fP specifies an extension event type, then the semantics of
-the data pointed to by \fIselect_data\fP are defined by the extension
-selector registered for the specified event type.
-.LP
-In either case the \*(xI are not required to copy the data
-pointed to by \fIselect_data\fP, so the caller must ensure that it remains
-valid as long as the event handler remains registered with this value
-of \fIselect_data\fP.
-.LP
-The \fIposition\fP argument allows the client to control the order of
-invocation of event handlers registered for the same event type. If
-the client does not care about the order, it should normally specify
-.PN XtListTail ,
-which registers this event handler after any previously
-registered handlers for this event type.
-.LP
-Each widget has a single registered event handler list, which will
-contain any procedure/client_data pair exactly once if it is
-registered with
-.PN XtInsertEventTypeHandler ,
-regardless of the manner
-in which it is registered and regardless of the value(s)
-of \fIselect_data\fP. If the procedure is already registered with the
-same \fIclient_data\fP value, the specified mask augments the existing
-mask and the procedure is repositioned in the list.
-.sp
-.LP
-To remove an event handler registered with
-.PN XtInsertEventTypeHandler ,
-use
-.PN XtRemoveEventTypeHandler .
-.LP
-.IN "XtRemoveEventTypeHandler" "" "@DEF"
-.sM
-.FD 0
-void XtRemoveEventTypeHandler(\fIwidget\fP, \fIevent_type\fP, \
-\fIselect_data\fP, \fIproc\fP, \fIclient_data\fP)
-.br
- Widget \fIwidget\fP;
-.br
- int \fIevent_type\fP;
-.br
- XtPointer \fIselect_data\fP;
-.br
- XtEventHandler \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget for which the event handler was registered. \*(cI
-.IP \fIevent_type\fP 1i
-Specifies the event type for which the handler was registered.
-.IP \fIselect_data\fP 1i
-Specifies data used to deselect events of the specified type
-from the server, or NULL.
-.IP \fIproc\fP 1i
-Specifies the event handler to be removed.
-.IP \fIclient_data\fP 1i
-Specifies the additional client data with which the procedure was registered.
-.LP
-.eM
-The
-.PN XtRemoveEventTypeHandler
-function unregisters an event handler
-registered with
-.PN XtInsertEventTypeHandler
-for the specified event type.
-The request is ignored if \fIclient_data\fP does not match the value given
-when the handler was registered.
-.LP
-If \fIevent_type\fP specifies one of the core X protocol events,
-\fIselect_data\fP must be a pointer to a value of type
-.PN EventMask, indicating the event
-mask to be used to deselect for the appropriate event. If the widget
-is realized,
-.PN XtRemoveEventTypeHandler
-calls
-.PN XSelectInput
-if necessary.
-Specifying NULL for \fIselect_data\fP is equivalent to specifying a pointer
-to an event mask containing 0. This is similar to the
-.PN XtRemoveRawEventHandler
-function.
-.LP
-If \fIevent_type\fP specifies an extension event type, then the semantics of
-the data pointed to by \fIselect_data\fP are defined by the extension
-selector registered for the specified event type.
-.sp
-.LP
-To register a procedure to select extension events for a widget, use
-.PN XtRegisterExtensionSelector .
-.LP
-.IN "XtRegisterExtensionSelector" "" "@DEF@"
-.sM
-.FD 0
-void XtRegisterExtensionSelector(\fIdisplay\fP, \fImin_event_type\fP, \
-\fImax_event_type\fP, \fIproc\fP,
- \fIclient_data\fP)
-.br
- Display \fI*display\fP;
-.br
- int \fImin_event_type\fP;
-.br
- int \fImax_event_type\fP;
-.br
- XtExtensionSelectProc \fIproc\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIdisplay\fP 1.5i
-Specifies the display for which the extension selector is to be registered.
-.IP \fImin_event_type\fP
-.IP \fImax_event_type\fP 1.5i
-Specifies the range of event types for the extension.
-.IP \fIproc\fP 1.5i
-Specifies the extension selector procedure.
-.IP \fIclient_data\fP 1.5i
-Specifies additional data to be passed to the extension selector.
-.LP
-.eM
-The
-.PN XtRegisterExtensionSelector
-function registers a procedure to arrange
-for the delivery of extension events to widgets.
-.LP
-If \fImin_event_type\fP and \fImax_event_type\fP match the parameters
-to a previous call to
-.PN XtRegisterExtensionSelector
-for the same \fIdisplay\fP, then \fIproc\fP and \fIclient_data\fP
-replace the previously
-registered values. If the range specified by \fImin_event_type\fP
-and \fImax_event_type\fP overlaps the range of the parameters to a
-previous call for the same display in any other way, an error results.
-.LP
-When a widget is realized,
-after the \fIcore.realize\fP method is called,
-the \*(xI check to see if any event
-handler specifies an event type within the range of a registered
-extension selector. If so, the \*(xI call each such selector.
-If an event type handler is added or removed, the \*(xI check to
-see if the event type falls within the range of a registered extension
-selector, and if it does, calls the selector. In either case the \*(xI
-pass a list of all the widget's event types that are within the
-selector's range. The corresponding select data are also passed. The
-selector is responsible for enabling the delivery of extension events
-required by the widget.
-.sp
-.LP
-An extension selector is of type
-.PN XtExtensionSelectProc .
-.LP
-.IN "XtExtensionSelectProc" "" "@DEF"
-.sM
-.FD 0
-typedef void (*XtExtensionSelectProc)(Widget, int *, XtPointer *, int, \
-XtPointer);
-.br
- Widget \fIwidget\fP;
-.br
- int *\fIevent_types\fP;
-.br
- XtPointer *\fIselect_data\fP;
-.br
- int \fIcount\fP;
-.br
- XtPointer \fIclient_data\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget that is being realized or is having
-an event handler added or removed.
-.IP \fIevent_types\fP 1i
-Specifies a list of event types that the widget has
-registered event handlers for.
-.IP \fIselect_data\fP 1i
-Specifies a list of the select_data parameters specified in
-.PN XtInsertEventTypeHandler .
-.IP \fIcount\fP 1i
-Specifies the number of entries in the \fIevent_types\fP and \fIselect_data\fP
-lists.
-.IP \fIclient_data\fP 1i
-Specifies the additional client data with which the procedure was registered.
-.LP
-.eM
-The \fIevent_types\fP and \fIselect_data\fP lists will always have the
-same number of elements, specified by \fIcount\fP.
-Each event type/select data pair represents one call to
-.PN XtInsertEventTypeHandler .
-.sp
-.LP
-To register a procedure to dispatch events of a specific type within
-.PN XtDispatchEvent ,
-use
-.PN XtSetEventDispatcher .
-.LP
-.IN "XtSetEventDispatcher" "" "@DEF@"
-.sM
-.FD 0
-XtEventDispatchProc XtSetEventDispatcher(\fIdisplay\fP, \fIevent_type\fP, \
-\fIproc\fP)
-.br
- Display *\fIdisplay\fP;
-.br
- int \fIevent_type\fP;
-.br
- XtEventDispatchProc \fIproc\fP;
-.FN
-.IP \fIdisplay\fP 1i
-Specifies the display for which the event dispatcher is to be registered.
-.IP \fIevent_type\fP 1i
-Specifies the event type for which the dispatcher should be invoked.
-.IP \fIproc\fP 1i
-Specifies the event dispatcher procedure.
-.LP
-.eM
-The
-.PN XtSetEventDispatcher
-function registers the event dispatcher procedure specified by \fIproc\fP
-for events with the type \fIevent_type\fP. The previously registered
-dispatcher (or the default dispatcher if there was no previously registered
-dispatcher) is returned. If \fIproc\fP is NULL, the default procedure is
-restored for the specified type.
-.LP
-In the future, when
-.PN XtDispatchEvent
-is called with an event type of \fIevent_type\fP, the specified \fIproc\fP
-(or the default dispatcher) is invoked to determine a widget
-to which to dispatch the event.
-.LP
-The default dispatcher handles the \*(xI modal cascade and keyboard
-focus mechanisms, handles the semantics of \fIcompress_enterleave\fP
-and \fIcompress_motion\fP, and discards all extension events.
-.sp
-.LP
-An event dispatcher procedure pointer is of type
-.PN XtEventDispatchProc .
-.LP
-.IN "XtEventDispatchProc" "" "@DEF@"
-.sM
-.FD 0
-typedef Boolean (*XtEventDispatchProc)(XEvent*)
-.br
- XEvent *\fIevent\fP;
-.FN
-.IP \fIevent\fP 1i
-Passes the event to be dispatched.
-.LP
-.eM
-The event dispatcher procedure should determine whether this event is of
-a type that should be dispatched to a widget.
-.LP
-If the event should be dispatched to a widget, the event dispatcher
-procedure should determine the appropriate widget to receive the
-event, call
-.PN XFilterEvent
-with the window of this widget, or
-.PN None
-if the event is to be discarded, and if
-.PN XFilterEvent
-returns
-.PN False ,
-dispatch the event to the widget using
-.PN XtDispatchEventToWidget .
-The procedure should return
-.PN True
-if either
-.PN XFilterEvent
-or
-.PN XtDispatchEventToWidget
-returned
-.PN True
-and
-.PN False
-otherwise.
-.LP
-If the event should not be dispatched to a widget, the event
-dispatcher procedure should attempt to dispatch the event elsewhere as
-appropriate and return
-.PN True
-if it successfully dispatched the event and
-.PN False
-otherwise.
-.sp
-.LP
-Some dispatchers for extension events may wish to forward events
-according to the Intrinsics' keyboard focus mechanism. To determine
-which widget is the end result of keyboard event forwarding, use
-.PN XtGetKeyboardFocusWidget .
-.LP
-.IN "XtGetKeyboardFocusWidget" "" "@DEF@"
-.sM
-.FD 0
-Widget XtGetKeyboardFocusWidget(\fIwidget\fP)
-.br
- Widget \fIwidget\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget to get forwarding information for.
-.LP
-.eM
-The
-.PN XtGetKeyboardFocusWidget
-function returns the widget that would be the end result of keyboard
-event forwarding for a keyboard event for the specified widget.
-.sp
-.LP
-To dispatch an event to a specified widget, use
-.PN XtDispatchEventToWidget .
-.LP
-.IN "XtDispatchEventToWidget" "" "@DEF@"
-.sM
-.FD 0
-Boolean XtDispatchEventToWidget(\fIwidget\fP, \fIevent\fP)
-.br
- Widget \fIwidget\fP;
-.br
- XEvent *\fIevent\fP;
-.FN
-.IP \fIwidget\fP 1i
-Specifies the widget to which to dispatch the event.
-.IP \fIevent\fP 1i
-Specifies a pointer to the event to be dispatched.
-.LP
-.eM
-The
-.PN XtDispatchEventToWidget
-function scans the list of registered event handlers for the
-specified widget and calls each handler that has been registered
-for the specified event type, subject to the \fIcontinue_to_dispatch\fP
-value returned by each handler.
-The \*(xI behave as if event handlers were registered at the head
-of the list for
-.PN Expose ,
-.PN NoExpose ,
-.PN GraphicsExpose ,
-and
-.PN VisibilityNotify
-events to invoke the widget's expose procedure according to the exposure
-compression rules and to update the widget's \fIvisible\fP field
-if \fIvisible_interest\fP is
-.PN True .
-These internal event handlers never set \fIcontinue_to_dispatch\fP to
-.PN False .
-.LP
-.PN XtDispatchEventToWidget
-returns
-.PN True
-if any event handler was called and
-.PN False
-otherwise.
-
-.NH 2
-Using the \*(xI in a Multi-Threaded Environment
-.XS
-\*(SN Using the \*(xI in a Multi-Threaded Environment
-.XE
-.LP
-The \*(xI may be used in environments that offer multiple threads
-of execution within the context of a single process. A multi-threaded
-application using the \*(xI must explicitly initialize the toolkit
-for mutually exclusive access by calling
-.PN XtToolkitThreadInitialize .
-
-.NH 3
-Initializing a Multi-Threaded \*(xI Application
-.XS
-\fB\*(SN Initializing a Multi-Threaded \*(xI Application\fP
-.XE
-.LP
-To test and initialize \*(xI support for mutually exclusive thread
-access, call
-.PN XtToolkitThreadInitialize .
-.LP
-.IN "XtToolkitThreadInitialize" "" "@DEF@"
-.sM
-.FD 0
-Boolean XtToolkitThreadInitialize()
-.FN
-.LP
-.eM
-.PN XtToolkitThreadInitialize
-returns \fBTrue\fP if the \*(xI support mutually exclusive thread
-access, otherwise it returns \fBFalse\fP. \fBXtToolkitThreadInitialize\fP
-must be called before
-.PN XtCreateApplicationContext ,
-.PN XtAppInitialize ,
-.PN XtOpenApplication ,
-or
-.PN XtSetLanguageProc
-is called. \fBXtToolkitThreadInitialize\fP may be called more than once;
-however, the application writer must ensure that it is not called
-simultaneously by two or more threads.
-
-.NH 3
-Locking \*(tk Data Structures
-.XS
-\fB\*(SN Locking \*(tk Data Structures\fP
-.XE
-.LP
-The \*(xI employs two levels of locking: application context and
-process. Locking an application context ensures mutually exclusive
-access by a thread to the state associated with the application context,
-including all displays and widgets associated with it. Locking a
-process ensures mutually exclusive access by a thread to \*(xI process
-global data.
-.LP
-A client may acquire a lock multiple times and the effect is cumulative.
-The client must ensure that the lock is released an equal number of times in
-order for the lock to be acquired by another thread.
-.LP
-Most application writers will have little need to use locking as the
-\*(xI performs the necessary locking internally.
-Resource converters are an exception.
-They require the application context or process to be locked
-before the application can safely call them directly, for example:
-.LP
-.KS
-.Ds
-.TA .5i 2i
-.ta .5i 2i
- ...
- XtAppLock(app_context);
- XtCvtStringToPixel(dpy, args, num_args, fromVal, toVal, closure_ret);
- XtAppUnlock(app_context);
- ...
-.De
-.KE
-.LP
-When the application relies upon
-.PN XtConvertAndStore
-or a converter to provide the storage for the results of a
-conversion, the application should acquire the process lock before
-calling out and hold the lock until the results have been copied.
-.LP
-Application writers who write their own
-utility functions, such as one which retrieves the being_destroyed field from
-a widget instance, must lock the application context before accessing
-widget internal data. For example:
-.LP
-.KS
-.Ds
-.TA .5i 2i
-.ta .5i 2i
-#include <X11/CoreP.h>
-Boolean BeingDestroyed (widget)
- Widget widget;
-{
- Boolean ret;
- XtAppLock(XtWidgetToApplicationContext(widget));
- ret = widget->core.being_destroyed;
- XtAppUnlock(XtWidgetToApplicationContext(widget));
- return ret;
-}
-.De
-.KE
-A client that wishes to atomically call two or more \*(xI functions
-must lock the application context. For example:
-.LP
-.KS
-.Ds
-.TA .5i 2i
-.ta .5i 2i
- ...
- XtAppLock(XtWidgetToApplicationContext(widget));
- XtUnmanageChild (widget1);
- XtManageChild (widget2);
- XtAppUnlock(XtWidgetToApplicationContext(widget));
- ...
-.De
-.KE
-
-.NH 4
-Locking the Application Context
-.XS
-\fB\*(SN Locking the Application Context\fP
-.XE
-.LP
-To ensure mutual exclusion of application context, display, or
-widget internal state, use
-.PN XtAppLock.
-.LP
-.IN "XtAppLock" "" "@DEF@"
-.sM
-.FD 0
-void XtAppLock(\fIapp_context\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context to lock.
-.LP
-.eM
-\fBXtAppLock\fP blocks until it is able to acquire the lock. Locking the
-application context also ensures that only the thread holding the lock
-makes Xlib calls from within Xt. An application that makes its own
-direct Xlib calls must either lock the application context around every
-call or enable thread locking in Xlib.
-.LP
-To unlock a locked application context, use
-.PN XtAppUnlock.
-.LP
-.IN "XtAppUnlock" "" "@DEF@"
-.sM
-.FD 0
-void XtAppUnlock(\fIapp_context\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context that was previously locked.
-.LP
-.eM
-
-.NH 4
-Locking the Process
-.XS
-\*(SN Locking the Process
-.XE
-.LP
-To ensure mutual exclusion of \*(tk process global data, a
-widget writer must use
-.PN XtProcessLock.
-.LP
-.IN "XtProcessLock" "" "@DEF@"
-.sM
-.FD 0
-void XtProcessLock()
-.FN
-.LP
-.eM
-\fBXtProcessLock\fP blocks until it is able to acquire the lock.
-Widget writers may use XtProcessLock to guarantee mutually exclusive
-access to widget static data.
-.LP
-To unlock a locked process, use
-.PN XtProcessUnlock .
-.LP
-.IN "XtProcessUnlock" "" "@DEF@"
-.sM
-.FD 0
-void XtProcessUnlock()
-.FN
-.LP
-.eM
-To lock both an application context and the process at the same
-time, call
-.PN XtAppLock
-first and then
-.PN XtProcessLock .
-To release both locks, call
-.PN XtProcessUnlock
-first and then
-.PN XtAppUnlock .
-The order is important to avoid deadlock.
-
-.NH 3
-Event Management in a Multi-Threaded Environment
-.XS
-\fB\*(SN Event Management in a Multi-Threaded Environment\fP
-.XE
-.LP
-In a nonthreaded environment an application writer could reasonably
-assume that it is safe to exit the application from a quit callback.
-This assumption may no longer hold true in a multi-threaded environment;
-therefore it is desirable to provide a mechanism to terminate an
-event-processing loop without necessarily terminating its thread.
-.LP
-To indicate that the event loop should terminate after the current
-event dispatch has completed, use
-.PN XtAppSetExitFlag .
-.LP
-.IN "XtAppSetExitFlag" "" "@DEF@"
-.sM
-.FD 0
-void XtAppSetExitFlag(\fIapp_context\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context.
-.LP
-.eM
-.PN XtAppMainLoop
-tests the value of the flag and will return if the flag is \fBTrue\fP.
-.LP
-Application writers who implement their own main loop may test the
-value of the exit flag with
-.PN XtAppGetExitFlag .
-.LP
-.IN "XtAppGetExitFlag" "" "@DEF@"
-.sM
-.FD 0
-Boolean XtAppGetExitFlag(\fIapp_context\fP)
-.br
- XtAppContext \fIapp_context\fP;
-.FN
-.IP \fIapp_context\fP 1i
-Specifies the application context.
-.LP
-.eM
-.PN XtAppGetExitFlag
-will normally return \fBFalse\fP, indicating that event processing
-may continue. When
-.PN XtAppGetExitFlag
-returns \fBTrue\fP, the loop must terminate and return to the caller,
-which might then destroy the application context.
-.LP
-Application writers should be aware that, if a thread is blocked in
-.PN XtAppNextEvent ,
-.PN XtAppPeekEvent ,
-or
-.PN XtAppProcessEvent
-and another thread in the same application context opens a new display,
-adds an alternate input, or a timeout, any new source(s) will not
-normally be "noticed" by the blocked thread. Any new sources are
-"noticed" the next time one of these functions is called.
-.LP
-The \*(xI manage access to events on a last-in, first-out basis. If
-multiple threads in the same application context block in
-.PN XtAppNextEvent ,
-.PN XtAppPeekEvent ,
-or
-.PN XtAppProcessEvent ,
-the last thread to call one of these functions is the first
-thread to return.
-.bp