changeset 49302:17a9a82ad89f

(mouse_position_for_popup): New function. (Fx_popup_menu): Call mouse_position_for_popup for X and mouse_position_hook for others.
author Jan Djärv <jan.h.d@swipnet.se>
date Sat, 18 Jan 2003 09:55:37 +0000
parents 8d203a2bfdef
children 87cedc1fb60b
files src/xmenu.c
diffstat 1 files changed, 81 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/src/xmenu.c	Sat Jan 18 03:19:28 2003 +0000
+++ b/src/xmenu.c	Sat Jan 18 09:55:37 2003 +0000
@@ -669,6 +669,56 @@
     }
 }
 
+#ifdef HAVE_X_WINDOWS
+/* Return the mouse position in *X and *Y.  The coordinates are window
+   relative for the edit window in frame F.
+   This is for Fx_popup_menu.  The mouse_position_hook can not
+   be used for X, as it returns window relative coordinates
+   for the window where the mouse is in.  This could be the menu bar,
+   the scroll bar or the edit window.  Fx_popup_menu needs to be
+   sure it is the edit window.  */
+static void
+mouse_position_for_popup(f, x, y)
+     FRAME_PTR f;
+     int *x;
+     int *y;
+{
+  Window root, dummy_window;
+  int dummy;
+
+  BLOCK_INPUT;
+          
+  XQueryPointer (FRAME_X_DISPLAY (f),
+                 DefaultRootWindow (FRAME_X_DISPLAY (f)),
+
+                 /* The root window which contains the pointer.  */
+                 &root,
+
+                 /* Window pointer is on, not used  */
+                 &dummy_window,
+
+                 /* The position on that root window.  */
+                 x, y,
+
+                 /* x/y in dummy_window coordinates, not used.  */
+                 &dummy, &dummy,
+
+                 /* Modifier keys and pointer buttons, about which
+                    we don't care.  */
+                 (unsigned int *) &dummy);
+
+  UNBLOCK_INPUT;
+
+  /* xmenu_show expects window coordinates, not root window
+     coordinates.  Translate.  */
+  *x -= f->output_data.x->left_pos
+    + FRAME_OUTER_TO_INNER_DIFF_X (f);
+  *y -= f->output_data.x->top_pos
+    + FRAME_OUTER_TO_INNER_DIFF_Y (f);
+}
+
+#endif /* HAVE_X_WINDOWS */
+
 DEFUN ("x-popup-menu", Fx_popup_menu, Sx_popup_menu, 2, 2, 0,
        doc: /* Pop up a deck-of-cards menu and return user's selection.
 POSITION is a position specification.  This is either a mouse button event
@@ -730,44 +780,38 @@
 	{
 	  /* Use the mouse's current position.  */
 	  FRAME_PTR new_f = SELECTED_FRAME ();
-          Window root, dummy_window;
-          int cur_x, cur_y, dummy;
-
-          BLOCK_INPUT;
+#ifdef HAVE_X_WINDOWS
+          /* Can't use mouse_position_hook for X since it returns
+             coordinates relative to the window the mouse is in,
+             we need coordinates relative to the edit widget always.  */
+          if (new_f != 0)
+            {
+              int cur_x, cur_y;
+
+              mouse_position_for_popup (new_f, &cur_x, &cur_y);
+              /* cur_x/y may be negative, so use make_number.  */
+              x = make_number (cur_x);
+              y = make_number (cur_y);
+            }
           
-          XQueryPointer (FRAME_X_DISPLAY (new_f),
-                         DefaultRootWindow (FRAME_X_DISPLAY (new_f)),
-
-                         /* The root window which contains the pointer.  */
-                         &root,
-
-                         /* Window pointer is on, not used  */
-                         &dummy_window,
-
-                         /* The position on that root window.  */
-                         &cur_x, &cur_y,
-
-                         /* x/y in dummy_window coordinates, not used.  */
-                         &dummy, &dummy,
-
-                         /* Modifier keys and pointer buttons, about which
-                            we don't care.  */
-                         (unsigned int *) &dummy);
-
-          UNBLOCK_INPUT;
-
-          /* xmenu_show expects window coordinates, not root window
-             coordinates.  Translate.  */
-          cur_x -= new_f->output_data.x->left_pos
-            + FRAME_OUTER_TO_INNER_DIFF_X (new_f);
-          cur_y -= new_f->output_data.x->top_pos
-            + FRAME_OUTER_TO_INNER_DIFF_Y (new_f);
-
-          /* cur_x/y may be negative, so use make_number.  */
-          x = make_number (cur_x);
-          y = make_number (cur_y);
-
-          XSETFRAME (window, new_f);
+#else /* not HAVE_X_WINDOWS */
+	  Lisp_Object bar_window;
+	  enum scroll_bar_part part;
+	  unsigned long time;
+
+	  if (mouse_position_hook)
+	    (*mouse_position_hook) (&new_f, 1, &bar_window,
+				    &part, &x, &y, &time);
+#endif /* not HAVE_X_WINDOWS */
+
+	  if (new_f != 0)
+	    XSETFRAME (window, new_f);
+	  else
+	    {
+	      window = selected_window;
+	      XSETFASTINT (x, 0);
+	      XSETFASTINT (y, 0);
+	    }
 	}
       else
 	{