mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-11-06 13:00:59 -04:00
Draw a blank for a double-width character cut off at the edge of a view
A double-width character that starts in the last column of a view is drawn over the view's frame. One that is scrolled halfway out to the left is skipped, and the column it reaches into isn't drawn at all. The draw loop clips cells against the edges of the view as if every cell were one column wide. A terminal can't show half of a double-width character. So draw a blank in the column that is on screen, in the character's colors, and let the selection highlight cover that column like any other. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
bab90de2fd
commit
e314ad884a
+17
-7
@@ -1878,13 +1878,7 @@ func (v *View) draw(isWindowFocused bool) {
|
||||
|
||||
var c cell
|
||||
for x < maxX {
|
||||
if x < 0 {
|
||||
if cellIdx < len(vline.line) {
|
||||
x += uniseg.StringWidth(vline.line[cellIdx].chr)
|
||||
cellIdx++
|
||||
continue
|
||||
}
|
||||
|
||||
if x < 0 && cellIdx >= len(vline.line) {
|
||||
// no more characters to write so we're only going to be printing empty cells
|
||||
// past this point
|
||||
x = gutterWidth
|
||||
@@ -1897,6 +1891,22 @@ func (v *View) draw(isWindowFocused bool) {
|
||||
c = vline.line[cellIdx]
|
||||
}
|
||||
|
||||
// Skip the cells scrolled out to the left.
|
||||
if x < 0 && x+c.width <= 0 {
|
||||
x += c.width
|
||||
cellIdx++
|
||||
continue
|
||||
}
|
||||
|
||||
// A terminal can't show half of a double-width character, so one that is cut
|
||||
// off by the left or right edge shows as a blank in the column of it that is
|
||||
// on screen.
|
||||
if x < 0 || x+c.width > maxX {
|
||||
c.chr = " "
|
||||
c.width = 1
|
||||
x = max(x, 0)
|
||||
}
|
||||
|
||||
fgColor := c.fgColor
|
||||
if fgColor == ColorDefault {
|
||||
fgColor = v.FgColor
|
||||
|
||||
@@ -1178,12 +1178,8 @@ func TestDoubleWidthCharacterAtTheRightEdge(t *testing.T) {
|
||||
|
||||
// The frame puts view column 9 at screen column 10.
|
||||
chr, _, width := Screen.Get(10, 1)
|
||||
/* EXPECTED:
|
||||
assert.Equal(t, " ", chr)
|
||||
assert.Equal(t, 1, width)
|
||||
ACTUAL: */
|
||||
assert.Equal(t, "プ", chr)
|
||||
assert.Equal(t, 2, width)
|
||||
}
|
||||
|
||||
// A double-width character that is scrolled halfway out to the left shows as a blank
|
||||
@@ -1203,10 +1199,7 @@ func TestDoubleWidthCharacterCutOffAtTheLeftEdge(t *testing.T) {
|
||||
chr, style, _ := Screen.Get(1, 1)
|
||||
assert.Equal(t, " ", chr)
|
||||
assert.Equal(t,
|
||||
/* EXPECTED:
|
||||
true,
|
||||
ACTUAL: */
|
||||
false,
|
||||
style.GetBackground() != tcell.ColorDefault,
|
||||
"the selection covers the column")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user