aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGerd Möllmann2025-01-23 15:30:30 +0100
committerGerd Möllmann2025-01-23 15:34:36 +0100
commitd83d090de1127d6e88e4ff33a617d8621a85a8cd (patch)
treed3e7d78599afb1b17de2840cef2e78e063ed7d43 /src
parentda3b93ff9658481fa81a1dbd49618ed8792f9f3b (diff)
downloademacs-d83d090de1127d6e88e4ff33a617d8621a85a8cd.tar.gz
emacs-d83d090de1127d6e88e4ff33a617d8621a85a8cd.zip
Handle tty menus overlapping child frames
* src/dispnew.c (frame_pos_abs, is_frame_ancestor): Make externally visible. * src/dispextern.h: Declare above functions. * src/term.c (mouse_get_xy): Handle mouse movement over child frames.
Diffstat (limited to 'src')
-rw-r--r--src/dispextern.h2
-rw-r--r--src/dispnew.c4
-rw-r--r--src/term.c17
3 files changed, 11 insertions, 12 deletions
diff --git a/src/dispextern.h b/src/dispextern.h
index ccf0aebd7c6..1060895d0f4 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3958,6 +3958,8 @@ void combine_updates (Lisp_Object root_frames);
3958void combine_updates_for_frame (struct frame *f, bool inhibit_id_p); 3958void combine_updates_for_frame (struct frame *f, bool inhibit_id_p);
3959void tty_raise_lower_frame (struct frame *f, bool raise); 3959void tty_raise_lower_frame (struct frame *f, bool raise);
3960int max_child_z_order (struct frame *parent); 3960int max_child_z_order (struct frame *parent);
3961void frame_pos_abs (struct frame *f, int *x, int *y);
3962bool is_frame_ancestor (struct frame *f1, struct frame *f2);
3961 3963
3962INLINE_HEADER_END 3964INLINE_HEADER_END
3963 3965
diff --git a/src/dispnew.c b/src/dispnew.c
index 23ef5ff699b..9726bf70660 100644
--- a/src/dispnew.c
+++ b/src/dispnew.c
@@ -3315,7 +3315,7 @@ rect_intersect (struct rect *r, struct rect r1, struct rect r2)
3315 3315
3316/* Return the absolute position of frame F in *X and *Y. */ 3316/* Return the absolute position of frame F in *X and *Y. */
3317 3317
3318static void 3318void
3319frame_pos_abs (struct frame *f, int *x, int *y) 3319frame_pos_abs (struct frame *f, int *x, int *y)
3320{ 3320{
3321 *x = *y = 0; 3321 *x = *y = 0;
@@ -3355,7 +3355,7 @@ max_child_z_order (struct frame *parent)
3355 3355
3356/* Return true if F1 is an ancestor of F2. */ 3356/* Return true if F1 is an ancestor of F2. */
3357 3357
3358static bool 3358bool
3359is_frame_ancestor (struct frame *f1, struct frame *f2) 3359is_frame_ancestor (struct frame *f1, struct frame *f2)
3360{ 3360{
3361 for (struct frame *f = FRAME_PARENT_FRAME (f2); f; f = FRAME_PARENT_FRAME (f)) 3361 for (struct frame *f = FRAME_PARENT_FRAME (f2); f; f = FRAME_PARENT_FRAME (f))
diff --git a/src/term.c b/src/term.c
index f7d3e58a465..4ae9c373888 100644
--- a/src/term.c
+++ b/src/term.c
@@ -2990,19 +2990,16 @@ tty_menu_calc_size (tty_menu *menu, int *width, int *height)
2990static void 2990static void
2991mouse_get_xy (int *x, int *y) 2991mouse_get_xy (int *x, int *y)
2992{ 2992{
2993 Lisp_Object lmx = Qnil, lmy = Qnil;
2994 Lisp_Object mouse = mouse_position (tty_menu_calls_mouse_position_function); 2993 Lisp_Object mouse = mouse_position (tty_menu_calls_mouse_position_function);
2995 2994
2996 if (EQ (selected_frame, XCAR (mouse))) 2995 struct frame *f = XFRAME (XCAR (mouse));
2997 { 2996 struct frame *sf = SELECTED_FRAME ();
2998 lmx = XCAR (XCDR (mouse)); 2997 if (f == sf || is_frame_ancestor (sf, f))
2999 lmy = XCDR (XCDR (mouse));
3000 }
3001
3002 if (!NILP (lmx))
3003 { 2998 {
3004 *x = XFIXNUM (lmx); 2999 int fx, fy;
3005 *y = XFIXNUM (lmy); 3000 frame_pos_abs (f, &fx, &fy);
3001 *x = fx + XFIXNUM (XCAR (XCDR (mouse)));
3002 *y = fy + XFIXNUM (XCDR (XCDR (mouse)));
3006 } 3003 }
3007} 3004}
3008 3005