*** empty log message ***
[bpt/emacs.git] / lisp / terminal.el
index 7b2f4d7..d33ba91 100644 (file)
@@ -1,4 +1,4 @@
-;;; terminal.el --- terminal emulator for GNU Emacs.
+;;; terminal.el --- terminal emulator for GNU Emacs
 
 ;; Copyright (C) 1986,87,88,89,93,94 Free Software Foundation, Inc.
 
@@ -60,7 +60,7 @@ This variable is local to each terminal-emulator buffer."
   :type 'character
   :group 'terminal)
 
-(defcustom terminal-scrolling t ;;>> Setting this to T sort-of defeats my whole aim in writing this package...
+(defcustom terminal-scrolling t ;;>> Setting this to t sort-of defeats my whole aim in writing this package...
   "*If non-nil, the terminal-emulator will losingly `scroll' when output occurs
 past the bottom of the screen.  If nil, output will win and `wrap' to the top
 of the screen.
@@ -100,6 +100,9 @@ performance."
 (if terminal-map
     nil
   (let ((map (make-sparse-keymap)))
+    ;; Prevent defining [menu-bar] as te-pass-through
+    ;; so we allow the global menu bar to be visible.
+    (define-key map [menu-bar] (make-sparse-keymap))
     (define-key map [t] 'te-pass-through)
     (define-key map [switch-frame] 'handle-switch-frame)
     (define-key map "\e" terminal-meta-map)
@@ -206,9 +209,13 @@ performance."
           (use-local-map terminal-escape-map)
           (setq s (read-key-sequence
                     (if current-prefix-arg
-                        (format "Emacs Terminal escape> %d "
+                        (format "Emacs Terminal escape[%s for help]> %d "
+                               (substitute-command-keys
+                                "\\<terminal-escape-map>\\[te-escape-help]")
                                 (prefix-numeric-value current-prefix-arg))
-                        "Emacs Terminal escape> "))))
+                        (format "Emacs Terminal escape[%s for help]> "
+                               (substitute-command-keys
+                                "\\<terminal-escape-map>\\[te-escape-help]"))))))
       (use-global-map global)
       (use-local-map local))
 
@@ -247,12 +254,9 @@ Other chars following \"%s\" are interpreted as follows:\n"
                        (where-is-internal 'te-escape-extended-command
                                           terminal-escape-map t)
                        'te-escape-extended-command))
-        (let ((l (if (fboundp 'sortcar)
-                     (sortcar (copy-sequence te-escape-command-alist)
-                              'string<)
-                     (sort (copy-sequence te-escape-command-alist)
-                           (function (lambda (a b)
-                              (string< (car a) (car b))))))))
+        (let ((l (sort (copy-sequence te-escape-command-alist)
+                       (function (lambda (a b)
+                                   (string< (car a) (car b)))))))
           (while l
             (let ((doc (or (documentation (cdr (car l)))
                            "Not documented")))
@@ -1264,10 +1268,10 @@ of the terminal-emulator"
 (defun te-create-terminfo ()
   "Create and compile a terminfo entry for the virtual terminal. This is kept
 in the directory specified by `te-terminfo-directory'."
-  (if (and system-uses-terminfo
-          (not (file-exists-p (concat  te-terminfo-directory
-                                       (substring te-terminal-name-prefix 0 1)
-                                       "/" te-terminal-name))))
+  (when (and system-uses-terminfo
+            (not (file-exists-p (concat te-terminfo-directory
+                                        (substring te-terminal-name-prefix 0 1)
+                                        "/" te-terminal-name))))
     (let ( (terminfo
            (concat
             ;; The first newline avoids trouble with ncurses.
@@ -1278,24 +1282,30 @@ in the directory specified by `te-terminfo-directory'."
             "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,"
+            ;; The last newline avoids trouble with ncurses.
             "il1=^P^O!, ind=^P\\n, nel=\\n,\n"))
-          ;; The last newline avoids trouble with ncurses.
+          ;; This is the desired name for the source file.
           (file-name (concat te-terminfo-directory te-terminal-name ".tif")) )
       (make-directory te-terminfo-directory t)
-      (save-excursion
-       (set-buffer (create-file-buffer file-name))
-       (insert terminfo)
-       (write-file file-name)
-       (kill-buffer nil)
-       )
-      (let ( (process-environment
-             (cons (concat "TERMINFO="
-                           (directory-file-name te-terminfo-directory))
-                   process-environment)) )
+      (let ((temp-file
+            (make-temp-file (expand-file-name "tif" te-terminfo-directory))))
+       ;; Store the source file under a random temp name.
+       (with-temp-file temp-file
+         (insert terminfo))
+       ;; Rename it to the desired name.
+       ;; We use this roundabout approach
+       ;; to avoid any risk of writing a name that
+       ;; was michievouslyt set up as a symlink.
+       (rename-file temp-file file-name))
+      ;; Now compile that source to make the binary that the
+      ;; programs actually use.
+      (let ((process-environment
+            (cons (concat "TERMINFO="
+                          (directory-file-name te-terminfo-directory))
+                  process-environment)))
        (set-process-sentinel (start-process "tic" nil "tic" file-name)
                              'te-tic-sentinel))))
-    (directory-file-name te-terminfo-directory)
-)
+    (directory-file-name te-terminfo-directory))
 
 (defun te-create-termcap ()
   "Create a termcap entry for the virtual terminal"
@@ -1335,4 +1345,5 @@ in the directory specified by `te-terminfo-directory'."
 
 (provide 'terminal)
 
+;;; arch-tag: 0ae1d7d7-90ef-4566-a531-6e7ff8c79b2f
 ;;; terminal.el ends here