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,
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;
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);
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;
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);
+}
+
\f
/* set the keyboard focus */
void