]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't load terminit files repeatedly. Also, don't call terminit functions more than...
authorKaroly Lorentey <lorentey@elte.hu>
Sat, 20 May 2006 15:28:05 +0000 (15:28 +0000)
committerKaroly Lorentey <lorentey@elte.hu>
Sat, 20 May 2006 15:28:05 +0000 (15:28 +0000)
* lisp/faces.el (tty-find-type): New function.
(tty-run-terminal-initialization): Load files just once per Emacs
session, and call terminit functions just once per terminal.

git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-563

lisp/faces.el

index ddce4c72e76b099c2d53ac99e4478fc213346d4f..b428db0ebf0119338e66f1ab393a020fb1975fc9 100644 (file)
@@ -1840,34 +1840,49 @@ created."
        (delete-frame frame)))
     frame))
 
+(defun tty-find-type (pred type)
+  "Return the longest prefix of TYPE to which PRED returns non-nil.
+TYPE should be a tty type name such as \"xterm-16color\".
+
+The function tries only those prefixes that are followed by a
+dash or underscore in the original type name, like \"xterm\" in
+the above example."
+  (let (hyphend)
+    (while (and type
+               (not (funcall pred type)))
+      ;; Strip off last hyphen and what follows, then try again
+      (setq type
+           (if (setq hyphend (string-match "[-_][^-_]+$" type))
+               (substring type 0 hyphend)
+             nil))))
+  type)
+
 (defun tty-run-terminal-initialization (frame)
   "Run the special initialization code for the terminal type of FRAME."
   ;; Load library for our terminal type.
   ;; User init file can set term-file-prefix to nil to prevent this.
   (with-selected-frame frame
-    (unless (null term-file-prefix)
-      (let* ((term (frame-parameter frame 'tty-type))
-            (term2 term)
-            hyphend term-init-func)
-       (while (and term
-                   (not (load (concat term-file-prefix term) t t)))
-         ;; Strip off last hyphen and what follows, then try again
-         (setq term
-               (if (setq hyphend (string-match "[-_][^-_]+$" term))
-                   (substring term 0 hyphend)
-                 nil)))
-       ;; The terminal file has been loaded, now find and call the
-       ;; terminal specific initialization function.
-       (while (and term2
-                   (not (fboundp
-                         (setq term-init-func (intern (concat "terminal-init-" term2))))))
-         ;; Strip off last hyphen and what follows, then try again
-         (setq term2
-               (if (setq hyphend (string-match "[-_][^-_]+$" term2))
-                   (substring term2 0 hyphend)
-                 nil)))
+    (unless (or (null term-file-prefix)
+               ;; Don't reinitialize the terminal each time a new
+               ;; frame is opened on it.
+               (terminal-parameter frame 'terminal-initted))
+      (let* (term-init-func)
+       ;; First, load the terminal initialization file, if it is
+       ;; available and it hasn't been loaded already.
+       (tty-find-type #'(lambda (type)
+                          (let ((file (locate-library (concat term-file-prefix type))))
+                            (and file
+                                 (or (assoc file load-history)
+                                     (load file t t)))))
+                      (tty-type frame))
+       ;; Next, try to find a matching initialization function, and call it.
+       (tty-find-type #'(lambda (type)
+                          (fboundp (setq term-init-func
+                                         (intern (concat "terminal-init-" type)))))
+                      (tty-type frame))
        (when (fboundp term-init-func)
-         (funcall term-init-func))))))
+         (funcall term-init-func))
+       (set-terminal-parameter frame 'terminal-initted term-init-func)))))
 
 ;; Called from C function init_display to initialize faces of the
 ;; dumped terminal frame on startup.