diff options
author | Kuremu <clem@kuremu.com> | 2024-05-05 09:56:43 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-05 18:56:43 +0900 |
commit | 7b98c2c653389e422aa429728298dd84b7cc18b8 (patch) | |
tree | fb5f97ce4ebef6308f808fcbbbe2443e11ed1357 /src | |
parent | b6add2a25777b20e416cb84473f6d1632b73715d (diff) |
Add click-header event for reporting clicks within header (#3768)
Sets $FZF_CLICK_HEADER_LINE and $FZF_CLICK_HEADER_COLUMN env vars with
coordinates of the last click inside and relative to the header and
fires click-header event.
Co-authored-by: Junegunn Choi <junegunn.c@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/options.go | 2 | ||||
-rw-r--r-- | src/terminal.go | 38 | ||||
-rw-r--r-- | src/tui/tui.go | 1 |
3 files changed, 38 insertions, 3 deletions
diff --git a/src/options.go b/src/options.go index 66e0554e..5098318d 100644 --- a/src/options.go +++ b/src/options.go @@ -708,6 +708,8 @@ func parseKeyChordsImpl(str string, message string, exit func(string)) map[tui.E add(tui.Jump) case "jump-cancel": add(tui.JumpCancel) + case "click-header": + add(tui.ClickHeader) case "alt-enter", "alt-return": chords[tui.CtrlAltKey('m')] = key case "alt-space": diff --git a/src/terminal.go b/src/terminal.go index 7de1de6e..a9eb6582 100644 --- a/src/terminal.go +++ b/src/terminal.go @@ -298,6 +298,8 @@ type Terminal struct { areaLines int areaColumns int forcePreview bool + clickHeaderLine int + clickHeaderColumn int } type selectedItem struct { @@ -857,6 +859,8 @@ func (t *Terminal) environ() []string { env = append(env, fmt.Sprintf("FZF_LINES=%d", t.areaLines)) env = append(env, fmt.Sprintf("FZF_COLUMNS=%d", t.areaColumns)) env = append(env, fmt.Sprintf("FZF_POS=%d", util.Min(t.merger.Length(), t.cy+1))) + env = append(env, fmt.Sprintf("FZF_CLICK_HEADER_LINE=%d", t.clickHeaderLine)) + env = append(env, fmt.Sprintf("FZF_CLICK_HEADER_COLUMN=%d", t.clickHeaderColumn)) return env } @@ -4001,10 +4005,10 @@ func (t *Terminal) Loop() { } if me.Down { - mx = util.Constrain(mx-t.promptLen, 0, len(t.input)) - if my == t.promptLine() && mx >= 0 { + mx_cons := util.Constrain(mx-t.promptLen, 0, len(t.input)) + if my == t.promptLine() && mx_cons >= 0 { // Prompt - t.cx = mx + t.xoffset + t.cx = mx_cons + t.xoffset } else if my >= min { t.vset(t.offset + my - min) req(reqList) @@ -4019,6 +4023,34 @@ func (t *Terminal) Loop() { } } return doActions(actionsFor(evt)) + } else { + // Header + lineOffset := 0 + numLines := t.visibleHeaderLines() + if !t.headerFirst { + // offset for info line + if t.noSeparatorLine() { + lineOffset = 1 + } else { + lineOffset = 2 + } + } else { + // adjust for too-small window + numItems := t.areaLines - numLines + if !t.noSeparatorLine() { + numItems -= 1 + } + if numItems < 0 { + numLines += numItems + } + } + my = util.Constrain(my-lineOffset, -1, numLines) + mx -= 2 // offset gutter + if my >= 0 && my < numLines && mx >= 0 { + t.clickHeaderLine = my + 1 + t.clickHeaderColumn = mx + 1 + return doActions(actionsFor(tui.ClickHeader)) + } } } case actReload, actReloadSync: diff --git a/src/tui/tui.go b/src/tui/tui.go index 7fad8f48..a56edc7f 100644 --- a/src/tui/tui.go +++ b/src/tui/tui.go @@ -130,6 +130,7 @@ const ( Result Jump JumpCancel + ClickHeader ) func (t EventType) AsEvent() Event { |