]> git.eshelyaron.com Git - emacs.git/commitdiff
Support for menu bar in window_from_coordinates
authorManuel Giraud <manuel@ledu-giraud.fr>
Sat, 21 Oct 2023 12:36:24 +0000 (14:36 +0200)
committerPo Lu <luangruo@yahoo.com>
Sat, 28 Oct 2023 05:28:07 +0000 (13:28 +0800)
* src/window.h:
* src/window.c (window_from_coordinates): In the no toolkit
build, add support for the menu bar window.  Add a new
'menu_bar_p' argument so the function's signature has changed.
All callers changed.

* src/androidterm.c (handle_one_android_event):
* src/haikuterm.c (haiku_read_socket):
* src/keyboard.c (make_lispy_position):
* src/nsterm.m ([EmacsView mouseDown:]):
* src/pgtkterm.c (button_event):
* src/w32term.c (w32_read_socket):
* src/xdisp.c (note_mouse_highlight):
* src/xterm.c (handle_one_xevent): Set menu_bar_p to true.

12 files changed:
src/androidterm.c
src/haikuterm.c
src/keyboard.c
src/msdos.c
src/nsterm.m
src/pgtkterm.c
src/w32inevt.c
src/w32term.c
src/window.c
src/window.h
src/xdisp.c
src/xterm.c

index e87f7ca2d1491d933aa3cbc424b14f8b6e7e99e4..4a479daf45279346f84bc787144bb22912011623 100644 (file)
@@ -1141,7 +1141,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
              Lisp_Object window
                = window_from_coordinates (f, event->xmotion.x,
                                           event->xmotion.y, 0,
-                                          false, false);
+                                          false, false, false);
 
              /* A window will be autoselected only when it is not
                 selected now and the last mouse movement event was
@@ -1290,7 +1290,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
              int x = event->xbutton.x;
              int y = event->xbutton.y;
 
-             window = window_from_coordinates (f, x, y, 0, true, true);
+             window = window_from_coordinates (f, x, y, 0, true, true, true);
              tab_bar_p = EQ (window, f->tab_bar_window);
 
              if (tab_bar_p)
@@ -1312,7 +1312,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
              int x = event->xbutton.x;
              int y = event->xbutton.y;
 
-             window = window_from_coordinates (f, x, y, 0, true, true);
+             window = window_from_coordinates (f, x, y, 0, true, true, true);
              tool_bar_p = (EQ (window, f->tool_bar_window)
                            && ((event->xbutton.type
                                 != ANDROID_BUTTON_RELEASE)
@@ -1408,7 +1408,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
          int y = event->touch.y;
 
          window = window_from_coordinates (any, x, y, 0, true,
-                                           true);
+                                           true, true);
 
          /* If this touch has started in the tool bar, do not
             send it to Lisp.  Instead, simulate a tool bar
@@ -1605,7 +1605,7 @@ handle_one_android_event (struct android_display_info *dpyinfo,
          /* Figure out how much to scale the deltas by.  */
          window = window_from_coordinates (any, event->wheel.x,
                                            event->wheel.y, NULL,
-                                           false, false);
+                                           false, false, false);
 
          if (WINDOWP (window))
            scroll_height = XWINDOW (window)->pixel_height;
