changeset 58998:dd8c66d7733c

(zone): Fix omission bug: Use a self-disabling one-shot thunk for uniform (error, quit, normal) recovery. (zone-pgm-random-life): Fix bug: Recognize empty initial field by lack of "@" chars.
author Thien-Thi Nguyen <ttn@gnuvola.org>
date Thu, 16 Dec 2004 17:08:34 +0000
parents f7098e12436d
children fbea361e1fcb
files lisp/play/zone.el
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/play/zone.el	Thu Dec 16 15:26:39 2004 +0000
+++ b/lisp/play/zone.el	Thu Dec 16 17:08:34 2004 +0000
@@ -152,8 +152,15 @@
     (set-window-point (selected-window) wp)
     (sit-for 0 500)
     (let ((pgm (elt zone-programs (random (length zone-programs))))
-          (ct (and f (frame-parameter f 'cursor-type))))
-      (when ct (modify-frame-parameters f '((cursor-type . (bar . 0)))))
+          (ct (and f (frame-parameter f 'cursor-type)))
+          (restore (list '(kill-buffer outbuf))))
+      (when ct
+        (modify-frame-parameters f '((cursor-type . (bar . 0))))
+        (setq restore (cons '(modify-frame-parameters
+                              f (list (cons 'cursor-type ct)))
+                            restore)))
+      ;; Make `restore' a self-disabling one-shot thunk.
+      (setq restore `(lambda () ,@restore (setq restore nil)))
       (condition-case nil
           (progn
             (message "Zoning... (%s)" pgm)
@@ -167,14 +174,17 @@
             (zone-call pgm)
             (message "Zoning...sorry"))
         (error
+         (funcall restore)
          (while (not (input-pending-p))
            (message (format "We were zoning when we wrote %s..." pgm))
            (sit-for 3)
            (message "...here's hoping we didn't hose your buffer!")
            (sit-for 3)))
-        (quit (ding) (message "Zoning...sorry")))
-      (when ct (modify-frame-parameters f (list (cons 'cursor-type ct)))))
-    (kill-buffer outbuf)))
+        (quit
+         (funcall restore)
+         (ding)
+         (message "Zoning...sorry")))
+      (when restore (funcall restore)))))
 
 ;;;; Zone when idle, or not.
 
@@ -659,7 +669,7 @@
       (end-of-line 0)
       (forward-char -10))
     (let ((life-patterns (vector
-                          (if (and col (re-search-forward "[^ ]" max t))
+                          (if (and col (search-forward "@" max t))
                               (cons (make-string (length (car col)) 32) col)
                             (list (mapconcat 'identity
                                              (make-list (/ (- rtc 11) 15)