X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/eada086196ccb005ded188ac2e58d41f3682a125..51721edc6ba92f9c7cb6a2daab45bb538a696f3d:/lisp/xt-mouse.el diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el index 76c78b84b4..f9e89880da 100644 --- a/lisp/xt-mouse.el +++ b/lisp/xt-mouse.el @@ -1,6 +1,6 @@ ;;; xt-mouse.el --- support the mouse when emacs run in an xterm -;; Copyright (C) 1994, 2000-2012 Free Software Foundation, Inc. +;; Copyright (C) 1994, 2000-2014 Free Software Foundation, Inc. ;; Author: Per Abrahamsen ;; Keywords: mouse, terminals @@ -42,13 +42,12 @@ (defvar xterm-mouse-debug-buffer nil) -(defvar xterm-mouse-last) - ;; Mouse events symbols must have an 'event-kind property with ;; the value 'mouse-click. -(dolist (event-type '(mouse-1 mouse-2 mouse-3 - M-down-mouse-1 M-down-mouse-2 M-down-mouse-3)) - (put event-type 'event-kind 'mouse-click)) +(dolist (event '(mouse-1 mouse-2 mouse-3 mouse-4 mouse-5)) + (let ((M-event (intern (concat "M-" (symbol-name event))))) + (put event 'event-kind 'mouse-click) + (put M-event 'event-kind 'mouse-click))) (defun xterm-mouse-translate (_event) "Read a click and release event from XTerm." @@ -63,58 +62,49 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." (defun xterm-mouse-translate-1 (&optional extension) (save-excursion - (save-window-excursion - (deactivate-mark) - (let* ((xterm-mouse-last nil) - (down (xterm-mouse-event extension)) - (down-command (nth 0 down)) - (down-data (nth 1 down)) - (down-where (nth 1 down-data)) - (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))))) - - ;; Retrieve the expected preface for the up-event. - (unless is-click - (unless (cond ((null extension) - (and (eq (read-event) ?\e) - (eq (read-event) ?\[) - (eq (read-event) ?M))) - ((eq extension 1006) - (and (eq (read-event) ?\e) - (eq (read-event) ?\[) - (eq (read-event) ?<)))) - (error "Unexpected escape sequence from XTerm"))) - - ;; Process the up-event. - (let* ((click (if is-click down (xterm-mouse-event extension))) - (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)) - (setq unread-command-events - (append (if (eq down-where click-where) - (list click) - (list - ;; Cheat `mouse-drag-region' with move event. - (list 'mouse-movement click-data) - ;; Generate a drag event. - (if (symbolp down-where) - 0 - (list (intern (format "drag-mouse-%d" - (1+ xterm-mouse-last))) - down-data click-data)))) - unread-command-events)) - (if xterm-mouse-debug-buffer - (print unread-command-events xterm-mouse-debug-buffer)) - (if (and (symbolp down-where) - (consp down-where)) - (vector (list down-where down-data) down) - (vector down)))))))) + (save-window-excursion ;FIXME: Why? + (deactivate-mark) ;FIXME: Why? + (let* ((event (xterm-mouse-event extension)) + (ev-command (nth 0 event)) + (ev-data (nth 1 event)) + (ev-where (nth 1 ev-data)) + (vec (if (and (symbolp ev-where) (consp ev-where)) + ;; FIXME: This condition can *never* be non-nil!?! + (vector (list ev-where ev-data) event) + (vector event))) + (is-down (string-match "down-" (symbol-name ev-command)))) + + (cond + ((null event) nil) ;Unknown/bogus byte sequence! + (is-down + (setf (terminal-parameter nil 'xterm-mouse-last-down) event) + vec) + (t + (let* ((down (terminal-parameter nil 'xterm-mouse-last-down)) + (down-data (nth 1 down)) + (down-where (nth 1 down-data))) + (setf (terminal-parameter nil 'xterm-mouse-last-down) nil) + (cond + ((null down) + ;; This is an "up-only" event. Pretend there was an up-event + ;; right before and keep the up-event for later. + (push event unread-command-events) + (vector (cons (intern (replace-regexp-in-string + "\\`\\([ACMHSs]-\\)*" "\\&down-" + (symbol-name ev-command) t)) + (cdr event)))) + ((equal ev-where down-where) vec) + (t + (let ((drag (if (symbolp ev-where) + 0 ;FIXME: Why?!? + (list (replace-regexp-in-string + "\\`\\([ACMHSs]-\\)*" "\\&drag-" + (symbol-name ev-command) t) + down-data ev-data)))) + (if (null track-mouse) + (vector drag) + (push drag unread-command-events) + (vector (list 'mouse-movement ev-data))))))))))))) ;; These two variables have been converted to terminal parameters. ;; @@ -135,20 +125,6 @@ http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." (terminal-parameter nil 'xterm-mouse-y)))) pos) -;; Read XTerm sequences above ASCII 127 (#x7f) -(defun xterm-mouse-event-read () - ;; We get the characters decoded by the keyboard coding system. Try - ;; to recover the raw character. - (let ((c (read-event))) - (cond ;; If meta-flag is t we get a meta character - ((>= c ?\M-\^@) - (- c (- ?\M-\^@ 128))) - ;; Reencode the character in the keyboard coding system, if - ;; this is a non-ASCII character. - ((>= c #x80) - (aref (encode-coding-string (string c) (keyboard-coding-system)) 0)) - (t c)))) - (defun xterm-mouse-truncate-wrap (f) "Truncate with wrap-around." (condition-case nil @@ -167,40 +143,38 @@ 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 (- (xterm-mouse-event-read) 32))) - (intern - ;; For buttons > 3, the release-event looks differently - ;; (see xc/programs/xterm/button.c, function EditorButton), - ;; and come in a release-event only, no down-event. - (cond ((>= code 64) - (format "mouse-%d" (- code 60))) - ((memq code '(8 9 10)) - (setq xterm-mouse-last code) - (format "M-down-mouse-%d" (- code 7))) - ((= code 11) - (format "M-mouse-%d" (- xterm-mouse-last 7))) - ((= 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 - (setq xterm-mouse-last code) - (format "down-mouse-%d" (+ 1 code)))))) - ;; x and y coordinates - (- (xterm-mouse-event-read) 33) - (- (xterm-mouse-event-read) 33))) + (let* ((code (- (read-event) 32)) + (type + ;; For buttons > 3, the release-event looks differently + ;; (see xc/programs/xterm/button.c, function EditorButton), + ;; and come in a release-event only, no down-event. + (cond ((>= code 64) + (format "mouse-%d" (- code 60))) + ((memq code '(8 9 10)) + (format "M-down-mouse-%d" (- code 7))) + ((memq code '(3 11)) + (let ((down (car (terminal-parameter + nil 'xterm-mouse-last-down)))) + (when (and down (string-match "[0-9]" (symbol-name down))) + (format (if (eq code 3) "mouse-%s" "M-mouse-%s") + (match-string 0 (symbol-name down)))))) + ((memq code '(0 1 2)) + (format "down-mouse-%d" (+ 1 code))))) + (x (- (read-event) 33)) + (y (- (read-event) 33))) + (and type (wholenump x) (wholenump y) + (list (intern type) x y)))) ;; XTerm's 1006-mode terminal mouse click reporting has the form ;;