# HG changeset patch # User Richard M. Stallman # Date 839702898 0 # Node ID 1ca5c3c9853a9803924ec388b84d01d8416740a1 # Parent 8d8800822c781185c7ad0afa0fb154d80568f09b (update_one_menu_entry): When creating a pulldown in an existing but empty menu item, in order to get a new functional pulldown, the menu item must be switched from an XmPushButtonGadget into a XmCascadeButtonGadget. diff -r 8d8800822c78 -r 1ca5c3c9853a lwlib/lwlib-Xm.c --- a/lwlib/lwlib-Xm.c Fri Aug 09 22:31:46 1996 +0000 +++ b/lwlib/lwlib-Xm.c Sat Aug 10 18:48:18 1996 +0000 @@ -509,11 +509,41 @@ { if (contents) { - menu = XmCreatePulldownMenu (XtParent (widget), XtName (widget), NULL, 0); + unsigned int old_num_children, i; + Widget button, parent; + Widget *widget_list; + int buttonchange; + + parent = XtParent (widget); + widget_list = XtCompositeChildren (parent, &old_num_children); + + /* Find the widget position within the parent's widget list. */ + for (i = 0; i < old_num_children; i++) + if (strcmp (XtName (widget_list[i]), XtName (widget)) == 0) + break; + if (i == old_num_children) + abort (); + /* `buttonchange' indicates the parent button is being + exchanged with a CascadeButton. */ + buttonchange = !XmIsCascadeButton (widget_list[i]); + if (buttonchange) + XtDestroyWidget (widget_list[i]); + menu = XmCreatePulldownMenu (parent, val->name, NULL, 0); make_menu_in_widget (instance, menu, contents, 0); ac = 0; XtSetArg (al [ac], XmNsubMenuId, menu); ac++; - XtSetValues (widget, al, ac); + /* Non-zero values don't work reliably in + conjunction with Emacs' event loop */ + XtSetArg (al [ac], XmNmappingDelay, 0); ac++; + /* Tell Motif to put it in the right place. */ + XtSetArg (al [ac], XmNpositionIndex, i); ac++; + button = XmCreateCascadeButtonGadget (parent, val->name, al, ac); + xm_update_label (instance, button, val); + + XtAddCallback (button, XmNcascadingCallback, xm_pull_down_callback, + (XtPointer)instance); + if (buttonchange) + XtManageChild (button); } } else if (!contents) @@ -575,7 +605,10 @@ for (i = 0, cur = val->contents; i < num_children_to_keep; i++) { if (!cur) - abort (); + { + num_children_to_keep = i; + break; + } if (children [i]->core.being_destroyed || strcmp (XtName (children [i]), cur->name)) continue;