;; FIXME: The test for running in batch mode is here solely
;; for the sake of xt-mouse-tests where the only frame is
;; the initial frame.
- (frame (unless noninteractive (tty-frame-at x y)))
- ;;(_ (message (format "*** %S" frame)))
- (frame-pos (frame-position frame))
- ;;(_ (message (format "*** %S" frame-pos)))
- (x (- x (car frame-pos)))
- (y (- y (cdr frame-pos)))
- ;;(_ (message (format "*** %S %S" x y)))
+ (frame-and-xy (unless noninteractive (tty-frame-at x y)))
+ (frame (nth 0 frame-and-xy))
+ (x (nth 1 frame-and-xy))
+ (y (nth 2 frame-and-xy))
(w (window-at x y frame))
- ;;(_ (message (format "*** %S" w)))
-
(ltrb (window-edges w))
(left (nth 0 ltrb))
(top (nth 1 ltrb))
void tty_raise_lower_frame (struct frame *f, bool raise);
int max_child_z_order (struct frame *parent);
void root_xy (struct frame *f, int x, int y, int *rx, int *ry);
+void child_xy (struct frame *f, int x, int y, int *cx, int *cy);
bool is_frame_ancestor (struct frame *f1, struct frame *f2);
INLINE_HEADER_END
}
}
+/* Translate absolute coordinates (X, Y) to coordinates relative to F's origin. */
+
+void
+child_xy (struct frame *f, int x, int y, int *cx, int *cy)
+{
+ int rx, ry;
+ root_xy (f, 0, 0, &rx, &ry);
+ *cx = x - rx;
+ *cy = y - ry;
+}
+
/* Return the rectangle frame F occupies. X and Y are in absolute
coordinates. */
#endif
static Lisp_Object
-tty_frame_at (int x, int y)
+tty_frame_at (int x, int y, int *cx, int *cy)
{
for (Lisp_Object frames = Ftty_frame_list_z_order (Qnil);
!NILP (frames);
int fx, fy;
root_xy (f, 0, 0, &fx, &fy);
- if (fx <= x && x < fx + f->pixel_width
- && fy <= y && y < fy + f->pixel_height)
- return frame;
+ if ((fx <= x && x < fx + f->pixel_width)
+ && (fy <= y && y < fy + f->pixel_height))
+ {
+ child_xy (XFRAME (frame), x, y, cx, cy);
+ return frame;
+ }
}
return Qnil;
}
-DEFUN ("tty-frame-at", Ftty_frame_at, Stty_frame_at,
- 2, 2, 0,
- doc: /* Return tty frame containing pixel position X, Y. */)
+DEFUN ("tty-frame-at", Ftty_frame_at, Stty_frame_at, 2, 2, 0,
+ doc : /* Return tty frame containing absolute pixel position (X, Y).
+Value is nil if no frame found. Otherwise it is a list (FRAME CX CY),
+where FRAME is the frame containing (X, Y) and CX and CY are X and Y
+relative to FRAME. */)
(Lisp_Object x, Lisp_Object y)
{
if (! FIXNUMP (x) || ! FIXNUMP (y))
/* Coordinates this big can not correspond to any frame. */
return Qnil;
- return tty_frame_at (XFIXNUM (x), XFIXNUM (y));
+ int cx, cy;
+ Lisp_Object frame = tty_frame_at (XFIXNUM (x), XFIXNUM (y), &cx, &cy);
+ if (NILP (frame))
+ return Qnil;
+ return list3 (frame, make_fixnum (cx), make_fixnum (cy));
}
#ifdef HAVE_GPM
int
handle_one_term_event (struct tty_display_info *tty, const Gpm_Event *event_in)
{
- Lisp_Object frame = tty_frame_at (event_in->x, event_in->y);
- struct frame *f = decode_live_frame (frame);
Gpm_Event event = *event_in;
- event.x -= f->left_pos;
- event.y -= f->top_pos;
+ Lisp_Object frame = tty_frame_at (event_in->x, event_in->y, &event.x, &event.y);
+ struct frame *f = decode_live_frame (frame);
struct input_event ie;
int count = 0;