(function-key-map): Use char-names more consistently.
[bpt/emacs.git] / lisp / terminal.el
index 04f9830..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)
@@ -187,7 +190,9 @@ performance."
 ;; Required to support terminfo systems
 (defconst te-terminal-name-prefix "emacs-em"
   "Prefix used for terminal type names for Terminfo.")
-(defconst te-terminfo-directory "/tmp/emacs-terminfo/"
+(defconst te-terminfo-directory
+  (file-name-as-directory
+   (expand-file-name "emacs-terminfo" temporary-file-directory))
   "Directory used for run-time terminal definition files for Terminfo.")
 (defvar te-terminal-name nil)
 \f
@@ -204,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))
 
@@ -245,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")))
@@ -989,11 +995,10 @@ move to start of new line, clear to end of line."
             ;; preemptible output!  Oh my!!
             (throw 'te-process-output t)))))
   ;; We must update window-point in every window displaying our buffer
-  (let* ((s (selected-window))
-        (w s))
-    (while (not (eq s (setq w (next-window w))))
-      (if (eq (window-buffer w) (current-buffer))
-         (set-window-point w (point))))))
+  (walk-windows (lambda (w)
+                 (when (and (not (eq w (selected-window)))
+                            (eq (window-buffer w) (current-buffer)))
+                   (set-window-point w (point))))))
 
 (defun te-get-char ()
   (if (cdr te-pending-output)
@@ -1069,7 +1074,7 @@ move to start of new line, clear to end of line."
 ARGS is a list of argument-strings.  Remaining arguments are WIDTH and HEIGHT.
 BUFFER's contents are made an image of the display generated by that program,
 and any input typed when BUFFER is the current Emacs buffer is sent to that
-program an keyboard input.
+program as keyboard input.
 
 Interactively, BUFFER defaults to \"*terminal*\" and PROGRAM and ARGS
 are parsed from an input-string using your usual shell.
@@ -1119,8 +1124,9 @@ subprocess started."
   (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 te-terminal-name (concat te-terminal-name-prefix
+                                (number-to-string te-width)
+                                (number-to-string te-height)))
   (setq mode-line-buffer-identification
        (list (format "Emacs terminal %dx%d: %%b  " te-width te-height)
              'te-pending-output-info))
@@ -1262,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.
@@ -1276,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"
@@ -1333,4 +1345,5 @@ in the directory specified by `te-terminfo-directory'."
 
 (provide 'terminal)
 
+;;; arch-tag: 0ae1d7d7-90ef-4566-a531-6e7ff8c79b2f
 ;;; terminal.el ends here