diff options
author | Alan Coopersmith <alan.coopersmith@oracle.com> | 2010-06-08 20:26:29 -0700 |
---|---|---|
committer | Alan Coopersmith <alan.coopersmith@oracle.com> | 2010-06-08 20:26:29 -0700 |
commit | 74cb722a974010fa3c82dc57a036f97768b3695b (patch) | |
tree | 17c13995e79faf0e5478b98770b739aca8188c3f /specs/CH10 | |
parent | 56621d3ec521dd30fabb1a77ad1c396baa740569 (diff) |
Move Xt specs from xorg-docs module
For now, just checked in and included in dist tarballs, not processed
into a usable format - same as it was in xorg-docs
Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
Diffstat (limited to 'specs/CH10')
-rw-r--r-- | specs/CH10 | 1521 |
1 files changed, 1521 insertions, 0 deletions
diff --git a/specs/CH10 b/specs/CH10 new file mode 100644 index 0000000..b7c0139 --- /dev/null +++ b/specs/CH10 @@ -0,0 +1,1521 @@ +.\" $Xorg: CH10,v 1.3 2000/08/17 19:42:46 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 10\fP\s-1 + +\s+1\fBTranslation Management\s-1 +.sp 2 +.nr H1 10 +.nr H2 0 +.nr H3 0 +.nr H4 0 +.nr H5 0 +.LP +.XS +Chapter 10 \(em Translation Management +.XE +Except under unusual circumstances, +widgets do not hardwire the mapping of user events into widget behavior +by using the event manager. +Instead, they provide a default mapping of events into behavior +that you can override. +.LP +The translation manager provides an interface to specify and manage the +mapping of X event sequences into widget-supplied functionality, +for example, calling procedure \fIAbc\fP when the \fIy\fP key +is pressed. +.LP +The translation manager uses two kinds of tables to perform translations: +.IP \(bu 5 +The action tables, which are in the widget class structure, +specify the mapping of externally available procedure name strings +to the corresponding procedure implemented by the widget class. +.IP \(bu 5 +A translation table, which is in the widget class structure, +specifies the mapping of event sequences to procedure name strings. +.LP +You can override the translation table in the class structure +for a specific widget instance by supplying a different translation table +for the widget instance. The resources +XtNtranslations and XtNbaseTranslations are used to modify the class +default translation table; see Section 10.3. + +.NH 2 +Action Tables +.XS +\fB\*(SN Action Tables\fP +.XE +.LP +All widget class records contain an action table, +an array of +.PN XtActionsRec +entries. +In addition, +an application can register its own action tables with the translation manager +so that the translation tables it provides to widget instances can access +application functionality directly. +The translation action procedure pointer is of type +.PN XtActionProc . +.LP +.IN "action_proc procedure" "" "@DEF@" +.IN "XtActionProc" "" "@DEF@" +.sM +.FD 0 +typedef void (*XtActionProc)(Widget, XEvent*, String*, Cardinal*); +.br + Widget \fIw\fP; +.br + XEvent *\fIevent\fP; +.br + String *\fIparams\fP; +.br + Cardinal *\fInum_params\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget that caused the action to be called. +.IP \fIevent\fP 1i +Specifies the event that caused the action to be called. +If the action is called after a sequence of events, +then the last event in the sequence is used. +.IP \fIparams\fP 1i +Specifies a pointer to the list of strings that were specified +in the translation table as arguments to the action, or NULL. +.IP \fInum_params\fP 1i +Specifies the number of entries in \fIparams\fP. +.IN "XtActionsRec" +.IN "XtActionList" +.LP +.Ds 0 +.TA .5i 3i +.ta .5i 3i +typedef struct _XtActionsRec { + String string; + XtActionProc proc; +} XtActionsRec, *XtActionList; +.De +.LP +.eM +The \fIstring\fP field is the name used in translation tables to access +the procedure. +The \fIproc\fP field is a pointer to a procedure that implements +the functionality. +.LP +When the action list is specified as the +.PN CoreClassPart +\fIactions\fP field, the string pointed to by \fIstring\fP must be +permanently allocated prior to or during the execution of the class +initialization procedure and must not be subsequently deallocated. +.LP +Action procedures should not assume that the widget in which they +are invoked is realized; an accelerator specification can cause +an action procedure to be called for a widget that does not yet +have a window. Widget writers should also note which of a widget's +callback lists are invoked from action procedures and warn clients +not to assume the widget is realized in those callbacks. +.LP +For example, a Pushbutton widget has procedures to take the following actions: +.IP \(bu 5 +Set the button to indicate it is activated. +.IP \(bu 5 +Unset the button back to its normal mode. +.IP \(bu 5 +Highlight the button borders. +.IP \(bu 5 +Unhighlight the button borders. +.IP \(bu 5 +Notify any callbacks that the button has been activated. +.LP +The action table for the Pushbutton widget class makes these functions +available to translation tables written for Pushbutton or any subclass. +The string entry is the name used in translation tables. +The procedure entry (usually spelled identically to the string) +is the name of the C procedure that implements that function: +.LP +.IN "Action Table" +.Ds +.TA .5i 1.5i +.ta .5i 1.5i +XtActionsRec actionTable[] = { + {"Set", Set}, + {"Unset", Unset}, + {"Highlight", Highlight}, + {"Unhighlight", Unhighlight} + {"Notify", Notify}, +}; +.De +.LP +The \*(xI reserve all action names and parameters starting with +the characters ``Xt'' for future standard enhancements. Users, +applications, and widgets should not declare action names or pass +parameters starting with these characters except to invoke specified +built-in \*(xI functions. + +.NH 3 +Action Table Registration +.XS +\fB\*(SN Action Table Registration\fP +.XE +.LP +.IN "actions" +The \fIactions\fP and \fInum_actions\fP fields of +.PN CoreClassPart +specify the actions implemented by a widget class. These are +automatically registered with the \*(xI when the class is initialized +and must be allocated in writable storage prior to Core class_part +initialization, and never deallocated. To save memory and optimize +access, the \*(xI may overwrite the storage in order to compile the +list into an internal representation. +.sp +.LP +To declare an action table within an application +and register it with the translation manager, use +.PN XtAppAddActions . +.LP +.IN "XtAppAddActions" "" "@DEF@" +.sM +.FD 0 +void XtAppAddActions(\fIapp_context\fP, \fIactions\fP, \fInum_actions\fP) +.br + XtAppContext \fIapp_context\fP; +.br + XtActionList \fIactions\fP; +.br + Cardinal \fInum_actions\fP; +.FN +.IP \fIapp_context\fP 1i +Specifies the application context. +.IP \fIactions\fP 1i +Specifies the action table to register. +.IP \fInum_actions\fP 1i +Specifies the number of entries in this action table. +.LP +.eM +If more than one action is registered with the same name, +the most recently registered action is used. +If duplicate actions exist in an action table, +the first is used. +The \*(xI register an action table containing +.PN XtMenuPopup +and +.PN XtMenuPopdown +as part of +.PN XtCreateApplicationContext . + +.NH 3 +Action Names to Procedure Translations +.XS +\fB\*(SN Action Names to Procedure Translations\fP +.XE +.LP +The translation manager uses a simple algorithm to resolve the name of +a procedure specified in a translation table into the +actual procedure specified +in an action table. +When the widget +is realized, the translation manager +performs a search for the name in the following tables, in order: +.IP \(bu 5 +The widget's class and all superclass action tables, in subclass-to-superclass +order. +.IP \(bu 5 +The parent's class and all superclass action tables, in subclass-to-superclass +order, then on up the ancestor tree. +.IP \(bu 5 +The action tables registered with +.PN XtAppAddActions +and +.PN XtAddActions +from the most recently added table to the oldest table. +.LP +As soon as it finds a name, +the translation manager stops the search. +If it cannot find a name, +the translation manager generates a warning message. + +.NH 3 +Action Hook Registration +.XS +\fB\*(SN Action Hook Registration\fP +.XE +.LP +An application can specify a procedure that will be called just before +every action routine is dispatched by the translation manager. To do +so, the application supplies a procedure pointer of type +.PN XtActionHookProc . +.LP +.IN "XtActionHookProc" "" "@DEF@" +.sM +.FD 0 +typedef void (*XtActionHookProc)(Widget, XtPointer, String, XEvent*, \ +String*, Cardinal*); +.br + Widget \fIw\fP; +.br + XtPointer \fIclient_data\fP; +.br + String \fIaction_name\fP; +.br + XEvent* \fIevent\fP; +.br + String* \fIparams\fP; +.br + Cardinal* \fInum_params\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget whose action is about to be dispatched. +.IP \fIclient_data\fP 1i +Specifies the application-specific closure that was passed to +.PN XtAppAddActionHook. +.IP \fIaction_name\fP 1i +Specifies the name of the action to be dispatched. +.IP \fIevent\fP 1i +Specifies the event argument that will be passed to the action routine. +.IP \fIparams\fP 1i +Specifies the action parameters that will be passed to the action routine. +.IP \fInum_params\fP 1i +Specifies the number of entries in \fIparams\fP. +.LP +.eM +Action hooks should not modify any of the data pointed to by the +arguments other than the \fIclient_data\fP argument. +.sp +.LP +To add an action hook, use +.PN XtAppAddActionHook . +.LP +.IN "XtAppAddActionHook" "" "@DEF@" +.sM +.FD 0 +XtActionHookId XtAppAddActionHook(\fIapp\fP, \fIproc\fP, \fIclient_data\fP) +.br + XtAppContext \fIapp\fP; +.br + XtActionHookProc \fIproc\fP; +.br + XtPointer \fIclient_data\fP; +.FN +.IP \fIapp\fP 1i +Specifies the application context. +.IP \fIproc\fP 1i +Specifies the action hook procedure. +.IP \fIclient_data\fP 1i +Specifies application-specific data to be passed to the action hook. +.LP +.eM +.PN XtAppAddActionHook +adds the specified procedure to the front of a list +maintained in the application context. In the future, when an action +routine is about to be invoked for any widget in this application +context, either through the translation manager or via +.PN XtCallActionProc , +the action hook procedures will be called in reverse +order of registration just prior to invoking the action routine. +.LP +Action hook procedures are removed automatically and the +.PN XtActionHookId is +destroyed when the application context in which +they were added is destroyed. +.sp +.LP +To remove an action hook procedure without destroying the application +context, use +.PN XtRemoveActionHook . +.LP +.IN "XtRemoveActionHook" "" "@DEF@" +.sM +.FD 0 +void XtRemoveActionHook(\fIid\fP) +.br + XtActionHookId \fIid\fP; +.FN +.IP \fIid\fP 1i +Specifies the action hook id returned by +.PN XtAppAddActionHook . +.LP +.eM +.PN XtRemoveActionHook +removes the specified action hook procedure from +the list in which it was registered. + +.NH 2 +Translation Tables +.XS +\fB\*(SN Translation Tables\fP +.XE +.LP +All widget instance records contain a translation table, +which is a resource with a default value specified elsewhere in the +class record. +A translation table specifies what action procedures are invoked for +an event or a sequence of events. +A translation table +is a string containing a list of translations from an event sequence +into one or more action procedure calls. +The translations are separated from one another by newline characters +(ASCII LF). +The complete syntax of translation tables is specified in Appendix B. +.LP +As an example, the default behavior of Pushbutton is +.IP \(bu 5 +Highlight on enter window. +.IP \(bu 5 +Unhighlight on exit window. +.IP \(bu 5 +Invert on left button down. +.IP \(bu 5 +Call callbacks and reinvert on left button up. +.LP +The following illustrates Pushbutton's default translation table: +.LP +.IN "Translation tables" +.Ds +.TA .5i 1.5i +.ta .5i 1.5i +static String defaultTranslations = + "<EnterWindow>: Highlight()\\n\\ + <LeaveWindow>: Unhighlight()\\n\\ + <Btn1Down>: Set()\\n\\ + <Btn1Up>: Notify() Unset()"; +.De +.LP +The \fItm_table\fP field of the +.PN CoreClassPart +should be filled in at class initialization time with +the string containing the class's default translations. +If a class wants to inherit its superclass's translations, +it can store the special value +.PN XtInheritTranslations +into \fItm_table\fP. +In Core's class part initialization procedure, +the \*(xI compile this translation table into an efficient internal form. +Then, at widget creation time, +this default translation table is +combined with the XtNtranslations +and XtNbaseTranslations resources; see Section 10.3. +.LP +The resource conversion mechanism automatically compiles +string translation tables that are specified in the resource database. +If a client uses translation tables that are not retrieved via a +resource conversion, +it must compile them itself using +.PN XtParseTranslationTable . +.LP +The \*(xI use the compiled form of the translation table to register the +necessary events with the event manager. +Widgets need do nothing other than specify the action and translation tables +for events to be processed by the translation manager. + +.NH 3 +Event Sequences +.XS +\fB\*(SN Event Sequences\fP +.XE +.LP +An event sequence is a comma-separated list of X event descriptions +that describes a specific sequence of X events to map to a set of +program actions. +Each X event description consists of three parts: +The X event type, a prefix consisting of the X modifier bits, and +an event-specific suffix. +.LP +Various abbreviations are supported to make translation tables easier +to read. The events must match incoming events in left-to-right order +to trigger the action sequence. + +.NH 3 +Action Sequences +.XS +\fB\*(SN Action Sequences\fP +.XE +.LP +Action sequences specify what program or widget actions to take in response to +incoming X events. An action sequence consists of space-separated +action procedure call specifications. +Each action procedure call consists of the name of an action procedure and a +parenthesized list of zero or more comma-separated +string parameters to pass to that procedure. +The actions are invoked in left-to-right order as specified in the +action sequence. + +.NH 3 +Multi-Click Time +.XS +\fB\*(SN Multi-Click Time\fP +.XE +.LP +Translation table entries may specify actions that are taken when two +or more identical events occur consecutively within a short time +interval, called the multi-click time. The multi-click time value may +be specified as an application resource with name ``multiClickTime'' and +.IN "multiClickTime" "" "@DEF@" +.IN "Resources" "multiClickTime" +class ``MultiClickTime'' and may also be modified dynamically by the +application. The multi-click time is unique for each Display value and +is retrieved from the resource database by +.PN XtDisplayInitialize . +If no value is specified, the initial value is 200 milliseconds. +.sp +.LP +To set the multi-click time dynamically, use +.PN XtSetMultiClickTime . +.LP +.IN "XtSetMultiClickTime" "" "@DEF@" +.sM +.FD 0 +void XtSetMultiClickTime(\fIdisplay\fP, \fItime\fP) +.br + Display *\fIdisplay\fP; +.br + int \fItime\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the display connection. +.IP \fItime\fP 1i +Specifies the multi-click time in milliseconds. +.LP +.eM +.PN XtSetMultiClickTime +sets the time interval used by the translation +manager to determine when multiple events are interpreted as a +repeated event. When a repeat count is specified in a translation +entry, the interval between the timestamps in each pair of repeated +events (e.g., between two +.PN ButtonPress +events) must be less than the +multi-click time in order for the translation actions to be taken. +.sp +.LP +To read the multi-click time, use +.PN XtGetMultiClickTime . +.LP +.IN "XtGetMultiClickTime" "" "@DEF@" +.sM +.FD 0 +int XtGetMultiClickTime(\fIdisplay\fP) +.br + Display *\fIdisplay\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the display connection. +.LP +.eM +.PN XtGetMultiClickTime +returns the time in milliseconds that the +translation manager uses to determine if multiple events are to be +interpreted as a repeated event for purposes of matching a translation +entry containing a repeat count. + +.NH 2 +Translation Table Management +.XS +\fB\*(SN Translation Table Management\fP +.XE +.LP +Sometimes an application needs to merge +its own translations with a widget's translations. +For example, a window manager provides functions to move a window. +The window manager wishes to bind this operation to a specific +pointer button in the title bar without the possibility of user +override and bind it to other buttons that may be overridden by the user. +.LP +To accomplish this, +the window manager should first create the title bar +and then should merge the two translation tables into +the title bar's translations. +One translation table contains the translations that the window manager +wants only if the user has not specified a translation for a particular event +or event sequence (i.e., those that may be overridden). +The other translation table contains the translations that the +window manager wants regardless of what the user has specified. +.LP +Three \*(xI functions support this merging: +.TS +lw(2i) lw(3.75i). +T{ +.PN XtParseTranslationTable +T} T{ +Compiles a translation table. +T} +.sp +T{ +.PN XtAugmentTranslations +T} T{ +Merges a compiled translation table into a widget's +compiled translation table, ignoring any new translations that +conflict with existing translations. +T} +.sp +T{ +.PN XtOverrideTranslations +T} T{ +Merges a compiled translation table into a widget's +compiled translation table, replacing any existing translations that +conflict with new translations. +T} +.TE +.sp +.LP +To compile a translation table, use +.PN XtParseTranslationTable . +.LP +.IN "XtParseTranslationTable" "" "@DEF@" +.sM +.FD 0 +XtTranslations XtParseTranslationTable(\fItable\fP) +.br + String \fItable\fP; +.FN +.IP \fItable\fP 1i +Specifies the translation table to compile. +.LP +.eM +The +.PN XtParseTranslationTable +function compiles the translation table, provided in the format given +in Appendix B, into an opaque internal representation +of type +.PN XtTranslations . +Note that if an empty translation table is required for any purpose, +one can be obtained by calling +.PN XtParseTranslationTable +and passing an empty string. +.sp +.LP +To merge additional translations into an existing translation table, use +.PN XtAugmentTranslations . +.LP +.IN "XtAugmentTranslations" "" "@DEF@" +.sM +.FD 0 +void XtAugmentTranslations(\fIw\fP, \fItranslations\fP) +.br + Widget \fIw\fP; +.br + XtTranslations \fItranslations\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget into which the new translations are to be merged. \*(cI +.IP \fItranslations\fP 1i +Specifies the compiled translation table to merge in. +.LP +.eM +The +.PN XtAugmentTranslations +function merges the new translations into the existing widget +translations, ignoring any +.PN #replace , +.PN #augment , +or +.PN #override +directive that may have been specified +in the translation string. The translation table specified by +\fItranslations\fP is not altered by this process. +.PN XtAugmentTranslations +logically appends the string representation of the new translations to +the string representation of the widget's current translations and reparses +the result with no warning messages about duplicate left-hand sides, then +stores the result back into the widget instance; i.e., +if the new translations contain an event or event sequence that +already exists in the widget's translations, +the new translation is ignored. +.sp +.LP +To overwrite existing translations with new translations, use +.PN XtOverrideTranslations . +.LP +.IN "XtOverrideTranslations" "" "@DEF@" +.sM +.FD 0 +void XtOverrideTranslations(\fIw\fP, \fItranslations\fP) +.br + Widget \fIw\fP; +.br + XtTranslations \fItranslations\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget into which the new translations are to be merged. \*(cI +.IP \fItranslations\fP 1i +Specifies the compiled translation table to merge in. +.LP +.eM +The +.PN XtOverrideTranslations +function merges the new translations into the existing widget +translations, ignoring any +.PN #replace , +.PN #augment , +or +.PN #override +directive that may have been +specified in the translation string. The translation table +specified by \fItranslations\fP is not altered by this process. +.PN XtOverrideTranslations +logically appends the string representation of the widget's current +translations to the string representation of the new translations and +reparses the result with no warning messages about duplicate left-hand +sides, then stores the result back into the widget instance; i.e., +if the new translations contain an event or event sequence that +already exists in the widget's translations, +the new translation overrides the widget's translation. +.LP +To replace a widget's translations completely, use +.PN XtSetValues +on the XtNtranslations resource and specify a compiled translation table +as the value. +.sp +.LP +To make it possible for users to easily modify translation tables in their +resource files, +the string-to-translation-table resource type converter +allows the string to specify whether the table should replace, +augment, or override any +existing translation table in the widget. +To specify this, +a pound sign (#) is given as the first character of the table +followed by one of the keywords ``replace'', ``augment'', or +``override'' to indicate +whether to replace, augment, or override the existing table. +The replace or merge +operation is performed during the +Core +instance initialization. +Each merge operation produces a new +translation resource value; if the original tables were shared by +other widgets, they are unaffected. If no directive is +specified, ``#replace'' is assumed. +.LP +At instance initialization +the XtNtranslations resource is first fetched. Then, if it was +not specified or did not contain ``#replace'', the +resource database is searched for the resource XtNbaseTranslations. +If XtNbaseTranslations is found, it is merged into the widget class +translation table. Then the widget \fItranslations\fP field is +merged into the result or into the class translation table if +XtNbaseTranslations was not found. This final table is then +stored into the widget \fItranslations\fP field. If the XtNtranslations +resource specified ``#replace'', no merge is done. +If neither XtNbaseTranslations or XtNtranslations are specified, +the class translation table is copied into the widget instance. +.sp +.LP +To completely remove existing translations, use +.PN XtUninstallTranslations . +.LP +.IN "XtUninstallTranslations" "" "@DEF@" +.sM +.FD 0 +void XtUninstallTranslations(\fIw\fP) +.br + Widget \fIw\fP; +.FN +.IP \fIw\fP 1i +Specifies the widget from which the translations are to be removed. \*(cI +.LP +.eM +The +.PN XtUninstallTranslations +function causes the entire translation table for the widget to be removed. + +.NH 2 +Using Accelerators +.XS +\fB\*(SN Using Accelerators\fP +.XE +.LP +It is often desirable to be able to bind events in one widget to actions in +another. +In particular, +it is often useful to be able to invoke menu actions from the keyboard. +The \*(xI provide a facility, called accelerators, that lets you +accomplish this. +.IN "Accelerator" "" "@DEF@" +An accelerator table is a translation table that is bound with its +actions in the context of a particular widget, the \fIsource\fP widget. +The accelerator table can then be installed on one or more \fIdestination\fP widgets. +When an event sequence in the destination widget would cause an +accelerator action to be taken, and if the source widget is sensitive, +the actions are executed as though triggered by the same event sequence +in the accelerator source +widget. The event is +passed to the action procedure without modification. The action +procedures used within accelerators must not assume that the source +widget is realized nor that any fields of the event are in reference +to the source widget's window if the widget is realized. +.LP +Each widget instance contains that widget's exported accelerator table +as a resource. +Each class of widget exports a method that takes a +displayable string representation of the accelerators +so that widgets can display their current accelerators. +The representation is the accelerator table in canonical +translation table form (see Appendix B). +The display_accelerator procedure pointer is of type +.PN XtStringProc . +.LP +.IN "display_accelerator procedure" "" "@DEF@" +.IN "XtStringProc" "" "@DEF@" +.sM +.FD 0 +typedef void (*XtStringProc)(Widget, String); +.br + Widget \fIw\fP; +.br + String \fIstring\fP; +.FN +.IP \fIw\fP 1i +Specifies the source widget that supplied the accelerators. +.IP \fIstring\fP 1i +Specifies the string representation of the accelerators for this widget. +.LP +.eM +Accelerators can be specified in resource files, +and the string representation is the same as for a translation table. +However, +the interpretation of the +.PN #augment +and +.PN #override +directives applies to +what will happen when the accelerator is installed; +that is, whether or not the accelerator translations will override the +translations in the destination widget. +The default is +.PN #augment , +which means that the accelerator translations have lower priority +than the destination translations. +The +.PN #replace +directive is ignored for accelerator tables. +.sp +.LP +To parse an accelerator table, use +.PN XtParseAcceleratorTable . +.LP +.IN "XtParseAcceleratorTable" "" "@DEF@" +.sM +.FD 0 +XtAccelerators XtParseAcceleratorTable(\fIsource\fP) +.br + String \fIsource\fP; +.FN +.IP \fIsource\fP 1i +Specifies the accelerator table to compile. +.LP +.eM +The +.PN XtParseAcceleratorTable +function compiles the accelerator table into an opaque internal representation. +The client +should set the XtNaccelerators resource of +each widget that is to be activated by these translations +to the returned value. +.sp +.LP +To install accelerators from a widget on another widget, use +.PN XtInstallAccelerators . +.LP +.IN "XtInstallAccelerators" "" "@DEF@" +.sM +.FD 0 +void XtInstallAccelerators(\fIdestination\fP, \fIsource\fP) +.br + Widget \fIdestination\fP; +.br + Widget \fIsource\fP; +.FN +.IP \fIdestination\fP 1i +Specifies the widget on which the accelerators are to be installed. \*(cI +.IP \fIsource\fP 1i +Specifies the widget from which the accelerators are to come. \*(cI +.LP +.eM +The +.PN XtInstallAccelerators +function installs the \fIaccelerators\fP resource value from +\fIsource\fP onto \fIdestination\fP +by merging the source accelerators into the destination translations. +If the source \fIdisplay_accelerator\fP field is non-NULL, +.PN XtInstallAccelerators +calls it with the source widget and a string representation +of the accelerator table, +which indicates that its accelerators have been installed +and that it should display them appropriately. +The string representation of the accelerator table is its +canonical translation table representation. +.sp +.LP +As a convenience for installing all accelerators from a widget and all its +descendants onto one destination, use +.PN XtInstallAllAccelerators . +.LP +.IN "XtInstallAllAccelerators" "" "@DEF@" +.sM +.FD 0 +void XtInstallAllAccelerators(\fIdestination\fP, \fIsource\fP) +.br + Widget \fIdestination\fP; +.br + Widget \fIsource\fP; +.FN +.IP \fIdestination\fP 1i +Specifies the widget on which the accelerators are to be installed. \*(cI +.IP \fIsource\fP 1i +Specifies the root widget of the widget tree +from which the accelerators are to come. \*(cI +.LP +.eM +The +.PN XtInstallAllAccelerators +function recursively descends the widget tree rooted at \fIsource\fP +and installs the accelerators resource value +of each widget encountered onto \fIdestination\fP. +A common use is to call +.PN XtInstallAllAccelerators +and pass the application main window as the source. + +.NH 2 +KeyCode-to-KeySym Conversions +.XS +\*(SN KeyCode-to-KeySym Conversions +.XE +.LP +The translation manager provides support for automatically translating +KeyCodes in incoming key events into KeySyms. +KeyCode-to-KeySym translator procedure pointers are of type +.PN XtKeyProc . +.LP +.IN "XtKeyProc" "" "@DEF@" +.sM +.FD 0 +typedef void (*XtKeyProc)(Display*, KeyCode, Modifiers, Modifiers*, \ +KeySym*); +.br + Display *\fIdisplay\fP; +.br + KeyCode \fIkeycode\fP; +.br + Modifiers \fImodifiers\fP; +.br + Modifiers *\fImodifiers_return\fP; +.br + KeySym *\fIkeysym_return\fP; +.FN +.IP \fIdisplay\fP 1.1i +Specifies the display that the KeyCode is from. +.IP \fIkeycode\fP 1.1i +Specifies the KeyCode to translate. +.IP \fImodifiers\fP 1.1i +Specifies the modifiers to the KeyCode. +.IP \fImodifiers_return\fP 1.1i +Specifies a location in which to store +a mask that indicates the subset of all +modifiers that are examined by the key translator for the specified keycode. +.IP \fIkeysym_return\fP 1.1i +Specifies a location in which to store the resulting KeySym. +.LP +.eM +This procedure takes a KeyCode and modifiers and produces a KeySym. +For any given key translator function and keyboard encoding, +\fImodifiers_return\fP will be a constant per KeyCode that indicates +the subset of all modifiers that are examined by the key translator +for that KeyCode. +.LP +The KeyCode-to-KeySym translator procedure +must be implemented such that multiple calls with the same +\fIdisplay\fP, \fIkeycode\fP, and \fImodifiers\fP return the same +result until either a new case converter, an +.PN XtCaseProc , +is installed or a +.PN MappingNotify +event is received. + +.sp +.LP +The \*(xI maintain tables internally to map KeyCodes to KeySyms +for each open display. Translator procedures and other clients may +share a single copy of this table to perform the same mapping. +.LP +To return a pointer to the KeySym-to-KeyCode mapping table for a +particular display, use +.PN XtGetKeysymTable . +.LP +.IN "XtGetKeysymTable" "" "@DEF@" +.sM +.FD 0 +KeySym *XtGetKeysymTable(\fIdisplay\fP, \fImin_keycode_return\fP, \ +\fIkeysyms_per_keycode_return\fP) +.br + Display *\fIdisplay\fP; +.br + KeyCode *\fImin_keycode_return\fP; +.br + int *\fIkeysyms_per_keycode_return\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the display whose table is required. +.IP \fImin_keycode_return\fP 1i +Returns the minimum KeyCode valid for the display. +.IP \fIkeysyms_per_keycode_return\fP 1i +Returns the number of KeySyms stored for each KeyCode. +.LP +.eM +.PN XtGetKeysymTable +returns a pointer to the \*(xI' copy of the +server's KeyCode-to-KeySym table. This table must not be modified. +There are \fIkeysyms_per_keycode_return\fP KeySyms associated with each +KeyCode, located in the table with indices starting at index +.IP + (test_keycode - min_keycode_return) * keysyms_per_keycode_return +.LP +for KeyCode \fItest_keycode\fP. Any entries that have no KeySyms associated +with them contain the value +.PN NoSymbol . +Clients should not cache the KeySym table but should call +.PN XtGetKeysymTable +each time the value is +needed, as the table may change prior to dispatching each event. +.LP +For more information on this table, see Section 12.7 in \fI\*(xL\fP. +.sp +.LP +To register a key translator, use +.PN XtSetKeyTranslator . +.LP +.IN "XtSetKeyTranslator" "" "@DEF@" +.sM +.FD 0 +void XtSetKeyTranslator(\fIdisplay\fP, \fIproc\fP) +.br + Display *\fIdisplay\fP; +.br + XtKeyProc \fIproc\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the display from which to translate the events. +.IP \fIproc\fP 1i +Specifies the procedure to perform key translations. +.LP +.eM +The +.PN XtSetKeyTranslator +function sets the specified procedure as the current key translator. +The default translator is +.PN XtTranslateKey , +an +.PN XtKeyProc +that uses the Shift, Lock, numlock, and group modifiers +with the interpretations defined in \fI\*(xP\fP, Section 5. +It is provided so that new translators can call it to get default +KeyCode-to-KeySym translations and so that the default translator +can be reinstalled. +.sp +.LP +To invoke the currently registered KeyCode-to-KeySym translator, +use +.PN XtTranslateKeycode . +.LP +.IN "XtTranslateKeycode" "" "@DEF@" +.sM +.FD 0 +void XtTranslateKeycode(\fIdisplay\fP, \fIkeycode\fP, \fImodifiers\fP, \ +\fImodifiers_return\fP, \fIkeysym_return\fP) +.br + Display *\fIdisplay\fP; +.br + KeyCode \fIkeycode\fP; +.br + Modifiers \fImodifiers\fP; +.br + Modifiers *\fImodifiers_return\fP; +.br + KeySym *\fIkeysym_return\fP; +.FN +.IP \fIdisplay\fP 1.1i +Specifies the display that the KeyCode is from. +.IP \fIkeycode\fP 1.1i +Specifies the KeyCode to translate. +.IP \fImodifiers\fP 1.1i +Specifies the modifiers to the KeyCode. +.IP \fImodifiers_return\fP 1.1i +Returns a mask that indicates the modifiers actually used +to generate the KeySym. +.IP \fIkeysym_return\fP 1.1i +Returns the resulting KeySym. +.LP +.eM +The +.PN XtTranslateKeycode +function passes the specified arguments +directly to the currently registered KeyCode-to-KeySym translator. +.sp +.LP +To handle capitalization of nonstandard KeySyms, the \*(xI allow +clients to register case conversion routines. +Case converter procedure pointers are of type +.PN XtCaseProc . +.LP +.IN "XtCaseProc" "" "@DEF@" +.sM +.FD 0 +typedef void (*XtCaseProc)(Display*, KeySym, KeySym*, KeySym*); +.br + Display *\fIdisplay\fP; +.br + KeySym \fIkeysym\fP; +.br + KeySym *\fIlower_return\fP; +.br + KeySym *\fIupper_return\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the display connection for which the conversion is required. +.IP \fIkeysym\fP 1i +Specifies the KeySym to convert. +.IP \fIlower_return\fP 1i +Specifies a location into which to store the lowercase equivalent for +the KeySym. +.IP \fIupper_return\fP 1i +Specifies a location into which to store the uppercase equivalent for +the KeySym. +.LP +.eM +If there is no case distinction, +this procedure should store the KeySym into both return values. +.sp +.LP +To register a case converter, use +.PN XtRegisterCaseConverter . +.LP +.IN "XtRegisterCaseConverter" "" "@DEF@" +.sM +.FD 0 +void XtRegisterCaseConverter(\fIdisplay\fP, \fIproc\fP, \fIstart\fP, \fIstop\fP) +.br + Display *\fIdisplay\fP; +.br + XtCaseProc \fIproc\fP; +.br + KeySym \fIstart\fP; +.br + KeySym \fIstop\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the display from which the key events are to come. +.IP \fIproc\fP 1i +Specifies the +.PN XtCaseProc +to do the conversions. +.IP \fIstart\fP 1i +Specifies the first KeySym for which this converter is valid. +.IP \fIstop\fP 1i +Specifies the last KeySym for which this converter is valid. +.LP +.eM +The +.PN XtRegisterCaseConverter +registers the specified case converter. +The \fIstart\fP and \fIstop\fP arguments provide the inclusive range of KeySyms +for which this converter is to be called. +The new converter overrides any previous converters for KeySyms in that range. +No interface exists to remove converters; +you need to register an identity converter. +When a new converter is registered, +the \*(xI refresh the keyboard state if necessary. +The default converter understands case conversion for all +Latin KeySyms defined in \fI\*(xP\fP, Appendix A. +.sp +.LP +To determine uppercase and lowercase equivalents for a KeySym, use +.PN XtConvertCase . +.LP +.IN "XtConvertCase" "" "@DEF@" +.sM +.FD 0 +void XtConvertCase(\fIdisplay\fP, \fIkeysym\fP, \fIlower_return\fP, \ +\fIupper_return\fP) +.br + Display *\fIdisplay\fP; +.br + KeySym \fIkeysym\fP; +.br + KeySym *\fIlower_return\fP; +.br + KeySym *\fIupper_return\fP; +.FN +.IP \fIdisplay\fP 1i +Specifies the display that the KeySym came from. +.IP \fIkeysym\fP 1i +Specifies the KeySym to convert. +.IP \fIlower_return\fP 1i +Returns the lowercase equivalent of the KeySym. +.IP \fIupper_return\fP 1i +Returns the uppercase equivalent of the KeySym. +.LP +.eM +The +.PN XtConvertCase +function calls the appropriate converter and returns the results. +A user-supplied +.PN XtKeyProc +may need to use this function. + +.NH 2 +Obtaining a KeySym in an Action Procedure +.XS +\fB\*(SN Obtaining a KeySym in an Action Procedure\fP +.XE +.LP +When an action procedure is invoked on a +.PN KeyPress +or +.PN KeyRelease +event, it often has a need to retrieve the KeySym and modifiers +corresponding to the event that caused it to be invoked. In order to +avoid repeating the processing that was just performed by the +\*(xI to match the translation entry, the KeySym and modifiers +are stored for the duration of the action procedure and are made +available to the client. +.LP +To retrieve the KeySym and modifiers that matched the final event +specification in the translation table entry, use +.PN XtGetActionKeysym . +.LP +.IN "XtGetActionKeysym" "" "@DEF@" +.sM +.FD 0 +KeySym XtGetActionKeysym(\fIevent\fP, \fImodifiers_return\fP) +.br + XEvent *\fIevent\fP; +.br + Modifiers *\fImodifiers_return\fP; +.FN +.IP \fIevent\fP 1.25i +Specifies the event pointer passed to the action procedure by the \*(xI. +.IP \fImodifiers_return\fP 1.25i +Returns the modifiers that caused the match, if non-NULL. +.LP +.eM +If +.PN XtGetActionKeysym +is called after an action procedure has been +invoked by the \*(xI and before that action procedure returns, and +if the event pointer has the same value as the event pointer passed to +that action routine, and if the event is a +.PN KeyPress +or +.PN KeyRelease +event, then +.PN XtGetActionKeysym +returns the KeySym that matched the final +event specification in the translation table and, if \fImodifiers_return\fP +is non-NULL, the modifier state actually used to generate this KeySym; +otherwise, if the event is a +.PN KeyPress +or +.PN KeyRelease +event, then +.PN XtGetActionKeysym +calls +.PN XtTranslateKeycode +and returns the results; +else it returns +.PN NoSymbol +and does not examine \fImodifiers_return\fP. +.LP +Note that if an action procedure invoked by the \*(xI +invokes a subsequent action procedure (and so on) via +.PN XtCallActionProc , +the nested action procedure may also call +.PN XtGetActionKeysym +to retrieve the \*(xI' KeySym and modifiers. + +.NH 2 +KeySym-to-KeyCode Conversions +.XS +\*(SN KeySym-to-KeyCode Conversions +.XE +.LP +To return the list of KeyCodes that map to a particular KeySym in +the keyboard mapping table maintained by the \*(xI, use +.PN XtKeysymToKeycodeList . +.LP +.IN "XtKeysymToKeycodeList" "" "@DEF@" +.sM +.FD 0 +void XtKeysymToKeycodeList(\fIdisplay\fP, \fIkeysym\fP, \fIkeycodes_return\fP, \ +\fIkeycount_return\fP) +.br + Display *\fIdisplay\fP; +.br + KeySym \fIkeysym\fP; +.br + KeyCode **\fIkeycodes_return\fP; +.br + Cardinal *\fIkeycount_return\fP; +.FN +.IP \fIdisplay\fP 1.25i +Specifies the display whose table is required. +.IP \fIkeysym\fP 1.25i +Specifies the KeySym for which to search. +.IP \fIkeycodes_return\fP 1.25i +Returns a list of KeyCodes that have \fIkeysym\fP +associated with them, or NULL if \fIkeycount_return\fP is 0. +.IP \fIkeycount_return\fP 1.25i +Returns the number of KeyCodes in the keycode list. +.LP +.eM +The +.PN XtKeysymToKeycodeList +procedure returns all the KeyCodes that have \fIkeysym\fP +in their entry for the keyboard mapping table associated with \fIdisplay\fP. +For each entry in the +table, the first four KeySyms (groups 1 and 2) are interpreted as +specified by \fI\*(xP\fP, Section 5. If no KeyCodes map to the +specified KeySym, \fIkeycount_return\fP is zero and *\fIkeycodes_return\fP is NULL. +.LP +The caller should free the storage pointed to by \fIkeycodes_return\fP using +.PN XtFree +when it is no longer useful. If the caller needs to examine +the KeyCode-to-KeySym table for a particular KeyCode, it should call +.PN XtGetKeysymTable . + +.NH 2 +Registering Button and Key Grabs for Actions +.XS +\fB\*(SN Registering Button and Key Grabs for Actions\fP +.XE +.LP +To register button and key grabs for a widget's window according to the +event bindings in the widget's translation table, use +.PN XtRegisterGrabAction . +.LP +.IN "XtRegisterGrabAction" "" "@DEF@" +.sM +.FD 0 +void XtRegisterGrabAction(\fIaction_proc\fP, \fIowner_events\fP, \ +\fIevent_mask\fP, \fIpointer_mode\fP, \fIkeyboard_mode\fP) +.br + XtActionProc \fIaction_proc\fP; +.br + Boolean \fIowner_events\fP; +.br + unsigned int \fIevent_mask\fP; +.br + int \fIpointer_mode\fP, \fIkeyboard_mode\fP; +.FN +.IP \fIaction_proc\fP 1i +Specifies the action procedure to search for in translation tables. +.sp +.IP \fIowner_events\fP +.br +.ns +.IP \fIevent_mask\fP +.br +.ns +.IP \fIpointer_mode\fP +.br +.ns +.IP \fIkeyboard_mode\fP 1i +Specify arguments to +.PN XtGrabButton +or +.PN XtGrabKey . +.LP +.eM +.PN XtRegisterGrabAction +adds the specified \fIaction_proc\fP to a list known to +the translation manager. When a widget is realized, or when the +translations of a realized widget or the accelerators installed on a +realized widget are modified, its translation table and any installed +accelerators are scanned for action procedures on this list. +If any are invoked on +.PN ButtonPress +or +.PN KeyPress +events as the only or final event +in a sequence, the \*(xI will call +.PN XtGrabButton +or +.PN XtGrabKey +for the widget with every button or KeyCode which maps to the +event detail field, passing the specified \fIowner_events\fP, \fIevent_mask\fP, +\fIpointer_mode\fP, and \fIkeyboard_mode\fP. For +.PN ButtonPress +events, the modifiers +specified in the grab are determined directly from the translation +specification and \fIconfine_to\fP and \fIcursor\fP are specified as +.PN None . +For +.PN KeyPress +events, if the translation table entry specifies colon (:) in +the modifier list, the modifiers are determined by calling the key +translator procedure registered for the display and calling +.PN XtGrabKey +for every combination of standard modifiers which map the KeyCode to +the specified event detail KeySym, and ORing any modifiers specified in +the translation table entry, and \fIevent_mask\fP is ignored. If the +translation table entry does not specify colon in the modifier list, +the modifiers specified in the grab are those specified in the +translation table entry only. For both +.PN ButtonPress +and +.PN KeyPress +events, don't-care modifiers are ignored unless the translation entry +explicitly specifies ``Any'' in the \fImodifiers\fP field. +.LP +If the specified \fIaction_proc\fP is already registered for the calling +process, the new values will replace the previously specified values +for any widgets that become realized following the call, but existing +grabs are not altered on currently realized widgets. +.LP +When translations or installed accelerators are modified for a +realized widget, any previous key or button grabs registered +as a result of the old bindings are released if they do not appear in +the new bindings and are not explicitly grabbed by the client with +.PN XtGrabKey +or +.PN XtGrabButton . + +.NH 2 +Invoking Actions Directly +.XS +\fB\*(SN Invoking Actions Directly\fP +.XE +.LP +Normally action procedures are invoked by the \*(xI when an +event or event sequence arrives for a widget. To +invoke an action procedure directly, without generating +(or synthesizing) events, use +.PN XtCallActionProc . +.LP +.IN "XtCallActionProc" "" "@DEF@" +.sM +.FD 0 +void XtCallActionProc(\fIwidget\fP, \fIaction\fP, \fIevent\fP, \fIparams\fP, \ +\fInum_params\fP) +.br + Widget \fIwidget\fP; +.br + String \fIaction\fP; +.br + XEvent *\fIevent\fP; +.br + String *\fIparams\fP; +.br + Cardinal \fInum_params\fP; +.FN +.IP \fIwidget\fP 1i +Specifies the widget in which the action is to be invoked. \*(cI +.IP \fIaction\fP 1i +Specifies the name of the action routine. +.IP \fIevent\fP 1i +Specifies the contents of the \fIevent\fP passed to the action routine. +.IP \fIparams\fP 1i +Specifies the contents of the \fIparams\fP passed to the action routine. +.IP \fInum_params\fP 1i +Specifies the number of entries in \fIparams\fP. +.LP +.eM +.PN XtCallActionProc +searches for the named action routine in the same +manner and order as translation tables are bound, as described in +Section 10.1.2, except that application action tables are searched, if +necessary, as of the time of the call to +.PN XtCallActionProc . +If found, +the action routine is invoked with the specified widget, event pointer, +and parameters. It is the responsibility of the caller to ensure that +the contents of the \fIevent\fP, \fIparams\fP, and \fInum_params\fP arguments are +appropriate for the specified action routine and, if necessary, that +the specified widget is realized or sensitive. If the named action +routine cannot be found, +.PN XtCallActionProc +generates a warning message and returns. + +.NH 2 +Obtaining a Widget's Action List +.XS +\*(SN Obtaining a Widget's Action List +.XE +.LP +Occasionally a subclass will require the pointers to one or more of +its superclass's action procedures. This would be needed, for +example, in order to envelop the superclass's action. To retrieve +the list of action procedures registered in the superclass's +\fIactions\fP field, use +.PN XtGetActionList . +.LP +.IN "XtGetActionList" "" "@DEF@" +.sM +.FD 0 +void XtGetActionList(\fIwidget_class\fP, \fIactions_return\fP, \ +\fInum_actions_return\fP) +.br + WidgetClass \fIwidget_class\fP; +.br + XtActionList *\fIactions_return\fP; +.br + Cardinal *\fInum_actions_return\fP; +.FN +.IP \fIwidget_class\fP 1.5i +Specifies the widget class whose actions are to be returned. +.IP \fIactions_return\fP 1.5i +Returns the action list. +.IP \fInum_actions_return\fP 1.5i +Returns the number of action procedures declared by the class. +.LP +.eM +.PN XtGetActionList +returns the action table defined by the specified +widget class. This table does not include actions defined by the +superclasses. If \fIwidget_class\fP is not initialized, or is not +.PN coreWidgetClass +or a subclass thereof, or if the class does not define any actions, +*\fIactions_return\fP will be NULL and *\fInum_actions_return\fP +will be zero. +If *\fIactions_return\fP is non-NULL the client is responsible for freeing +the table using +.PN XtFree +when it is no longer needed. +.bp |