X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/9f596249ba1cbdf2f2b315b27acdda99bfd10be5..393439a343c910e8be4427a070ef35e877173c3d:/lisp/xt-mouse.el diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el index 49f1886f87..86c28fa473 100644 --- a/lisp/xt-mouse.el +++ b/lisp/xt-mouse.el @@ -1,17 +1,17 @@ ;;; xt-mouse.el --- support the mouse when emacs run in an xterm ;; Copyright (C) 1994, 2000, 2001, 2002, 2003, -;; 2004, 2005, 2006, 2007 Free Software Foundation, Inc. +;; 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. ;; Author: Per Abrahamsen ;; Keywords: mouse, terminals ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,9 +19,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -45,9 +43,6 @@ (defvar xterm-mouse-debug-buffer nil) -;; XXX Perhaps this should be terminal-local instead. --lorentey -(define-key function-key-map "\e[M" 'xterm-mouse-translate) - (defvar xterm-mouse-last) ;; Mouse events symbols must have an 'event-kind property with @@ -78,7 +73,7 @@ (error "Unexpected escape sequence from XTerm"))) (let* ((click (if is-click down (xterm-mouse-event))) - (click-command (nth 0 click)) + ;; (click-command (nth 0 click)) (click-data (nth 1 click)) (click-where (nth 1 click-data))) (if (memq down-binding '(nil ignore)) @@ -171,7 +166,10 @@ ((= type 11) (format "mouse-%d" (- xterm-mouse-last 7))) ((= type 3) - (format "mouse-%d" (+ 1 xterm-mouse-last))) + ;; 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 type) (format "down-mouse-%d" (+ 1 type)))))) @@ -205,77 +203,66 @@ single clicks are supported. When turned on, the normal xterm mouse functionality for such clicks is still available by holding down the SHIFT key while pressing the mouse button." :global t :group 'mouse + (let ((do-hook (if xterm-mouse-mode 'add-hook 'remove-hook))) + (funcall do-hook 'terminal-init-xterm-hook + 'turn-on-xterm-mouse-tracking-on-terminal) + (funcall do-hook 'delete-terminal-functions + 'turn-off-xterm-mouse-tracking-on-terminal) + (funcall do-hook 'suspend-tty-functions + 'turn-off-xterm-mouse-tracking-on-terminal) + (funcall do-hook 'resume-tty-functions + 'turn-on-xterm-mouse-tracking-on-terminal) + (funcall do-hook 'suspend-hook 'turn-off-xterm-mouse-tracking) + (funcall do-hook 'suspend-resume-hook 'turn-on-xterm-mouse-tracking) + (funcall do-hook 'kill-emacs-hook 'turn-off-xterm-mouse-tracking)) (if xterm-mouse-mode ;; Turn it on (progn - ;; Frame creation and deletion. - (add-hook 'after-make-frame-functions - 'turn-on-xterm-mouse-tracking-on-terminal) - (add-hook 'delete-frame-functions 'xterm-mouse-handle-delete-frame) - - ;; Restore normal mouse behaviour outside Emacs. - - ;; Temporarily disable this hook, it does not work, when - ;; `suspend-tty' calls `suspend-tty-functions' the tty->output - ;; is already set to 0 so the 'send-string-to-terminal' call - ;; in `turn-off-xterm-mouse-tracking-on-terminal' will result - ;; in a crash. - ;; (add-hook 'suspend-tty-functions - ;; 'turn-off-xterm-mouse-tracking-on-terminal) - - (add-hook 'resume-tty-functions - 'turn-on-xterm-mouse-tracking-on-terminal) - (add-hook 'suspend-hook 'turn-off-xterm-mouse-tracking) - (add-hook 'suspend-resume-hook 'turn-on-xterm-mouse-tracking) - (add-hook 'kill-emacs-hook 'turn-off-xterm-mouse-tracking) (setq mouse-position-function #'xterm-mouse-position-function) (turn-on-xterm-mouse-tracking)) ;; Turn it off - (remove-hook 'after-make-frame-functions - 'turn-on-xterm-mouse-tracking-on-terminal) - (remove-hook 'delete-frame-functions 'xterm-mouse-handle-delete-frame) - ;; (remove-hook 'suspend-tty-functions - ;; 'turn-off-xterm-mouse-tracking-on-terminal) - (remove-hook 'resume-tty-functions - 'turn-on-xterm-mouse-tracking-on-terminal) - (remove-hook 'suspend-hook 'turn-off-xterm-mouse-tracking) - (remove-hook 'suspend-resume-hook 'turn-on-xterm-mouse-tracking) - (remove-hook 'kill-emacs-hook 'turn-off-xterm-mouse-tracking) (turn-off-xterm-mouse-tracking 'force) (setq mouse-position-function nil))) (defun turn-on-xterm-mouse-tracking () "Enable Emacs mouse tracking in xterm." - (dolist (f (frame-list)) - (when (eq t (frame-live-p f)) - (with-selected-frame f - (when xterm-mouse-mode - (send-string-to-terminal "\e[?1000h")))))) + (dolist (terminal (terminal-list)) + (turn-on-xterm-mouse-tracking-on-terminal terminal))) (defun turn-off-xterm-mouse-tracking (&optional force) "Disable Emacs mouse tracking in xterm." - (dolist (f (frame-list)) - (when (eq t (frame-live-p f)) - (with-selected-frame f - (when (or force xterm-mouse-mode) - (send-string-to-terminal "\e[?1000l")))))) + (dolist (terminal (terminal-list)) + (turn-off-xterm-mouse-tracking-on-terminal terminal))) -(defun turn-on-xterm-mouse-tracking-on-terminal (terminal) +(defun turn-on-xterm-mouse-tracking-on-terminal (&optional terminal) "Enable xterm mouse tracking on TERMINAL." - (when (and xterm-mouse-mode (eq t (terminal-live-p terminal))) + (when (and xterm-mouse-mode (eq t (terminal-live-p terminal)) + ;; Avoid the initial terminal which is not a termcap device. + ;; FIXME: is there more elegant way to detect the initial terminal? + (not (string= (terminal-name terminal) "initial_terminal"))) + (unless (terminal-parameter terminal 'xterm-mouse-mode) + ;; Simulate selecting a terminal by selecting one of its frames ;-( + (with-selected-frame (car (frames-on-display-list terminal)) + (define-key input-decode-map "\e[M" 'xterm-mouse-translate)) + (set-terminal-parameter terminal 'xterm-mouse-mode t)) (send-string-to-terminal "\e[?1000h" terminal))) (defun turn-off-xterm-mouse-tracking-on-terminal (terminal) "Disable xterm mouse tracking on TERMINAL." - (when (and xterm-mouse-mode (eq t (terminal-live-p terminal))) + ;; Only send the disable command to those terminals to which we've already + ;; sent the enable command. + (when (and (terminal-parameter terminal 'xterm-mouse-mode) + (eq t (terminal-live-p terminal)) + ;; Avoid the initial terminal which is not a termcap device. + ;; FIXME: is there more elegant way to detect the initial terminal? + (not (string= (terminal-name terminal) "initial_terminal"))) + ;; We could remove the key-binding and unset the `xterm-mouse-mode' + ;; terminal parameter, but it seems less harmful to send this escape + ;; command too many times (or to catch an unintended key sequence), than + ;; to send it too few times (or to fail to let xterm-mouse events + ;; pass by untranslated). (send-string-to-terminal "\e[?1000l" terminal))) -(defun xterm-mouse-handle-delete-frame (frame) - "Turn off xterm mouse tracking if FRAME is the last frame on its device." - (when (and (eq t (frame-live-p frame)) - (<= 1 (length (frames-on-display-list (frame-terminal frame))))) - (turn-off-xterm-mouse-tracking-on-terminal frame))) - (provide 'xt-mouse) ;; arch-tag: 84962d4e-fae9-4c13-a9d7-ef4925a4ac03