X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/358e1dd2b2e984069dc761ee4266efdad33a213f..a24b996116895c3bc8c78842ba014711fad4839c:/lisp/xt-mouse.el diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el index eca5f813ca..745bca7a2b 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-2011 Free Software Foundation, Inc. +;; Copyright (C) 1994, 2000-2013 Free Software Foundation, Inc. ;; Author: Per Abrahamsen ;; Keywords: mouse, terminals @@ -47,33 +47,49 @@ ;; 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)) + M-down-mouse-1 M-down-mouse-2 M-down-mouse-3)) (put event-type 'event-kind 'mouse-click)) (defun xterm-mouse-translate (_event) "Read a click and release event from XTerm." + (xterm-mouse-translate-1)) + +(defun xterm-mouse-translate-extended (_event) + "Read a click and release event from XTerm. +Similar to `xterm-mouse-translate', but using the \"1006\" +extension, which supports coordinates >= 231 (see +http://invisible-island.net/xterm/ctlseqs/ctlseqs.html)." + (xterm-mouse-translate-1 1006)) + +(defun xterm-mouse-translate-1 (&optional extension) (save-excursion (save-window-excursion (deactivate-mark) - (let* ((xterm-mouse-last) - (down (xterm-mouse-event)) + (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-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 (and (eq (read-char) ?\e) - (eq (read-char) ?\[) - (eq (read-char) ?M)) + (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"))) - (let* ((click (if is-click down (xterm-mouse-event))) - ;; (click-command (nth 0 click)) - (click-data (nth 1 click)) + ;; 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) @@ -81,17 +97,18 @@ (vector (list click-where click-data) click) (vector click)) (setq unread-command-events - (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))))) + (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) @@ -118,20 +135,6 @@ (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-char))) - (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 @@ -147,11 +150,82 @@ (fdiff (- f (* 1.0 maxwrap dbig)))) (+ (truncate fdiff) (* maxwrap dbig)))))) -(defun xterm-mouse-event () - "Convert XTerm mouse event to Emacs mouse event." - (let* ((type (- (xterm-mouse-event-read) #o40)) - (x (- (xterm-mouse-event-read) #o40 1)) - (y (- (xterm-mouse-event-read) #o40 1)) +;; 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))) + (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 + (- (read-event) 33) + (- (read-event) 33))) + +;; XTerm's 1006-mode terminal mouse click reporting has the form +;;