X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/2f87cc746e87f21c7af2cd42fdd9b56a76586698..51a91c091083098a2f347564594ca169175bba0f:/lwlib/lwlib-Xm.c diff --git a/lwlib/lwlib-Xm.c b/lwlib/lwlib-Xm.c index 16c8a947a4..766d3554e2 100644 --- a/lwlib/lwlib-Xm.c +++ b/lwlib/lwlib-Xm.c @@ -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_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, @@ -140,6 +139,32 @@ void xm_manage_resizing P_ ((Widget, Boolean)); #endif +#if 0 + +/* Print the complete X resource name of widget WIDGET to stderr. + This is sometimes handy to have available. */ + +void +x_print_complete_resource_name (widget) + Widget widget; +{ + int i; + String names[100]; + + for (i = 0; i < 100 && widget != NULL; ++i) + { + names[i] = XtName (widget); + widget = XtParent (widget); + } + + for (--i; i >= 1; --i) + fprintf (stderr, "%s.", names[i]); + fprintf (stderr, "%s\n", names[0]); +} + +#endif /* 0 */ + + static destroyed_instance *all_destroyed_instances = NULL; static destroyed_instance* @@ -266,7 +291,7 @@ xm_arm_callback (w, client_data, call_data) widget_instance *instance; /* Get the id of the menu bar or popup menu this widget is in. */ - while (w != None) + while (w != NULL) { if (XmIsRowColumn (w)) { @@ -280,7 +305,7 @@ xm_arm_callback (w, client_data, call_data) w = XtParent (w); } - if (w != None) + if (w != NULL) { instance = lw_get_widget_instance (w); if (instance && instance->info->highlight_cb) @@ -494,7 +519,8 @@ make_menu_in_widget (instance, widget, val, keep_first_children) old_children = XtCompositeChildren (widget, &old_num_children); /* Allocate the children array */ - for (num_children = 0, cur = val; cur; num_children++, cur = cur->next); + for (num_children = 0, cur = val; cur; num_children++, cur = cur->next) + ; children = (Widget*)XtMalloc (num_children * sizeof (Widget)); /* WIDGET should be a RowColumn. */ @@ -509,18 +535,11 @@ make_menu_in_widget (instance, widget, val, keep_first_children) 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 +616,6 @@ make_menu_in_widget (instance, widget, val, keep_first_children) { 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); @@ -624,12 +637,6 @@ make_menu_in_widget (instance, widget, val, keep_first_children) if (button) XtVaSetValues (widget, XmNmenuHelpWidget, button, NULL); - /* LessTif apparently doesn't recompute centered text when more - widgets are added. So, do it after all widgets have been - created. */ - if (title) - XtVaSetValues (title, XmNalignment, XmALIGNMENT_CENTER, NULL); - if (num_children) XtManageChildren (children, num_children); @@ -1490,15 +1497,6 @@ make_menubar (instance) ac = 0; XtSetArg(al[ac], XmNmenuAccelerator, 0); ++ac; - -#if 0 - /* As of 2000-01-17, the LessTif menu bar resizes to height 0 when - all its children are removed, causing an annoying flickering - behavior. Prevent that by not allowing resizing. */ - XtSetArg(al[ac], XmNresizeHeight, False); ++ac; - XtSetArg(al[ac], XmNresizeWidth, False); ++ac; -#endif - return XmCreateMenuBar (instance->parent, instance->info->name, al, ac); } @@ -1728,19 +1726,29 @@ xm_popup_menu (widget, event) if (event->type == ButtonPress || event->type == ButtonRelease) { - /* This is so totally ridiculous: there's NO WAY to tell Motif - that *any* button can select a menu item. Only one button - can have that honor. - */ - char *trans = 0; - if (event->xbutton.state & Button5Mask) trans = ""; - else if (event->xbutton.state & Button4Mask) trans = ""; - else if (event->xbutton.state & Button3Mask) trans = ""; - else if (event->xbutton.state & Button2Mask) trans = ""; - else if (event->xbutton.state & Button1Mask) trans = ""; - if (trans) XtVaSetValues (widget, XmNmenuPost, trans, NULL); + /* Setting the menuPost resource only required by Motif 1.1 and + LessTif 0.84 and earlier. With later versions of LessTif, + setting menuPost is unnecessary and may cause problems, so + don't do it. */ +#if XmVersion < 1002 || (defined LESSTIF_VERSION && LESSTIF_VERSION < 84) + { + /* This is so totally ridiculous: there's NO WAY to tell Motif + that *any* button can select a menu item. Only one button + can have that honor. */ + + char *trans = 0; + if (event->xbutton.state & Button5Mask) trans = ""; + else if (event->xbutton.state & Button4Mask) trans = ""; + else if (event->xbutton.state & Button3Mask) trans = ""; + else if (event->xbutton.state & Button2Mask) trans = ""; + else if (event->xbutton.state & Button1Mask) trans = ""; + if (trans) XtVaSetValues (widget, XmNmenuPost, trans, NULL); + } +#endif + XmMenuPosition (widget, (XButtonPressedEvent *) event); } + XtManageChild (widget); } @@ -1812,24 +1820,29 @@ do_call (widget, closure, type) 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 (); } @@ -1871,14 +1884,14 @@ xm_nosel_callback (widget, closure, call_data) 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); } @@ -1902,11 +1915,10 @@ xm_pull_down_callback (widget, closure, call_data) /* 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,19 +1928,8 @@ xm_pop_down_callback (widget, closure, 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); -} - -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); }