diff --git a/src/gui/widget/stringinput.cpp b/src/gui/widget/stringinput.cpp index b47a99c4e..8fa986268 100644 --- a/src/gui/widget/stringinput.cpp +++ b/src/gui/widget/stringinput.cpp @@ -150,6 +150,8 @@ void CStringInput::init() y = getScreenStartY(height); selected = 0; smstimer = 0; + force_saveScreen = false; + pixBuf = NULL; } void CStringInput::NormalKeyPressed(const neutrino_msg_t key) @@ -377,6 +379,15 @@ std::string &CStringInput::getValue(void) return *valueString; } +void CStringInput::forceSaveScreen(bool enable) +{ + force_saveScreen = enable; + if (!enable && pixBuf) { + delete[] pixBuf; + pixBuf = NULL; + } +} + int CStringInput::exec( CMenuTarget* parent, const std::string & ) { neutrino_msg_t msg; @@ -392,11 +403,12 @@ int CStringInput::exec( CMenuTarget* parent, const std::string & ) if (size > (int) valueString->length()) valueString->append(size - valueString->length(), ' '); - fb_pixel_t * pixbuf = NULL; - if (!parent) { - pixbuf = new fb_pixel_t[(width + OFFSET_SHADOW) * (height + OFFSET_SHADOW)]; - if (pixbuf) - frameBuffer->SaveScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixbuf); + if (pixBuf) + delete[] pixBuf; + if (!parent || force_saveScreen) { + pixBuf = new fb_pixel_t[(width + OFFSET_SHADOW) * (height + OFFSET_SHADOW)]; + if (pixBuf) + frameBuffer->SaveScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixBuf); } paint(); @@ -517,10 +529,11 @@ int CStringInput::exec( CMenuTarget* parent, const std::string & ) } } - if (pixbuf) + if (pixBuf) { - frameBuffer->RestoreScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixbuf); - delete[] pixbuf;//Mismatching allocation and deallocation: pixbuf + frameBuffer->RestoreScreen(x, y, width + OFFSET_SHADOW, height + OFFSET_SHADOW, pixBuf); + delete[] pixBuf; + pixBuf = NULL; frameBuffer->blit(); } else hide(); diff --git a/src/gui/widget/stringinput.h b/src/gui/widget/stringinput.h index 2a8d9bcd4..d435a7f84 100644 --- a/src/gui/widget/stringinput.h +++ b/src/gui/widget/stringinput.h @@ -61,6 +61,8 @@ class CStringInput : public CMenuTarget int size; int selected; CChangeObserver * observ; + bool force_saveScreen; + fb_pixel_t *pixBuf; virtual void init(); @@ -91,6 +93,8 @@ class CStringInput : public CMenuTarget int exec( CMenuTarget* parent, const std::string & actionKey ); void setMinMax(const int min_value, const int max_value); virtual std::string &getValue(void); + + void forceSaveScreen(bool enable); }; class CStringInputSMS : public CStringInput