🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.emacs.bug
Article #87210

Terminfo support for terminal emulator

#87210
From: Kishore Kumar
Date: Tue, 04 Oct 1994 11:23
242 lines
10785 bytes
Hi,

I  am  enclosing an   implementation of  terminal.el that  works  with
terminfo  database (the  current    version only  works   with termcap
facility). Hope you  find it OK  enough to  incorporate into the  next
release of emacs.

Kishore
------------------------------------------------------------------------------
(emacs-version)
"GNU Emacs 19.19.3 of Fri Feb 18 1994 on shruthi (usg-unix-v)"

Machine: Unisys U6000
OS: SVR4

Also tested on HP9000 running hpux.
------------------------------------------------------------------------------
Mon Oct  3 14:55:27 1994  Kishore Kumar  (kishorek@tulblr.unisys.com)

	*  (terminal.el): Added terminfo support. Modified
	terminal-emulator. Added two new functions - te-create-terminfo &
	te-tic-sentinel. Also, yanked some code from terminal-emulator
	into a seperate function te-create-termcap.
------------------------------------------------------------------------------
cd ~/
diff -c /home1/emacs/lib/emacs/19.19/lisp/terminal.old /home1/emacs/lib/emacs/19.19/lisp/terminal.el
*** /home1/emacs/lib/emacs/19.19/lisp/terminal.old	Thu Sep 22 13:38:05 1994
--- /home1/emacs/lib/emacs/19.19/lisp/terminal.el	Mon Oct  3 16:50:16 1994
***************
*** 33,38 ****
--- 33,39 ----
  ;;>>   more-processing enabled.
  
  (require 'ehelp)
+ (require 'cl)
  
  (defvar terminal-escape-char ?\C-^
    "*All characters except for this are passed verbatim through the
***************
*** 159,164 ****
--- 160,171 ----
  (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
  
***************
*** 1010,1016 ****
  		 (progn (goto-char (point-max))
  			(recenter -1)))))))
  
! (defvar te-stty-string "stty -nl erase '^?' kill '^u' intr '^c' echo pass8"
    "Shell command to set terminal modes for terminal emulator.")
  ;; This used to have `new' in it, but that loses outside BSD
  ;; and it's apparently not needed in BSD.
--- 1017,1023 ----
  		 (progn (goto-char (point-max))
  			(recenter -1)))))))
  
! (defvar te-stty-string "stty -nl erase '^?' kill '^u' intr '^c' echo"
    "Shell command to set terminal modes for terminal emulator.")
  ;; This used to have `new' in it, but that loses outside BSD
  ;; and it's apparently not needed in BSD.
***************
*** 1077,1082 ****
--- 1084,1091 ----
    (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))
***************
*** 1087,1135 ****
        (if (y-or-n-p (format "Kill process %s? " (process-name process)))
  	  (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"
! 			       ;; 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)
--- 1096,1119 ----
        (if (y-or-n-p (format "Kill process %s? " (process-name process)))
  	  (delete-process process)
  	(error "Process %s not killed" (process-name process)))))
+ 
    (condition-case err
!       (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)
***************
*** 1242,1247 ****
--- 1226,1298 ----
  					     (1+ end)))
  		   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 (find system-type te-terminfo-systems)
+ 	   (not (file-exists-p (concat  "/tmp/" 
+ 					(subseq 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)
  

Diff exited abnormally with code 1 at Tue Oct  4 10:58:38
------------------------------------------------------------------------------
Kishore Kumar                                email: kishorek@tulblr.unisys.com
Tata Unisys Ltd. 
80 Ft Road, Indiranagar
Bangalore, INDIA                                        Phone : +91-80-5584681
------------------------------------------------------------------------------
Technical Details
Message-ID: <9410040602.AA02546@felix>
Path: arc1-ca.pugleaf.net!bga.com!news.sprintlink.net!howland.reston.ans.net!math.ohio-state.edu!magnus.acs.ohio-state.edu!cis.ohio-state.edu!tulblr.unisys.COM!kishorek

Show Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit
X-Google-Thread: fb2f1,250b1027b430bf69,start
X-Google-Attributes: gidfb2f1,public
X-Google-ArrivalTime: 1994-10-04 05:45:54 PST
Path: arc1-ca.pugleaf.net!bga.com!news.sprintlink.net!howland.reston.ans.net!math.ohio-state.edu!magnus.acs.ohio-state.edu!cis.ohio-state.edu!tulblr.unisys.COM!kishorek
From: kishorek@tulblr.unisys.COM (Kishore Kumar)
Newsgroups: gnu.emacs.bug
Subject: Terminfo support for terminal emulator
Date: 4 Oct 1994 07:23:09 -0400
Organization: GNUs Not Usenet
Lines: 242
Sender: daemon@cis.ohio-state.edu
Approved: bug-gnu-emacs@prep.ai.mit.edu
Distribution: gnu
Message-ID: <9410040602.AA02546@felix>