From 1e7b9fadfe0ff1560d726b2d23030f8c7487ebdb Mon Sep 17 00:00:00 2001 From: djowel Date: Wed, 10 May 2023 15:56:46 +0800 Subject: [PATCH] Fixed caret drawing getting a stale pointer to this --- lib/external/asio | 2 +- lib/include/elements/element/text.hpp | 4 ++++ lib/src/element/text.cpp | 20 +++++++++++++++----- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/external/asio b/lib/external/asio index f64f91648..c465349fa 160000 --- a/lib/external/asio +++ b/lib/external/asio @@ -1 +1 @@ -Subproject commit f64f9164898bba3454dae077a89d99e5c463960d +Subproject commit c465349fa5cd91a64bb369f5131ceacab2c0c1c3 diff --git a/lib/include/elements/element/text.hpp b/lib/include/elements/element/text.hpp index a839f87f3..2356237b8 100644 --- a/lib/include/elements/element/text.hpp +++ b/lib/include/elements/element/text.hpp @@ -146,6 +146,9 @@ namespace cycfi { namespace elements state_saver_f capture_state(); + using this_handle = std::shared_ptr; + using this_weak_handle = std::weak_ptr; + int _select_start; int _select_end; float _current_x; @@ -153,6 +156,7 @@ namespace cycfi { namespace elements bool _is_focus : 1; bool _show_caret : 1; bool _caret_started : 1; + this_handle _this_handle; }; //////////////////////////////////////////////////////////////////////////// diff --git a/lib/src/element/text.cpp b/lib/src/element/text.cpp index 5aefa08c2..09c65f311 100644 --- a/lib/src/element/text.cpp +++ b/lib/src/element/text.cpp @@ -128,7 +128,9 @@ namespace cycfi { namespace elements {} basic_text_box::~basic_text_box() - {} + { + _this_handle.reset(); + } void basic_text_box::draw(context const& ctx) { @@ -539,6 +541,10 @@ namespace cycfi { namespace elements void basic_text_box::draw_caret(context const& ctx) { + // Make sure _this_handle is initialized to this + if (!_this_handle) + _this_handle = std::make_shared(this); + if (_select_start == -1) return; @@ -598,12 +604,16 @@ namespace cycfi { namespace elements caret_bounds = { tl.x, tl.y, br.x, br.y }; _caret_started = true; + this_weak_handle wp = _this_handle; ctx.view.post(500ms, - [this, &_view = ctx.view, caret_bounds]() + [wp, &_view = ctx.view, caret_bounds]() { - _show_caret = !_show_caret; - _view.refresh(caret_bounds); - _caret_started = false; + if (auto p = wp.lock()) + { + (*p)->_show_caret = !(*p)->_show_caret; + _view.refresh(caret_bounds); + (*p)->_caret_started = false; + } } ); }