index b1a016b49a96556d8b829e6250570dda771197b7..bcb5055ea4282abc45e8b216871ff1785f6347e6 100644 (file)
@@ -3472,7 +3472,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
                if (!NILP (Vmouse_autoselect_window))
                  {
                    static Lisp_Object last_mouse_window;
-                   Lisp_Object window = window_from_coordinates (f, b->x, b->y, 0, 0, 0);
+                   Lisp_Object window = window_from_coordinates (f, b->x, b->y, 0, 0, 0, 0);
 
                    if (WINDOWP (window)
                        && !EQ (window, last_mouse_window)
@@ -3555,7 +3555,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
                int x = b->x;
                int y = b->y;
 
-               window = window_from_coordinates (f, x, y, 0, true, true);
+               window = window_from_coordinates (f, x, y, 0, true, true, true);
                tab_bar_p = EQ (window, f->tab_bar_window);
 
                if (tab_bar_p)
@@ -3573,7 +3573,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
                int x = b->x;
                int y = b->y;
 
-               window = window_from_coordinates (f, x, y, 0, true, true);
+               window = window_from_coordinates (f, x, y, 0, true, true, true);
                tool_bar_p = (EQ (window, f->tool_bar_window)
                              && (type != BUTTON_UP
                                  || f->last_tool_bar_item != -1));
@@ -3834,7 +3834,7 @@ haiku_read_socket (struct terminal *terminal, struct input_event *hold_quit)
 
            BView_get_mouse (FRAME_HAIKU_VIEW (f), &x, &y);
 
-           wheel_window = window_from_coordinates (f, x, y, 0, false, false);
+           wheel_window = window_from_coordinates (f, x, y, 0, false, false, false);
 
            if (NILP (wheel_window))
              {
index dc2f78a7c26c94ca2bb8b6ff7c5453982f74a7ea..c00f48d7836001c58c7b1be4239b2f791f94ba80 100644 (file)
@@ -5562,7 +5562,7 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
   int xret = 0, yret = 0;
   /* The window or frame under frame pixel coordinates (x,y)  */
   Lisp_Object window_or_frame = f
-    ? window_from_coordinates (f, mx, my, &part, true, true)
+    ? window_from_coordinates (f, mx, my, &part, true, true, true)
     : Qnil;
 #ifdef HAVE_WINDOW_SYSTEM
   bool tool_bar_p = false;
index 1b7f2d4ae21d74ca0440a22ccc8cd64840ea2ed4..5dd7c1573c49652ce7c28d8fbf9d62ff5ca531db 100644 (file)
@@ -2662,7 +2662,7 @@ dos_rawgetc (void)
              static Lisp_Object last_mouse_window;
 
              mouse_window = window_from_coordinates
-               (SELECTED_FRAME (), mouse_last_x, mouse_last_y, 0, 0, 0);
+               (SELECTED_FRAME (), mouse_last_x, mouse_last_y, 0, 0, 0, 0);
              /* A window will be selected only when it is not
                 selected now, and the last mouse movement event was
                 not in it.  A minibuffer window will be selected iff
index 11535f071eb04dcd2b74e86fb8526950a294883c..46a5e8870e8de5847195e434aaefdf5795d61894 100644 (file)
@@ -7412,7 +7412,7 @@ ns_in_echo_area (void)
          int x = lrint (p.x);
          int y = lrint (p.y);
 
-         window = window_from_coordinates (emacsframe, x, y, 0, true, true);
+         window = window_from_coordinates (emacsframe, x, y, 0, true, true, true);
          tab_bar_p = EQ (window, emacsframe->tab_bar_window);
 
          if (tab_bar_p)
@@ -7518,7 +7518,7 @@ ns_in_echo_area (void)
       NSTRACE_MSG ("mouse_autoselect_window");
       static Lisp_Object last_mouse_window;
       Lisp_Object window
-       = window_from_coordinates (emacsframe, pt.x, pt.y, 0, 0, 0);
+       = window_from_coordinates (emacsframe, pt.x, pt.y, 0, 0, 0, 0);
 
       if (WINDOWP (window)
           && !EQ (window, last_mouse_window)
index a7c687d811d47a36236ae6fe6c2867b43e555c3e..461c9d6d8990f3477052b5f4e454f84a24e5987b 100644 (file)
@@ -5894,7 +5894,7 @@ motion_notify_event (GtkWidget *widget, GdkEvent *event,
        {
          static Lisp_Object last_mouse_window;
          Lisp_Object window = window_from_coordinates
-           (f, event->motion.x, event->motion.y, 0, false, false);
+           (f, event->motion.x, event->motion.y, 0, false, false, false);
 
          /* A window will be autoselected only when it is not
             selected now and the last mouse movement event was
@@ -6047,7 +6047,7 @@ button_event (GtkWidget *widget, GdkEvent *event,
          int x = event->button.x;
          int y = event->button.y;
 
-         window = window_from_coordinates (f, x, y, 0, true, true);
+         window = window_from_coordinates (f, x, y, 0, true, true, true);
          tab_bar_p = EQ (window, f->tab_bar_window);
 
          if (tab_bar_p)
index 29717954cfd33aca008c2135e4f8491e05d335b1..630a9f4e5fbddc52158570ee2cd45736add21183 100644 (file)
@@ -496,7 +496,7 @@ do_mouse_event (MOUSE_EVENT_RECORD *event,
            if (!NILP (Vmouse_autoselect_window))
              {
                Lisp_Object mouse_window = window_from_coordinates (f, mx, my,
-                                                                   0, 0, 0);
+                                                                   0, 0, 0, 0);
                /* A window will be selected only when it is not
                   selected now, and the last mouse movement event was
                   not in it.  A minibuffer window will be selected iff
index a5f17a18213a0df0a1b1ddef52372a90f597c841..301d8f4ef121e353fed8ebfdeceaae3a14b8f129 100644 (file)
@@ -3376,7 +3376,7 @@ w32_construct_mouse_wheel (struct input_event *result, W32Msg *msg,
       if (w32_wheel_scroll_lines == UINT_MAX)
        {
          Lisp_Object window = window_from_coordinates (f, p.x, p.y, NULL,
-                                                       false, false);
+                                                       false, false, false);
          if (!WINDOWP (window))
            {
              result->kind = NO_EVENT;
@@ -5335,7 +5335,7 @@ w32_read_socket (struct terminal *terminal,
                {
                  static Lisp_Object last_mouse_window;
                  Lisp_Object window = window_from_coordinates
-                   (f, LOWORD (msg.msg.lParam), HIWORD (msg.msg.lParam), 0, 0, 0);
+                   (f, LOWORD (msg.msg.lParam), HIWORD (msg.msg.lParam), 0, 0, 0, 0);
 
                  /* Window will be selected only when it is not
                     selected now and last mouse movement event was
@@ -5407,7 +5407,7 @@ w32_read_socket (struct terminal *terminal,
                    int x = XFIXNAT (inev.x);
                    int y = XFIXNAT (inev.y);
 
-                    window = window_from_coordinates (f, x, y, 0, 1, 1);
+                    window = window_from_coordinates (f, x, y, 0, 1, 1, 1);
 
                     if (EQ (window, f->tab_bar_window))
                       {
@@ -5435,7 +5435,7 @@ w32_read_socket (struct terminal *terminal,
                    int x = XFIXNAT (inev.x);
                    int y = XFIXNAT (inev.y);
 
-                    window = window_from_coordinates (f, x, y, 0, 1, 1);
+                    window = window_from_coordinates (f, x, y, 0, 1, 1, 1);
 
                     if (EQ (window, f->tool_bar_window)
                        /* Make sure the tool bar was previously
index 968b982c135714012b8426675d5a0c0a49308bfc..e802ffb3fe2602ffb02f731c58cd3d267800ff34 100644 (file)
@@ -1680,7 +1680,8 @@ check_window_containing (struct window *w, void *user_data)
 
 Lisp_Object
 window_from_coordinates (struct frame *f, int x, int y,
-                        enum window_part *part, bool tab_bar_p, bool tool_bar_p)
+                        enum window_part *part, bool menu_bar_p,
+                        bool tab_bar_p, bool tool_bar_p)
 {
   Lisp_Object window;
   struct check_window_data cw;
@@ -1693,6 +1694,21 @@ window_from_coordinates (struct frame *f, int x, int y,
   cw.window = &window, cw.x = x, cw.y = y; cw.part = part;
   foreach_window (f, check_window_containing, &cw);
 
+#if defined (HAVE_WINDOW_SYSTEM) && ! defined (HAVE_EXT_MENU_BAR)
+  /* If not found above, see if it's in the menu bar window, if a menu
+     bar exists.  */
+  if (NILP (window)
+      && menu_bar_p
+      && WINDOWP (f->menu_bar_window)
+      && WINDOW_TOTAL_LINES (XWINDOW (f->menu_bar_window)) > 0
+      && (coordinates_in_window (XWINDOW (f->menu_bar_window), x, y)
+         != ON_NOTHING))
+    {
+      *part = ON_TEXT;
+      window = f->menu_bar_window;
+    }
+#endif
+
 #if defined (HAVE_WINDOW_SYSTEM)
   /* If not found above, see if it's in the tab bar window, if a tab
      bar exists.  */
@@ -1746,7 +1762,7 @@ function returns nil.  */)
                                   + FRAME_INTERNAL_BORDER_WIDTH (f)),
                                  (FRAME_PIXEL_Y_FROM_CANON_Y (f, y)
                                   + FRAME_INTERNAL_BORDER_WIDTH (f)),
-                                 0, false, false);
+                                 0, false, false, false);
 }
 
 ptrdiff_t
