aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorColin Okay <okay@toyful.space>2022-07-24 13:24:46 -0500
committerColin Okay <okay@toyful.space>2022-07-24 13:24:46 -0500
commitae2e47be672493d4a83ede984c7c144a03818e23 (patch)
tree9e87b12a369d6e1ca9e143c16fb302f11817e9b4
parent758d5dcf7a8ffba2ae607e7cc19cacc54f5ea839 (diff)
[add] cleanup for menu and interactive
-rw-r--r--gui/menus.lisp3
-rw-r--r--src/interactive/interactive.lisp8
2 files changed, 11 insertions, 0 deletions
diff --git a/gui/menus.lisp b/gui/menus.lisp
index 6b3feb9..25abd7b 100644
--- a/gui/menus.lisp
+++ b/gui/menus.lisp
@@ -9,6 +9,9 @@
:doc "The item that is focused in this menu, if any.")
(region :std (error "Menus require an explicit region"))))
+(defmethod cleanup :after ((menu menu))
+ (loop for item in (menu-items menu) do (cleanup item)))
+
(defmethod initialize-instance :after ((menu menu) &key)
(with-slots (base-width base-height region) menu
(setf base-width (width region)
diff --git a/src/interactive/interactive.lisp b/src/interactive/interactive.lisp
index ceacf1b..11bc5ca 100644
--- a/src/interactive/interactive.lisp
+++ b/src/interactive/interactive.lisp
@@ -7,6 +7,14 @@
(focusablep :std t :doc "Whether or not this object can receive application focus."))
(:documentation "Supplies an object with a listener slot."))
+(defun remove-all-handlers (interactive)
+ (loop
+ for type in '(keydown keyup mousedown mouseup mousemotion mousewheel focus blur perframe)
+ do (remove-handler interactive type)))
+
+(defmethod cleanup :after ((ob interactive))
+ (remove-all-handlers ob))
+
(defun add-handler (interactive handler)
"Adds HANDLER to INTERACTIVE. HANDLER is an instance of
WHEELWORK::EVENT-HANDLER, as most readily constructed by using the