summaryrefslogtreecommitdiff
path: root/src/input_handler.cc
diff options
context:
space:
mode:
authorNicolas Ouellet-Payeur <nicolaso@google.com>2020-02-27 10:36:15 -0500
committerNicolas Ouellet-payeur <nicolaso@google.com>2020-02-27 10:36:15 -0500
commit10d887583fc420617cfa70d826d3ada535eb1abb (patch)
tree5d162e99b458a2040478a3b6815300c7ff4ec2bf /src/input_handler.cc
parent97e5e75d4c0eea3036ecc0127ccf146b68d0746d (diff)
Make `on_next_key_with_autoinfo()` respect `idle_timeout`
The prompt and autocomplete normally wait for `idle_timeout` before showing suggestions, however commands like `g`, `v`, or the lead-key show Clippy instantly. This fixes the issue by making `on_next_key_with_autoinfo()` wait for `idle_timeout` before displaying suggestions. Fixes mawww/kakoune#3365 Fixes mawww/kakoune#2066
Diffstat (limited to 'src/input_handler.cc')
-rw-r--r--src/input_handler.cc33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/input_handler.cc b/src/input_handler.cc
index f4029fcd..841de07c 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -273,7 +273,7 @@ public:
context.print_status(
{ format("invalid register '{}'", *cp),
context.faces()["Error"] });
- }, "enter target register", register_doc);
+ }, "enter target register", register_doc.str());
}
else
{
@@ -817,7 +817,7 @@ public:
display();
m_line_changed = true;
m_refresh_completion_pending = true;
- }, "enter register name", register_doc);
+ }, "enter register name", register_doc.str());
display();
return;
}
@@ -1100,8 +1100,10 @@ private:
class NextKey : public InputMode
{
public:
- NextKey(InputHandler& input_handler, String name, KeymapMode keymap_mode, KeyCallback callback)
- : InputMode(input_handler), m_name{std::move(name)}, m_callback(std::move(callback)), m_keymap_mode(keymap_mode) {}
+ NextKey(InputHandler& input_handler, String name, KeymapMode keymap_mode, KeyCallback callback,
+ Timer::Callback idle_callback)
+ : InputMode(input_handler), m_name{std::move(name)}, m_callback(std::move(callback)), m_keymap_mode(keymap_mode),
+ m_idle_timer{Clock::now() + get_idle_timeout(context()), std::move(idle_callback)} {}
void on_key(Key key) override
{
@@ -1122,9 +1124,10 @@ public:
StringView name() const override { return m_name; }
private:
- String m_name;
- KeyCallback m_callback;
- KeymapMode m_keymap_mode;
+ String m_name;
+ KeyCallback m_callback;
+ KeymapMode m_keymap_mode;
+ Timer m_idle_timer;
};
class Insert : public InputMode
@@ -1274,7 +1277,7 @@ public:
if (not cp or key == Key::Escape)
return;
insert(RegisterManager::instance()[*cp].get(context()));
- }, "enter register name", register_doc);
+ }, "enter register name", register_doc.str());
update_completions = false;
}
else if (key == ctrl('n'))
@@ -1588,9 +1591,11 @@ void InputHandler::menu(Vector<DisplayLine> choices, MenuCallback callback)
push_mode(new InputModes::Menu(*this, std::move(choices), std::move(callback)));
}
-void InputHandler::on_next_key(StringView mode_name, KeymapMode keymap_mode, KeyCallback callback)
+void InputHandler::on_next_key(StringView mode_name, KeymapMode keymap_mode, KeyCallback callback,
+ Timer::Callback idle_callback)
{
- push_mode(new InputModes::NextKey(*this, format("next-key[{}]", mode_name), keymap_mode, std::move(callback)));
+ push_mode(new InputModes::NextKey(*this, format("next-key[{}]", mode_name), keymap_mode, std::move(callback),
+ std::move(idle_callback)));
}
InputHandler::ScopedForceNormal::ScopedForceNormal(InputHandler& handler, NormalParams params)
@@ -1706,10 +1711,14 @@ std::pair<CursorMode, DisplayCoord> InputHandler::get_cursor_info() const
return current_mode().get_cursor_info();
}
+bool should_show_info(AutoInfo mask, const Context& context)
+{
+ return (context.options()["autoinfo"].get<AutoInfo>() & mask) and context.has_client();
+}
+
bool show_auto_info_ifn(StringView title, StringView info, AutoInfo mask, const Context& context)
{
- if (not (context.options()["autoinfo"].get<AutoInfo>() & mask) or
- not context.has_client())
+ if (not should_show_info(mask, context))
return false;
context.client().info_show(title.str(), info.str(), {}, InfoStyle::Prompt);