index 413293420fd65be41ae4f61ab3cdd15959b4107b..9ef8434af18b4a7b66e964ef1516f5139a454e04 100644 (file)
@@ -1111,7 +1111,7 @@ extern Lisp_Object minibuf_selected_window;
 
 extern Lisp_Object make_window (void);
 extern Lisp_Object window_from_coordinates (struct frame *, int, int,
-                                            enum window_part *, bool, bool);
+                                            enum window_part *, bool, bool, bool);
 extern void resize_frame_windows (struct frame *, int, bool);
 extern void restore_window_configuration (Lisp_Object);
 extern void delete_all_child_windows (Lisp_Object);
index b9009df5df98b301c40192e903881d2ae7ca738a..578131a40058c7ec89444784d9e992d85ee01d53 100644 (file)
@@ -2778,7 +2778,7 @@ remember_mouse_glyph (struct frame *f, int gx, int gy, NativeRectangle *rect)
       goto virtual_glyph;
     }
   else if (!f->glyphs_initialized_p
-          || (window = window_from_coordinates (f, gx, gy, &part, false, false),
+          || (window = window_from_coordinates (f, gx, gy, &part, false, false, false),
               NILP (window)))
     {
       width = FRAME_SMALLEST_CHAR_WIDTH (f);
@@ -35438,7 +35438,7 @@ note_mouse_highlight (struct frame *f, int x, int y)
     return;
 
   /* Which window is that in?  */
-  window = window_from_coordinates (f, x, y, &part, true, true);
+  window = window_from_coordinates (f, x, y, &part, true, true, true);
 
   /* If displaying active text in another window, clear that.  */
   if (! EQ (window, hlinfo->mouse_face_window)
index 5d491e63778db2d2abee2b6bb42a14a6c479fc41..d01c4da05647294acbdebff9281c200aaf880892 100644 (file)
@@ -21171,7 +21171,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                  }
 
                Lisp_Object window = window_from_coordinates
-                 (f, xmotion.x, xmotion.y, 0, false, false);
+                 (f, xmotion.x, xmotion.y, 0, false, false, false);
 
                /* A window will be autoselected only when it is not
                   selected now and the last mouse movement event was
@@ -21902,7 +21902,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                 int x = event->xbutton.x;
                 int y = event->xbutton.y;
 
-                window = window_from_coordinates (f, x, y, 0, true, true);
+                window = window_from_coordinates (f, x, y, 0, true, true, true);
                 tab_bar_p = EQ (window, f->tab_bar_window);
 
                 if (tab_bar_p)
@@ -21923,7 +21923,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                 int x = event->xbutton.x;
                 int y = event->xbutton.y;
 
-                window = window_from_coordinates (f, x, y, 0, true, true);
+                window = window_from_coordinates (f, x, y, 0, true, true, true);
                 tool_bar_p = (EQ (window, f->tool_bar_window)
                              && (event->xbutton.type != ButtonRelease
                                  || f->last_tool_bar_item != -1));
@@ -22656,7 +22656,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                            continue;
 
                          window = window_from_coordinates (f, real_x, real_y, NULL,
-                                                           false, false);
+                                                           false, false, false);
 
                          if (WINDOWP (window))
                            scroll_height = XWINDOW (window)->pixel_height;
@@ -23099,7 +23099,8 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                          || !NILP (focus_follows_mouse)))
                    {
                      static Lisp_Object last_mouse_window;
-                     Lisp_Object window = window_from_coordinates (f, ev.x, ev.y, 0, false, false);
+                     Lisp_Object window = window_from_coordinates (f, ev.x, ev.y, 0, false, false,
+                                                                   false);
 
                      /* A window will be autoselected only when it is not
                         selected now and the last mouse movement event was
@@ -23677,7 +23678,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      int x = bv.x;
                      int y = bv.y;
 
-                     window = window_from_coordinates (f, x, y, 0, true, true);
+                     window = window_from_coordinates (f, x, y, 0, true, true, true);
                      tab_bar_p = EQ (window, f->tab_bar_window);
 
                      if (tab_bar_p)
@@ -23698,7 +23699,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                      int x = bv.x;
                      int y = bv.y;
 
-                     window = window_from_coordinates (f, x, y, 0, true, true);
+                     window = window_from_coordinates (f, x, y, 0, true, true, true);
                      /* Ignore button release events if the mouse
                         wasn't previously pressed on the tool bar.
                         We do this because otherwise selecting some
@@ -24704,7 +24705,7 @@ handle_one_xevent (struct x_display_info *dpyinfo,
                  int x = xev->event_x;
                  int y = xev->event_y;
 
-                 window = window_from_coordinates (f, x, y, 0, true, true);
+                 window = window_from_coordinates (f, x, y, 0, true, true, true);
                  /* Ignore button release events if the mouse
                     wasn't previously pressed on the tool bar.
                     We do this because otherwise selecting some