changeset 74891:181210a9cef5

(fancy-splash-last-input-event): New variable. (fancy-splash-special-event-action): New function. (fancy-splash-screens): Temporarily bind special events to it. Execute command for saved special event before exiting from recursive editing.
author YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
date Mon, 25 Dec 2006 08:18:09 +0000
parents 3c0aa07a07ec
children b064bb685ef7
files lisp/startup.el
diffstat 1 files changed, 33 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/startup.el	Mon Dec 25 01:08:43 2006 +0000
+++ b/lisp/startup.el	Mon Dec 25 08:18:09 2006 +0000
@@ -1205,6 +1205,7 @@
 (defvar fancy-splash-help-echo nil)
 (defvar fancy-splash-stop-time nil)
 (defvar fancy-splash-outer-buffer nil)
+(defvar fancy-splash-last-input-event nil)
 
 (defun fancy-splash-insert (&rest args)
   "Insert text into the current buffer, with faces.
@@ -1359,6 +1360,14 @@
     (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-screens (&optional hide-on-input)
   "Display fancy splash screens when Emacs starts."
@@ -1368,6 +1377,7 @@
 	    splash-buffer
 	    (old-minor-mode-map-alist minor-mode-map-alist)
 	    (old-emulation-mode-map-alists emulation-mode-map-alists)
+	    (old-special-event-map special-event-map)
 	    (frame (fancy-splash-frame))
 	    timer)
 	(save-selected-window
@@ -1383,6 +1393,20 @@
 		  (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)
 		  (setq display-hourglass nil
 			minor-mode-map-alist nil
 			emulation-mode-map-alists nil
@@ -1399,8 +1423,15 @@
 	      (cancel-timer timer)
 	      (setq display-hourglass old-hourglass
 		    minor-mode-map-alist old-minor-mode-map-alist
-		    emulation-mode-map-alists old-emulation-mode-map-alists)
-	      (kill-buffer splash-buffer)))))
+		    emulation-mode-map-alists old-emulation-mode-map-alists
+		    special-event-map old-special-event-map)
+	      (kill-buffer splash-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))))))
     ;; If hide-on-input is nil, don't hide the buffer on input.
     (if (or (window-minibuffer-p)
 	    (window-dedicated-p (selected-window)))