(3)

NAME
XfwfMenuBar

DESCRIPTION
The MenuBar widget is a special kind of RowCol widget. It assumes that all its children are PullDown buttons or other widgets that pop up a menu. (But nothing will break if they are not.) By default, the children are arranged in a row, wrapping to the next row if the width is not enough for all of them. But other arrangements are possible, see the resources of the XfwfRowCol(3) widget. The MenuBar attaches itself to the popup callback of the menu shell that is popped up by the children, and inserts itself in the list of pointer grabs that Xt maintains. This is necessary to be able to drag the mouse from one menu into another, popping down the first one and popping up the second. If you use a RowCol widget instead of a MenuBar, you will find that switching from one menu to the next involves releasing the mouse and then pressing it again. To find the menu shell, the children are asked for their popup resource. PullDown buttons have this resource, others may not. The MenuBar widget introduces no new resources.

  Public variables
XfwfMenuBar
Name | Class | Type | Default

XtNframeType
     frameType = XfwfRaised

XtNtraversalOn
     traversalOn = False
    XfwfRowCol
    Name | Class | Type | Default
    XtNstoreByRow | XtCStoreByRow | Boolean | True
    XtNrows | XtCRows | Int | 0
    XtNcolumns | XtCColumns | Int | 0
    XtNalignment | XtCAlignment | Alignment | XfwfTopLeft
    XtNshrinkToFit | XtCShrinkToFit | Boolean | False
    XfwfBoard
    Name | Class | Type | Default
    XtNabs_x | XtCAbs_x | Position | 0
    XtNrel_x | XtCRel_x | Float | "0.0"
    XtNabs_y | XtCAbs_y | Position | 0
    XtNrel_y | XtCRel_y | Float | "0.0"
    XtNabs_width | XtCAbs_width | Position | 0
    XtNrel_width | XtCRel_width | Float | "1.0"
    XtNabs_height | XtCAbs_height | Position | 0
    XtNrel_height | XtCRel_height | Float | "1.0"
    XtNhunit | XtCHunit | Float | "1.0"
    XtNvunit | XtCVunit | Float | "1.0"
    XtNlocation | XtCLocation | String | NULL
    XfwfFrame
    Name | Class | Type | Default
    XtNcursor | XtCCursor | Cursor | None
    XtNframeType | XtCFrameType | FrameType | XfwfRaised
    XtNframeWidth | XtCFrameWidth | Dimension | 0
    XtNouterOffset | XtCOuterOffset | Dimension | 0
    XtNinnerOffset | XtCInnerOffset | Dimension | 0
    XtNshadowScheme | XtCShadowScheme | ShadowScheme | XfwfAuto
    XtNtopShadowColor | XtCTopShadowColor | Pixel | compute_topcolor
    XtNbottomShadowColor | XtCBottomShadowColor | Pixel | compute_bottomcolor
    XtNtopShadowStipple | XtCTopShadowStipple | Bitmap | NULL
    XtNbottomShadowStipple | XtCBottomShadowStipple | Bitmap | NULL
    XfwfCommon
    Name | Class | Type | Default
    XtNtraversalOn | XtCTraversalOn | Boolean | True
    XtNhighlightThickness | XtCHighlightThickness | Dimension | 2
    XtNhighlightColor | XtCHighlightColor | Pixel | XtDefaultForeground
    XtNhighlightPixmap | XtCHighlightPixmap | Pixmap | None
    XtNnextTop | XtCNextTop | Callback | NULL
    XtNuserData | XtCUserData | Pointer | NULL
    Composite
    Name | Class | Type | Default
    XtNchildren | XtCChildren | WidgetList | NULL
    insertPosition | XtCInsertPosition | XTOrderProc | NULL
    numChildren | XtCNumChildren | Cardinal | 0
    Core
    Name | Class | Type | Default
    XtNx | XtCX | Position | 0
    XtNy | XtCY | Position | 0
    XtNwidth | XtCWidth | Dimension | 0
    XtNheight | XtCHeight | Dimension | 0
    borderWidth | XtCBorderWidth | Dimension | 0
    XtNcolormap | XtCColormap | Colormap | NULL
    XtNdepth | XtCDepth | Int | 0
    destroyCallback | XtCDestroyCallback | XTCallbackList | NULL
    XtNsensitive | XtCSensitive | Boolean | True
    XtNtm | XtCTm | XTTMRec | NULL
    ancestorSensitive | XtCAncestorSensitive | Boolean | False
    accelerators | XtCAccelerators | XTTranslations | NULL
    borderColor | XtCBorderColor | Pixel | 0
    borderPixmap | XtCBorderPixmap | Pixmap | NULL
    background | XtCBackground | Pixel | 0
    backgroundPixmap | XtCBackgroundPixmap | Pixmap | NULL
    mappedWhenManaged | XtCMappedWhenManaged | Boolean | True
    XtNscreen | XtCScreen | Screen * | NULL

  Exports
