+2004-12-16 Thien-Thi Nguyen <ttn@gnu.org>
+
+ * play/zone.el (zone): Fix omission bug: Use a self-disabling
+ one-shot thunk for uniform (error, quit, normal) recovery.
+ Reported by John Paul Wallington.
+ (zone-pgm-random-life): Fix bug:
+ Recognize empty initial field by lack of "@" chars.
+
2004-12-16 Juri Linkov <juri@jurta.org>
* help.el (function-called-at-point):
(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)
(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.
(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)