diff options
| author | Richard M. Stallman | 1996-08-10 18:48:18 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1996-08-10 18:48:18 +0000 |
| commit | 565157eefa62ad416c7aa841953fa2aee1be5345 (patch) | |
| tree | 8228f6c4d2ad6dca139195538e02cbedfda0b601 | |
| parent | 1b97fc6eb4694cfdabb98bdf7b21c02b293bbd8a (diff) | |
| download | emacs-565157eefa62ad416c7aa841953fa2aee1be5345.tar.gz emacs-565157eefa62ad416c7aa841953fa2aee1be5345.zip | |
(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.
| -rw-r--r-- | lwlib/lwlib-Xm.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/lwlib/lwlib-Xm.c b/lwlib/lwlib-Xm.c index c5da97f85ed..38713adb25f 100644 --- a/lwlib/lwlib-Xm.c +++ b/lwlib/lwlib-Xm.c | |||
| @@ -509,11 +509,41 @@ update_one_menu_entry (instance, widget, val, deep_p) | |||
| 509 | { | 509 | { |
| 510 | if (contents) | 510 | if (contents) |
| 511 | { | 511 | { |
| 512 | menu = XmCreatePulldownMenu (XtParent (widget), XtName (widget), NULL, 0); | 512 | unsigned int old_num_children, i; |
| 513 | Widget button, parent; | ||
| 514 | Widget *widget_list; | ||
| 515 | int buttonchange; | ||
| 516 | |||
| 517 | parent = XtParent (widget); | ||
| 518 | widget_list = XtCompositeChildren (parent, &old_num_children); | ||
| 519 | |||
| 520 | /* Find the widget position within the parent's widget list. */ | ||
| 521 | for (i = 0; i < old_num_children; i++) | ||
| 522 | if (strcmp (XtName (widget_list[i]), XtName (widget)) == 0) | ||
| 523 | break; | ||
| 524 | if (i == old_num_children) | ||
| 525 | abort (); | ||
| 526 | /* `buttonchange' indicates the parent button is being | ||
| 527 | exchanged with a CascadeButton. */ | ||
| 528 | buttonchange = !XmIsCascadeButton (widget_list[i]); | ||
| 529 | if (buttonchange) | ||
| 530 | XtDestroyWidget (widget_list[i]); | ||
| 531 | menu = XmCreatePulldownMenu (parent, val->name, NULL, 0); | ||
| 513 | make_menu_in_widget (instance, menu, contents, 0); | 532 | make_menu_in_widget (instance, menu, contents, 0); |
| 514 | ac = 0; | 533 | ac = 0; |
| 515 | XtSetArg (al [ac], XmNsubMenuId, menu); ac++; | 534 | XtSetArg (al [ac], XmNsubMenuId, menu); ac++; |
| 516 | XtSetValues (widget, al, ac); | 535 | /* Non-zero values don't work reliably in |
| 536 | conjunction with Emacs' event loop */ | ||
| 537 | XtSetArg (al [ac], XmNmappingDelay, 0); ac++; | ||
| 538 | /* Tell Motif to put it in the right place. */ | ||
| 539 | XtSetArg (al [ac], XmNpositionIndex, i); ac++; | ||
| 540 | button = XmCreateCascadeButtonGadget (parent, val->name, al, ac); | ||
| 541 | xm_update_label (instance, button, val); | ||
| 542 | |||
| 543 | XtAddCallback (button, XmNcascadingCallback, xm_pull_down_callback, | ||
| 544 | (XtPointer)instance); | ||
| 545 | if (buttonchange) | ||
| 546 | XtManageChild (button); | ||
| 517 | } | 547 | } |
| 518 | } | 548 | } |
| 519 | else if (!contents) | 549 | else if (!contents) |
| @@ -575,7 +605,10 @@ xm_update_menu (instance, widget, val, deep_p) | |||
| 575 | for (i = 0, cur = val->contents; i < num_children_to_keep; i++) | 605 | for (i = 0, cur = val->contents; i < num_children_to_keep; i++) |
| 576 | { | 606 | { |
| 577 | if (!cur) | 607 | if (!cur) |
| 578 | abort (); | 608 | { |
| 609 | num_children_to_keep = i; | ||
| 610 | break; | ||
| 611 | } | ||
| 579 | if (children [i]->core.being_destroyed | 612 | if (children [i]->core.being_destroyed |
| 580 | || strcmp (XtName (children [i]), cur->name)) | 613 | || strcmp (XtName (children [i]), cur->name)) |
| 581 | continue; | 614 | continue; |