Mercurial > emacs
changeset 83369:d2e0850b17f2
Make xt-mouse.el multi-tty-compatible.
* lisp/xt-mouse.el (xterm-mouse-x, xterm-mouse-y): Convert to terminal parameters.
(xterm-mouse-position-function, xterm-mouse-event): Update.
(xterm-mouse-mode): Don't depend on current value of window-system.
(turn-on-xterm-mouse-tracking, turn-off-xterm-mouse-tracking): Update
for multi-tty.
(turn-on-xterm-mouse-tracking-on-terminal)
(turn-off-xterm-mouse-tracking-on-terminal)
(xterm-mouse-handle-delete-frame): New functions.
(delete-frame-functions, after-make-frame-functions)
(suspend-tty-functions, resume-tty-functions): Install extra hooks for multi-tty.
git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-409
author | Karoly Lorentey <lorentey@elte.hu> |
---|---|
date | Sun, 11 Sep 2005 03:06:33 +0000 |
parents | 0d0962d43546 |
children | 5272862a4865 |
files | README.multi-tty lisp/xt-mouse.el |
diffstat | 2 files changed, 71 insertions(+), 17 deletions(-) [+] |
line wrap: on
line diff
--- a/README.multi-tty Sun Sep 11 02:39:03 2005 +0000 +++ b/README.multi-tty Sun Sep 11 03:06:33 2005 +0000 @@ -386,9 +386,19 @@ THINGS TO DO ------------ -** xt-mouse.el needs to be adapted for multi-tty. It currently - signals an error on kill-emacs under X, which prevents the user - from exiting Emacs. (Reported by Mnemonikk on freenode.) +** This long-standing bug (first reported by Han Boetes) seems to come + and go all the time. It is time to track it down and fix it. + + emacs + M-x server-start + + # From another xterm: + emacsclient -e '(y-or-n-p "Do you want me to crash? ")' + # Notice how the answer ends up in the *scratch* buffer + M-x garbage-collect + SIGSEGV + +** frames-on-display-list should also accept frames. ** Consider the `tty-type' frame parameter and the `display-tty-type' function. They serve the exact same purpose. I think it may be @@ -398,11 +408,14 @@ big, big mess. How come the terminal-specific file is loaded by tty-create-frame-with-faces? I don't think it is necessary to load these files for each frame; once per terminal should be enough. + Update: lisp/term/*.el is not loaded repeatedly anymore, but + faces.el still needs to be cleaned up. ** Fix frame-set-background-mode in this branch. It was recently changed in CVS, and frame.el in multi-tty has not yet been adapted for the changes. (It needs to look at - default-frame-background-mode.) + default-frame-background-mode.) (Update: maybe it is fixed now; + needs testing.) ** I think `(set-)terminal-local-value' and the terminal parameter mechanism should be integrated into a single framework. @@ -411,6 +424,9 @@ instead of delete-frame-functions), after-delete-terminal-functions, after-create-terminal-functions. +** If the first key pressed on a new tty terminal is a function key, + it is not recognized correctly. May be related to the bug below. + ** Having {reset,init}_all_sys_modes in set-input-mode breaks arrow keys on non-selected terminals under screen, and sometimes on other terminal types as well. The other function keys continue to work @@ -1202,6 +1218,12 @@ frame is selected. (Done.) + +-- xt-mouse.el needs to be adapted for multi-tty. It currently + signals an error on kill-emacs under X, which prevents the user + from exiting Emacs. (Reported by Mnemonikk on freenode.) + + (Done, I hope.) ;;; arch-tag: 8da1619e-2e79-41a8-9ac9-a0485daad17d
--- a/lisp/xt-mouse.el Sun Sep 11 02:39:03 2005 +0000 +++ b/lisp/xt-mouse.el Sun Sep 11 03:06:33 2005 +0000 @@ -103,17 +103,21 @@ (vector (list down-where down-data) down) (vector down)))))))) -(defvar xterm-mouse-x 0 - "Position of last xterm mouse event relative to the frame.") - -(defvar xterm-mouse-y 0 - "Position of last xterm mouse event relative to the frame.") +;; These two variables have been converted to terminal parameters. +;; +;;(defvar xterm-mouse-x 0 +;; "Position of last xterm mouse event relative to the frame.") +;; +;;(defvar xterm-mouse-y 0 +;; "Position of last xterm mouse event relative to the frame.") ;; Indicator for the xterm-mouse mode. (defun xterm-mouse-position-function (pos) "Bound to `mouse-position-function' in XTerm mouse mode." - (setcdr pos (cons xterm-mouse-x xterm-mouse-y)) + (when (terminal-parameter nil 'xterm-mouse-x) + (setcdr pos (cons (terminal-parameter nil 'xterm-mouse-x) + (terminal-parameter nil 'xterm-mouse-y)))) pos) ;; read xterm sequences above ascii 127 (#x7f) @@ -145,8 +149,8 @@ (left (nth 0 ltrb)) (top (nth 1 ltrb))) - (setq xterm-mouse-x x - xterm-mouse-y y) + (set-terminal-parameter nil 'xterm-mouse-x x) + (set-terminal-parameter nil 'xterm-mouse-y y) (if w (list mouse (posn-at-x-y (- x left) (- y top) w t)) (list mouse @@ -166,7 +170,7 @@ :global t :group 'mouse (if xterm-mouse-mode ;; Turn it on - (unless window-system + (progn (setq mouse-position-function #'xterm-mouse-position-function) (turn-on-xterm-mouse-tracking)) ;; Turn it off @@ -175,15 +179,43 @@ (defun turn-on-xterm-mouse-tracking () "Enable Emacs mouse tracking in xterm." - (if xterm-mouse-mode - (send-string-to-terminal "\e[?1000h"))) + (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")))))) (defun turn-off-xterm-mouse-tracking (&optional force) "Disable Emacs mouse tracking in xterm." - (if (or force xterm-mouse-mode) - (send-string-to-terminal "\e[?1000l"))) + (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")))))) + +(defun turn-on-xterm-mouse-tracking-on-terminal (terminal) + "Enable xterm mouse tracking on TERMINAL." + (when (and xterm-mouse-mode (eq t (display-live-p terminal))) + (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 (display-live-p terminal))) + (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-display frame))))) + (turn-off-xterm-mouse-tracking-on-terminal frame))) + +;; 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. +(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)