summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKuremu <clem@kuremu.com>2024-05-05 09:56:43 +0000
committerGitHub <noreply@github.com>2024-05-05 18:56:43 +0900
commit7b98c2c653389e422aa429728298dd84b7cc18b8 (patch)
treefb5f97ce4ebef6308f808fcbbbe2443e11ed1357 /src
parentb6add2a25777b20e416cb84473f6d1632b73715d (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.go2
-rw-r--r--src/terminal.go38
-rw-r--r--src/tui/tui.go1
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 {