@ 261105.1 · fetching

261030.1 · d3a071ce4c8bac3d539fbcb96221f464e7bed246

fix(vt): reset grapheme state after resizing

reading declarations

vt/emulate.go

@@ -2395,6 +2395,7 @@ func (em *emulator) ResizeEvent(size Coord) {  func (em *emulator) applyResize(size Coord) { 	// resize clobbers our content, until it is redrawn+	em.lastIndex = 0 	em.size = size 	em.tabStops = slices.DeleteFunc(em.tabStops, func(x Col) bool { return x >= em.size.X }) 	// resizing resets the margins

vt/tests/mock_test.go

@@ -1260,6 +1260,28 @@ func TestBackendBlitReverse(t *testing.T) { 	CheckAttrs(t, term, 2, 2, vt.Bold) } +func TestGraphemeClusterAfterResize(t *testing.T) {+	for _, tc := range []struct {+		name               string+		size, cell, cursor Coord+	}{+		{"shrink", Coord{X: 4, Y: 2}, Coord{X: 3, Y: 1}, Coord{X: 3, Y: 1}},+		{"grow", Coord{X: 16, Y: 8}, Coord{X: 7, Y: 3}, Coord{X: 8, Y: 3}},+	} {+		t.Run(tc.name, func(t *testing.T) {+			term := vt.NewMockTerm(vt.MockOptSize{X: 8, Y: 4})+			defer MustClose(t, term)+			MustStart(t, term)++			WriteF(t, term, "\x1b[?2027h\x1b[4;7He")+			term.SetSize(tc.size)+			WriteF(t, term, "x\u0301")+			CheckContent(t, term, tc.cell.X, tc.cell.Y, "x\u0301")+			CheckPos(t, term, tc.cursor.X, tc.cursor.Y)+		})+	}+}+ func TestGraphemeCluster(t *testing.T) { 	term := vt.NewMockTerm(vt.MockOptSize{X: 10, Y: 5}) 	defer MustClose(t, term)