Jean-Christophe.Dhellemmes@MAPS.CS.CMU.EDU (06/02/90)
I am using X11 R4 and the Athena widget toolkit. I would like to have a
menu popup when I press Btn2 in my application window's background, and a
different menu popup with the same button when I am in a command
widget. For that I wrote the following (very simple) program:
------------------------------------------------------------------
/*************
** INCLUDES **
*************/
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Shell.h>
#include <X11/Xaw/Form.h>
#include <X11/Xaw/Label.h>
#include <X11/Xaw/Command.h>
/*********
** MAIN **
*********/
main(argc,argv)
int argc;
char *argv[];
{
Arg xarg[16];
XtTranslations trans;
Widget top,form,button,popup1,popup2,wg;
/* top window */
top = XtInitialize("mytop","MAPS",NULL,NULL,&argc,argv);
form = XtCreateManagedWidget("form",formWidgetClass,top,NULL,NULL);
/* menu 1 */
popup1 = XtCreatePopupShell("popup1",overrideShellWidgetClass,top,NULL,0);
trans = XtParseTranslationTable("<Btn2Up>: MenuPopdown(popup1)");
XtOverrideTranslations(popup1, trans);
XtSetArg(xarg[0],XtNlabel,"Menu1");
wg = XtCreateManagedWidget("button1",labelWidgetClass,popup1,xarg,1);
XtMoveWidget(popup1,100,100);
/* menu 2 */
popup2 = XtCreatePopupShell("popup2",overrideShellWidgetClass,top,NULL,0);
trans = XtParseTranslationTable("<Btn2Up>: MenuPopdown(popup2)");
XtOverrideTranslations(popup2, trans);
XtSetArg(xarg[0],XtNlabel,"Menu2");
wg = XtCreateManagedWidget("button2",labelWidgetClass,popup2,xarg,1);
XtMoveWidget(popup2,100,140);
/* button */
XtSetArg(xarg[0],XtNhorizDistance,50);
XtSetArg(xarg[1],XtNvertDistance,50);
XtSetArg(xarg[2],XtNlabel,"BUTTON");
button = XtCreateManagedWidget("button",commandWidgetClass,form,xarg,3);
/* translation tables */
trans = XtParseTranslationTable("<Btn2Down>: MenuPopup(popup1)");
XtOverrideTranslations(top, trans);
trans = XtParseTranslationTable("<Btn2Down>: MenuPopup(popup2)");
XtOverrideTranslations(button, trans);
/* start application */
XtConfigureWidget(top,100,100,200,200,1); /* set size */
XtRealizeWidget(top);
XtMainLoop();
}
-----------------------------------------------------------------
This program doesn't work. When I press Btn2 in the command widget, the
top window translation table is executed instead if the command widget's,
and the popup1 appears wherever I have pressed Btn2. I have tried many
different ways of doing that, with no success.
In this program, the hierarchy is:
top <Btn2Down>: MenuPopup(popup1) <-------.
/|\ \
/ | popup1 <Btn2Up>: MenuPopdown(popup1) \
/ | \
/ popup2 <Btn2Up>: MenuPopdown(popup2) \_ Shouldn't the
/ / priority be
form / for button ?
| /
button <Btn2Down>: MenuPopup(popup2) <------------'
As Tom Tulinsky suggested in his post of May-16-1990, I tried to move the
button translation up to the form, but it didn't work. I don't know if this
problem is linked to the translation tables management or to the popup
shells management.
Under R3, I used a trick to achieve my goals, by switching back and forth
the translation table of the top window on <EnterWindow> and <LeaveWindow>
events for the command widget. This doesn't work anymore under R4 because
the command widget now receives a <LeaveWindow> event before (?) the popup
shell pops up, and therefore resets the translation table to popup the wrong
shell.
1) Do I do something wrong in the program above ?
2) Is there a way to set-up translation tables so that a child's translation
table overrides the one of his parents ?
3) Is there an other way to do menu-switching when in a given button ?
I think this is an important feature I want to have in my window manager. I
hope I asked my questions clearly and that somebody will take the time to
explain to me how all this works. If I receive many answers/solutions, I'll
post a summary or/and forward the solutions to whoever wants them.
Thanks in advance.
* JCD
(jcd@maps.cs.cmu.edu)