[comp.windows.x.motif] XmForm eats Return and Escape?

serge@optigfx.com (Serge Issakov) (12/18/90)

GENERAL:
    I have a simple user-defined widget which captures keyboard input
    via default translations using the "Keypress" translation.  This
    widget is a child of a Motif XmForm widget.  The action proc simply
    does a printf("got a key\n").  My problem is that the Escape,
    Return and Enter keys are ignored.  Pressing any other keys results
    in the "got a key" message getting printed.

    If I don't use the XmForm widget, but just make my widget
    a direct child of the toplevel widget, then everything
    works fine.

    Has anyone run into this?  What is special about the Escape, Return,
    and Enter keys that would cause them to be treated differently?

    ENVIRONMENT:  Sparc, SunOS 4.1, X11R4, Motif 1.1

DETAILS:
    To recreate this problem in a simple program, I modified the dial
    widget example from section 12.2 of Douglas A. Young's, "The X
    Window System Programming and Applications with Xt" (Motif
    edition).

    I added "KeyPress" to the defaultTranslations array:
    static char defaultTranslations[] =
	"<Btn1Down>: select()\n<KeyPress>: Input()";

    And I added a new action proc: 
	static XtActionsRec actionsList[] = {
	  { "select", (XtActionProc) select_dial},
	  { "Input", Input }, /* NEW */
	};

	static void
	Input(w, event, args, n_args)
		XsDialWidget w;
		XEvent  *event;
		char    *args[];
		int     n_args;
	{
	    printf("Input: got a key\n");
	}

    With just these changes, the program works as expected: pressing
    any key while the pointer is in the dial results in the "got a key"
    message.

    But, if I also put a Motif form widget in between the top level
    widget and the dial widget, pressing the Escape, Return and Enter keys
    no longer results in the message being printed (but all other keys still
    work).

    The following code shows how I add in the form widget:

-----------------------------------
main(argc, argv)
        char **argv;
{
        Widget toplevel, dial;

#ifdef DONT_USE_FORM
	/* this works */
        toplevel = XtInitialize(argv[0], "DialTest", NULL,
                                0, &argc, argv);

        dial = XtCreateManagedWidget("dial", XsdialWidgetClass,
                                toplevel, NULL, 0);
#else
	/* this doesn't (for Return, Escape and Enter) */
        Widget form;

        toplevel = XtInitialize(argv[0], "DialTest", NULL,
                                0, &argc, argv);
        form = XmCreateForm(toplevel, "form", NULL, 0);
        XtManageChild(form);
        dial = XtCreateManagedWidget("dial", XsdialWidgetClass,
                                form, NULL, 0);
#endif

        XtAddCallback(dial, XtNselectCallback,
                select_callback, NULL);
        XtRealizeWidget(toplevel);
        XtMainLoop();
} /* main */
-----------------------------------

        How can the form widget be affecting keyboard input like this?

	Thanks in advance...

-----------------------------------------------------------------------------
Serge Issakov	     			serge@optigfx.COM
Optigraphics Corp.   			uunet!optigfx!serge
San Diego CA	     			619-292-6060