mirror of
https://github.com/neovim/neovim.git
synced 2025-10-03 08:28:34 +00:00
vim-patch:8.1.2053: SafeStateAgain not triggered if callback uses feedkeys()
Problem: SafeStateAgain not triggered if callback uses feedkeys().
Solution: Check for safe state in the input loop. Make log messages easier
to find. Add 'S' flag to state().
d103ee7843
Include misc1.c change from patch 8.1.2062.
Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
@@ -272,20 +272,26 @@ void may_trigger_modechanged(void)
|
||||
/// When true in a safe state when starting to wait for a character.
|
||||
static bool was_safe = false;
|
||||
|
||||
/// Return whether currently it is safe, assuming it was safe before (high level
|
||||
/// state didn't change).
|
||||
static bool is_safe_now(void)
|
||||
{
|
||||
return stuff_empty()
|
||||
&& typebuf.tb_len == 0
|
||||
&& !using_script()
|
||||
&& !global_busy;
|
||||
}
|
||||
|
||||
/// Trigger SafeState if currently in s safe state, that is "safe" is TRUE and
|
||||
/// there is no typeahead.
|
||||
void may_trigger_safestate(bool safe)
|
||||
{
|
||||
bool is_safe = safe
|
||||
&& stuff_empty()
|
||||
&& typebuf.tb_len == 0
|
||||
&& !using_script()
|
||||
&& !global_busy;
|
||||
bool is_safe = safe && is_safe_now();
|
||||
|
||||
if (was_safe != is_safe) {
|
||||
// Only log when the state changes, otherwise it happens at nearly
|
||||
// every key stroke.
|
||||
DLOG(is_safe ? "Start triggering SafeState" : "Stop triggering SafeState");
|
||||
DLOG(is_safe ? "SafeState: Start triggering" : "SafeState: Stop triggering");
|
||||
}
|
||||
if (is_safe) {
|
||||
apply_autocmds(EVENT_SAFESTATE, NULL, NULL, false, curbuf);
|
||||
@@ -296,10 +302,15 @@ void may_trigger_safestate(bool safe)
|
||||
/// Something changed which causes the state possibly to be unsafe, e.g. a
|
||||
/// character was typed. It will remain unsafe until the next call to
|
||||
/// may_trigger_safestate().
|
||||
void state_no_longer_safe(void)
|
||||
void state_no_longer_safe(const char *reason)
|
||||
{
|
||||
if (was_safe) {
|
||||
DLOG("safe state reset");
|
||||
if (was_safe && reason != NULL) {
|
||||
DLOG("SafeState reset: %s", reason);
|
||||
}
|
||||
was_safe = false;
|
||||
}
|
||||
|
||||
bool get_was_safe_state(void)
|
||||
{
|
||||
return was_safe;
|
||||
}
|
||||
|
Reference in New Issue
Block a user