From 8977c9257a8093a82a2cffa4f7e6974e43206ef4 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Thu, 14 Mar 2024 11:18:47 +0900 Subject: Limit the maximum number of focus events to process at once --- src/terminal.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/terminal.go b/src/terminal.go index b8358891..b24950e8 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -55,6 +55,9 @@ var actionTypeRegex *regexp.Regexp const clearCode string = "\x1b[2J" +// Number of maximum focus events to process synchronously +const maxFocusEvents = 10000 + func init() { placeholder = regexp.MustCompile(`\\?(?:{[+sf]*[0-9,-.]*}|{q}|{fzf:(?:query|action|prompt)}|{\+?f?nf?})`) whiteSuffix = regexp.MustCompile(`\s*$`) @@ -3305,18 +3308,22 @@ func (t *Terminal) Loop() { var doAction func(*action) bool var doActions func(actions []*action) bool doActions = func(actions []*action) bool { - currentIndex := t.currentIndex() - for _, action := range actions { - if !doAction(action) { - return false + for iter := 0; iter <= maxFocusEvents; iter++ { + currentIndex := t.currentIndex() + for _, action := range actions { + if !doAction(action) { + return false + } } - } - if onFocus, prs := t.keymap[tui.Focus.AsEvent()]; prs { - if newIndex := t.currentIndex(); newIndex != currentIndex { - t.lastFocus = newIndex - return doActions(onFocus) + if onFocus, prs := t.keymap[tui.Focus.AsEvent()]; prs && iter < maxFocusEvents { + if newIndex := t.currentIndex(); newIndex != currentIndex { + t.lastFocus = newIndex + actions = onFocus + continue + } } + break } return true } -- cgit v1.2.3