summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2023-11-03 00:07:28 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2023-11-03 00:09:02 +0900
commit68db9cb499ab32190edae6c285942c5fb7cf39ed (patch)
tree4c70d7627aac26faa5ba3fbadc90fad770416046 /src
parentd0466fa77714cccae6875facafb4a7d49e3f958e (diff)
downloadfzf-68db9cb499ab32190edae6c285942c5fb7cf39ed.tar.gz
Sixel and Kitty image support on Windows binary (#2544)
Diffstat (limited to 'src')
-rw-r--r--src/terminal.go8
-rw-r--r--src/tui/dummy.go3
-rw-r--r--src/tui/light.go8
-rw-r--r--src/tui/tcell.go25
-rw-r--r--src/tui/tui.go3
5 files changed, 36 insertions, 11 deletions
diff --git a/src/terminal.go b/src/terminal.go
index a8a607f4..e4ff304c 100644
--- a/src/terminal.go
+++ b/src/terminal.go
@@ -1938,6 +1938,8 @@ func (t *Terminal) renderPreviewArea(unchanged bool) {
if t.previewed.wipe && t.previewed.version != t.previewer.version {
t.previewed.wipe = false
t.pwindow.Erase()
+ // Required for tcell to clear the previous image
+ t.tui.Sync(true)
} else if unchanged {
t.pwindow.MoveAndClear(0, 0) // Clear scroll offset display
} else {
@@ -2061,6 +2063,10 @@ Loop:
for i := y + 1; i < height; i++ {
t.pwindow.MoveAndClear(i, 0)
}
+ // Required for tcell to clear the previous text
+ if !t.previewed.sixel {
+ t.tui.Sync(false)
+ }
}
sixel = sixel || isSixel
if idx == 0 {
@@ -2068,7 +2074,7 @@ Loop:
} else {
t.pwindow.Move(y, x)
}
- t.tui.PassThrough(passThrough)
+ t.tui.PassThrough(t.pwindow.Top()+y, t.pwindow.Left()+x, passThrough)
if requiredLines > 0 {
if y+requiredLines == height {
diff --git a/src/tui/dummy.go b/src/tui/dummy.go
index cceb4478..d6495816 100644
--- a/src/tui/dummy.go
+++ b/src/tui/dummy.go
@@ -33,7 +33,8 @@ func (r *FullscreenRenderer) Init() {}
func (r *FullscreenRenderer) Resize(maxHeightFunc func(int) int) {}
func (r *FullscreenRenderer) Pause(bool) {}
func (r *FullscreenRenderer) Resume(bool, bool) {}
-func (r *FullscreenRenderer) PassThrough(string) {}
+func (r *FullscreenRenderer) PassThrough(int, int, string) {}
+func (r *FullscreenRenderer) Sync(bool) {}
func (r *FullscreenRenderer) Clear() {}
func (r *FullscreenRenderer) NeedScrollbarRedraw() bool { return false }
func (r *FullscreenRenderer) Refresh() {}
diff --git a/src/tui/light.go b/src/tui/light.go
index e5950cde..dd1f9f3d 100644
--- a/src/tui/light.go
+++ b/src/tui/light.go
@@ -31,8 +31,12 @@ const consoleDevice string = "/dev/tty"
var offsetRegexp *regexp.Regexp = regexp.MustCompile("(.*)\x1b\\[([0-9]+);([0-9]+)R")
var offsetRegexpBegin *regexp.Regexp = regexp.MustCompile("^\x1b\\[[0-9]+;[0-9]+R")
-func (r *LightRenderer) PassThrough(str string) {
- r.queued.WriteString("\x1b7" + str + "\x1b8")
+func (r *LightRenderer) PassThrough(y int, x int, data string) {
+ r.queued.WriteString("\x1b7" + data + "\x1b8")
+}
+
+func (r *LightRenderer) Sync(bool) {
+ // No-op
}
func (r *LightRenderer) stderr(str string) {
diff --git a/src/tui/tcell.go b/src/tui/tcell.go
index 38641f7a..bf7b57cb 100644
--- a/src/tui/tcell.go
+++ b/src/tui/tcell.go
@@ -98,9 +98,22 @@ const (
AttrClear = Attr(1 << 8)
)
-func (r *FullscreenRenderer) PassThrough(str string) {
- // No-op
- // https://github.com/gdamore/tcell/issues/363#issuecomment-680665073
+func (r *FullscreenRenderer) PassThrough(y int, x int, data string) {
+ tty, _ := _screen.Tty()
+ ti, err := tcell.LookupTerminfo(os.Getenv("TERM"))
+ if err != nil {
+ return
+ }
+ ti.TPuts(tty, ti.TGoto(x, y))
+ ti.TPuts(tty, data)
+}
+
+func (r *FullscreenRenderer) Sync(hard bool) {
+ if hard {
+ _screen.Sync()
+ } else {
+ _screen.Show()
+ }
}
func (r *FullscreenRenderer) Resize(maxHeightFunc func(int) int) {}
@@ -207,10 +220,10 @@ func (r *FullscreenRenderer) Refresh() {
// noop
}
-// TODO: Pixel width and height not implemented
func (r *FullscreenRenderer) Size() TermSize {
- cols, lines := _screen.Size()
- return TermSize{lines, cols, 0, 0}
+ tty, _ := _screen.Tty()
+ ws, _ := tty.WindowSize()
+ return TermSize{ws.Height, ws.Width, ws.PixelWidth, ws.PixelHeight}
}
func (r *FullscreenRenderer) GetChar() Event {
diff --git a/src/tui/tui.go b/src/tui/tui.go
index 5a5e18d6..6834f350 100644
--- a/src/tui/tui.go
+++ b/src/tui/tui.go
@@ -489,7 +489,8 @@ type Renderer interface {
RefreshWindows(windows []Window)
Refresh()
Close()
- PassThrough(string)
+ PassThrough(y int, x int, data string)
+ Sync(bool)
NeedScrollbarRedraw() bool
GetChar() Event