vim-patch:8.1.2046: SafeState may be triggered at the wrong moment

Problem:    SafeState may be triggered at the wrong moment.
Solution:   Move it up higher to after where messages are processed.  Add a
            SafeStateAgain event to tigger there.

69198cb8c0

SafeStateAgain is N/A.
Move SafeState functions to state.c.

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2023-08-21 11:11:02 +08:00
parent ab45d5bf6d
commit 4956f26744
4 changed files with 36 additions and 35 deletions

View File

@@ -482,40 +482,6 @@ bool check_text_or_curbuf_locked(oparg_T *oap)
return true;
}
static bool was_safe = false;
static int not_safe_now = 0;
/// 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
&& !global_busy;
if (is_safe) {
apply_autocmds(EVENT_SAFESTATE, NULL, NULL, false, curbuf);
}
was_safe = is_safe;
}
/// Entering a not-safe state.
void enter_unsafe_state(void)
{
not_safe_now++;
}
/// Leaving a not-safe state. Trigger SafeState if we were in a safe state
/// before first calling enter_not_safe_state().
void leave_unsafe_state(void)
{
not_safe_now--;
if (not_safe_now == 0 && was_safe) {
apply_autocmds(EVENT_SAFESTATE, NULL, NULL, false, curbuf);
}
}
/// Normal state entry point. This is called on:
///
/// - Startup, In this case the function never returns.
@@ -1434,7 +1400,7 @@ static int normal_check(VimState *state)
quit_more = false;
// it's not safe unless normal_check_safe_state() is called
was_safe = false;
state_no_longer_safe();
// If skip redraw is set (for ":" in wait_return()), don't redraw now.
// If there is nothing in the stuff_buffer or do_redraw is true,