[comp.windows.x] translation tables conflict

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)