# HG changeset patch # User Gerd Moellmann # Date 984500999 0 # Node ID 85a9fd1b9e41a9cf7b9af55d1dd9e101182a8472 # Parent a3c8e30dedddb7834989e5d2cc13f34ae5bef8a7 (make_menu_in_widget): Add an XmNpopdownCallback instead of an XmNunmapCallback. (xm_unmap_callback): Removed. diff -r a3c8e30deddd -r 85a9fd1b9e41 lwlib/lwlib-Xm.c --- a/lwlib/lwlib-Xm.c Tue Mar 13 16:26:25 2001 +0000 +++ b/lwlib/lwlib-Xm.c Tue Mar 13 16:29:59 2001 +0000 @@ -125,7 +125,6 @@ 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, @@ -509,18 +508,11 @@ 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; @@ -597,12 +589,6 @@ { 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++; button = XmCreateCascadeButton (widget, cur->name, al, ac); @@ -1813,24 +1799,29 @@ user_data = NULL; XtSetArg (al [ac], XmNuserData, &user_data); ac++; XtGetValues (widget, al, ac); + switch (type) { case pre_activate: if (instance->info->pre_activate_cb) instance->info->pre_activate_cb (widget, id, user_data); break; + case selection: if (instance->info->selection_cb) instance->info->selection_cb (widget, id, user_data); break; + case no_selection: if (instance->info->selection_cb) instance->info->selection_cb (widget, id, (XtPointer) -1); break; + case post_activate: if (instance->info->post_activate_cb) instance->info->post_activate_cb (widget, id, user_data); break; + default: abort (); } @@ -1872,14 +1863,14 @@ XtPointer closure; XtPointer call_data; { - /* This callback is only called when a dialog box is dismissed with the wm's - destroy button (WM_DELETE_WINDOW.) We want the dialog box to be destroyed - in that case, not just unmapped, so that it releases its keyboard grabs. - But there are problems with running our callbacks while the widget is in - the process of being destroyed, so we set XmNdeleteResponse to XmUNMAP - instead of XmDESTROY and then destroy it ourself after having run the - callback. - */ + /* This callback is only called when a dialog box is dismissed with + the wm's destroy button (WM_DELETE_WINDOW.) We want the dialog + box to be destroyed in that case, not just unmapped, so that it + releases its keyboard grabs. But there are problems with running + our callbacks while the widget is in the process of being + destroyed, so we set XmNdeleteResponse to XmUNMAP instead of + XmDESTROY and then destroy it ourself after having run the + callback. */ do_call (widget, closure, no_selection); XtDestroyWidget (widget); } @@ -1903,11 +1894,10 @@ /* 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. + CLOSURE is a pointer to the widget_instance of the shell, - 2000-01-23: This callback is called for each cascade button in - a menu, whether or not its submenu is visible. */ + Note that 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) @@ -1916,20 +1906,10 @@ XtPointer call_data; { widget_instance *instance = (widget_instance *) closure; - - if ((!instance->pop_up_p && (XtParent (widget) == instance->widget)) - || (XtParent (widget) == instance->parent)) - do_call (widget, closure, post_activate); -} + fprintf (stderr, "%p\n", call_data); -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) + if ((!instance->pop_up_p && XtParent (widget) == instance->widget) + || XtParent (widget) == instance->parent) do_call (widget, closure, post_activate); }