Limit the maximum number of focus events to process at once

This commit is contained in:
Junegunn Choi 2024-03-14 11:18:47 +09:00
parent 091b7eacba
commit 8977c9257a
No known key found for this signature in database
GPG Key ID: 254BC280FEF9C627

View File

@ -55,6 +55,9 @@ var actionTypeRegex *regexp.Regexp
const clearCode string = "\x1b[2J" const clearCode string = "\x1b[2J"
// Number of maximum focus events to process synchronously
const maxFocusEvents = 10000
func init() { func init() {
placeholder = regexp.MustCompile(`\\?(?:{[+sf]*[0-9,-.]*}|{q}|{fzf:(?:query|action|prompt)}|{\+?f?nf?})`) placeholder = regexp.MustCompile(`\\?(?:{[+sf]*[0-9,-.]*}|{q}|{fzf:(?:query|action|prompt)}|{\+?f?nf?})`)
whiteSuffix = regexp.MustCompile(`\s*$`) whiteSuffix = regexp.MustCompile(`\s*$`)
@ -3305,18 +3308,22 @@ func (t *Terminal) Loop() {
var doAction func(*action) bool var doAction func(*action) bool
var doActions func(actions []*action) bool var doActions func(actions []*action) bool
doActions = func(actions []*action) bool { doActions = func(actions []*action) bool {
currentIndex := t.currentIndex() for iter := 0; iter <= maxFocusEvents; iter++ {
for _, action := range actions { currentIndex := t.currentIndex()
if !doAction(action) { for _, action := range actions {
return false if !doAction(action) {
return false
}
} }
}
if onFocus, prs := t.keymap[tui.Focus.AsEvent()]; prs { if onFocus, prs := t.keymap[tui.Focus.AsEvent()]; prs && iter < maxFocusEvents {
if newIndex := t.currentIndex(); newIndex != currentIndex { if newIndex := t.currentIndex(); newIndex != currentIndex {
t.lastFocus = newIndex t.lastFocus = newIndex
return doActions(onFocus) actions = onFocus
continue
}
} }
break
} }
return true return true
} }