From e4ac3d9b21549c8808ea5e3ada23924b91f72447 Mon Sep 17 00:00:00 2001 From: aristocratos Date: Mon, 8 Nov 2021 12:46:18 +0100 Subject: [PATCH] Fixed: Stall when clearing input queue on exit and queue is >1 --- src/btop.cpp | 2 +- src/btop_input.cpp | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/btop.cpp b/src/btop.cpp index 5034629..f49189e 100644 --- a/src/btop.cpp +++ b/src/btop.cpp @@ -208,7 +208,6 @@ void clean_quit(int sig) { } Config::write(); - Input::clear(); //? Wait for any remaining Tools::atomic_lock destructors to finish for max 1000ms for (int i = 0; Tools::active_locks > 0 and i < 100; i++) { @@ -216,6 +215,7 @@ void clean_quit(int sig) { } if (Term::initialized) { + Input::clear(); Term::restore(); } diff --git a/src/btop_input.cpp b/src/btop_input.cpp index 2d2a854..a69e4bd 100644 --- a/src/btop_input.cpp +++ b/src/btop_input.cpp @@ -95,7 +95,7 @@ namespace Input { string get() { string key; while (cin.rdbuf()->in_avail() > 0 and key.size() < 100) key += cin.get(); - if (cin.rdbuf()->in_avail() > 0) cin.ignore(cin.rdbuf()->in_avail()); + if (cin.rdbuf()->in_avail() > 0) clear(); if (not key.empty()) { //? Remove escape code prefix if present if (key.substr(0, 2) == Fx::e) { @@ -175,7 +175,12 @@ namespace Input { } void clear() { - if (cin.rdbuf()->in_avail() > 0) cin.ignore(SSmax); + auto first_num = cin.rdbuf()->in_avail(); + while (cin.rdbuf()->in_avail() == first_num) { + if (first_num-- == 0) break; + cin.ignore(1); + + } } void process(const string& key) {