mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-02-14 03:37:38 -08:00
Add `xterm-extra-capabilities' defcustom for terminals where the xterm capabilities query is not needed or wanted.
* term/xterm.el (xterm): Add defgroup. (xterm-extra-capabilities): Add defcustom to supply known xterm capabilities, skip querying them, or query them (default). (terminal-init-xterm): Use it. (terminal-init-xterm-modify-other-keys): New function to set up modifyOtherKeys support to simplify `terminal-init-xterm'.
This commit is contained in:
parent
cc322c061d
commit
59f623b770
2 changed files with 129 additions and 68 deletions
|
|
@ -1,3 +1,12 @@
|
|||
2011-06-09 Teodor Zlatanov <tzz@lifelogs.com>
|
||||
|
||||
* term/xterm.el (xterm): Add defgroup.
|
||||
(xterm-extra-capabilities): Add defcustom to supply known xterm
|
||||
capabilities, skip querying them, or query them (default).
|
||||
(terminal-init-xterm): Use it.
|
||||
(terminal-init-xterm-modify-other-keys): New function to set up
|
||||
modifyOtherKeys support to simplify `terminal-init-xterm'.
|
||||
|
||||
2011-06-09 Martin Rudalics <rudalics@gmx.at>
|
||||
|
||||
* window.el (resize-window-reset, resize-window-reset-1)
|
||||
|
|
|
|||
|
|
@ -24,6 +24,23 @@
|
|||
|
||||
;;; Code:
|
||||
|
||||
(defgroup xterm nil
|
||||
"XTerm support."
|
||||
:version "24.1"
|
||||
:group 'emacs)
|
||||
|
||||
(defcustom xterm-extra-capabilities 'check
|
||||
"Set to a list if the XTerm supports modifyOtherKeys or
|
||||
reporting the background color. Set to 'check to check for those
|
||||
features. Set to nil to skip the checks."
|
||||
:group 'xterm
|
||||
:type '(choice (const :tag "No" nil)
|
||||
(const :tag "Check" check)
|
||||
;; NOTE: If you add entries here, make sure to update
|
||||
;; `tocheck-capabilities' in `terminal-init-xterm' as well.
|
||||
(set (const :tag "modifyOtherKeys support" modifyOtherKeys)
|
||||
(const :tag "report background" reportBackground))))
|
||||
|
||||
(defvar xterm-function-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
|
||||
|
|
@ -460,81 +477,116 @@
|
|||
(set-keymap-parent map (keymap-parent input-decode-map))
|
||||
(set-keymap-parent input-decode-map map)))
|
||||
|
||||
(xterm-register-default-colors)
|
||||
(tty-set-up-initial-frame-faces)
|
||||
(xterm-register-default-colors)
|
||||
(tty-set-up-initial-frame-faces)
|
||||
|
||||
;; Try to turn on the modifyOtherKeys feature on modern xterms.
|
||||
;; When it is turned on many more key bindings work: things like
|
||||
;; C-. C-, etc.
|
||||
;; To do that we need to find out if the current terminal supports
|
||||
;; modifyOtherKeys. At this time only xterm does.
|
||||
;; Try to turn on the modifyOtherKeys feature on modern xterms.
|
||||
;; When it is turned on many more key bindings work: things like
|
||||
;; C-. C-, etc.
|
||||
;; To do that we need to find out if the current terminal supports
|
||||
;; modifyOtherKeys. At this time only xterm does.
|
||||
(when xterm-extra-capabilities
|
||||
(let ((coding-system-for-read 'binary)
|
||||
(chr nil)
|
||||
(str nil)
|
||||
(recompute-faces nil)
|
||||
version)
|
||||
;; Pending input can be mistakenly returned by the calls to
|
||||
;; read-event below. Discard it.
|
||||
(discard-input)
|
||||
;; Try to find out the type of terminal by sending a "Secondary
|
||||
;; Device Attributes (DA)" query.
|
||||
(send-string-to-terminal "\e[>0c")
|
||||
(chr nil)
|
||||
(str nil)
|
||||
(background-regex
|
||||
"11;rgb:\\([a-f0-9]+\\)/\\([a-f0-9]+\\)/\\([a-f0-9]+\\)")
|
||||
(recompute-faces nil)
|
||||
;; If `xterm-extra-capabilities' is 'check, we don't know
|
||||
;; the capabilities. We need to check for those defined
|
||||
;; as `xterm-extra-capabilities' set options. Otherwise,
|
||||
;; we don't need to check for any capabilities because
|
||||
;; they are given by setting `xterm-extra-capabilities' to
|
||||
;; a list (which could be empty).
|
||||
(tocheck-capabilities (when (eq 'check xterm-extra-capabilities)
|
||||
'(modifyOtherKeys reportBackground)))
|
||||
;; The given capabilities are either the contents of
|
||||
;; `xterm-extra-capabilities', if it's a list, or an empty
|
||||
;; list.
|
||||
(given-capabilities (when (consp xterm-extra-capabilities)
|
||||
xterm-extra-capabilities))
|
||||
version)
|
||||
|
||||
;; The reply should be of the form: \e [ > NUMBER1 ; NUMBER2 ; NUMBER3 c
|
||||
;; If the timeout is completely removed for read-event, this
|
||||
;; might hang for terminals that pretend to be xterm, but don't
|
||||
;; respond to this escape sequence. RMS' opinion was to remove
|
||||
;; it completely. That might be right, but let's first try to
|
||||
;; see if by using a longer timeout we get rid of most issues.
|
||||
(when (equal (read-event nil nil 2) ?\e)
|
||||
(when (equal (read-event nil nil 2) ?\[)
|
||||
(while (not (equal (setq chr (read-event nil nil 2)) ?c))
|
||||
(setq str (concat str (string chr))))
|
||||
(when (string-match ">0;\\([0-9]+\\);0" str)
|
||||
(setq version (string-to-number
|
||||
(substring str (match-beginning 1) (match-end 1))))
|
||||
;; xterm version 242 supports reporting the background
|
||||
;; color, maybe earlier versions do too...
|
||||
(when (>= version 242)
|
||||
(send-string-to-terminal "\e]11;?\e\\")
|
||||
(when (equal (read-event nil nil 2) ?\e)
|
||||
(when (equal (read-event nil nil 2) ?\])
|
||||
(setq str "")
|
||||
(while (not (equal (setq chr (read-event nil nil 2)) ?\\))
|
||||
(setq str (concat str (string chr))))
|
||||
(when (string-match "11;rgb:\\([a-f0-9]+\\)/\\([a-f0-9]+\\)/\\([a-f0-9]+\\)" str)
|
||||
(setq recompute-faces
|
||||
(xterm-maybe-set-dark-background-mode
|
||||
(string-to-number (match-string 1 str) 16)
|
||||
(string-to-number (match-string 2 str) 16)
|
||||
(string-to-number (match-string 3 str) 16)))))))
|
||||
;; NUMBER2 is the xterm version number, look for something
|
||||
;; greater than 216, the version when modifyOtherKeys was
|
||||
;; introduced.
|
||||
(when (>= version 216)
|
||||
;; Make sure that the modifyOtherKeys state is restored when
|
||||
;; suspending, resuming and exiting.
|
||||
(add-hook 'suspend-hook 'xterm-turn-off-modify-other-keys)
|
||||
(add-hook 'suspend-resume-hook 'xterm-turn-on-modify-other-keys)
|
||||
(add-hook 'kill-emacs-hook 'xterm-remove-modify-other-keys)
|
||||
(add-hook 'delete-terminal-functions 'xterm-remove-modify-other-keys)
|
||||
;; Add the selected frame to the list of frames that
|
||||
;; need to deal with modify-other-keys.
|
||||
(push (frame-terminal (selected-frame))
|
||||
xterm-modify-other-keys-terminal-list)
|
||||
(xterm-turn-on-modify-other-keys))
|
||||
;; Do the following if `xterm-extra-capabilities' is anything but nil.
|
||||
(when xterm-extra-capabilities
|
||||
;; 1. Set `version'
|
||||
|
||||
;; Recompute faces here in case the background mode was
|
||||
;; set to dark. We used to call
|
||||
;; `tty-set-up-initial-frame-faces' only once, but that
|
||||
;; caused the light background faces to be computed
|
||||
;; incorrectly. See:
|
||||
;; http://permalink.gmane.org/gmane.emacs.devel/119627
|
||||
(when recompute-faces
|
||||
(tty-set-up-initial-frame-faces))))))
|
||||
;; Pending input can be mistakenly returned by the calls to
|
||||
;; read-event below. Discard it.
|
||||
(discard-input)
|
||||
;; Try to find out the type of terminal by sending a "Secondary
|
||||
;; Device Attributes (DA)" query.
|
||||
(send-string-to-terminal "\e[>0c")
|
||||
|
||||
;; The reply should be: \e [ > NUMBER1 ; NUMBER2 ; NUMBER3 c
|
||||
;; If the timeout is completely removed for read-event, this
|
||||
;; might hang for terminals that pretend to be xterm, but don't
|
||||
;; respond to this escape sequence. RMS' opinion was to remove
|
||||
;; it completely. That might be right, but let's first try to
|
||||
;; see if by using a longer timeout we get rid of most issues.
|
||||
(when (equal (read-event nil nil 2) ?\e)
|
||||
(when (equal (read-event nil nil 2) ?\[)
|
||||
(while (not (equal (setq chr (read-event nil nil 2)) ?c))
|
||||
(setq str (concat str (string chr))))
|
||||
(when (string-match ">0;\\([0-9]+\\);0" str)
|
||||
(setq version
|
||||
(string-to-number
|
||||
(substring str (match-beginning 1) (match-end 1)))))))
|
||||
|
||||
;; 2. If reportBackground is known to be supported, or the
|
||||
;; version is 242 or higher, assume the xterm supports
|
||||
;; reporting the background color (TODO: maybe earlier
|
||||
;; versions do too...)
|
||||
(when (or (memq 'reportBackground given-capabilities)
|
||||
(and (memq 'reportBackground tocheck-capabilities)
|
||||
(>= version 242)))
|
||||
(send-string-to-terminal "\e]11;?\e\\")
|
||||
(when (equal (read-event nil nil 2) ?\e)
|
||||
(when (equal (read-event nil nil 2) ?\])
|
||||
(setq str "")
|
||||
(while (not (equal (setq chr (read-event nil nil 2)) ?\\))
|
||||
(setq str (concat str (string chr))))
|
||||
(when (string-match background-regex str)
|
||||
(setq recompute-faces
|
||||
(xterm-maybe-set-dark-background-mode
|
||||
(string-to-number (match-string 1 str) 16)
|
||||
(string-to-number (match-string 2 str) 16)
|
||||
(string-to-number (match-string 3 str) 16)))))))
|
||||
|
||||
;; 3. If modifyOtherKeys is known to be supported or the
|
||||
;; version is 216 (the version when modifyOtherKeys was
|
||||
;; introduced) or higher, initialize the modifyOtherKeys
|
||||
;; support.
|
||||
(when (or (memq 'modifyOtherKeys given-capabilities)
|
||||
(and (memq 'modifyOtherKeys tocheck-capabilities)
|
||||
(>= version 216)))
|
||||
(terminal-init-xterm-modify-other-keys))
|
||||
|
||||
;; Recompute faces here in case the background mode was
|
||||
;; set to dark. We used to call
|
||||
;; `tty-set-up-initial-frame-faces' only once, but that
|
||||
;; caused the light background faces to be computed
|
||||
;; incorrectly. See:
|
||||
;; http://permalink.gmane.org/gmane.emacs.devel/119627
|
||||
(when recompute-faces
|
||||
(tty-set-up-initial-frame-faces)))))
|
||||
|
||||
(run-hooks 'terminal-init-xterm-hook))
|
||||
|
||||
(defun terminal-init-xterm-modify-other-keys ()
|
||||
"Terminal initialization for xterm's modifyOtherKeys support."
|
||||
;; Make sure that the modifyOtherKeys state is restored when
|
||||
;; suspending, resuming and exiting.
|
||||
(add-hook 'suspend-hook 'xterm-turn-off-modify-other-keys)
|
||||
(add-hook 'suspend-resume-hook 'xterm-turn-on-modify-other-keys)
|
||||
(add-hook 'kill-emacs-hook 'xterm-remove-modify-other-keys)
|
||||
(add-hook 'delete-terminal-functions 'xterm-remove-modify-other-keys)
|
||||
;; Add the selected frame to the list of frames that
|
||||
;; need to deal with modify-other-keys.
|
||||
(push (frame-terminal (selected-frame))
|
||||
xterm-modify-other-keys-terminal-list)
|
||||
(xterm-turn-on-modify-other-keys))
|
||||
|
||||
;; Set up colors, for those versions of xterm that support it.
|
||||
(defvar xterm-standard-colors
|
||||
;; The names in the comments taken from XTerm-col.ad in the xterm
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue