From b406487f5227bb0f26844aea233a7b8d4a3709db Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Wed, 7 May 2014 21:46:15 -0400 Subject: [PATCH] * lisp/xt-mouse.el: Drop spurious/oddly shaped events. (xterm-mouse--read-event-sequence-1000): Return nil if something looks fishy. (xterm-mouse-event): Propagate it. (xterm-mouse-translate-1): Handle it. Fixes: debbugs:17378 --- lisp/ChangeLog | 8 ++++ lisp/xt-mouse.el | 103 +++++++++++++++++++++++++---------------------- 2 files changed, 62 insertions(+), 49 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f8502bd35b..333bc7fcf9 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,11 @@ +2014-05-08 Stefan Monnier + + * xt-mouse.el: Drop spurious/oddly shaped events (bug#17378). + (xterm-mouse--read-event-sequence-1000): Return nil if something + looks fishy. + (xterm-mouse-event): Propagate it. + (xterm-mouse-translate-1): Handle it. + 2014-05-07 Stephen Berman * calendar/todo-mode.el (todo-insert-item--apply-args): When all diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el index 87e65f7e11..5b34612c2e 100644 --- a/lisp/xt-mouse.el +++ b/lisp/xt-mouse.el @@ -63,8 +63,8 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." (defun xterm-mouse-translate-1 (&optional extension) (save-excursion - (save-window-excursion - (deactivate-mark) + (save-window-excursion ;FIXME: Why? + (deactivate-mark) ;FIXME: Why? (let* ((xterm-mouse-last nil) (down (xterm-mouse-event extension)) (down-command (nth 0 down)) @@ -73,10 +73,10 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." (down-binding (key-binding (if (symbolp down-where) (vector down-where down-command) (vector down-command)))) - (is-click (string-match "^mouse" (symbol-name (car down))))) + (is-down (string-match "down" (symbol-name (car down))))) ;; Retrieve the expected preface for the up-event. - (unless is-click + (unless is-down (unless (cond ((null extension) (and (eq (read-event) ?\e) (eq (read-event) ?\[) @@ -88,14 +88,17 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." (error "Unexpected escape sequence from XTerm"))) ;; Process the up-event. - (let* ((click (if is-click down (xterm-mouse-event extension))) + (let* ((click (if is-down (xterm-mouse-event extension) down)) (click-data (nth 1 click)) (click-where (nth 1 click-data))) - (if (memq down-binding '(nil ignore)) - (if (and (symbolp click-where) - (consp click-where)) - (vector (list click-where click-data) click) - (vector click)) + (cond + ((null down) nil) + ((memq down-binding '(nil ignore)) + (if (and (symbolp click-where) + (consp click-where)) + (vector (list click-where click-data) click) + (vector click))) + (t (setq unread-command-events (append (if (eq down-where click-where) (list click) @@ -114,7 +117,7 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." (if (and (symbolp down-where) (consp down-where)) (vector (list down-where down-data) down) - (vector down)))))))) + (vector down))))))))) ;; These two variables have been converted to terminal parameters. ;; @@ -153,7 +156,8 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." ;; Normal terminal mouse click reporting: expect three bytes, of the ;; form . Return a list (EVENT-TYPE X Y). (defun xterm-mouse--read-event-sequence-1000 () - (list (let ((code (- (read-event) 32))) + (let* ((code (- (read-event) 32)) + (type (intern ;; For buttons > 3, the release-event looks differently ;; (see xc/programs/xterm/button.c, function EditorButton), @@ -163,19 +167,19 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." ((memq code '(8 9 10)) (setq xterm-mouse-last (- code 8)) (format "M-down-mouse-%d" (- code 7))) - ((= code 11) - (format "M-mouse-%d" (+ 1 (or xterm-mouse-last 0)))) - ((= code 3) - ;; For buttons > 5 xterm only reports a - ;; button-release event. Avoid error by mapping - ;; them all to mouse-1. - (format "mouse-%d" (+ 1 (or xterm-mouse-last 0)))) - (t + ((and (= code 11) xterm-mouse-last) + (format "M-mouse-%d" (1+ xterm-mouse-last))) + ((and (= code 3) xterm-mouse-last) + ;; For buttons > 5 xterm only reports a button-release event. + ;; Drop them since they're not usable and can be spurious. + (format "mouse-%d" (1+ xterm-mouse-last))) + ((memq code '(0 1 2)) (setq xterm-mouse-last code) (format "down-mouse-%d" (+ 1 code)))))) - ;; x and y coordinates - (max 0 (- (read-event) 33)) - (max 0 (- (read-event) 33)))) + (x (- (read-event) 33)) + (y (- (read-event) 33))) + (and type (wholenump x) (wholenump y) + (list type x y)))) ;; XTerm's 1006-mode terminal mouse click reporting has the form ;;