From 71d0606a0356e8f9a5fb605190aef7330b630b9e Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Fri, 20 May 2011 23:37:45 +0300 Subject: Possible fix for sticky paste key in X systems. This code add 2 seconds timeout between paste actions. --- src/gui/widgets/textfield.cpp | 11 ++++++++++- src/gui/widgets/textfield.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index 8836b4ad4..8e61bce3c 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -49,7 +49,8 @@ TextField::TextField(const std::string &text, bool loseFocusOnTab, gcn::TextField(text), mNumeric(false), mMinimum(0), - mMaximum(0) + mMaximum(0), + mLastEventPaste(false) { setFrameSize(2); @@ -215,6 +216,10 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) /* In UTF-8, 10xxxxxx is only used for inner parts of characters. So skip them when processing key presses. */ + // unblock past key + if (val != 22) + mLastEventPaste = 0; + switch (val) { case Key::LEFT: @@ -286,7 +291,11 @@ void TextField::keyPressed(gcn::KeyEvent &keyEvent) break; case 22: // Control code 22, SYNCHRONOUS IDLE, sent on Ctrl+v + // hack to prevent paste key sticking + if (mLastEventPaste && mLastEventPaste > cur_time) + break; handlePaste(); + mLastEventPaste = cur_time + 1; break; default: break; diff --git a/src/gui/widgets/textfield.h b/src/gui/widgets/textfield.h index 04e1ea51c..79197bb7a 100644 --- a/src/gui/widgets/textfield.h +++ b/src/gui/widgets/textfield.h @@ -106,6 +106,7 @@ class TextField : public gcn::TextField int mMinimum; int mMaximum; bool mLoseFocusOnTab; + int mLastEventPaste; }; #endif -- cgit v1.2.3-60-g2f50