diff options
-rw-r--r-- | README.multi-tty | 30 | ||||
-rw-r--r-- | lisp/xt-mouse.el | 58 |
2 files changed, 71 insertions, 17 deletions
diff --git a/README.multi-tty b/README.multi-tty index e6dde3bfd9..d1122dfba8 100644 --- a/README.multi-tty +++ b/README.multi-tty @@ -386,9 +386,19 @@ is probably not very interesting for anyone else.) 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 @@ THINGS TO DO 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 @@ THINGS TO DO 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 @@ DIARY OF CHANGES 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 diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el index 6a800dd2d2..c3eb9519ab 100644 --- a/lisp/xt-mouse.el +++ b/lisp/xt-mouse.el @@ -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 @@ down the SHIFT key while pressing the mouse button." :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 @@ down the SHIFT key while pressing the mouse button." (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) |