aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/terminal.el
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>1994-12-30 20:41:25 +0000
committerRichard M. Stallman <[email protected]>1994-12-30 20:41:25 +0000
commit398e98d1c2531b12f83a1c4e2079fc9e4f8a937b (patch)
tree6ad31db4c118f839626c903ceefbb29dbd1ad934 /lisp/terminal.el
parentca0569ad39d56be9edb911d93b741e33d5f71c98 (diff)
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.el136
1 files changed, 93 insertions, 43 deletions
diff --git a/lisp/terminal.el b/lisp/terminal.el
index 7a9235f36e..ebb74c3d03 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