X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/2b06561ab5054b2b36b74dfcf1c3bf38bc1090ff..018ba359ab456f6a43f3acea0c15df616aa0ad02:/src/xmenu.c diff --git a/src/xmenu.c b/src/xmenu.c index db20b6b0b6..bf7bdbfd34 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -1,5 +1,6 @@ /* X Communication module for terminals which understand the X protocol. - Copyright (C) 1986, 88, 93, 94, 96, 99, 2000 Free Software Foundation, Inc. + Copyright (C) 1986, 88, 93, 94, 96, 99, 2000, 2001 + Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -36,11 +37,13 @@ Boston, MA 02111-1307, USA. */ #include #include +#define DOC_STRINGS_IN_COMMENTS #include "lisp.h" #include "termhooks.h" +#include "keyboard.h" +#include "keymap.h" #include "frame.h" #include "window.h" -#include "keyboard.h" #include "blockinput.h" #include "buffer.h" @@ -65,6 +68,7 @@ Boston, MA 02111-1307, USA. */ #ifdef HAVE_X_WINDOWS #undef HAVE_MULTILINGUAL_MENU #ifdef USE_X_TOOLKIT +#include "widget.h" #include #include #include @@ -79,13 +83,6 @@ Boston, MA 02111-1307, USA. */ #endif /* not USE_X_TOOLKIT */ #endif /* HAVE_X_WINDOWS */ -#ifdef USE_MOTIF -#include /* for LESSTIF_VERSION */ -#endif - -#define min(x,y) (((x) < (y)) ? (x) : (y)) -#define max(x,y) (((x) > (y)) ? (x) : (y)) - #ifndef TRUE #define TRUE 1 #define FALSE 0 @@ -126,12 +123,16 @@ void popup_get_selection (); static void push_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)); -static Lisp_Object xmenu_show (); -static void keymap_panes (); -static void single_keymap_panes (); -static void single_menu_item (); -static void list_of_panes (); -static void list_of_items (); +static int update_frame_menubar P_ ((struct frame *)); +static Lisp_Object xmenu_show P_ ((struct frame *, int, int, int, int, + Lisp_Object, char **)); +static void keymap_panes P_ ((Lisp_Object *, int, int)); +static void single_keymap_panes P_ ((Lisp_Object, Lisp_Object, Lisp_Object, + int, int)); +static void single_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object *, + int, int, int *)); +static void list_of_panes P_ ((Lisp_Object)); +static void list_of_items P_ ((Lisp_Object)); /* This holds a Lisp vector that holds the results of decoding the keymaps or alist-of-alists that specify a menu. @@ -381,7 +382,7 @@ keymap_panes (keymaps, nmaps, notreal) P is the number of panes we have made so far. */ for (mapno = 0; mapno < nmaps; mapno++) single_keymap_panes (keymaps[mapno], - map_prompt (keymaps[mapno]), Qnil, notreal, 10); + Fkeymap_prompt (keymaps[mapno]), Qnil, notreal, 10); finish_menu_items (); } @@ -655,39 +656,40 @@ list_of_items (pane) } DEFUN ("x-popup-menu", Fx_popup_menu, Sx_popup_menu, 2, 2, 0, - "Pop up a deck-of-cards menu and return user's selection.\n\ -POSITION is a position specification. This is either a mouse button event\n\ -or a list ((XOFFSET YOFFSET) WINDOW)\n\ -where XOFFSET and YOFFSET are positions in pixels from the top left\n\ -corner of WINDOW's frame. (WINDOW may be a frame object instead of a window.)\n\ -This controls the position of the center of the first line\n\ -in the first pane of the menu, not the top left of the menu as a whole.\n\ -If POSITION is t, it means to use the current mouse position.\n\ -\n\ -MENU is a specifier for a menu. For the simplest case, MENU is a keymap.\n\ -The menu items come from key bindings that have a menu string as well as\n\ -a definition; actually, the \"definition\" in such a key binding looks like\n\ -\(STRING . REAL-DEFINITION). To give the menu a title, put a string into\n\ -the keymap as a top-level element.\n\n\ -If REAL-DEFINITION is nil, that puts a nonselectable string in the menu.\n\ -Otherwise, REAL-DEFINITION should be a valid key binding definition.\n\ -\n\ -You can also use a list of keymaps as MENU.\n\ - Then each keymap makes a separate pane.\n\ -When MENU is a keymap or a list of keymaps, the return value\n\ -is a list of events.\n\n\ -\n\ -Alternatively, you can specify a menu of multiple panes\n\ - with a list of the form (TITLE PANE1 PANE2...),\n\ -where each pane is a list of form (TITLE ITEM1 ITEM2...).\n\ -Each ITEM is normally a cons cell (STRING . VALUE);\n\ -but a string can appear as an item--that makes a nonselectable line\n\ -in the menu.\n\ -With this form of menu, the return value is VALUE from the chosen item.\n\ -\n\ -If POSITION is nil, don't display the menu at all, just precalculate the\n\ -cached information about equivalent key sequences.") - (position, menu) + /* Pop up a deck-of-cards menu and return user's selection. +POSITION is a position specification. This is either a mouse button event +or a list ((XOFFSET YOFFSET) WINDOW) +where XOFFSET and YOFFSET are positions in pixels from the top left +corner of WINDOW's frame. (WINDOW may be a frame object instead of a window.) +This controls the position of the center of the first line +in the first pane of the menu, not the top left of the menu as a whole. +If POSITION is t, it means to use the current mouse position. + +MENU is a specifier for a menu. For the simplest case, MENU is a keymap. +The menu items come from key bindings that have a menu string as well as +a definition; actually, the "definition" in such a key binding looks like +\(STRING . REAL-DEFINITION). To give the menu a title, put a string into +the keymap as a top-level element. + +If REAL-DEFINITION is nil, that puts a nonselectable string in the menu. +Otherwise, REAL-DEFINITION should be a valid key binding definition. + +You can also use a list of keymaps as MENU. + Then each keymap makes a separate pane. +When MENU is a keymap or a list of keymaps, the return value +is a list of events. + +Alternatively, you can specify a menu of multiple panes + with a list of the form (TITLE PANE1 PANE2...), +where each pane is a list of form (TITLE ITEM1 ITEM2...). +Each ITEM is normally a cons cell (STRING . VALUE); +but a string can appear as an item--that makes a nonselectable line +in the menu. +With this form of menu, the return value is VALUE from the chosen item. + +If POSITION is nil, don't display the menu at all, just precalculate the +cached information about equivalent key sequences. */ + (position, menu)) Lisp_Object position, menu; { Lisp_Object keymap, tem; @@ -788,22 +790,18 @@ cached information about equivalent key sequences.") /* Decode the menu items from what was specified. */ - keymap = Fkeymapp (menu); - tem = Qnil; - if (CONSP (menu)) - tem = Fkeymapp (Fcar (menu)); - if (!NILP (keymap)) + keymap = get_keymap (menu, 0, 0); + if (CONSP (keymap)) { /* We were given a keymap. Extract menu info from the keymap. */ Lisp_Object prompt; - keymap = get_keymap (menu); /* Extract the detailed info to make one pane. */ keymap_panes (&menu, 1, NILP (position)); /* Search for a string appearing directly as an element of the keymap. That string is the title of the menu. */ - prompt = map_prompt (keymap); + prompt = Fkeymap_prompt (keymap); if (NILP (title) && !NILP (prompt)) title = prompt; @@ -813,7 +811,7 @@ cached information about equivalent key sequences.") keymaps = 1; } - else if (!NILP (tem)) + else if (CONSP (menu) && KEYMAPP (XCAR (menu))) { /* We were given a list of keymaps. */ int nmaps = XFASTINT (Flength (menu)); @@ -829,9 +827,9 @@ cached information about equivalent key sequences.") { Lisp_Object prompt; - maps[i++] = keymap = get_keymap (Fcar (tem)); + maps[i++] = keymap = get_keymap (Fcar (tem), 1, 0); - prompt = map_prompt (keymap); + prompt = Fkeymap_prompt (keymap); if (NILP (title) && !NILP (prompt)) title = prompt; } @@ -883,21 +881,22 @@ cached information about equivalent key sequences.") #ifdef HAVE_MENUS DEFUN ("x-popup-dialog", Fx_popup_dialog, Sx_popup_dialog, 2, 2, 0, - "Pop up a dialog box and return user's selection.\n\ -POSITION specifies which frame to use.\n\ -This is normally a mouse button event or a window or frame.\n\ -If POSITION is t, it means to use the frame the mouse is on.\n\ -The dialog box appears in the middle of the specified frame.\n\ -\n\ -CONTENTS specifies the alternatives to display in the dialog box.\n\ -It is a list of the form (TITLE ITEM1 ITEM2...).\n\ -Each ITEM is a cons cell (STRING . VALUE).\n\ -The return value is VALUE from the chosen item.\n\n\ -An ITEM may also be just a string--that makes a nonselectable item.\n\ -An ITEM may also be nil--that means to put all preceding items\n\ -on the left of the dialog box and all following items on the right.\n\ -\(By default, approximately half appear on each side.)") - (position, contents) + /* Pop up a dialog box and return user's selection. +POSITION specifies which frame to use. +This is normally a mouse button event or a window or frame. +If POSITION is t, it means to use the frame the mouse is on. +The dialog box appears in the middle of the specified frame. + +CONTENTS specifies the alternatives to display in the dialog box. +It is a list of the form (TITLE ITEM1 ITEM2...). +Each ITEM is a cons cell (STRING . VALUE). +The return value is VALUE from the chosen item. + +An ITEM may also be just a string--that makes a nonselectable item. +An ITEM may also be nil--that means to put all preceding items +on the left of the dialog box and all following items on the right. +\(By default, approximately half appear on each side.) */ + (position, contents)) Lisp_Object position, contents; { struct frame * f = NULL; @@ -1081,14 +1080,10 @@ popup_get_selection (initial_event, dpyinfo, id) && (event.xany.display != dpyinfo->display || x_non_menubar_window_to_frame (dpyinfo, event.xany.window))) { - queue_tmp = (struct event_queue *) malloc (sizeof (struct event_queue)); - - if (queue_tmp != NULL) - { - queue_tmp->event = event; - queue_tmp->next = queue; - queue = queue_tmp; - } + queue_tmp = (struct event_queue *) xmalloc (sizeof *queue_tmp); + queue_tmp->event = event; + queue_tmp->next = queue; + queue = queue_tmp; } else XtDispatchEvent (&event); @@ -1161,11 +1156,7 @@ popup_activate_callback (widget, id, client_data) LWLIB_ID id; XtPointer client_data; { -#ifdef USE_MOTIF - ++popup_activated_flag; -#else popup_activated_flag = 1; -#endif } /* This callback is invoked when a dialog or menu is finished being @@ -1177,11 +1168,7 @@ popup_deactivate_callback (widget, id, client_data) LWLIB_ID id; XtPointer client_data; { -#ifdef USE_MOTIF - --popup_activated_flag; -#else popup_activated_flag = 0; -#endif } /* Lwlib callback called when menu items are highlighted/unhighlighted @@ -1396,8 +1383,7 @@ single_submenu (item_key, item_name, maps) for (i = 0; i < len; i++) { if (SYMBOLP (mapvec[i]) - || (CONSP (mapvec[i]) - && NILP (Fkeymapp (mapvec[i])))) + || (CONSP (mapvec[i]) && !KEYMAPP (mapvec[i]))) { /* Here we have a command at top level in the menu bar as opposed to a submenu. */ @@ -1456,11 +1442,16 @@ single_submenu (item_key, item_name, maps) /* Create a new pane. */ Lisp_Object pane_name, prefix; char *pane_string; + pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; + #ifndef HAVE_MULTILINGUAL_MENU if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) - pane_name = string_make_unibyte (pane_name); + { + pane_name = string_make_unibyte (pane_name); + AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; + } #endif pane_string = (NILP (pane_name) ? "" : (char *) XSTRING (pane_name)->data); @@ -1498,21 +1489,27 @@ single_submenu (item_key, item_name, maps) Lisp_Object item_name, enable, descrip, def, type, selected; Lisp_Object help; - item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; - enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; - descrip - = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; - def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION]; - type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE]; - selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED]; - help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP]; + item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); + enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); + descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); + def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); + type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); + selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); + help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); #ifndef HAVE_MULTILINGUAL_MENU if (STRING_MULTIBYTE (item_name)) - item_name = string_make_unibyte (item_name); + { + item_name = string_make_unibyte (item_name); + AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; + } + if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) - descrip = string_make_unibyte (descrip); -#endif + { + descrip = string_make_unibyte (descrip); + AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; + } +#endif /* not HAVE_MULTILINGUAL_MENU */ wv = xmalloc_widget_value (); if (prev_wv) @@ -1559,64 +1556,51 @@ single_submenu (item_key, item_name, maps) return first_wv; } - -extern void EmacsFrameSetCharSize (); -/* Recompute all the widgets of frame F, when the menu bar - has been changed. */ -static void + +/* Recompute all the widgets of frame F, when the menu bar has been + changed. Value is non-zero if widgets were updated. */ + +static int update_frame_menubar (f) FRAME_PTR f; { struct x_output *x = f->output_data.x; int columns, rows; - int menubar_changed; - /* We assume the menubar contents has changed if the global flag is set, - or if the current buffer has changed, or if the menubar has never - been updated before. - */ - menubar_changed = (x->menubar_widget - && !XtIsManaged (x->menubar_widget)); - - if (! (menubar_changed)) - return; + if (!x->menubar_widget || XtIsManaged (x->menubar_widget)) + return 0; BLOCK_INPUT; - /* Save the size of the frame because the pane widget doesn't accept to - resize itself. So force it. */ + /* Save the size of the frame because the pane widget doesn't accept + to resize itself. So force it. */ columns = f->width; rows = f->height; - /* Do the voodoo which means "I'm changing lots of things, don't try to - refigure sizes until I'm done." */ + /* Do the voodoo which means "I'm changing lots of things, don't try + to refigure sizes until I'm done." */ lw_refigure_widget (x->column_widget, False); - /* the order in which children are managed is the top to - bottom order in which they are displayed in the paned window. - First, remove the text-area widget. - */ + /* The order in which children are managed is the top to bottom + order in which they are displayed in the paned window. First, + remove the text-area widget. */ XtUnmanageChild (x->edit_widget); - /* remove the menubar that is there now, and put up the menubar that - should be there. - */ - if (menubar_changed) - { - XtManageChild (x->menubar_widget); - XtMapWidget (x->menubar_widget); - XtVaSetValues (x->menubar_widget, XtNmappedWhenManaged, 1, NULL); - } + /* Remove the menubar that is there now, and put up the menubar that + should be there. */ + XtManageChild (x->menubar_widget); + XtMapWidget (x->menubar_widget); + XtVaSetValues (x->menubar_widget, XtNmappedWhenManaged, 1, NULL); /* Re-manage the text-area widget, and then thrash the sizes. */ XtManageChild (x->edit_widget); - x_set_menu_resources_from_menu_face (f, x->menubar_widget); lw_refigure_widget (x->column_widget, True); /* Force the pane widget to resize itself with the right values. */ EmacsFrameSetCharSize (x->edit_widget, columns, rows); UNBLOCK_INPUT; + return 1; } /* Set the contents of the menubar widgets of frame F. @@ -1693,7 +1677,8 @@ set_frame_menubar (f, first_time, deep_p) set_buffer_internal_1 (XBUFFER (buffer)); /* Run the Lucid hook. */ - call1 (Vrun_hooks, Qactivate_menubar_hook); + safe_run_hooks (Qactivate_menubar_hook); + /* If it has changed current-menubar from previous value, really recompute the menubar from the value. */ if (! NILP (Vlucid_menu_bar_dirty_flag)) @@ -1706,12 +1691,13 @@ set_frame_menubar (f, first_time, deep_p) inhibit_garbage_collection (); /* Save the frame's previous menu bar contents data. */ - bcopy (XVECTOR (f->menu_bar_vector)->contents, previous_items, - previous_menu_items_used * sizeof (Lisp_Object)); + if (previous_menu_items_used) + bcopy (XVECTOR (f->menu_bar_vector)->contents, previous_items, + previous_menu_items_used * sizeof (Lisp_Object)); /* Fill in the current menu bar contents. */ menu_items = f->menu_bar_vector; - menu_items_allocated = XVECTOR (menu_items)->size; + menu_items_allocated = VECTORP (menu_items) ? ASIZE (menu_items) : 0; init_menu_items (); for (i = 0; i < XVECTOR (items)->size; i += 4) { @@ -1881,6 +1867,7 @@ initialize_frame_menubar (f) set_frame_menubar (f, 1, 1); } + /* Get rid of the menu bar of frame F, and free its storage. This is used when deleting a frame, and when turning off the menu bar. */ @@ -1896,8 +1883,37 @@ free_frame_menubar (f) if (menubar_widget) { +#ifdef USE_MOTIF + /* Removing the menu bar magically changes the shell widget's x + and y position of (0, 0) which, when the menu bar is turned + on again, leads to pull-down menuss appearing in strange + positions near the upper-left corner of the display. This + happens only with some window managers like twm and ctwm, + but not with other like Motif's mwm or kwm, because the + latter generate ConfigureNotify events when the menu bar + is switched off, which fixes the shell position. */ + Position x0, y0, x1, y1; +#endif + BLOCK_INPUT; + +#ifdef USE_MOTIF + if (f->output_data.x->widget) + XtVaGetValues (f->output_data.x->widget, XtNx, &x0, XtNy, &y0, NULL); +#endif + lw_destroy_all_widgets ((LWLIB_ID) f->output_data.x->id); + f->output_data.x->menubar_widget = NULL; + +#ifdef USE_MOTIF + if (f->output_data.x->widget) + { + XtVaGetValues (f->output_data.x->widget, XtNx, &x1, XtNy, &y1, NULL); + if (x1 == 0 && y1 == 0) + XtVaSetValues (f->output_data.x->widget, XtNx, x0, XtNy, y0, NULL); + } +#endif + UNBLOCK_INPUT; } } @@ -2017,11 +2033,16 @@ xmenu_show (f, x, y, for_click, keymaps, title, error) /* Create a new pane. */ Lisp_Object pane_name, prefix; char *pane_string; - pane_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_NAME]; - prefix = XVECTOR (menu_items)->contents[i + MENU_ITEMS_PANE_PREFIX]; + + pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME); + prefix = AREF (menu_items, i + MENU_ITEMS_PANE_PREFIX); + #ifndef HAVE_MULTILINGUAL_MENU - if (!NILP (pane_name) && STRING_MULTIBYTE (pane_name)) - pane_name = string_make_unibyte (pane_name); + if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) + { + pane_name = string_make_unibyte (pane_name); + AREF (menu_items, i + MENU_ITEMS_PANE_NAME) = pane_name; + } #endif pane_string = (NILP (pane_name) ? "" : (char *) XSTRING (pane_name)->data); @@ -2061,21 +2082,27 @@ xmenu_show (f, x, y, for_click, keymaps, title, error) { /* Create a new item within current pane. */ Lisp_Object item_name, enable, descrip, def, type, selected, help; - item_name = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_NAME]; - enable = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_ENABLE]; - descrip - = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_EQUIV_KEY]; - def = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_DEFINITION]; - type = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_TYPE]; - selected = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_SELECTED]; - help = XVECTOR (menu_items)->contents[i + MENU_ITEMS_ITEM_HELP]; + item_name = AREF (menu_items, i + MENU_ITEMS_ITEM_NAME); + enable = AREF (menu_items, i + MENU_ITEMS_ITEM_ENABLE); + descrip = AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY); + def = AREF (menu_items, i + MENU_ITEMS_ITEM_DEFINITION); + type = AREF (menu_items, i + MENU_ITEMS_ITEM_TYPE); + selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); + help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); #ifndef HAVE_MULTILINGUAL_MENU if (STRINGP (item_name) && STRING_MULTIBYTE (item_name)) - item_name = string_make_unibyte (item_name); + { + item_name = string_make_unibyte (item_name); + AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name; + } + if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) - item_name = string_make_unibyte (descrip); -#endif + { + descrip = string_make_unibyte (descrip); + AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip; + } +#endif /* not HAVE_MULTILINGUAL_MENU */ wv = xmalloc_widget_value (); if (prev_wv) @@ -2129,6 +2156,7 @@ xmenu_show (f, x, y, for_click, keymaps, title, error) if (STRING_MULTIBYTE (title)) title = string_make_unibyte (title); #endif + wv_title->name = (char *) XSTRING (title)->data; wv_title->enabled = True; wv_title->button_type = BUTTON_TYPE_NONE; @@ -2200,9 +2228,6 @@ xmenu_show (f, x, y, for_click, keymaps, title, error) /* Free the widget_value objects we used to specify the contents. */ free_menubar_widget_value_tree (first_wv); - /* Override any default settings with ones from the `menu' face. */ - x_set_menu_resources_from_menu_face (f, menu); - /* No selection has been chosen yet. */ menu_item_selection = 0; @@ -2213,17 +2238,6 @@ xmenu_show (f, x, y, for_click, keymaps, title, error) /* Process events that apply to the menu. */ popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id); -#ifdef LESSTIF_VERSION - /* Nov 1998: For an unknown reason a button grab remains active - after the popup menu has gone. */ - XUngrabButton (XtDisplay (f->output_data.x->widget), - AnyButton, AnyModifier, - XtWindow (f->output_data.x->widget)); - XUngrabButton (XtDisplay (f->output_data.x->edit_widget), - AnyButton, AnyModifier, - XtWindow (f->output_data.x->edit_widget)); -#endif /* LESSTIF_VERSION */ - /* fp turned off the following statement and wrote a comment that it is unnecessary--that the menu has already disappeared. Nowadays the menu disappears ok, all right, but @@ -2721,10 +2735,8 @@ xmenu_show (f, x, y, for_click, keymaps, title, error) /* All set and ready to fly. */ XMenuRecompute (FRAME_X_DISPLAY (f), menu); - dispwidth = DisplayWidth (FRAME_X_DISPLAY (f), - XScreenNumberOfScreen (FRAME_X_SCREEN (f))); - dispheight = DisplayHeight (FRAME_X_DISPLAY (f), - XScreenNumberOfScreen (FRAME_X_SCREEN (f))); + dispwidth = DisplayWidth (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); + dispheight = DisplayHeight (FRAME_X_DISPLAY (f), FRAME_X_SCREEN_NUMBER (f)); x = min (x, dispwidth); y = min (y, dispheight); x = max (x, 1); @@ -2837,9 +2849,9 @@ syms_of_xmenu () Qdebug_on_next_call = intern ("debug-on-next-call"); staticpro (&Qdebug_on_next_call); - DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame, - "Frame for which we are updating a menu.\n\ -The enable predicate for a menu command should check this variable."); + DEFVAR_LISP ("menu-updating-frame", &Vmenu_updating_frame + /* Frame for which we are updating a menu. +The enable predicate for a menu command should check this variable. */); Vmenu_updating_frame = Qnil; #ifdef USE_X_TOOLKIT