aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.multi-tty30
-rw-r--r--lisp/xt-mouse.el58
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)