changeset 83887:5e1dbcacecd3

(fancy-about-text): New variable. (fancy-splash-delay, fancy-splash-max-time): Remove user options. (fancy-current-text, fancy-splash-stop-time) (fancy-splash-outer-buffer): Remove variables. (fancy-splash-head, fancy-splash-tail): Add new optional argument `startup' and use it to conditionally display different texts for Startup and About screens. Don't display Help commands on the About screen. (fancy-splash-screens-1): Remove function and move its content to `fancy-splash-screens' to the part that dislpays the About screen. (exit-splash-screen): Don't treat specially exiting from alternating screens. (fancy-splash-screens): Rename argument `static' to `startup'. Fix docstring. Remove code for displaying alternating screens. Use arg `startup' in calls to `fancy-splash-head', `fancy-splash-tail'. Remove let-bind for `fancy-splash-outer-buffer' and add let-bind for `inhibit-read-only'. (normal-splash-screen): Rename argument `static' to `startup'. Fix docstring. Use argument `startup' to conditionally display different texts for Startup and About screens. Don't display Help commands on the About screen. Remove `unwind-protect' `sit-for' delay and `kill-buffer' after it. (display-startup-echo-area-message): Remove call to `use-fancy-splash-screens-p' because image.el is preloaded and doesn't display "Loading image... done". (display-splash-screen): Rename argument `static' to `startup'. Fix docstring.
author Juri Linkov <juri@jurta.org>
date Tue, 04 Sep 2007 22:52:08 +0000
parents bb3eb6739f35
children f5b67b11d8bf
files lisp/startup.el
diffstat 1 files changed, 161 insertions(+), 222 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/startup.el	Tue Sep 04 22:41:07 2007 +0000
+++ b/lisp/startup.el	Tue Sep 04 22:52:08 2007 +0000
@@ -1198,26 +1198,19 @@
 Each element in the list should be a list of strings or pairs
 `:face FACE', like `fancy-splash-insert' accepts them.")
 
+(defvar fancy-about-text
+  '((:face variable-pitch
+    ))
+  "A list of texts to show in the middle part of the About screen.
+Each element in the list should be a list of strings or pairs
+`:face FACE', like `fancy-splash-insert' accepts them.")
+
 
 (defgroup fancy-splash-screen ()
   "Fancy splash screen when Emacs starts."
   :version "21.1"
   :group 'initialization)
 
-
-(defcustom fancy-splash-delay 7
-  "*Delay in seconds between splash screens."
-  :group 'fancy-splash-screen
-  :type 'integer)
-
-
-(defcustom fancy-splash-max-time 30
-  "*Show splash screens for at most this number of seconds.
-Values less than twice `fancy-splash-delay' are ignored."
-  :group 'fancy-splash-screen
-  :type 'integer)
-
-
 (defcustom fancy-splash-image nil
   "*The image to show in the splash screens, or nil for defaults."
   :group 'fancy-splash-screen
@@ -1237,10 +1230,7 @@
 
 ;; These are temporary storage areas for the splash screen display.
 
-(defvar fancy-current-text nil)
 (defvar fancy-splash-help-echo nil)
-(defvar fancy-splash-stop-time nil)
-(defvar fancy-splash-outer-buffer nil)
 
 (defun fancy-splash-insert (&rest args)
   "Insert text into the current buffer, with faces.
@@ -1268,7 +1258,7 @@
       (setq args (cdr args)))))
 
 
-(defun fancy-splash-head ()
+(defun fancy-splash-head (&optional startup)
   "Insert the head part of the splash screen into the current buffer."
   (let* ((image-file (cond ((stringp fancy-splash-image)
 			    fancy-splash-image)
@@ -1307,27 +1297,21 @@
        "GNU Emacs is one component of the GNU/Linux operating system."
      "GNU Emacs is one component of the GNU operating system."))
   (insert "\n")
-  (fancy-splash-insert
-   :face 'variable-pitch
-   "You can do basic editing with the menu bar and scroll bar \
+  (if startup
+      (fancy-splash-insert
+       :face 'variable-pitch
+       "You can do basic editing with the menu bar and scroll bar \
 using the mouse.\n"
-   :face 'variable-pitch
-   "To quit a partially entered command, type "
-   :face 'default
-   "Control-g"
-   :face 'variable-pitch
-   "."
-   "\n\n")
-  (when fancy-splash-outer-buffer
-    (fancy-splash-insert
-     :face 'variable-pitch
-     "Type "
-     :face 'default
-     "`q'"
-     :face 'variable-pitch
-     " to exit from this screen.\n")))
+       :face 'variable-pitch
+       "To quit a partially entered command, type "
+       :face 'default
+       "Control-g"
+       :face 'variable-pitch
+       "."
+       "\n\n"))
+  )
 
-(defun fancy-splash-tail ()
+(defun fancy-splash-tail (&optional startup)
   "Insert the tail part of the splash screen into the current buffer."
   (let ((fg (if (eq (frame-parameter nil 'background-mode) 'dark)
 		"cyan" "darkblue")))
@@ -1336,8 +1320,10 @@
 			 (emacs-version)
 			 "\n"
 			 :face '(variable-pitch :height 0.5)
-			 emacs-copyright)
-    (and auto-save-list-file-prefix
+			 emacs-copyright
+			 "\n")
+    (and startup
+	 auto-save-list-file-prefix
 	 ;; Don't signal an error if the
 	 ;; directory for auto-save-list files
 	 ;; does not yet exist.
@@ -1351,7 +1337,7 @@
 				 auto-save-list-file-prefix)))
 	  t)
 	 (fancy-splash-insert :face '(variable-pitch :foreground "red")
-			      "\n\nIf an Emacs session crashed recently, "
+			      "\nIf an Emacs session crashed recently, "
 			      "type "
 			      :face '(fixed-pitch :foreground "red")
 			      "Meta-x recover-session RET"
@@ -1359,100 +1345,72 @@
 			      "\nto recover"
 			      " the files you were editing.\n"))))
 
-(defun fancy-splash-screens-1 (buffer)
-  "Timer function displaying a splash screen."
-  (when (> (float-time) fancy-splash-stop-time)
-    (throw 'stop-splashing nil))
-  (unless fancy-current-text
-    (setq fancy-current-text fancy-splash-text))
-  (let ((text (car fancy-current-text))
-	(inhibit-read-only t))
-    (set-buffer buffer)
-    (erase-buffer)
-    (if pure-space-overflow
-	(insert "\
-Warning Warning!!!  Pure space overflow    !!!Warning Warning
-\(See the node Pure Storage in the Lisp manual for details.)\n"))
-    (fancy-splash-head)
-    (apply #'fancy-splash-insert text)
-    (fancy-splash-tail)
-    (unless (current-message)
-      (message fancy-splash-help-echo))
-    (set-buffer-modified-p nil)
-    (goto-char (point-min))
-    (force-mode-line-update)
-    (setq fancy-current-text (cdr fancy-current-text))))
-
 (defun exit-splash-screen ()
   "Stop displaying the splash screen buffer."
   (interactive)
-  (if fancy-splash-outer-buffer
-      (throw 'stop-splashing nil)
-    (quit-window t)))
+  (quit-window t))
 
-(defun fancy-splash-screens (&optional static)
-  "Display fancy splash screens when Emacs starts."
-  (if (not static)
-      (let ((old-hourglass display-hourglass)
-	    (fancy-splash-outer-buffer (current-buffer))
-	    splash-buffer
-	    (frame (fancy-splash-frame))
-	    timer)
+(defun fancy-splash-screens (&optional startup)
+  "Display fancy splash screens.
+If optional argument STARTUP is non-nil, display the startup screen
+after Emacs starts.  If STARTUP is nil, display the About screen."
+  (if (not startup)
+      ;; Display About screen
+      (let ((frame (fancy-splash-frame)))
 	(save-selected-window
 	  (select-frame frame)
 	  (switch-to-buffer "*About GNU Emacs*")
-	  (make-local-variable 'cursor-type)
-	  (setq splash-buffer (current-buffer))
-	  (catch 'stop-splashing
-	    (unwind-protect
-		(let ((cursor-type nil))
-		  (setq display-hourglass nil
-			buffer-undo-list t
-			mode-line-format (propertize "---- %b %-"
-						     'face 'mode-line-buffer-id)
-			fancy-splash-stop-time (+ (float-time)
-						  fancy-splash-max-time)
-			timer (run-with-timer 0 fancy-splash-delay
-					      #'fancy-splash-screens-1
-					      splash-buffer))
-		  (use-local-map splash-screen-keymap)
-		  (setq tab-width 22)
-		  (message "%s" (startup-echo-area-message))
-		  (setq buffer-read-only t)
-		  (recursive-edit))
-	      (cancel-timer timer)
-	      (setq display-hourglass old-hourglass)
-	      (kill-buffer splash-buffer)
-	      (when (frame-live-p frame)
-		(select-frame frame)
-		(switch-to-buffer fancy-splash-outer-buffer))))))
-    ;; If static is non-nil, don't show fancy splash screen.
+	  (setq buffer-undo-list t
+		mode-line-format (propertize "---- %b %-"
+					     'face 'mode-line-buffer-id))
+	  (let ((inhibit-read-only t))
+	    (erase-buffer)
+	    (if pure-space-overflow
+		(insert "\
+Warning Warning!!!  Pure space overflow    !!!Warning Warning
+\(See the node Pure Storage in the Lisp manual for details.)\n"))
+	    (fancy-splash-head startup)
+	    (dolist (text fancy-about-text)
+	      (apply #'fancy-splash-insert text)
+	      (insert "\n"))
+	    (fancy-splash-tail startup)
+	    (unless (current-message)
+	      (message fancy-splash-help-echo))
+	    (set-buffer-modified-p nil)
+	    (goto-char (point-min))
+	    (force-mode-line-update))
+	  (use-local-map splash-screen-keymap)
+	  (setq tab-width 22)
+	  (message "%s" (startup-echo-area-message))
+	  (setq buffer-read-only t)
+	  (goto-char (point-min))))
+
+    ;; If startup is non-nil, display startup fancy splash screen.
     (if (or (window-minibuffer-p)
 	    (window-dedicated-p (selected-window)))
 	(pop-to-buffer (current-buffer))
       (switch-to-buffer "*GNU Emacs*"))
-    (setq buffer-read-only nil)
-    (erase-buffer)
-    (if pure-space-overflow
-	(insert "\
+    (let ((inhibit-read-only t))
+      (erase-buffer)
+      (if pure-space-overflow
+	  (insert "\
 Warning Warning!!!  Pure space overflow    !!!Warning Warning
 \(See the node Pure Storage in the Lisp manual for details.)\n"))
-    (let (fancy-splash-outer-buffer)
-      (fancy-splash-head)
+      (fancy-splash-head startup)
       (dolist (text fancy-splash-text)
 	(apply #'fancy-splash-insert text)
 	(insert "\n"))
       (skip-chars-backward "\n")
       (delete-region (point) (point-max))
       (insert "\n")
-      (fancy-splash-tail)
-      (use-local-map splash-screen-keymap)
-      (setq tab-width 22)
-      (set-buffer-modified-p nil)
-      (setq buffer-read-only t)
-      (if (and view-read-only (not view-mode))
-	  (view-mode-enter nil 'kill-buffer))
-      (goto-char (point-min)))))
+      (fancy-splash-tail startup))
+    (use-local-map splash-screen-keymap)
+    (setq tab-width 22)
+    (set-buffer-modified-p nil)
+    (setq buffer-read-only t)
+    (if (and view-read-only (not view-mode))
+	(view-mode-enter nil 'kill-buffer))
+    (goto-char (point-min))))
 
 (defun fancy-splash-frame ()
   "Return the frame to use for the fancy splash screen.
@@ -1486,42 +1444,41 @@
 	  (> frame-height (+ image-height 19)))))))
 
 
-(defun normal-splash-screen (&optional static)
-  "Display splash screen when Emacs starts."
+(defun normal-splash-screen (&optional startup)
+  "Display non-graphic splash screen.
+If optional argument STARTUP is non-nil, display the startup screen
+after Emacs starts.  If STARTUP is nil, display the About screen."
   (let ((prev-buffer (current-buffer)))
-    (unwind-protect
-	(with-current-buffer (get-buffer-create "*About GNU Emacs*")
-	  (setq buffer-read-only nil)
-	  (erase-buffer)
-	  (set (make-local-variable 'tab-width) 8)
-	  (if (not static)
-	      (set (make-local-variable 'mode-line-format)
-		   (propertize "---- %b %-" 'face 'mode-line-buffer-id)))
+    (with-current-buffer (get-buffer-create "*About GNU Emacs*")
+      (setq buffer-read-only nil)
+      (erase-buffer)
+      (set (make-local-variable 'tab-width) 8)
+      (if (not startup)
+	  (set (make-local-variable 'mode-line-format)
+	       (propertize "---- %b %-" 'face 'mode-line-buffer-id)))
 
-          (if pure-space-overflow
-              (insert "\
+      (if pure-space-overflow
+	  (insert "\
 Warning Warning!!!  Pure space overflow    !!!Warning Warning
 \(See the node Pure Storage in the Lisp manual for details.)\n"))
 
-          ;; The convention for this piece of code is that
-          ;; each piece of output starts with one or two newlines
-          ;; and does not end with any newlines.
-          (insert "Welcome to GNU Emacs")
-          (insert
-           (if (eq system-type 'gnu/linux)
-               ", one component of the GNU/Linux operating system.\n"
-             ", a part of the GNU operating system.\n"))
+      ;; The convention for this piece of code is that
+      ;; each piece of output starts with one or two newlines
+      ;; and does not end with any newlines.
+      (if startup
+	  (insert "Welcome to GNU Emacs")
+	(insert "This is GNU Emacs"))
+      (insert
+       (if (eq system-type 'gnu/linux)
+	   ", one component of the GNU/Linux operating system.\n"
+	 ", a part of the GNU operating system.\n"))
 
-	  (if (not static)
-	      (insert (substitute-command-keys
-		       (concat
-			"\nType \\[recenter] to quit from this screen.\n"))))
-
-          (if (display-mouse-p)
-              ;; The user can use the mouse to activate menus
-              ;; so give help in terms of menu items.
-              (progn
-                (insert "\
+      (if startup
+	  (if (display-mouse-p)
+	      ;; The user can use the mouse to activate menus
+	      ;; so give help in terms of menu items.
+	      (progn
+		(insert "\
 You can do basic editing with the menu bar and scroll bar using the mouse.
 To quit a partially entered command, type Control-g.\n")
 
@@ -1574,8 +1531,8 @@
 			       'follow-link t)
 		(insert "\tChange initialization settings including this screen\n")
 
-                (insert "\n" (emacs-version)
-                        "\n" emacs-copyright))
+		(insert "\n" (emacs-version)
+			"\n" emacs-copyright))
 
 	    ;; No mouse menus, so give help using kbd commands.
 
@@ -1588,9 +1545,9 @@
 		     (eq (key-binding "\C-hi") 'info)
 		     (eq (key-binding "\C-hr") 'info-emacs-manual)
 		     (eq (key-binding "\C-h\C-n") 'view-emacs-news))
-                (progn
+		(progn
 		  (insert "
-Get help	   C-h  (Hold down CTRL and press h)
+Get help\t   C-h  (Hold down CTRL and press h)
 ")
 		  (insert-button "Emacs manual"
 				 'action (lambda (button) (info-emacs-manual))
@@ -1612,7 +1569,7 @@
 		  (insert "\t   C-h C-m\tExit Emacs\t   C-x C-c"))
 
 	      (insert (format "
-Get help	   %s
+Get help\t   %s
 "
 			      (let ((where (where-is-internal
 					    'help-command nil t)))
@@ -1622,7 +1579,7 @@
 	      (insert-button "Emacs manual"
 			     'action (lambda (button) (info-emacs-manual))
 			     'follow-link t)
-	      (insert (substitute-command-keys"	   \\[info-emacs-manual]\t"))
+	      (insert (substitute-command-keys"\t   \\[info-emacs-manual]\t"))
 	      (insert-button "Browse manuals"
 			     'action (lambda (button) (Info-directory))
 			     'follow-link t)
@@ -1632,7 +1589,7 @@
 			     'action (lambda (button) (help-with-tutorial))
 			     'follow-link t)
 	      (insert (substitute-command-keys
-		       "	   \\[help-with-tutorial]\tUndo changes\t   \\[advertised-undo]
+		       "\t   \\[help-with-tutorial]\tUndo changes\t   \\[advertised-undo]
 "))
 	      (insert-button "Buy manuals"
 			     'action (lambda (button) (view-order-manuals))
@@ -1640,15 +1597,15 @@
 	      (insert (substitute-command-keys
 		       "\t   \\[view-order-manuals]\tExit Emacs\t   \\[save-buffers-kill-terminal]")))
 
-            ;; Say how to use the menu bar with the keyboard.
+	    ;; Say how to use the menu bar with the keyboard.
 	    (insert "\n")
 	    (insert-button "Activate menubar"
 			   'action (lambda (button) (tmm-menubar))
 			   'follow-link t)
-            (if (and (eq (key-binding "\M-`") 'tmm-menubar)
-                     (eq (key-binding [f10]) 'tmm-menubar))
-                (insert "   F10  or  ESC `  or   M-`")
-              (insert (substitute-command-keys "     \\[tmm-menubar]")))
+	    (if (and (eq (key-binding "\M-`") 'tmm-menubar)
+		     (eq (key-binding [f10]) 'tmm-menubar))
+		(insert "   F10  or  ESC `  or   M-`")
+	      (insert (substitute-command-keys "   \\[tmm-menubar]")))
 
 	    ;; Many users seem to have problems with these.
 	    (insert "
@@ -1677,13 +1634,13 @@
 			   'follow-link t)
 	    (insert "\n")
 
-            (insert "\n" (emacs-version)
-                    "\n" emacs-copyright)
+	    (insert "\n" (emacs-version)
+		    "\n" emacs-copyright)
 
 	    (if (and (eq (key-binding "\C-h\C-c") 'describe-copying)
 		     (eq (key-binding "\C-h\C-d") 'describe-distribution)
 		     (eq (key-binding "\C-h\C-w") 'describe-no-warranty))
-                (progn
+		(progn
 		  (insert
 		   "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for ")
@@ -1702,8 +1659,8 @@
 				 'action (lambda (button) (describe-distribution))
 				 'follow-link t)
 		  (insert "."))
-              (insert (substitute-command-keys
-                       "\n
+	      (insert (substitute-command-keys
+		       "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for "))
 	      (insert-button "full details"
 			     'action (lambda (button) (describe-no-warranty))
@@ -1721,52 +1678,42 @@
 			     'follow-link t)
 	      (insert ".")))
 
-	  ;; The rest of the startup screen is the same on all
-	  ;; kinds of terminals.
+	;; About screen
+	(insert "\n" (emacs-version) "\n" emacs-copyright "\n")
+	)
 
-	  ;; Give information on recovering, if there was a crash.
-	  (and auto-save-list-file-prefix
-	       ;; Don't signal an error if the
-	       ;; directory for auto-save-list files
-	       ;; does not yet exist.
-	       (file-directory-p (file-name-directory
-				  auto-save-list-file-prefix))
-	       (directory-files
-		(file-name-directory auto-save-list-file-prefix)
-		nil
-		(concat "\\`"
-			(regexp-quote (file-name-nondirectory
-				       auto-save-list-file-prefix)))
-		t)
-	       (insert "\n\nIf an Emacs session crashed recently, "
-		       "type Meta-x recover-session RET\nto recover"
-                       " the files you were editing.\n"))
-
-	  (use-local-map splash-screen-keymap)
+      ;; The rest of the startup screen is the same on all
+      ;; kinds of terminals.
 
-          ;; Display the input that we set up in the buffer.
-          (set-buffer-modified-p nil)
-	  (setq buffer-read-only t)
-	  (if (and view-read-only (not view-mode))
-	      (view-mode-enter nil 'kill-buffer))
-          (goto-char (point-min))
-	  (if (not static)
-	      (if (or (window-minibuffer-p)
-		      (window-dedicated-p (selected-window)))
-		  ;; If static is nil, creating a new frame will
-		  ;; generate enough events that the subsequent `sit-for'
-		  ;; will immediately return anyway.
-		  nil ;; (pop-to-buffer (current-buffer))
-		(save-window-excursion
-		  (switch-to-buffer (current-buffer))
-		  (sit-for 120))
-		(condition-case nil
-		    (switch-to-buffer (current-buffer))))))
-      ;; Unwind ... ensure splash buffer is killed
-      (if (not static)
-	  (kill-buffer "*About GNU Emacs*")
-	(switch-to-buffer "*About GNU Emacs*")
-	(rename-buffer "*GNU Emacs*" t)))))
+      ;; Give information on recovering, if there was a crash.
+      (and startup
+	   auto-save-list-file-prefix
+	   ;; Don't signal an error if the
+	   ;; directory for auto-save-list files
+	   ;; does not yet exist.
+	   (file-directory-p (file-name-directory
+			      auto-save-list-file-prefix))
+	   (directory-files
+	    (file-name-directory auto-save-list-file-prefix)
+	    nil
+	    (concat "\\`"
+		    (regexp-quote (file-name-nondirectory
+				   auto-save-list-file-prefix)))
+	    t)
+	   (insert "\n\nIf an Emacs session crashed recently, "
+		   "type Meta-x recover-session RET\nto recover"
+		   " the files you were editing.\n"))
+
+      (use-local-map splash-screen-keymap)
+
+      ;; Display the input that we set up in the buffer.
+      (set-buffer-modified-p nil)
+      (setq buffer-read-only t)
+      (if (and view-read-only (not view-mode))
+	  (view-mode-enter nil 'kill-buffer))
+      (switch-to-buffer "*About GNU Emacs*")
+      (if startup (rename-buffer "*GNU Emacs*" t))
+      (goto-char (point-min)))))
 
 
 (defun startup-echo-area-message ()
@@ -1808,29 +1755,21 @@
 			      nil t))
 			 (error nil))
 		     (kill-buffer buffer)))))
-	;; display-splash-screen at the end of command-line-1 calls
-	;; use-fancy-splash-screens-p. This can cause image.el to be
-	;; loaded, putting "Loading image... done" in the echo area.
-	;; This hides startup-echo-area-message. So
-	;; use-fancy-splash-screens-p is called here simply to get the
-	;; loading of image.el (if needed) out of the way before
-	;; display-startup-echo-area-message runs.
-	(progn
-	  (use-fancy-splash-screens-p)
-	  (message "%s" (startup-echo-area-message))))))
+	(message "%s" (startup-echo-area-message)))))
 
 
-(defun display-splash-screen (&optional static)
+(defun display-splash-screen (&optional startup)
   "Display splash screen according to display.
-Fancy splash screens are used on graphic displays,
-normal otherwise.
-With a prefix argument, any user input hides the splash screen."
+Fancy splash screens are used on graphic displays, normal otherwise.
+
+If optional argument STARTUP is non-nil, display the startup screen
+after Emacs starts.  If STARTUP is nil, display the About screen."
   (interactive "P")
   ;; Prevent recursive calls from server-process-filter.
   (if (not (get-buffer "*About GNU Emacs*"))
       (if (use-fancy-splash-screens-p)
-	  (fancy-splash-screens static)
-	(normal-splash-screen static))))
+	  (fancy-splash-screens startup)
+	(normal-splash-screen startup))))
 
 (defalias 'about-emacs 'display-splash-screen)