diff options
author | Richard M. Stallman <rms@gnu.org> | 1994-12-30 20:41:25 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1994-12-30 20:41:25 +0000 |
commit | ccef57bd5f626d9216940ba4179d41c54bc1536a (patch) | |
tree | 629a027c00e4ccc2b13e9b0d8cacd72f66770288 /lisp/terminal.el | |
parent | d770d003f67b9126691009153de1983210159987 (diff) | |
download | emacs-ccef57bd5f626d9216940ba4179d41c54bc1536a.tar.gz |
Added terminfo support.
(te-terminal-name-prefix, te-terminal-name, te-terminfo-systems):
New variables.
(terminal-emulator): Handle termcap or terminfo.
(te-create-terminfo, te-create-termcap): New subroutines.
(te-tic-sentinel): New subroutine.
Diffstat (limited to 'lisp/terminal.el')
-rw-r--r-- | lisp/terminal.el | 136 |
1 files changed, 93 insertions, 43 deletions
diff --git a/lisp/terminal.el b/lisp/terminal.el index 7a9235f36ee..ebb74c3d038 100644 --- a/lisp/terminal.el +++ b/lisp/terminal.el @@ -25,7 +25,6 @@ ;;; Code: ;;>>TODO -;;>> terminfo? ;;>> ** Nothing can be done about emacs' meta-lossage ** ;;>> (without redoing keymaps `sanely' -- ask Mly for details) @@ -160,6 +159,12 @@ performance.") (defvar te-more-old-mode-line-format nil) (defvar te-pending-output-info nil) +;; Required to support terminfo systems +(defconst te-terminal-name-prefix "emacs-virtual") +(defvar te-terminal-name nil) +(defvar te-terminfo-systems '(hpux usg-unix-v) +"List of system types that support terminfo instead of termcap") + ;;;; escape map @@ -1048,10 +1053,7 @@ terminal-redisplay-interval. This function calls the value of terminal-mode-hook if that exists and is non-nil after the terminal buffer has been set up and the -subprocess started. - -Presently with `termcap' only; if somebody sends us code to make this -work with `terminfo' we will try to use it." +subprocess started." (interactive (cons (save-excursion (set-buffer (get-buffer-create "*terminal*")) @@ -1079,6 +1081,8 @@ work with `terminfo' we will try to use it." (if (null height) (setq height (- (window-height (selected-window)) 1))) (terminal-mode) (setq te-width width te-height height) + (setq te-terminal-name (concat te-terminal-name-prefix "-" te-width + te-height)) (setq mode-line-buffer-identification (list (format "Emacs terminal %dx%d: %%b " te-width te-height) 'te-pending-output-info)) @@ -1090,44 +1094,22 @@ work with `terminfo' we will try to use it." (delete-process process) (error "Process %s not killed" (process-name process))))) (condition-case err - (let ((termcap - ;; Because of Unix Brain Death(tm), we can't change - ;; the terminal type of a running process, and so - ;; terminal size and scrollability are wired-down - ;; at this point. ("Detach? What's that?") - (concat (format "emacs-virtual:co#%d:li#%d:%s" - ;; Sigh. These can't be dynamically changed. - te-width te-height (if terminal-scrolling - "" "ns:")) - ;;-- Basic things - ;; cursor-motion, bol, forward/backward char - "cm=^p=%+ %+ :cr=^p^a:le=^p^b:nd=^p^f:" - ;; newline, clear eof/eof, audible bell - "nw=^j:ce=^pc:cd=^pC:cl=^p^l:bl=^p^g:" - ;; insert/delete char/line - "IC=^p_%+ :DC=^pd%+ :AL=^p^o%+ :DL=^p^k%+ :" - ;;-- Not-widely-known (ie nonstandard) flags, which mean - ;; o writing in the last column of the last line - ;; doesn't cause idiotic scrolling, and - ;; o don't use idiotische c-s/c-q sogenannte - ;; ``flow control'' auf keinen Fall. - "LP:NF:" - ;;-- For stupid or obsolete programs - "ic=^p_!:dc=^pd!:al=^p^o!:dl=^p^k!:ho=^p= :" - ;;-- For disgusting programs. - ;; (VI? What losers need these, I wonder?) - "im=:ei=:dm=:ed=:mi:do=^p^j:nl=^p^j:bs:"))) - (let ((process-environment - (cons "TERM=emacs-virtual" - (cons (concat "TERMCAP=" termcap) - process-environment)))) - (setq te-process - (start-process "terminal-emulator" (current-buffer) - "/bin/sh" "-c" - (format "%s; exec %s" - te-stty-string - (mapconcat 'te-quote-arg-for-sh - (cons program args) " "))))) + (let ((process-environment + (cons (concat "TERM=" te-terminal-name) + (cons (concat "TERMCAP=" (te-create-termcap)) + (cons (concat "TERMINFO=" (te-create-terminfo)) + process-environment))))) + (setq te-process + (start-process "terminal-emulator" (current-buffer) + "/bin/sh" "-c" + ;; Yuck!!! Start a shell to set some terminal + ;; control characteristics. Then start the + ;; "env" program to setup the terminal type + ;; Then finally start the program we wanted. + (format "%s; exec %s" + te-stty-string + (mapconcat 'te-quote-arg-for-sh + (cons program args) " ")))) (set-process-filter te-process 'te-filter) (set-process-sentinel te-process 'te-sentinel)) (error (fundamental-mode) @@ -1239,6 +1221,74 @@ of the terminal-emulator" start (1+ end))) (concat "\"" harder "\""))))) +(defun te-create-terminfo () + "Create and compile a terminfo entry for the virtual terminal. This is kept +in the /tmp directory" + (if (and (member system-type te-terminfo-systems) + (not (file-exists-p (concat "/tmp/" + (substring te-terminal-name-prefix 0 1) + "/" te-terminal-name)))) + (let ( (terminfo + (concat + (format "%s,mir, xon,cols#%d, lines#%d," + te-terminal-name te-width te-height) + "bel=^P^G, clear=^P\\f, cr=^P^A, cub1=^P^B, cud1=^P\\n," + "cuf1=^P^F, cup=^P=%p1%'\\s'%+%c%p2%'\\s'%+%c," + "dch=^Pd%p1%'\\s'%+%c, dch1=^Pd!, dl=^P^K%p1%'\\s'%+%c," + "dl1=^P^K!, ed=^PC, el=^Pc, home=^P=\\s\\s," + "ich=^P_%p1%'\\s'%+%c, ich1=^P_!, il=^P^O%p1%'\\s'%+%c," + "il1=^P^O!, ind=^P\\n, nel=\\n,")) + (file-name (concat "/tmp/" te-terminal-name ".tif")) ) + (save-excursion + (set-buffer (create-file-buffer file-name)) + (insert terminfo) + (write-file file-name) + (kill-buffer nil) + ) + (let ( (process-environment + (cons (concat "TERMINFO=" "/tmp") + process-environment)) ) + (set-process-sentinel (start-process "tic" nil "tic" file-name) + 'te-tic-sentinel)))) + "/tmp" +) + +(defun te-create-termcap () + "Create a termcap entry for the virtual terminal" + ;; Because of Unix Brain Death(tm), we can't change + ;; the terminal type of a running process, and so + ;; terminal size and scrollability are wired-down + ;; at this point. ("Detach? What's that?") + (concat (format "%s:co#%d:li#%d:%s" + ;; Sigh. These can't be dynamically changed. + te-terminal-name te-width te-height (if terminal-scrolling + "" "ns:")) + ;;-- Basic things + ;; cursor-motion, bol, forward/backward char + "cm=^p=%+ %+ :cr=^p^a:le=^p^b:nd=^p^f:" + ;; newline, clear eof/eof, audible bell + "nw=^j:ce=^pc:cd=^pC:cl=^p^l:bl=^p^g:" + ;; insert/delete char/line + "IC=^p_%+ :DC=^pd%+ :AL=^p^o%+ :DL=^p^k%+ :" + ;;-- Not-widely-known (ie nonstandard) flags, which mean + ;; o writing in the last column of the last line + ;; doesn't cause idiotic scrolling, and + ;; o don't use idiotische c-s/c-q sogenannte + ;; ``flow control'' auf keinen Fall. + "LP:NF:" + ;;-- For stupid or obsolete programs + "ic=^p_!:dc=^pd!:al=^p^o!:dl=^p^k!:ho=^p= :" + ;;-- For disgusting programs. + ;; (VI? What losers need these, I wonder?) + "im=:ei=:dm=:ed=:mi:do=^p^j:nl=^p^j:bs:") +) + +(defun te-tic-sentinel (proc state-change) + "If tic has finished, delete the .tif file" + (if (equal state-change "finished +") + (delete-file (concat "/tmp/" te-terminal-name ".tif")))) + (provide 'terminal) ;;; terminal.el ends here |