Commit 6bac1616 authored by Karoly Lorentey's avatar Karoly Lorentey
Browse files

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
parent 80a426c2
......@@ -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
......
......@@ -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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment