]> code.delx.au - gnu-emacs/blobdiff - lisp/startup.el
Merged from emacs@sv.gnu.org
[gnu-emacs] / lisp / startup.el
index 76bec878338bae4d2fcb87dc3e4554e223d30cd2..7e88b5f29e960aefacdadaba2ac0c0f86400cfa0 100644 (file)
 (defvar command-line-processed nil
   "Non-nil once command line has been processed.")
 
+(defvar window-system initial-window-system
+  "Name of window system the selected frame is displaying through.
+The value is a symbol--for instance, `x' for X windows.
+The value is nil if the selected frame is on a text-only-terminal.")
+
+(make-variable-frame-local 'window-system)
+
 (defgroup initialization nil
   "Emacs start-up procedure."
   :group 'internal)
@@ -437,36 +444,19 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
        ;; for instance due to a dense colormap.
        (when (or frame-initial-frame
                  ;; If frame-initial-frame has no meaning, do this anyway.
-                 (not (and window-system
+                 (not (and initial-window-system
                            (not noninteractive)
-                           (not (eq window-system 'pc)))))
+                           (not (eq initial-window-system 'pc)))))
          ;; Modify the initial frame based on what .emacs puts into
          ;; ...-frame-alist.
          (if (fboundp 'frame-notice-user-settings)
              (frame-notice-user-settings))
+         ;; Set the faces for the initial background mode even if
+         ;; frame-notice-user-settings didn't (such as on a tty).
+         ;; frame-set-background-mode is idempotent, so it won't
+         ;; cause any harm if it's already been done.
          (if (fboundp 'frame-set-background-mode)
-             ;; Set the faces for the initial background mode even if
-             ;; frame-notice-user-settings didn't (such as on a tty).
-             ;; frame-set-background-mode is idempotent, so it won't
-             ;; cause any harm if it's already been done.
-             (let ((frame (selected-frame))
-                   term)
-               (when (and (null window-system)
-                          ;; Don't override default set by files in lisp/term.
-                          (null default-frame-background-mode)
-                          (let ((bg (frame-parameter frame 'background-color)))
-                            (or (null bg)
-                                (member bg '(unspecified "unspecified-bg"
-                                                         "unspecified-fg")))))
-
-                 (setq term (getenv "TERM"))
-                 ;; Some files in lisp/term do a better job with the
-                 ;; background mode, but we leave this here anyway, in
-                 ;; case they remove those files.
-                 (if (string-match "^\\(xterm\\|rxvt\\|dtterm\\|eterm\\)"
-                                   term)
-                     (setq default-frame-background-mode 'light)))
-               (frame-set-background-mode (selected-frame)))))
+             (frame-set-background-mode (selected-frame))))
 
        ;; Now we know the user's default font, so add it to the menu.
        (if (fboundp 'font-menu-add-default)
@@ -507,6 +497,20 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
 (defvar tool-bar-originally-present nil
   "Non-nil if tool-bars are present before user and site init files are read.")
 
+(defvar handle-args-function-alist '((nil . tty-handle-args))
+  "Functions for processing window-system dependent command-line arguments.
+Window system startup files should add their own function to this
+alist, which should parse the command line arguments.  Those
+pertaining to the window system should be processed and removed
+from the returned command line.")
+
+(defvar window-system-initialization-alist '((nil . ignore))
+  "Alist of window-system initialization functions.
+Window-system startup files should add their own initialization
+function to this list.  The function should take no arguments,
+and initialize the window system environment to prepare for
+opening the first frame (e.g. open a connection to an X server).")
+
 ;; Handle the X-like command-line arguments "-fg", "-bg", "-name", etc.
 (defun tty-handle-args (args)
   (let (rest)
@@ -611,16 +615,22 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
     (setq eol-mnemonic-dos  "(DOS)"
           eol-mnemonic-mac  "(Mac)")))
 
-  ;; Read window system's init file if using a window system.
+  ;; Make sure window system's init file was loaded in loadup.el if using a window system.
   (condition-case error
-      (if (and window-system (not noninteractive))
-         (load (concat term-file-prefix
-                       (symbol-name window-system)
-                       "-win")
-               ;; Every window system should have a startup file;
-               ;; barf if we can't find it.
-               nil t))
-    ;; If we can't read it, print the error message and exit.
+    (unless noninteractive
+      (if (and initial-window-system
+              (not (featurep
+                    (intern (concat (symbol-name initial-window-system) "-win")))))
+         (error "Unsupported window system `%s'" initial-window-system))
+      ;; Process window-system specific command line parameters.
+      (setq command-line-args
+           (funcall (or (cdr (assq initial-window-system handle-args-function-alist))
+                        (error "Unsupported window system `%s'" initial-window-system))
+                    command-line-args))
+      ;; Initialize the window system. (Open connection, etc.)
+      (funcall (or (cdr (assq initial-window-system window-system-initialization-alist))
+                  (error "Unsupported window system `%s'" initial-window-system))))
+    ;; If there was an error, print the error message and exit.
     (error
      (princ
       (if (eq (car error) 'error)
@@ -636,13 +646,9 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
                              (cdr error) ", "))))
       'external-debugging-output)
      (terpri 'external-debugging-output)
-     (setq window-system nil)
+     (setq initial-window-system nil)
      (kill-emacs)))
 
