From 3ea00789c3113e32254774c8e48d864eeaf58d93 Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Tue, 9 Jan 2024 22:16:36 -0800 Subject: [PATCH 01/12] Fix for missing misplaced characters --- output.go | 6 +++++- term.go | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/output.go b/output.go index cf8e4ae0..3d54b817 100644 --- a/output.go +++ b/output.go @@ -87,7 +87,7 @@ type parseState struct { vt100 rune } -func (t *Terminal) handleOutput(buf []byte) { +func (t *Terminal) handleOutput(buf []byte) []byte { if t.hasSelectedText() { t.clearSelectedText() } @@ -108,6 +108,9 @@ func (t *Terminal) handleOutput(buf []byte) { if size == 0 { break } + if r == utf8.RuneError && size == 1 { + return buf + } if r == asciiEscape { t.state.esc = i @@ -152,6 +155,7 @@ func (t *Terminal) handleOutput(buf []byte) { if t.state.esc != noEscape { t.state.esc = -1 } + return buf } func (t *Terminal) parseEscState(r rune) (shouldContinue bool) { diff --git a/term.go b/term.go index 4e1b51f7..1edb7f36 100644 --- a/term.go +++ b/term.go @@ -271,8 +271,9 @@ func (t *Terminal) guessCellSize() fyne.Size { } func (t *Terminal) run() { - bufLen := 4069 + bufLen := 4096 buf := make([]byte, bufLen) + leftOver := make([]byte, 1) for { num, err := t.out.Read(buf) if err != nil { @@ -286,7 +287,7 @@ func (t *Terminal) run() { fyne.LogError("pty read error", err) } - t.handleOutput(buf[:num]) + leftOver = t.handleOutput(append(leftOver, buf[:num]...)) if num < bufLen { t.Refresh() } From bb23254b3339877f3766dd9e21c0738fe2c00b17 Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Tue, 9 Jan 2024 22:24:02 -0800 Subject: [PATCH 02/12] make leftover bytes 3 and explain --- output.go | 3 ++- term.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/output.go b/output.go index 3d54b817..56203f24 100644 --- a/output.go +++ b/output.go @@ -108,7 +108,8 @@ func (t *Terminal) handleOutput(buf []byte) []byte { if size == 0 { break } - if r == utf8.RuneError && size == 1 { + // UTF-8 can be 1-4 bytes long + if r == utf8.RuneError && size < 4 { return buf } diff --git a/term.go b/term.go index 1edb7f36..edb965fb 100644 --- a/term.go +++ b/term.go @@ -273,7 +273,7 @@ func (t *Terminal) guessCellSize() fyne.Size { func (t *Terminal) run() { bufLen := 4096 buf := make([]byte, bufLen) - leftOver := make([]byte, 1) + leftOver := make([]byte, 3) // UTF-8 leftovers for { num, err := t.out.Read(buf) if err != nil { From 723e8cc884a3517a1d2ffc59b0ab47b3f0e1768c Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Tue, 9 Jan 2024 22:54:57 -0800 Subject: [PATCH 03/12] check leftOver length to prevent padding. --- term.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/term.go b/term.go index edb965fb..707acf02 100644 --- a/term.go +++ b/term.go @@ -273,7 +273,7 @@ func (t *Terminal) guessCellSize() fyne.Size { func (t *Terminal) run() { bufLen := 4096 buf := make([]byte, bufLen) - leftOver := make([]byte, 3) // UTF-8 leftovers + var leftOver []byte for { num, err := t.out.Read(buf) if err != nil { @@ -287,7 +287,10 @@ func (t *Terminal) run() { fyne.LogError("pty read error", err) } - leftOver = t.handleOutput(append(leftOver, buf[:num]...)) + if len(leftOver) > 0 { + buf = append(leftOver, buf[:num]...) + } + leftOver = t.handleOutput(buf[:num]) if num < bufLen { t.Refresh() } From 1e358922772707aa761f1742356a11f4dbb914a7 Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Tue, 9 Jan 2024 23:10:44 -0800 Subject: [PATCH 04/12] simplify current implementation --- output.go | 3 +-- term.go | 5 +---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/output.go b/output.go index 56203f24..3d54b817 100644 --- a/output.go +++ b/output.go @@ -108,8 +108,7 @@ func (t *Terminal) handleOutput(buf []byte) []byte { if size == 0 { break } - // UTF-8 can be 1-4 bytes long - if r == utf8.RuneError && size < 4 { + if r == utf8.RuneError && size == 1 { return buf } diff --git a/term.go b/term.go index 707acf02..115b7aaf 100644 --- a/term.go +++ b/term.go @@ -287,10 +287,7 @@ func (t *Terminal) run() { fyne.LogError("pty read error", err) } - if len(leftOver) > 0 { - buf = append(leftOver, buf[:num]...) - } - leftOver = t.handleOutput(buf[:num]) + leftOver = t.handleOutput(append(leftOver, buf[:num]...)) if num < bufLen { t.Refresh() } From f9d1be3104bac8bbc826ee2af993d46e984edccd Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Tue, 9 Jan 2024 23:51:44 -0800 Subject: [PATCH 05/12] check len of leftOver instead of always appending. --- term.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/term.go b/term.go index 115b7aaf..2bced927 100644 --- a/term.go +++ b/term.go @@ -287,7 +287,11 @@ func (t *Terminal) run() { fyne.LogError("pty read error", err) } - leftOver = t.handleOutput(append(leftOver, buf[:num]...)) + if len(leftOver) > 0 { + buf = append(leftOver, buf...) + num++ + } + leftOver = t.handleOutput(buf[:num]) if num < bufLen { t.Refresh() } From ab0f0e7c3b495297c245f8e0afa9f9afa0896d4e Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Wed, 10 Jan 2024 00:04:25 -0800 Subject: [PATCH 06/12] size the buffer append --- term.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/term.go b/term.go index 2bced927..958fd4fa 100644 --- a/term.go +++ b/term.go @@ -288,7 +288,7 @@ func (t *Terminal) run() { } if len(leftOver) > 0 { - buf = append(leftOver, buf...) + buf = append(leftOver, buf[:num]...) num++ } leftOver = t.handleOutput(buf[:num]) From 3772fc2f8e135210405ff8fe3d2fa7daf33fd8da Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Wed, 10 Jan 2024 00:22:14 -0800 Subject: [PATCH 07/12] update num by len of leftover --- term.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/term.go b/term.go index 958fd4fa..4b1255e4 100644 --- a/term.go +++ b/term.go @@ -289,7 +289,7 @@ func (t *Terminal) run() { if len(leftOver) > 0 { buf = append(leftOver, buf[:num]...) - num++ + num += len(leftOver) } leftOver = t.handleOutput(buf[:num]) if num < bufLen { From 9d67cf68a5766f0649e0522e235b3928faafae7b Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Wed, 10 Jan 2024 00:36:56 -0800 Subject: [PATCH 08/12] increase bufLen with length of leftOver --- term.go | 1 + 1 file changed, 1 insertion(+) diff --git a/term.go b/term.go index 4b1255e4..d547c093 100644 --- a/term.go +++ b/term.go @@ -290,6 +290,7 @@ func (t *Terminal) run() { if len(leftOver) > 0 { buf = append(leftOver, buf[:num]...) num += len(leftOver) + bufLen += len(leftOver) } leftOver = t.handleOutput(buf[:num]) if num < bufLen { From 3b59c359cf52cbd4c1cf2ec1a501b4cabb6ad84e Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Wed, 10 Jan 2024 00:39:58 -0800 Subject: [PATCH 09/12] only add to bufLen for t.Refresh check --- term.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/term.go b/term.go index d547c093..d54a5d98 100644 --- a/term.go +++ b/term.go @@ -290,10 +290,9 @@ func (t *Terminal) run() { if len(leftOver) > 0 { buf = append(leftOver, buf[:num]...) num += len(leftOver) - bufLen += len(leftOver) } leftOver = t.handleOutput(buf[:num]) - if num < bufLen { + if num < bufLen+len(leftOver) { t.Refresh() } } From 11589dc828f97a7b90b6b4ef663b82b547cd27f0 Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Wed, 10 Jan 2024 01:48:31 -0800 Subject: [PATCH 10/12] stop handling output on cols/rows change --- output.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/output.go b/output.go index 3d54b817..a975f7a1 100644 --- a/output.go +++ b/output.go @@ -100,8 +100,15 @@ func (t *Terminal) handleOutput(buf []byte) []byte { size int r rune i = -1 + cols = t.config.Columns + rows = t.config.Rows ) for { + // check if terminal size has changed + if t.config.Columns != cols || t.config.Rows != rows { + break + } + i++ buf = buf[size:] r, size = utf8.DecodeRune(buf) From eb72cc80796423d0cb0bd3187973ab9f1d99f56f Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Wed, 10 Jan 2024 09:39:56 -0800 Subject: [PATCH 11/12] reverted speed up due to information loss --- output.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/output.go b/output.go index a975f7a1..3d54b817 100644 --- a/output.go +++ b/output.go @@ -100,15 +100,8 @@ func (t *Terminal) handleOutput(buf []byte) []byte { size int r rune i = -1 - cols = t.config.Columns - rows = t.config.Rows ) for { - // check if terminal size has changed - if t.config.Columns != cols || t.config.Rows != rows { - break - } - i++ buf = buf[size:] r, size = utf8.DecodeRune(buf) From 5b0afd2dc1c83000fec4945a815bce0e9af74cb5 Mon Sep 17 00:00:00 2001 From: figuerom16 Date: Fri, 12 Jan 2024 10:43:54 -0800 Subject: [PATCH 12/12] fix occasionally missing a resize since length of leftover wasn't carrying over. --- term.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/term.go b/term.go index d54a5d98..1f85cf52 100644 --- a/term.go +++ b/term.go @@ -287,12 +287,13 @@ func (t *Terminal) run() { fyne.LogError("pty read error", err) } - if len(leftOver) > 0 { + lenLeftOver := len(leftOver) + if lenLeftOver > 0 { buf = append(leftOver, buf[:num]...) - num += len(leftOver) + num += lenLeftOver } leftOver = t.handleOutput(buf[:num]) - if num < bufLen+len(leftOver) { + if num < bufLen+lenLeftOver { t.Refresh() } }