From b7eb78397bc96c0e1bc2d280bd6660bbaa779790 Mon Sep 17 00:00:00 2001 From: Jared Finder Date: Sat, 31 Oct 2020 21:25:47 -0800 Subject: [PATCH] Face-changing text properties and help-echo now work with xterm-mouse. * src/term.c (handle-lisp-mouse-motion): New function like handle_one_term_event but only for mouse motion and with no GPM code. * lisp/xt-mouse.el (xterm-mouse--handle-mouse-motion): New function that calls 'handle-lisp-mouse-motion'. (xterm-mouse-translate-1): Call 'xterm-mouse--handle-mouse-motion'. --- lisp/xt-mouse.el | 9 +++++++++ src/term.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el index f9c08f9a17..37550276f8 100644 --- a/lisp/xt-mouse.el +++ b/lisp/xt-mouse.el @@ -77,6 +77,7 @@ xterm-mouse-translate-1 (copy-sequence event)) vec) (is-move + (xterm-mouse--handle-mouse-motion) (if track-mouse vec ;; Mouse movement events are currently supposed to be ;; suppressed. Return no event. @@ -106,8 +107,16 @@ xterm-mouse-translate-1 (if (null track-mouse) (vector drag) (push drag unread-command-events) + (xterm-mouse--handle-mouse-motion) (vector (list 'mouse-movement ev-data)))))))))))) +(defun xterm-mouse--handle-mouse-motion () + "Handle mouse motion that was just generated for XTerm mouse." + (let ((frame (selected-frame))) + (handle-lisp-mouse-motion frame + (terminal-parameter frame 'xterm-mouse-x) + (terminal-parameter frame 'xterm-mouse-y)))) + ;; These two variables have been converted to terminal parameters. ;; ;;(defvar xterm-mouse-x 0 diff --git a/src/term.c b/src/term.c index ff1aabfed2..710b00e32f 100644 --- a/src/term.c +++ b/src/term.c @@ -2617,6 +2617,33 @@ handle_one_term_event (struct tty_display_info *tty, Gpm_Event *event, return count; } +DEFUN ("handle-lisp-mouse-motion", Fhandle_lisp_mouse_motion, + Shandle_lisp_mouse_motion, 3, 3, 0, + doc: /* Handle mouse motion detected by Lisp code. + +This function should be called when Lisp code detects the mouse has +moved, even if `track-mouse' is nil. This handles updates that do not +not rely on input events such as updating display for mouse-face +proprties or updating the help echo text. */) + (Lisp_Object frame, Lisp_Object mouse_x, Lisp_Object mouse_y) +{ + if (NILP (frame)) + frame = selected_frame; + + previous_help_echo_string = help_echo_string; + help_echo_string = Qnil; + + note_mouse_highlight(XFRAME(frame), XFIXNUM (mouse_x), XFIXNUM (mouse_y)); + + if (!NILP (help_echo_string) + || !NILP (previous_help_echo_string)) + { + gen_help_event (help_echo_string, frame, help_echo_window, + help_echo_object, help_echo_pos); + } + return Qnil; +} + DEFUN ("gpm-mouse-start", Fgpm_mouse_start, Sgpm_mouse_start, 0, 0, 0, doc: /* Open a connection to Gpm. @@ -4568,6 +4595,7 @@ syms_of_term (void) defsubr (&Stty_top_frame); defsubr (&Ssuspend_tty); defsubr (&Sresume_tty); + defsubr (&Shandle_lisp_mouse_motion); #ifdef HAVE_GPM defsubr (&Sgpm_mouse_start); defsubr (&Sgpm_mouse_stop); -- 2.20.1