changeset 10294:23dee56d9ee4

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.
author Richard M. Stallman <rms@gnu.org>
date Fri, 30 Dec 1994 20:41:25 +0000
parents 96cc5c0a7ada
children 6ed7d0ea5fb9
files lisp/terminal.el
diffstat 1 files changed, 93 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/terminal.el	Fri Dec 30 06:50:01 1994 +0000
+++ b/lisp/terminal.el	Fri Dec 30 20:41:25 1994 +0000
@@ -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 @@
 (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 @@
 
 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 @@
   (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 @@
 	  (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 @@
 		   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