diff options
-rw-r--r-- | lwlib/lwlib-Xm.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/lwlib/lwlib-Xm.c b/lwlib/lwlib-Xm.c index 38713adb25f..2050c295755 100644 --- a/lwlib/lwlib-Xm.c +++ b/lwlib/lwlib-Xm.c @@ -510,9 +510,8 @@ update_one_menu_entry (instance, widget, val, deep_p) if (contents) { unsigned int old_num_children, i; - Widget button, parent; + Widget parent; Widget *widget_list; - int buttonchange; parent = XtParent (widget); widget_list = XtCompositeChildren (parent, &old_num_children); @@ -523,27 +522,37 @@ update_one_menu_entry (instance, widget, val, deep_p) 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++; - /* 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); + if (XmIsCascadeButton (widget_list[i])) + { + menu = XmCreatePulldownMenu (parent, XtName(widget), NULL, 0); + make_menu_in_widget (instance, menu, contents, 0); + ac = 0; + XtSetArg (al [ac], XmNsubMenuId, menu); ac++; + XtSetValues (widget, al, ac); + } + else + { + Widget button; + + /* The current menuitem is a XmPushButtonGadget, it + needs to be replaced by a CascadeButtonGadget */ + 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++; + /* 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); + XtManageChild (button); + } } } else if (!contents) |