-  ;; Windowed displays do this inside their *-win.el.
-  (unless (or (display-graphic-p) noninteractive)
-    (setq command-line-args (tty-handle-args command-line-args)))
-
   (set-locale-environment nil)
 
   ;; Convert preloaded file names in load-history to absolute.
@@ -763,7 +769,7 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   ;; If frame was created with a menu bar, set menu-bar-mode on.
   (unless (or noninteractive
              emacs-basic-display
-              (and (memq window-system '(x w32))
+              (and (memq initial-window-system '(x w32))
                    (<= (frame-parameter nil 'menu-bar-lines) 0)))
     (menu-bar-mode 1))
 
@@ -777,7 +783,6 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   ;; Can't do this init in defcustom because the relevant variables
   ;; are not set.
   (custom-reevaluate-setting 'blink-cursor-mode)
-  (custom-reevaluate-setting 'normal-erase-is-backspace)
   (custom-reevaluate-setting 'tooltip-mode)
   (custom-reevaluate-setting 'global-font-lock-mode)
   (custom-reevaluate-setting 'mouse-wheel-down-event)
@@ -786,13 +791,15 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   (custom-reevaluate-setting 'send-mail-function)
   (custom-reevaluate-setting 'focus-follows-mouse)
 
+  (normal-erase-is-backspace-setup-frame)
+
   ;; Register default TTY colors for the case the terminal hasn't a
-  ;; terminal init file.
-  (unless (memq window-system '(x w32 mac))
-    ;; We do this regardles of whether the terminal supports colors
-    ;; or not, since they can switch that support on or off in
-    ;; mid-session by setting the tty-color-mode frame parameter.
-    (tty-register-default-colors))
+  ;; terminal init file.  We do this regardles of whether the terminal
+  ;; supports colors or not and regardless the current display type,
+  ;; since users can connect to color-capable terminals and also
+  ;; switch color support on or off in mid-session by setting the
+  ;; tty-color-mode frame parameter.
+  (tty-register-default-colors)
 
   ;; Record whether the tool-bar is present before the user and site
   ;; init files are processed.  frame-notice-user-settings uses this
@@ -1054,31 +1061,8 @@ or `CVS', and any subdirectory that contains a file named `.nosearch'."
   ;; Load library for our terminal type.
   ;; User init file can set term-file-prefix to nil to prevent this.
   (unless (or noninteractive
-              window-system
-              (null term-file-prefix))
-    (let* ((TERM (getenv "TERM"))
-           (term TERM)
-          hyphend)
-      (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)))
-      (setq term TERM)
-      ;; The terminal file has been loaded, now call the terminal specific
-      ;; initialization function.
-      (while term
-       (let ((term-init-func (intern-soft (concat "terminal-init-" term))))
-         (if (not (fboundp term-init-func))
-              ;; Strip off last hyphen and what follows, then try again
-              (setq term
-                    (if (setq hyphend (string-match "[-_][^-_]+\\'" term))
-                        (substring term 0 hyphend)
-                      nil))
-            (setq term nil)
-           (funcall term-init-func))))))
+              initial-window-system)
+    (tty-run-terminal-initialization (selected-frame)))
 
   ;; Update the out-of-memory error message based on user's key bindings
   ;; for save-some-buffers.
@@ -1353,7 +1337,6 @@ Warning Warning!!!  Pure space overflow    !!!Warning Warning
     (force-mode-line-update)
     (setq fancy-current-text (cdr fancy-current-text))))
 
-
 (defun fancy-splash-default-action ()
   "Stop displaying the splash screen buffer.
 This is an internal function used to turn off the splash screen after
@@ -1363,20 +1346,23 @@ mouse."
   (if (and (memq 'down (event-modifiers last-command-event))
           (eq (posn-window (event-start last-command-event))
               (selected-window)))
-      ;; This is a mouse-down event in the spash screen window.
+      ;; This is a mouse-down event in the splash screen window.
       ;; Ignore it and consume the corresponding mouse-up event.
       (read-event)
     (push last-command-event unread-command-events))
   (throw 'exit nil))
 
-(defun fancy-splash-special-event-action ()
-  "Save the last event and stop displaying the splash screen buffer.
-This is an internal function used to turn off the splash screen after
-the user caused an input event that is bound in `special-event-map'"
-  (interactive)
-  (setq fancy-splash-last-input-event last-input-event)
-  (throw 'exit nil))
+(defun fancy-splash-exit ()
+  "Exit the splash screen."
+  (if (get-buffer "GNU Emacs")
+      (throw 'stop-splashing nil)))
 
+(defun fancy-splash-delete-frame (frame)
+  "Exit the splash screen after the frame is deleted."
+  ;; We can not throw from `delete-frame-events', so we set up a timer
+  ;; to exit the recursive edit as soon as Emacs is idle again.
+  (if (frame-live-p frame)
+      (run-at-time 0 nil 'fancy-splash-exit)))
 
 (defun fancy-splash-screens (&optional hide-on-input)
   "Display fancy splash screens when Emacs starts."
@@ -1396,27 +1382,32 @@ the user caused an input event that is bound in `special-event-map'"
          (setq splash-buffer (current-buffer))
          (catch 'stop-splashing
            (unwind-protect
-               (let ((map (make-sparse-keymap))
-                     (cursor-type nil))
-                 (use-local-map map)
-                 (define-key map [switch-frame] 'ignore)
+               (let* ((map (make-sparse-keymap))
+                      (cursor-type nil)
+                      (overriding-local-map map)
+                      ;; Catch if our frame is deleted; the delete-frame
+                      ;; event is unreliable and is handled by
+                      ;; `special-event-map' anyway.
+                      (delete-frame-functions (cons 'fancy-splash-delete-frame
+                                                    delete-frame-functions)))
                  (define-key map [t] 'fancy-splash-default-action)
                  (define-key map [mouse-movement] 'ignore)
                  (define-key map [mode-line t] 'ignore)
-                 ;; Temporarily bind special events to
-                 ;; fancy-splash-special-event-action so as to stop
-                 ;; displaying splash screens with such events.
-                 ;; Otherwise, drag-n-drop into splash screens may
-                 ;; leave us in recursive editing with invisible
-                 ;; cursors for a while.
-                 (setq special-event-map (make-sparse-keymap))
-                 (map-keymap
-                  (lambda (key def)
-                    (define-key special-event-map (vector key)
-                      (if (eq def 'ignore)
-                          'ignore
-                        'fancy-splash-special-event-action)))
-                  old-special-event-map)
+                 (define-key map [select-window] 'ignore)
+                 ;; Temporarily bind special events to
+                 ;; fancy-splash-special-event-action so as to stop
+                 ;; displaying splash screens with such events.
+                 ;; Otherwise, drag-n-drop into splash screens may
+                 ;; leave us in recursive editing with invisible
+                 ;; cursors for a while.
+                 (setq special-event-map (make-sparse-keymap))
+                 (map-keymap
+                  (lambda (key def)
+                    (define-key special-event-map (vector key)
+                      (if (eq def 'ignore)
+                          'ignore
+                        'fancy-splash-special-event-action)))
+                  old-special-event-map)
                  (setq display-hourglass nil
                        minor-mode-map-alist nil
                        emulation-mode-map-alists nil
@@ -1436,12 +1427,15 @@ the user caused an input event that is bound in `special-event-map'"
                    emulation-mode-map-alists old-emulation-mode-map-alists
                    special-event-map old-special-event-map)
              (kill-buffer splash-buffer)
+             (when (frame-live-p frame)
+               (select-frame frame)
+               (switch-to-buffer fancy-splash-outer-buffer))
              (when fancy-splash-last-input-event
                (setq last-input-event fancy-splash-last-input-event
                      fancy-splash-last-input-event nil)
-               (command-execute (lookup-key special-event-map
-                                            (vector last-input-event))
-                                nil (vector last-input-event) t))))))
+               (command-execute (lookup-key special-event-map
+                                            (vector last-input-event))
+                                nil (vector last-input-event) t))))))
     ;; If hide-on-input is nil, don't hide the buffer on input.
     (if (or (window-minibuffer-p)
            (window-dedicated-p (selected-window)))
@@ -1468,6 +1462,15 @@ Warning Warning!!!  Pure space overflow    !!!Warning Warning
          (view-mode-enter nil 'kill-buffer))
       (goto-char (point-min)))))
 
+(defun fancy-splash-special-event-action ()
+  "Save the last event and stop displaying the splash screen buffer.
+This is an internal function used to turn off the splash screen after
+the user caused an input event that is bound in `special-event-map'"
+  (interactive)
+  (setq fancy-splash-last-input-event last-input-event)
+  (throw 'exit nil))
+
+
 (defun fancy-splash-frame ()
   "Return the frame to use for the fancy splash screen.
 Returning non-nil does not mean we should necessarily
@@ -1559,90 +1562,90 @@ More Manuals / Ordering Manuals    How to order printed manuals from the FSF
                         "
 Copyright (C) 2007 Free Software Foundation, Inc."))
 
-            ;; No mouse menus, so give help using kbd commands.
-
-            ;; If keys have their default meanings,
-            ;; use precomputed string to save lots of time.
-            (if (and (eq (key-binding "\C-h") 'help-command)
-                     (eq (key-binding "\C-xu") 'advertised-undo)
-                     (eq (key-binding "\C-x\C-c") 'save-buffers-kill-emacs)
-                     (eq (key-binding "\C-ht") 'help-with-tutorial)
-                     (eq (key-binding "\C-hi") 'info)
-                     (eq (key-binding "\C-hr") 'info-emacs-manual)
-                     (eq (key-binding "\C-h\C-n") 'view-emacs-news))
-                (insert "
+           ;; No mouse menus, so give help using kbd commands.
+
+           ;; If keys have their default meanings,
+           ;; use precomputed string to save lots of time.
+           (if (and (eq (key-binding "\C-h") 'help-command)
+                    (eq (key-binding "\C-xu") 'advertised-undo)
+                    (eq (key-binding "\C-x\C-c") 'save-buffers-kill-terminal)
+                    (eq (key-binding "\C-ht") 'help-with-tutorial)
+                    (eq (key-binding "\C-hi") 'info)
+                    (eq (key-binding "\C-hr") 'info-emacs-manual)
+                    (eq (key-binding "\C-h\C-n") 'view-emacs-news))
+               (insert "
 Get help          C-h  (Hold down CTRL and press h)
 Emacs manual      C-h r
 Emacs tutorial    C-h t           Undo changes     C-x u
 Buy manuals        C-h C-m         Exit Emacs      C-x C-c
 Browse manuals     C-h i")
 
-              (insert (substitute-command-keys
-                       (format "\n
+             (insert (substitute-command-keys
+                      (format "\n
 Get help          %s
 Emacs manual      \\[info-emacs-manual]
 Emacs tutorial    \\[help-with-tutorial]\tUndo changes\t\\[advertised-undo]
-Buy manuals        \\[view-order-manuals]\tExit Emacs\t\\[save-buffers-kill-emacs]
+Buy manuals        \\[view-order-manuals]\tExit Emacs\t\\[save-buffers-kill-terminal]
 Browse manuals     \\[info]"
-                               (let ((where (where-is-internal
-                                             'help-command nil t)))
-                                 (if where
-                                     (key-description where)
-                                   "M-x help"))))))
-
-            ;; Say how to use the menu bar with the keyboard.
-            (if (and (eq (key-binding "\M-`") 'tmm-menubar)
-                     (eq (key-binding [f10]) 'tmm-menubar))
-                (insert "
+                              (let ((where (where-is-internal
+                                            'help-command nil t)))
+                                (if where
+                                    (key-description where)
+                                  "M-x help"))))))
+
+           ;; Say how to use the menu bar with the keyboard.
+           (if (and (eq (key-binding "\M-`") 'tmm-menubar)
+                    (eq (key-binding [f10]) 'tmm-menubar))
+               (insert "
 Activate menubar   F10  or  ESC `  or   M-`")
-              (insert (substitute-command-keys "
+             (insert (substitute-command-keys "
 Activate menubar     \\[tmm-menubar]")))
 
-            ;; Many users seem to have problems with these.
-            (insert "
+           ;; Many users seem to have problems with these.
+           (insert "
 \(`C-' means use the CTRL key.  `M-' means use the Meta (or Alt) key.
 If you have no Meta key, you may instead type ESC followed by the character.)")
 
-            (insert "\n\n" (emacs-version)
-                    "
+           (insert "\n\n" (emacs-version)
+                   "
 Copyright (C) 2007 Free Software Foundation, Inc.")
 
-            (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))
-                (insert
-                 "\n
+           (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))
+               (insert
+                "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type C-h C-w for full details.
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type C-h C-c to see the conditions.
 Type C-h C-d for information on getting the latest version.")
-              (insert (substitute-command-keys
-                       "\n
+             (insert (substitute-command-keys
+                      "\n
 GNU Emacs comes with ABSOLUTELY NO WARRANTY; type \\[describe-no-warranty] for full details.
 Emacs is Free Software--Free as in Freedom--so you can redistribute copies
 of Emacs and modify it; type \\[describe-copying] to see the conditions.
 Type \\[describe-distribution] for information on getting the latest version."))))
 
-          ;; The rest of the startup screen is the same on all
-          ;; kinds of terminals.
-
-          ;; 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."))
+         ;; The rest of the startup screen is the same on all
+         ;; kinds of terminals.
+
+         ;; 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."))
 
           ;; Display the input that we set up in the buffer.
           (set-buffer-modified-p nil)
@@ -1650,20 +1653,18 @@ Type \\[describe-distribution] for information on getting the latest version."))
          (if (and view-read-only (not view-mode))
              (view-mode-enter nil 'kill-buffer))
           (goto-char (point-min))
-          (if hide-on-input
-              (if (or (window-minibuffer-p)
-                      (window-dedicated-p (selected-window)))
-                  ;; If hide-on-input 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))
+         (if hide-on-input
+             (if (or (window-minibuffer-p)
+                     (window-dedicated-p (selected-window)))
+                 ;; If hide-on-input 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))
-            ;; In case the window is dedicated or something.
-            (error (pop-to-buffer (current-buffer))))))
+                 (switch-to-buffer (current-buffer))
+                 (sit-for 120))
+               (condition-case nil
+                   (switch-to-buffer (current-buffer))))))
       ;; Unwind ... ensure splash buffer is killed
       (if hide-on-input
          (kill-buffer "GNU Emacs")
@@ -1681,7 +1682,45 @@ Type \\[describe-distribution] for information on getting the latest version."))
 
 (defun display-startup-echo-area-message ()
   (let ((resize-mini-windows t))
-    (message "%s" (startup-echo-area-message))))
+    (or noninteractive ;(input-pending-p) init-file-had-error
+       ;; t if the init file says to inhibit the echo area startup message.
+       (and inhibit-startup-echo-area-message
+            user-init-file
+            (or (and (get 'inhibit-startup-echo-area-message 'saved-value)
+                     (equal inhibit-startup-echo-area-message
+                            (if (equal init-file-user "")
+                                (user-login-name)
+                              init-file-user)))
+                ;; Wasn't set with custom; see if .emacs has a setq.
+                (let ((buffer (get-buffer-create " *temp*")))
+                  (prog1
+                      (condition-case nil
+                          (save-excursion
+                            (set-buffer buffer)
+                            (insert-file-contents user-init-file)
+                            (re-search-forward
+                             (concat
+                              "([ \t\n]*setq[ \t\n]+"
+                              "inhibit-startup-echo-area-message[ \t\n]+"
+                              (regexp-quote
+                               (prin1-to-string
+                                (if (equal init-file-user "")
+                                    (user-login-name)
+                                  init-file-user)))
+                              "[ \t\n]*)")
+                             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))))))
 
 
 (defun display-splash-screen (&optional hide-on-input)
@@ -1690,51 +1729,14 @@ Fancy splash screens are used on graphic displays,
 normal otherwise.
 With a prefix argument, any user input hides the splash screen."
   (interactive "P")
-  (if (use-fancy-splash-screens-p)
-      (fancy-splash-screens hide-on-input)
-    (normal-splash-screen hide-on-input)))
-
+  ;; Prevent recursive calls from server-process-filter.
+  (if (not (get-buffer "GNU Emacs"))
+      (if (use-fancy-splash-screens-p)
+         (fancy-splash-screens hide-on-input)
+       (normal-splash-screen hide-on-input))))
 
 (defun command-line-1 (command-line-args-left)
-  (or noninteractive (input-pending-p) init-file-had-error
-      ;; t if the init file says to inhibit the echo area startup message.
-      (and inhibit-startup-echo-area-message
-          user-init-file
-          (or (and (get 'inhibit-startup-echo-area-message 'saved-value)
-                   (equal inhibit-startup-echo-area-message
-                          (if (equal init-file-user "")
-                              (user-login-name)
-                            init-file-user)))
-              ;; Wasn't set with custom; see if .emacs has a setq.
-              (let ((buffer (get-buffer-create " *temp*")))
-                (prog1
-                    (condition-case nil
-                        (save-excursion
-                          (set-buffer buffer)
-                          (insert-file-contents user-init-file)
-                          (re-search-forward
-                           (concat
-                            "([ \t\n]*setq[ \t\n]+"
-                            "inhibit-startup-echo-area-message[ \t\n]+"
-                            (regexp-quote
-                             (prin1-to-string
-                              (if (equal init-file-user "")
-                                  (user-login-name)
-                                init-file-user)))
-                            "[ \t\n]*)")
-                           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)
-        (display-startup-echo-area-message)))
+  (display-startup-echo-area-message)
 
   ;; Delay 2 seconds after an init file error message
   ;; was displayed, so user can read it.