From 022c6ccec48b5dca482239da4a4c38550377b188 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 9 Jun 2013 18:06:58 +0300 Subject: [PATCH] Don't accept characters in Entry if there hasn't been a key press first This rectifies a problem where a program reacts to a key press event by focusing an Entry, which then receives the associated character event. --- source/entry.cpp | 12 ++++++++++-- source/entry.h | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/source/entry.cpp b/source/entry.cpp index 52a7b42..8aee0cf 100644 --- a/source/entry.cpp +++ b/source/entry.cpp @@ -20,7 +20,8 @@ Entry::Entry(const string &t): first_row(0), visible_rows(1), text_part(0), - slider(0) + slider(0), + got_key_press(false) { set_text(t); } @@ -145,6 +146,7 @@ void Entry::render_special(const Part &part, GL::Renderer &renderer) const void Entry::key_press(unsigned key, unsigned) { + got_key_press = true; if(key==Input::KEY_LEFT) { if(edit_pos>0) @@ -191,7 +193,7 @@ void Entry::key_press(unsigned key, unsigned) void Entry::character(wchar_t ch) { - if(ch>=' ') + if(got_key_press && ch>=' ') { text.insert(edit_pos, StringCodec::encode(StringCodec::ustring(1, ch))); ++edit_pos; @@ -199,6 +201,12 @@ void Entry::character(wchar_t ch) } } +void Entry::focus_out() +{ + Widget::focus_out(); + got_key_press = false; +} + void Entry::on_geometry_change() { reposition_slider(); diff --git a/source/entry.h b/source/entry.h index 3ee0b2c..65a201a 100644 --- a/source/entry.h +++ b/source/entry.h @@ -38,6 +38,7 @@ private: unsigned visible_rows; const Part *text_part; VSlider *slider; + bool got_key_press; public: Entry(const std::string & = std::string()); @@ -58,6 +59,7 @@ private: public: virtual void key_press(unsigned, unsigned); virtual void character(wchar_t); + virtual void focus_out(); private: virtual void on_geometry_change(); virtual void on_style_change(); -- 2.43.0