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)