diff options
author | Thomas Lübking <thomas.luebking@gmail.com> | 2016-08-30 23:24:31 (GMT) |
---|---|---|
committer | Thomas Lübking <thomas.luebking@gmail.com> | 2016-08-31 18:37:37 (GMT) |
commit | 6ca6422344f0046ef1794c5fbaea90d28692fd5f (patch) | |
tree | 5bb567269a75c293317fbcf473106a3b68788b7d /src/Keys.cc | |
parent | 6c4d1123c07f8fe265bbb38920b0ae3d90879d56 (diff) | |
download | fluxbox-6ca6422344f0046ef1794c5fbaea90d28692fd5f.zip fluxbox-6ca6422344f0046ef1794c5fbaea90d28692fd5f.tar.bz2 |
introduce a 5s timeout for emacs shortcuts
The user needs to enter his chain within 5 seconds
Otherwise the chain is reset.
REQUEST: 291
Diffstat (limited to 'src/Keys.cc')
-rw-r--r-- | src/Keys.cc | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/Keys.cc b/src/Keys.cc index 1e66463..072cba9 100644 --- a/src/Keys.cc +++ b/src/Keys.cc | |||
@@ -522,6 +522,8 @@ bool Keys::doAction(int type, unsigned int mods, unsigned int key, | |||
522 | if (!m_keylist) | 522 | if (!m_keylist) |
523 | return false; | 523 | return false; |
524 | 524 | ||
525 | static Time first_key_time = 0; | ||
526 | |||
525 | static Time last_button_time = 0; | 527 | static Time last_button_time = 0; |
526 | static unsigned int last_button = 0; | 528 | static unsigned int last_button = 0; |
527 | 529 | ||
@@ -544,6 +546,17 @@ bool Keys::doAction(int type, unsigned int mods, unsigned int key, | |||
544 | isdouble = double_click; | 546 | isdouble = double_click; |
545 | } | 547 | } |
546 | 548 | ||
549 | auto resetKeyChain = [&]() { | ||
550 | first_key_time = 0; | ||
551 | next_key.reset(); | ||
552 | if (saved_keymode) { | ||
553 | setKeyMode(saved_keymode); | ||
554 | saved_keymode.reset(); | ||
555 | } | ||
556 | }; | ||
557 | if (type == KeyPress && first_key_time && time - first_key_time > 5000) | ||
558 | resetKeyChain(); | ||
559 | |||
547 | if (!next_key) | 560 | if (!next_key) |
548 | next_key = m_keylist; | 561 | next_key = m_keylist; |
549 | 562 | ||
@@ -560,8 +573,10 @@ bool Keys::doAction(int type, unsigned int mods, unsigned int key, | |||
560 | return true; // if there's a motion action, prevent replay to the client (but do nothing) | 573 | return true; // if there's a motion action, prevent replay to the client (but do nothing) |
561 | 574 | ||
562 | if (temp_key && !temp_key->keylist.empty()) { // emacs-style | 575 | if (temp_key && !temp_key->keylist.empty()) { // emacs-style |
563 | if (!saved_keymode) | 576 | if (!saved_keymode) { |
577 | first_key_time = time; | ||
564 | saved_keymode = m_keylist; | 578 | saved_keymode = m_keylist; |
579 | } | ||
565 | next_key = temp_key; | 580 | next_key = temp_key; |
566 | setKeyMode(next_key); | 581 | setKeyMode(next_key); |
567 | return true; | 582 | return true; |
@@ -570,11 +585,7 @@ bool Keys::doAction(int type, unsigned int mods, unsigned int key, | |||
570 | if (type == KeyPress && | 585 | if (type == KeyPress && |
571 | !FbTk::KeyUtil::instance().keycodeToModmask(key)) { | 586 | !FbTk::KeyUtil::instance().keycodeToModmask(key)) { |
572 | // if we're in the middle of an emacs-style keychain, exit it | 587 | // if we're in the middle of an emacs-style keychain, exit it |
573 | next_key.reset(); | 588 | resetKeyChain(); |
574 | if (saved_keymode) { | ||
575 | setKeyMode(saved_keymode); | ||
576 | saved_keymode.reset(); | ||
577 | } | ||
578 | } | 589 | } |
579 | return false; | 590 | return false; |
580 | } | 591 | } |