Parent document is top of "Motif FAQ (Part 6 of 9)"
Previous document is "183) Should I have a cascade button without a submenu in a pulldown"
Next document is "185) How do popup menus work?"
184) What is the best way to create popup menus?
[Last modified: August 92]
Susan Murdock Thompson (from OSF): In general, create a popupMenu as the
child from which you will be posting it from (ie: if you have a bulletinBoard
with a PushButton in it and want MB2 on the pushButton to post the popupMenu,
create the popupMenu as a child of the pushButton). [This parent-child
relationship seems to make a big difference in the behavior of the popups.]
Add an event handler to handle buttonPress events. You'll need to check for
the correct button (what you've specified menuPost to be) before posting the
menu.
To create a popup that can be accessible from within an entire client window,
create it as the child of the top-most widget (but not the shell) and add
event handlers for the top-most widget and children widgets.
ie:
{
....
XtManageChild(rc=XmCreateRowColumn(Shell1, "rc", NULL, 0));
XtManageChild(label = XmCreateLabel(rc, "label", NULL, 0));
XtManageChild(text = XmCreateText(rc, "text", NULL, 0));
XtManageChild(pushbutton = XmCreatePushButton(rc, "pushbutton", NULL, 0));
n = 0;
XtSetArg(args[n], XmNmenuPost, "<Btn3Down>"); n++;
popup = XmCreatePopupMenu(rc, "popup", args, n);
XtAddEventHandler(rc, ButtonPressMask, False, PostMenu3, popup);
XtAddEventHandler(text, ButtonPressMask, False, PostMenu3, popup);
XtAddEventHandler(label, ButtonPressMask, False, PostMenu3, popup);
XtAddEventHandler(pushbutton, ButtonPressMask, False, PostMenu3, popup);
XtManageChild(m1 = XmCreatePushButton(popup, "m1", NULL, 0));
XtManageChild(m2 = XmCreatePushButton(popup, "m2", NULL, 0));
XtManageChild(m3 = XmCreatePushButton(popup, "m3", NULL, 0));
XtAddCallback(m1, XmNactivateCallback, SayCB, "button M1");
XtAddCallback(m2, XmNactivateCallback, SayCB, "button M2");
XtAddCallback(m3, XmNactivateCallback, SayCB, "button M3");
...
}
/* where PostMenu3 is ... */
PostMenu3 (w, popup, event)
Widget w;
Widget popup;
XButtonEvent * event;
{
printf("menuPost = 3, button %d\n", event->button);
if (event->button != Button3)
return;
XmMenuPosition(popup, event);
XtManageChild(popup);
}
Parent document is top of "Motif FAQ (Part 6 of 9)"
Previous document is "183) Should I have a cascade button without a submenu in a pulldown"
Next document is "185) How do popup menus work?"