XmProcessTraversal — A function that determines
which component receives keyboard events when a widget has the focus
"XmProcessTraversal"
#include <Xm/Xm.h>
Boolean XmProcessTraversal(
Widget widget,
XmTraversalDirection direction);
XmProcessTraversal determines which component of a
hierarchy receives keyboard events when the hierarchy that contains the
given widget has keyboard focus.
XmProcessTraversal changes focus only when the keyboard
focus policy of the widget hierarchy is explicit. If the
XmNkeyboardFocusPolicy of the nearest shell ancestor of the given
widget is not XmEXPLICIT, XmProcessTraversal returns False
without making any focus changes.
- widget
- Specifies the widget ID of the widget whose hierarchy is to be
traversed
- direction
- Specifies the direction of traversal
In order to be eligible to receive keyboard focus when the shell's
XmNkeyboardFocusPolicy is XmEXPLICIT, a widget or gadget must
meet the following conditions:
- •
- The widget and its ancestors are not in the process of being
destroyed.
- •
- The widget and its ancestors are sensitive. A widget is sensitive
when its XmNsensitive and XmNancestorSensitive resources are
both True.
- •
- The XmNtraversalOn resource for the widget and its ancestors is
True.
- •
- The widget is viewable. This means that the widget and its ancestors are
managed, realized, and (except for gadgets) mapped. Furthermore, in
general, some part of the widget's rectangular area must be unobscured by
the widget's ancestors. If an application unmaps a widget that has its
XmNmappedWhenManaged resource set to True, the result is
undefined.
-
- In a ScrolledWindow with an XmNscrollingPolicy of
XmAUTOMATIC, a widget that is obscured because it is not within the
clip window may be able to receive focus if some part of the widget is
within the work area and if an XmNtraverseObscuredCallback routine
can make the widget at least partially visible by scrolling the
window.
In general only primitives, gadgets, and Drawing Area are eligible
to receive focus. Most managers cannot receive focus even if they meet all
these conditions.
The direction argument identifies the kind of traversal
action to take. The descriptions of these actions below refer to traversable
non-tab-group widgets and traversable tab groups.
- •
- A traversable non-tab-group widget is a widget that is not a tab group and
that meets all the conditions for receiving focus described above.
- •
- A traversable tab group widget is a tab group widget that meets the same
conditions, except that a manager that is a tab group and meets the other
conditions is also eligible for traversal as long as it contains a
descendant that can receive focus.
A tab group is a widget whose XmNnavigationType is:
- •
- XmTAB_GROUP or XmSTICKY_TAB_GROUP, if the hierarchy (up to
the nearest shell ancestor) that contains the widget has no widget whose
XmNnavigationType is XmEXCLUSIVE_TAB_GROUP
- •
- XmEXCLUSIVE_TAB_GROUP or XmSTICKY_TAB_GROUP, if the
hierarchy (up to the nearest shell ancestor) that contains the widget has
any widget whose XmNnavigationType is
XmEXCLUSIVE_TAB_GROUP
The hierarchy to be traversed is that containing the widget
argument. This hierarchy is traversed only up to the nearest shell;
XmProcessTraversal does not move focus from one shell to another. If
the shell containing widget does not currently have the focus, any
change that XmProcessTraversal makes to the element with focus within
that shell does not take effect until the next time the shell receives
focus.
XmProcessTraversal begins the traversal action from the
widget in the hierarchy that currently has keyboard focus or that last had
focus when the user traversed away from the shell hierarchy.
The value of the direction argument determines which of
three kinds of traversal action to take:
- •
- Traversal to a non-tab-group widget. This kind of traversal is possible
only when the widget that currently has focus is not a tab group;
otherwise, XmProcessTraversal returns False for these actions.
-
- These actions do not move focus from one tab group to another. The actions
first determine the containing tab group. This is the tab group containing
the widget that currently has focus. The actions traverse only to a
non-tab-group widget within the containing tab group.
-
- A non-tab-group widget is eligible for this kind of traversal if the
widget is traversable and has no tab group ancestors up to the containing
tab group. If the tab group contains no traversable non-tab-group widgets,
XmProcessTraversal returns False.
-
- Following are the possible values of the direction argument. Note
that when actions wrap, wrapping occurs in the traversal direction. The
following describes what happens in a left to right environment:
- •
- XmTRAVERSE_RIGHT—If the XmNnavigationType of the
containing tab group is not XmEXCLUSIVE_TAB_GROUP, focus moves to
the next traversable non-tab-group widget to the right of the widget that
currently has focus. In a left to right environment, at the right side of
the tab group this action wraps to the non-tab-group widget at the left
side and next toward the bottom. At the rightmost widget in the bottom row
of the tab group this action wraps to the non-tab-group widget at the
leftmost widget in the upper row.
-
- In a right to left environment, at the right side of the tab group, this
action wraps to the non-tab-group widget at the left side and next toward
the top. At the rightmost widget in the upper row of the tab group this
action wraps to the non-tab-group widget at the leftmost widget in the
bottom row.
-
- If the XmNnavigationType of the containing tab group is
XmEXCLUSIVE_TAB_GROUP, focus moves to the next traversable
non-tab-group widget in the tab group, proceeding in the order in which
the widgets appear in their parents' XmNchildren lists. After the
last widget in the tab group, this action wraps to the first non-tab-group
widget.
- •
- XmTRAVERSE_LEFT—If the XmNnavigationType of the
containing tab group is not XmEXCLUSIVE_TAB_GROUP, focus moves to
the next traversable non-tab-group widget to the left of the widget that
currently has focus. In a left to right environment, at the left side of
the tab group this action wraps to the non-tab-group widget at the right
side and next toward the top. At the leftmost widget in the upper row of
the tab group this action wraps to the non-tab-group widget at the
rightmost widget in the bottom row.
-
- In a right to left environment, at the left side of the tab group this
action wraps to the non-tab-group widget at the right side and next toward
the bottom. At the leftmost widget in the bottom row of the tab group this
action wraps to the non-tab-group widget at the rightmost widget in the
upper row.
-
- If the XmNnavigationType of the containing tab group is
XmEXCLUSIVE_TAB_GROUP, focus moves to the previous traversable
non-tab-group widget in the tab group, proceeding in the reverse order in
which the widgets appear in their parents' XmNchildren lists. After
the first widget in the tab group, this action wraps to the last
non-tab-group widget.
- •
- XmTRAVERSE_DOWN—If the XmNnavigationType of the
containing tab group is not XmEXCLUSIVE_TAB_GROUP, focus moves to
the next traversable non-tab-group widget below the widget that currently
has focus. In a left to right environment, at the bottom of the tab group
this action wraps to the non-tab-group widget at the top and next toward
the right. At the bottom widget in the rightmost column of the tab group
this action wraps to the non-tab-group widget at the top widget in the
leftmost column.
-
- In a right to left environment, at the bottom of the tab group this action
wraps to the non-tab-group widget at the top and next toward the left. At
the bottom widget of the leftmost widget of the tab group this action
wraps to the non-tab-group widget at the top widget of the rightmost
column.
-
- If the XmNnavigationType of the containing tab group is
XmEXCLUSIVE_TAB_GROUP, focus moves to the next traversable
non-tab-group widget in the tab group, proceeding in the order in which
the widgets appear in their parents' XmNchildren lists. After the
last widget in the tab group, this action wraps to the first non-tab-group
widget.
- •
- XmTRAVERSE_UP—If the XmNnavigationType of the
containing tab group is not XmEXCLUSIVE_TAB_GROUP, focus moves to
the next traversable non-tab-group widget above the widget that currently
has focus. In a left to right environment, at the top of the tab group
this action wraps to the non-tab-group widget at the bottom and next
toward the left. At the top widget of the leftmost column of the tab group
this action wraps to the non-tab-group widget at the bottom widget of the
rightmost column.
-
- In a right to left environment, at the top of the tab group this action
wraps to the non-tab-group widget at the bottom and next toward the right.
At the top widget of the right most column of the tab group this action
wraps to the non-tab-group widget at the bottom widget of the leftmost
column.
-
- If the XmNnavigationType of the containing tab group is
XmEXCLUSIVE_TAB_GROUP, focus moves to the previous traversable
non-tab-group widget in the tab group, proceeding in the reverse order in
which the widgets appear in their parents' XmNchildren lists. After
the first widget in the tab group, this action wraps to the last
non-tab-group widget.
- •
- XmTRAVERSE_NEXT—Focus moves to the next traversable
non-tab-group widget in the tab group, proceeding in the order in which
the widgets appear in their parents' XmNchildren lists. After the
last widget in the tab group, this action wraps to the first non-tab-group
widget.
- •
- XmTRAVERSE_PREV—Focus moves to the previous traversable
non-tab-group widget in the tab group, proceeding in the reverse order in
which the widgets appear in their parents' XmNchildren lists. After
the first widget in the tab group, this action wraps to the last
non-tab-group widget.
- •
- XmTRAVERSE_HOME—If the XmNnavigationType of the
containing tab group is not XmEXCLUSIVE_TAB_GROUP, focus moves to
the first traversable non-tab-group widget at the initial focus of the tab
group.
-
- If the XmNnavigationType of the containing tab group is
XmEXCLUSIVE_TAB_GROUP, focus moves to the first traversable
non-tab-group widget in the tab group, according to the order in which the
widgets appear in their parents' XmNchildren lists.
- •
- Traversal to a tab group. These actions first determine the current widget
hierarchy and the containing tab group. The current widget hierarchy is
the widget hierarchy whose root is the nearest shell ancestor of the
widget that currently has focus. The containing tab group is is the tab
group containing the widget that currently has focus. If the current
widget hierarchy contains no traversable tab groups,
XmProcessTraversal returns False.
-
- Following are the possible values of the direction argument. If any
tab group in the current widget hierarchy has an XmNnavigationType
of XmEXCLUSIVE_TAB_GROUP, traversal of tab groups in the hierarchy
proceeds to widgets in the order in which their XmNnavigationType
resources were specified as XmEXCLUSIVE_TAB_GROUP or
XmSTICKY_TAB_GROUP.:
- •
- XmTRAVERSE_NEXT_TAB_GROUP—Finds the hierarchy that contains
widget, finds the active tab group (if any), and makes the next tab
group the active tab group in the hierarchy.
- •
- XmTRAVERSE_PREV_TAB_GROUP—Finds the hierarchy that contains
widget, finds the active tab group (if any), and makes the previous
tab group the active tab group in the hierarchy.
- •
- Traversal to any widget. In this case the widget argument is the
widget to which XmProcessTraversal tries to give focus. If the
widget is not traversable, XmProcessTraversal returns False.
-
- Following are the possible values of the direction argument:
- •
- XmTRAVERSE_CURRENT—Finds the hierarchy and the tab group
that contain widget. If this tab group is not the active tab group,
this action makes it the active tab group. If widget is an item in
the active tab group, this action makes it the active item. If
widget is the active tab group, this action makes the first
traversable item in the tab group the active item.
Using XmProcessTraversal to traverse to MenuBars, Pulldown
menu panes, or Popup menu panes is not supported.
XmProcessTraversal cannot be called recursively. In
particular, an application cannot call this routine from an
XmNfocusCallback or XmNlosingFocusCallback procedure.
Returns True if the traversal action succeeded. Returns False if
the XmNkeyboardFocusPolicy of the nearest shell ancestor of
widget is not XmEXPLICIT, if the traversal action finds no
traversable widget to receive focus, or if the call to the routine has
invalid arguments.