summaryrefslogtreecommitdiff
path: root/catbird/overlay.scm
diff options
context:
space:
mode:
Diffstat (limited to 'catbird/overlay.scm')
-rw-r--r--catbird/overlay.scm30
1 files changed, 30 insertions, 0 deletions
diff --git a/catbird/overlay.scm b/catbird/overlay.scm
index 5c3cf17..420b146 100644
--- a/catbird/overlay.scm
+++ b/catbird/overlay.scm
@@ -43,6 +43,32 @@
(define (make-overlay)
(make <overlay> #:name 'overlay))
+(define-method (open-repl (overlay <overlay>))
+ (unless (is-a? (major-mode overlay) <repl-mode>)
+ (push-major-mode overlay (make <repl-mode>)))
+ (open-repl (major-mode overlay)))
+
+(define-method (freeze-all-regions (overlay <overlay>))
+ (for-each (lambda (region)
+ ;; Freeze everything except the overlay.
+ (unless (eq? (scene region) overlay)
+ (freeze region)))
+ (all-regions)))
+
+(define (unfreeze-all-regions)
+ (for-each unfreeze (all-regions)))
+
+(define-method (handle-error (overlay <overlay>) exception stack)
+ (freeze-all-regions overlay)
+ (open-repl overlay)
+ (let ((repl (& overlay repl)))
+ (enter-debugger repl exception stack)))
+
+(define-method (on-enter (overlay <overlay>))
+ (set! (error-handler (current-kernel))
+ (lambda (exception stack)
+ (handle-error overlay exception stack))))
+
(define-method (notify (scene <overlay>) message)
(run-script scene
(let* ((padding 8.0)
@@ -71,6 +97,10 @@
(sleep 5.0)
(detach notification))))
+(define-meta-command ((resume r) system repl)
+ "- Resume game."
+ (unfreeze-all-regions))
+
(define-class <fps-display> (<node-2d>))
(define-method (on-boot (fps-display <fps-display>))