closes #251 Two related bugs where Python garbage collection destroyed callbacks that were still needed by live C++ objects: 1. **Drawable callbacks (all 8 types)**: tp_dealloc unconditionally called click_unregister() etc., destroying callbacks even when the C++ object was still alive in a parent's children vector. Fixed by guarding with shared_ptr::use_count() <= 1 — only unregister when the Python wrapper is the last owner. 2. **Timer GC prevention**: Active timers now hold a Py_INCREF'd reference to their Python wrapper (Timer::py_wrapper), preventing GC while the timer is registered in the engine. Released on stop(), one-shot fire, or destruction. mcrfpy.Timer("name", cb, 100) now works without storing the return value. Also includes audio synth demo UI fixes: button click handling (don't set on_click on Caption children), single-column slider layout, improved Animalese contrast. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| ldtk | ||
| screens | ||
| screenshots | ||
| __init__.py | ||
| audio_synth_demo.py | ||
| cookbook_showcase.py | ||
| demo_main.py | ||
| new_features_showcase.py | ||
| perspective_patrol_demo.py | ||
| procgen_showcase.py | ||
| simple_showcase.py | ||
| tutorial_screenshots.py | ||
| tutorial_showcase.py | ||
| viewport3d_demo.py | ||
| viewport3d_screenshot.py | ||