From 03572b03f8fe0ec6d36a330410c573403f6e55cc Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sun, 5 Sep 2021 12:44:14 +0200 Subject: [PATCH] Fixed switchScreen by value instead of by ref --- src/screenmanager.h | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/screenmanager.h b/src/screenmanager.h index c72b1ab..2424490 100644 --- a/src/screenmanager.h +++ b/src/screenmanager.h @@ -23,7 +23,20 @@ inline void deconstructScreen() } template -void switchScreenImpl(Args&&... args) +void switchScreenImpl(Args... args) +{ + deconstructScreen(); + + std::unique_ptr ptr = std::make_unique(args...); + currentDisplay = std::move(ptr); + currentDisplay->start(); + currentDisplay->initScreen(); + currentDisplay->update(); + currentDisplay->redraw(); +} + +template +void switchScreenRefImpl(Args&&... args) { deconstructScreen(); @@ -38,12 +51,21 @@ void switchScreenImpl(Args&&... args) extern std::function changeScreenCallback; template -void switchScreen(Args&&... args) +void switchScreen(Args... args) { if (currentDisplay) - changeScreenCallback = [&args...](){ switchScreenImpl(std::forward(args)...); }; + changeScreenCallback = [args...](){ switchScreenImpl(args...); }; else - switchScreenImpl(std::forward(args)...); + switchScreenImpl(args...); +} + +template +void switchScreenRef(Args&&... args) +{ + if (currentDisplay) + changeScreenCallback = [args...](){ switchScreenRefImpl(std::forward(args)...); }; + else + switchScreenRefImpl(std::forward(args)...); } } // namespace espgui