emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 409f0430b6: Fix click position to menu bar entry with no-toolkit


From: Po Lu
Subject: master 409f0430b6: Fix click position to menu bar entry with no-toolkit
Date: Fri, 18 Nov 2022 19:24:46 -0500 (EST)

branch: master
commit 409f0430b6a0c138836e5067141bf6b2a7beb6b3
Author: Manuel Giraud <manuel@ledu-giraud.fr>
Commit: Po Lu <luangruo@yahoo.com>

    Fix click position to menu bar entry with no-toolkit
    
    * src/keyboard.c (make_lispy_event): Use x_y_to_hpos_vpos to
    compute correct menu bar position should the menu face change.
    * src/xdisp.c (x_y_to_hpos_vpos): Not static anymore.
    * src/dispextern.h: Export x_y_to_hpos_vpos.
---
 src/dispextern.h |  3 ++-
 src/keyboard.c   | 18 ++++++++++++++++--
 src/xdisp.c      |  2 +-
 3 files changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/dispextern.h b/src/dispextern.h
index 2f5f4335fe..2afbdeabaa 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3495,7 +3495,8 @@ extern bool cursor_in_mouse_face_p (struct window *w);
 extern void tty_draw_row_with_mouse_face (struct window *, struct glyph_row *,
                                          int, int, enum draw_glyphs_face);
 extern void display_tty_menu_item (const char *, int, int, int, int, bool);
-
+extern struct glyph *x_y_to_hpos_vpos (struct window *, int, int, int *, int *,
+                                      int *, int *, int *);
 /* Flags passed to try_window.  */
 #define TRY_WINDOW_CHECK_MARGINS       (1 << 0)
 #define TRY_WINDOW_IGNORE_FONTS_CHANGE (1 << 1)
diff --git a/src/keyboard.c b/src/keyboard.c
index 069cf0627b..6ce6ce17f2 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -5974,8 +5974,22 @@ make_lispy_event (struct input_event *event)
               in a menu (non-toolkit version).  */
            if (!toolkit_menubar_in_use (f))
              {
-               pixel_to_glyph_coords (f, XFIXNUM (event->x), XFIXNUM 
(event->y),
-                                      &column, &row, NULL, 1);
+#if defined HAVE_WINDOW_SYSTEM
+               if (FRAME_WINDOW_P (f))
+                 {
+                   struct window *menu_w = XWINDOW (f->menu_bar_window);
+                   int x, y, dummy;
+
+                   x = FRAME_TO_WINDOW_PIXEL_X (menu_w, XFIXNUM (event->x));
+                   y = FRAME_TO_WINDOW_PIXEL_Y (menu_w, XFIXNUM (event->y));
+
+                   x_y_to_hpos_vpos (XWINDOW (f->menu_bar_window), x, y, 
&column, &row,
+                                     NULL, NULL, &dummy);
+                 }
+               else
+#endif
+                 pixel_to_glyph_coords (f, XFIXNUM (event->x), XFIXNUM 
(event->y),
+                                        &column, &row, NULL, 1);
 
                /* In the non-toolkit version, clicks on the menu bar
                   are ordinary button events in the event buffer.
diff --git a/src/xdisp.c b/src/xdisp.c
index f8fc0f5787..b5f013ea6a 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -2330,7 +2330,7 @@ pixel_to_glyph_coords (struct frame *f, int pix_x, int 
pix_y, int *x, int *y,
    text, or we can't tell because W's current matrix is not up to
    date.  */
 
-static struct glyph *
+struct glyph *
 x_y_to_hpos_vpos (struct window *w, int x, int y, int *hpos, int *vpos,
                  int *dx, int *dy, int *area)
 {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]