Mercurial > emacs
changeset 15853:1ca5c3c9853a
(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.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 10 Aug 1996 18:48:18 +0000 |
parents | 8d8800822c78 |
children | 184808f2a73c |
files | lwlib/lwlib-Xm.c |
diffstat | 1 files changed, 36 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;