The MenuBar widget has a method process_menu that can be used by children (usually PullDown buttons) to pop up a menu and to register it with the menu bar. If they do so, the menu bar is able to process events elsewhere in the menu bar and pop down the menu in favour of another one, when the user moves the mouse to another button in the menu bar. A menu or a button is unable to do this by itself, since they do not know what other menus are present. To call the process_menu method, widgets should use the XfwfCallProcessMenu function, which will check that the receiver of the call is indeed a MenuBar widget. It returns True if the process_menu method could be called, otherwise False. The value for cursor can also be None, in which case the cursor from the menu's parent (the root window, usually) will be used instead.
Boolean  XfwfCallProcessMenu( $, Widget  menu, Cursor  cursor)
{
    if (XtIsSubclass($, xfwfMenuBarWidgetClass) $process_menu) {
    $process_menu($, menu, cursor);
    return True;
    } else
    return False; }

  Translations
Since the MenuBar widget adds itself to the list of cascaded popups that is maintained by Xt, it will receive pointer events when a menu is popped up. If the event is a button release, the current menu will have to be popped down.

<Btn1Up>: menu_popdown()

  Actions

menu_popdown
    The menu_popdown action calls XtPopdown for the current menu, if there is one.
    void menu_popdown($, XEvent* event, String* params, Cardinal* num_params)
    {
        if ($current_menu != NULL) {
    	XtPopdown($current_menu);
    	$current_menu = NULL;
        }
    }

Importss
incl
 <Xfwf/PullDown.h>
incl
 <X11/Shell.h>
incl
 <stdio.h>

  Private variables
A pointer to the currently popped up menu is kept in a private variable current_menu. The variable is set in the process_menu method.

Widget  current_menu

  Methods
initialize(Widget  request, $, ArgList  args, Cardinal * num_args)
{
    $current_menu = NULL;
}
The process_menu method is provided for use by children (usually PullDown buttons) to pop up their menus. If they call this method instead of popping up the menu themselves, the menu bar has a chance to intercept events for other buttons in the menu bar and pop down the menu when the user clicks on another button in the menubar. The method adds the appropriate (passive) global grabs, establishes an Xt local grab and adds a callback to the menu, so that the menu bar will be informed when the menu is popped down again.
process_menu($, Widget  menu, Cursor  cursor)
{
    if (menu == $current_menu) return;
    if ($current_menu) XtPopdown($current_menu);
    XtAddGrab($, True, False);
/*
    XtGrabButton(menu, AnyButton, AnyModifier, True, ButtonPressMask |
		 ButtonReleaseMask | EnterWindowMask | LeaveWindowMask
		 | PointerMotionMask, GrabModeAsync, GrabModeAsync,
		 None, cursor);
    XtGrabKey(menu, AnyKey, AnyModifier, True, GrabModeAsync,
	      GrabModeAsync);
*/
    XtAddCallback(menu, XtNpopdownCallback, popdown_cb, $);
    $current_menu = menu;
    XtPopup(menu, XtGrabNonexclusive);
}

Utilities
The popdown_cb routine is a callback that is attached to the currently popped up menu. When the menu pops down, the routine removes the grabs and resets current_menu to NULL.
popdown_cb(Widget  menu, XtPointer  client_data, XtPointer  call_data)
{
    Widget $ = (Widget) client_data;
    XtRemoveCallback(menu, XtNpopdownCallback, popdown_cb, $);
/*
    XtUngrabKey(menu, AnyKey, AnyModifier);
    XtUngrabButton(menu, AnyButton, AnyModifier);
    XtRemoveGrab($);
*/
    $current_menu = NULL;
}