1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-26 10:49:33 +00:00

(make_menu_in_widget): Add an XmNpopdownCallback

instead of an XmNunmapCallback.
(xm_unmap_callback): Removed.
This commit is contained in:
Gerd Moellmann 2001-03-13 16:30:15 +00:00
parent 2756b446fd
commit f25d58a47c
2 changed files with 24 additions and 40 deletions

View File

@ -1,7 +1,11 @@
2001-03-13 Gerd Moellmann <gerd@gnu.org> 2001-03-13 Gerd Moellmann <gerd@gnu.org>
* lwlib-Xm.c (make_menubar): Take out code in #if 0. * lwlib-Xm.c (make_menu_in_widget): Add an XmNpopdownCallback
instead of an XmNunmapCallback.
(xm_unmap_callback): Removed.
* lwlib-Xm.c (make_menubar): Take out code in #if 0.
* lwlib-Xm.c (xm_popup_menu): Don't set XmNmenuPost unless * lwlib-Xm.c (xm_popup_menu): Don't set XmNmenuPost unless
necessary. From Rick Scott <rwscott@alumni.uwaterloo.ca>. necessary. From Rick Scott <rwscott@alumni.uwaterloo.ca>.

View File

@ -125,7 +125,6 @@ static void xm_generic_callback P_ ((Widget, XtPointer, XtPointer));
static void xm_nosel_callback P_ ((Widget, XtPointer, XtPointer)); static void xm_nosel_callback P_ ((Widget, XtPointer, XtPointer));
static void xm_pull_down_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_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_keyboard_focus P_ ((Widget, Widget));
void xm_set_main_areas P_ ((Widget, Widget, Widget)); void xm_set_main_areas P_ ((Widget, Widget, Widget));
static void xm_internal_update_other_instances P_ ((Widget, XtPointer, static void xm_internal_update_other_instances P_ ((Widget, XtPointer,
@ -509,18 +508,11 @@ make_menu_in_widget (instance, widget, val, keep_first_children)
abort (); abort ();
menubar_p = type == XmMENU_BAR; 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 /* Add a callback to popups and pulldowns that is called when
it is made invisible again. */ it is made invisible again. */
if (!menubar_p) if (!menubar_p)
XtAddCallback (XtParent (widget), XmNpopdownCallback, XtAddCallback (XtParent (widget), XmNpopdownCallback,
xm_pop_down_callback, (XtPointer)instance); xm_pop_down_callback, (XtPointer)instance);
#endif
/* Preserve the first KEEP_FIRST_CHILDREN old children. */ /* Preserve the first KEEP_FIRST_CHILDREN old children. */
for (child_index = 0, cur = val; child_index < keep_first_children; for (child_index = 0, cur = val; child_index < keep_first_children;
@ -597,12 +589,6 @@ make_menu_in_widget (instance, widget, val, keep_first_children)
{ {
menu = XmCreatePulldownMenu (widget, cur->name, NULL, 0); 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); make_menu_in_widget (instance, menu, cur->contents, 0);
XtSetArg (al[ac], XmNsubMenuId, menu); ac++; XtSetArg (al[ac], XmNsubMenuId, menu); ac++;
button = XmCreateCascadeButton (widget, cur->name, al, ac); button = XmCreateCascadeButton (widget, cur->name, al, ac);
@ -1813,24 +1799,29 @@ do_call (widget, closure, type)
user_data = NULL; user_data = NULL;
XtSetArg (al [ac], XmNuserData, &user_data); ac++; XtSetArg (al [ac], XmNuserData, &user_data); ac++;
XtGetValues (widget, al, ac); XtGetValues (widget, al, ac);
switch (type) switch (type)
{ {
case pre_activate: case pre_activate:
if (instance->info->pre_activate_cb) if (instance->info->pre_activate_cb)
instance->info->pre_activate_cb (widget, id, user_data); instance->info->pre_activate_cb (widget, id, user_data);
break; break;
case selection: case selection:
if (instance->info->selection_cb) if (instance->info->selection_cb)
instance->info->selection_cb (widget, id, user_data); instance->info->selection_cb (widget, id, user_data);
break; break;
case no_selection: case no_selection:
if (instance->info->selection_cb) if (instance->info->selection_cb)
instance->info->selection_cb (widget, id, (XtPointer) -1); instance->info->selection_cb (widget, id, (XtPointer) -1);
break; break;
case post_activate: case post_activate:
if (instance->info->post_activate_cb) if (instance->info->post_activate_cb)
instance->info->post_activate_cb (widget, id, user_data); instance->info->post_activate_cb (widget, id, user_data);
break; break;
default: default:
abort (); abort ();
} }
@ -1872,14 +1863,14 @@ xm_nosel_callback (widget, closure, call_data)
XtPointer closure; XtPointer closure;
XtPointer call_data; XtPointer call_data;
{ {
/* This callback is only called when a dialog box is dismissed with the wm's /* This callback is only called when a dialog box is dismissed with
destroy button (WM_DELETE_WINDOW.) We want the dialog box to be destroyed the wm's destroy button (WM_DELETE_WINDOW.) We want the dialog
in that case, not just unmapped, so that it releases its keyboard grabs. box to be destroyed in that case, not just unmapped, so that it
But there are problems with running our callbacks while the widget is in releases its keyboard grabs. But there are problems with running
the process of being destroyed, so we set XmNdeleteResponse to XmUNMAP our callbacks while the widget is in the process of being
instead of XmDESTROY and then destroy it ourself after having run the destroyed, so we set XmNdeleteResponse to XmUNMAP instead of
callback. XmDESTROY and then destroy it ourself after having run the
*/ callback. */
do_call (widget, closure, no_selection); do_call (widget, closure, no_selection);
XtDestroyWidget (widget); XtDestroyWidget (widget);
} }
@ -1903,11 +1894,10 @@ xm_pull_down_callback (widget, closure, call_data)
/* XmNpopdownCallback for MenuShell widgets. WIDGET is the MenuShell, /* XmNpopdownCallback for MenuShell widgets. WIDGET is the MenuShell,
CLOSURE is a pointer to the widget_instance of the shell, CALL_DATA CLOSURE is a pointer to the widget_instance of the shell,
is always null under LessTif.
2000-01-23: This callback is called for each cascade button in Note that this callback is called for each cascade button in a
a menu, whether or not its submenu is visible. */ menu, whether or not its submenu is visible. */
static void static void
xm_pop_down_callback (widget, closure, call_data) xm_pop_down_callback (widget, closure, call_data)
@ -1916,20 +1906,10 @@ xm_pop_down_callback (widget, closure, call_data)
XtPointer call_data; XtPointer call_data;
{ {
widget_instance *instance = (widget_instance *) closure; widget_instance *instance = (widget_instance *) closure;
fprintf (stderr, "%p\n", call_data);
if ((!instance->pop_up_p && (XtParent (widget) == instance->widget)) if ((!instance->pop_up_p && XtParent (widget) == instance->widget)
|| (XtParent (widget) == instance->parent)) || XtParent (widget) == instance->parent)
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); do_call (widget, closure, post_activate);
} }