summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1994-03-20 07:05:38 +0000
committerRichard M. Stallman <rms@gnu.org>1994-03-20 07:05:38 +0000
commit99fe880dc3e3e7d03db81657b76db196f9f2acfd (patch)
tree71206b600b8358450d8505cb09f3cd0b5193cd61
parent6f4387dde1fb5ec85af13b1beb91ff525aedc4d6 (diff)
downloademacs-99fe880dc3e3e7d03db81657b76db196f9f2acfd.tar.gz
(xdialog_show): Delete args x, y.
(Fx_popup_dialog): Don't pass those args; don't compute them. Second arg is now just one pane. Lots of simplification. Always start by decoding POSITION arg to get a frame. [! USE_X_TOOLKIT]: Put the menu in middle of that frame.
-rw-r--r--src/xmenu.c218
1 files changed, 77 insertions, 141 deletions
diff --git a/src/xmenu.c b/src/xmenu.c
index 4a8fb70d221..354bf778f01 100644
--- a/src/xmenu.c
+++ b/src/xmenu.c
@@ -836,166 +836,104 @@ cached information about equivalent key sequences.")
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 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 characters 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\
-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\
-Alternatively, you can specify a menu of multiple panes\n\
- with a list of the form (TITLE PANE),\n\
-where 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\
-Dialog boxes do not support multiple panes.\n\
-With this form of menu, the return value is VALUE from the chosen item.\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\
-If POSITION is nil, don't display the menu at all, just precalculate the\n\
-cached information about equivalent key sequences.")
- (position, menu)
- Lisp_Object position, menu;
+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.")
+ (position, contents)
+ Lisp_Object position, contents;
{
-#ifndef USE_X_TOOLKIT
- return Fx_popup_menu (position, menu);
-#else
- int number_of_panes, panes;
- Lisp_Object keymap, tem;
- int xpos, ypos;
- Lisp_Object title;
- char *error_name;
- Lisp_Object selection;
- int i, j;
FRAME_PTR f;
- Lisp_Object x, y, window;
- int keymaps = 0;
- int menubarp = 0;
- struct gcpro gcpro1;
+ Lisp_Object window;
check_x ();
- if (! NILP (position))
+ /* Decode the first argument: find the window or frame to use. */
+ if (EQ (position, Qt))
{
- /* Decode the first argument: find the window and the coordinates. */
- if (EQ (position, Qt))
- {
- /* Use the mouse's current position. */
- FRAME_PTR new_f = 0;
- Lisp_Object bar_window;
- int part;
- unsigned long time;
+ /* Use the mouse's current position. */
+ FRAME_PTR new_f = 0;
+ Lisp_Object bar_window;
+ int part;
+ unsigned long time;
+ Lisp_Object x, y;
- (*mouse_position_hook) (&new_f, &bar_window, &part, &x, &y, &time);
+ (*mouse_position_hook) (&new_f, &bar_window, &part, &x, &y, &time);
- if (new_f != 0)
- XSET (window, Lisp_Frame, new_f);
- else
- {
- window = selected_window;
- XFASTINT (x) = 0;
- XFASTINT (y) = 0;
- }
- }
+ if (new_f != 0)
+ XSET (window, Lisp_Frame, new_f);
+ else
+ window = selected_window;
+ }
+ else if (CONSP (position))
+ {
+ Lisp_Object tem;
+ tem = Fcar (position);
+ if (XTYPE (tem) == Lisp_Cons)
+ window = Fcar (Fcdr (position));
else
{
- tem = Fcar (position);
- if (XTYPE (tem) == Lisp_Cons)
- {
- window = Fcar (Fcdr (position));
- x = Fcar (tem);
- y = Fcar (Fcdr (tem));
- }
- else
- {
- tem = Fcar (Fcdr (position)); /* EVENT_START (position) */
- window = Fcar (tem); /* POSN_WINDOW (tem) */
- tem = Fcar (Fcdr (Fcdr (tem))); /* POSN_WINDOW_POSN (tem) */
- x = Fcar (tem);
- y = Fcdr (tem);
-
- /* Determine whether this menu is handling a menu bar click. */
- tem = Fcar (Fcdr (Fcar (Fcdr (position))));
- if (XTYPE (Fcar (position)) != Lisp_Cons
- && CONSP (tem)
- && EQ (Fcar (tem), Qmenu_bar))
- menubarp = 1;
- }
- }
-
- CHECK_NUMBER (x, 0);
- CHECK_NUMBER (y, 0);
-
- /* Decode where to put the menu. */
-
- if (XTYPE (window) == Lisp_Frame)
- {
- f = XFRAME (window);
-
- xpos = 0;
- ypos = 0;
- }
- else if (XTYPE (window) == Lisp_Window)
- {
- CHECK_LIVE_WINDOW (window, 0);
- f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
-
- xpos = (FONT_WIDTH (f->display.x->font) * XWINDOW (window)->left);
- ypos = (FONT_HEIGHT (f->display.x->font) * XWINDOW (window)->top);
+ tem = Fcar (Fcdr (position)); /* EVENT_START (position) */
+ window = Fcar (tem); /* POSN_WINDOW (tem) */
}
- else
- /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME,
- but I don't want to make one now. */
- CHECK_WINDOW (window, 0);
-
- xpos += XINT (x);
- ypos += XINT (y);
}
+ else if (WINDOWP (position) || FRAMEP (position))
+ window = position;
- title = Qnil;
- GCPRO1 (title);
+ /* Decode where to put the menu. */
- /* Decode the dialog items from what was specified. */
+ if (XTYPE (window) == Lisp_Frame)
+ f = XFRAME (window);
+ else if (XTYPE (window) == Lisp_Window)
{
- /* We were given an old-fashioned menu. */
- title = Fcar (menu);
- CHECK_STRING (title, 1);
-
- list_of_panes (Fcdr (menu));
-
- keymaps = 0;
- }
-
- if (NILP (position))
- {
- discard_menu_items ();
- UNGCPRO;
- return Qnil;
+ CHECK_LIVE_WINDOW (window, 0);
+ f = XFRAME (WINDOW_FRAME (XWINDOW (window)));
}
+ else
+ /* ??? Not really clean; should be CHECK_WINDOW_OR_FRAME,
+ but I don't want to make one now. */
+ CHECK_WINDOW (window, 0);
- /* Display them in a dialog box. */
- BLOCK_INPUT;
+#ifndef USE_X_TOOLKIT
+ /* Display a menu with these alternatives
+ in the middle of frame F. */
+ {
+ Lisp_Object x, y, frame, newpos;
+ XSET (frame, Lisp_Frame, f);
+ XSET (x, Lisp_Int, x_pixel_width (f) / 2);
+ XSET (y, Lisp_Int, x_pixel_height (f) / 2);
+ newpos = Fcons (Fcons (x, Fcons (y, Qnil)), Fcons (frame, Qnil));
+
+ return Fx_popup_menu (newpos,
+ Fcons (Fcar (contents), Fcons (contents, Qnil)));
+ }
+#else
+ {
+ Lisp_Object title;
+ char *error_name;
+ Lisp_Object selection;
- selection = xdialog_show (f, xpos, ypos, menubarp,
- keymaps, title, &error_name);
- UNBLOCK_INPUT;
+ /* Decode the dialog items from what was specified. */
+ title = Fcar (contents);
+ CHECK_STRING (title, 1);
- discard_menu_items ();
+ list_of_panes (Fcons (contents, Qnil));
- UNGCPRO;
+ /* Display them in a dialog box. */
+ BLOCK_INPUT;
+ selection = xdialog_show (f, 0, 0, title, &error_name);
+ UNBLOCK_INPUT;
- if (error_name) error (error_name);
- return selection;
+ discard_menu_items ();
+
+ if (error_name) error (error_name);
+ return selection;
+ }
#endif
}
@@ -1753,10 +1691,8 @@ static char * button_names [] = {
"button6", "button7", "button8", "button9", "button10" };
static Lisp_Object
-xdialog_show (f, x, y, menubarp, keymaps, title, error)
+xdialog_show (f, menubarp, keymaps, title, error)
FRAME_PTR f;
- int x;
- int y;
int menubarp;
int keymaps;
Lisp_Object title;