# HG changeset patch # User Gerd Moellmann # Date 948815453 0 # Node ID 5c5bb4b1ff45f986daf54d74fc7de5208847a5ef # Parent 34b81c94619866ed27d66d4d402cbbf13bb31352 (make_menu_in_widget): Don't add XmNpopdownCallback, add XmNunmapCallback. (xm_unmap_callback): New function. (xm_pull_down_callback): Call pre-activate callback only if parent is the menu bar. diff -r 34b81c946198 -r 5c5bb4b1ff45 lwlib/lwlib-Xm.c --- a/lwlib/lwlib-Xm.c Tue Jan 25 15:44:52 2000 +0000 +++ b/lwlib/lwlib-Xm.c Tue Jan 25 15:50:53 2000 +0000 @@ -125,6 +125,7 @@ static void xm_nosel_callback P_ ((Widget, XtPointer, XtPointer)); static void xm_pull_down_callback P_ ((Widget, XtPointer, XtPointer)); static void xm_pop_down_callback P_ ((Widget, XtPointer, XtPointer)); +static void xm_unmap_callback P_ ((Widget, XtPointer, XtPointer)); void xm_set_keyboard_focus P_ ((Widget, Widget)); void xm_set_main_areas P_ ((Widget, Widget, Widget)); static void xm_internal_update_other_instances P_ ((Widget, XtPointer, @@ -505,11 +506,18 @@ abort (); menubar_p = type == XmMENU_BAR; +#if 0 /* This can't be used in LessTif as of 2000-01-24 because it's + impossible to decide from this plus the cascading callback if a + popup is still posted or not. When selecting cascade button A, + then B, then clicking on the frame, the sequence of callbacks is + `cascading A', cascading B', `popdown for all cascade buttons in + the menu bar. */ /* Add a callback to popups and pulldowns that is called when it is made invisible again. */ if (!menubar_p) XtAddCallback (XtParent (widget), XmNpopdownCallback, xm_pop_down_callback, (XtPointer)instance); +#endif /* Preserve the first KEEP_FIRST_CHILDREN old children. */ for (child_index = 0, cur = val; child_index < keep_first_children; @@ -585,11 +593,15 @@ else { menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0); + + /* XmNpopdownCallback is working strangely under LessTif. + Using XmNunmapCallback is the only way to go there. */ + if (menubar_p) + XtAddCallback (menu, XmNunmapCallback, xm_unmap_callback, + (XtPointer) instance); + make_menu_in_widget (instance, menu, cur->contents, 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++; + XtSetArg (al[ac], XmNsubMenuId, menu); ac++; button = XmCreateCascadeButton (widget, cur->name, al, ac); xm_update_label (instance, button, cur); @@ -1876,9 +1888,25 @@ XtPointer closure; XtPointer call_data; { - do_call (widget, closure, pre_activate); + Widget parent = XtParent (widget); + + if (XmIsRowColumn (parent)) + { + unsigned char type = 0xff; + XtVaGetValues (parent, XmNrowColumnType, &type, NULL); + if (type == XmMENU_BAR) + do_call (widget, closure, pre_activate); + } } + +/* XmNpopdownCallback for MenuShell widgets. WIDGET is the MenuShell, + CLOSURE is a pointer to the widget_instance of the shell, CALL_DATA + is always null under LessTif. + + 2000-01-23: This callback is called for each cascade button in + a menu, whether or not its submenu is visible. */ + static void xm_pop_down_callback (widget, closure, call_data) Widget widget; @@ -1892,6 +1920,17 @@ do_call (widget, closure, post_activate); } +static void +xm_unmap_callback (widget, closure, call_data) + Widget widget; + XtPointer closure; + XtPointer call_data; +{ + widget_instance *instance = (widget_instance *) closure; + if (!instance->pop_up_p) + do_call (widget, closure, post_activate); +} + /* set the keyboard focus */ void