From b4c4cb7b08050ce777addfb28fd7270b3665d408 Mon Sep 17 00:00:00 2001 From: Vladimir Kravets Date: Sun, 2 Dec 2018 12:58:26 +0200 Subject: [PATCH] redraw correctly during resize --- gui/gui.go | 178 +++++++++++++++++++++++++++-------------------------- 1 file changed, 90 insertions(+), 88 deletions(-) diff --git a/gui/gui.go b/gui/gui.go index a4a3053..328c497 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -91,6 +91,8 @@ func (gui *GUI) resize(w *glfw.Window, width int, height int) { gui.logger.Debugf("Resize complete!") + gui.redraw(buffer.NewBackgroundCell(gui.config.ColourScheme.Background)) + gui.window.SwapBuffers() } func (gui *GUI) getTermSize() (uint, uint) { @@ -219,94 +221,7 @@ func (gui *GUI) Render() error { if gui.terminal.CheckDirty() { - gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT) - - lines := gui.terminal.GetVisibleLines() - lineCount := int(gui.terminal.ActiveBuffer().ViewHeight()) - colCount := int(gui.terminal.ActiveBuffer().ViewWidth()) - cx := uint(gui.terminal.GetLogicalCursorX()) - cy := uint(gui.terminal.GetLogicalCursorY()) + uint(gui.terminal.GetScrollOffset()) - - var colour *config.Colour - for y := 0; y < lineCount; y++ { - if y < len(lines) { - cells := lines[y].Cells() - for x := 0; x < colCount; x++ { - - cursor := false - if gui.terminal.Modes().ShowCursor { - cursor = cx == uint(x) && cy == uint(y) - } - - if gui.terminal.ActiveBuffer().InSelection(uint16(x), uint16(y)) { - colour = &gui.config.ColourScheme.Selection - } else { - colour = nil - } - - cell := defaultCell - if colour != nil || cursor || x < len(cells) { - - if x < len(cells) { - cell = cells[x] - if cell.Image() != nil { - gui.renderer.DrawCellImage(cell, uint(x), uint(y)) - continue - } - } - - gui.renderer.DrawCellBg(cell, uint(x), uint(y), cursor, colour, false) - } - - } - } - } - - for y := 0; y < lineCount; y++ { - - if y < len(lines) { - - bufStr := "" - bold := false - dim := false - col := 0 - colour := [3]float32{0, 0, 0} - cells := lines[y].Cells() - - for x := 0; x < colCount; x++ { - if x < len(cells) { - cell := cells[x] - if bufStr != "" && (cell.Attr().Dim != dim || cell.Attr().Bold != bold || colour != cell.Fg()) { - var alpha float32 = 1.0 - if dim { - alpha = 0.5 - } - gui.renderer.DrawCellText(bufStr, uint(col), uint(y), alpha, colour, bold) - col = x - bufStr = "" - } - dim = cell.Attr().Dim - colour = cell.Fg() - bold = cell.Attr().Bold - r := cell.Rune() - if r == 0 { - r = ' ' - } - bufStr += string(r) - } - } - if bufStr != "" { - var alpha float32 = 1.0 - if dim { - alpha = 0.5 - } - gui.renderer.DrawCellText(bufStr, uint(col), uint(y), alpha, colour, bold) - } - } - - } - - gui.renderOverlay() + gui.redraw(defaultCell) if gui.showDebugInfo { gui.textbox(2, 2, fmt.Sprintf(`Cursor: %d,%d @@ -357,6 +272,93 @@ Buffer Size: %d lines } +func (gui *GUI) redraw(defaultCell buffer.Cell) { + gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT) + lines := gui.terminal.GetVisibleLines() + lineCount := int(gui.terminal.ActiveBuffer().ViewHeight()) + colCount := int(gui.terminal.ActiveBuffer().ViewWidth()) + cx := uint(gui.terminal.GetLogicalCursorX()) + cy := uint(gui.terminal.GetLogicalCursorY()) + uint(gui.terminal.GetScrollOffset()) + var colour *config.Colour + for y := 0; y < lineCount; y++ { + if y < len(lines) { + cells := lines[y].Cells() + for x := 0; x < colCount; x++ { + + cursor := false + if gui.terminal.Modes().ShowCursor { + cursor = cx == uint(x) && cy == uint(y) + } + + if gui.terminal.ActiveBuffer().InSelection(uint16(x), uint16(y)) { + colour = &gui.config.ColourScheme.Selection + } else { + colour = nil + } + + cell := defaultCell + if colour != nil || cursor || x < len(cells) { + + if x < len(cells) { + cell = cells[x] + if cell.Image() != nil { + gui.renderer.DrawCellImage(cell, uint(x), uint(y)) + continue + } + } + + gui.renderer.DrawCellBg(cell, uint(x), uint(y), cursor, colour, false) + } + + } + } + } + for y := 0; y < lineCount; y++ { + + if y < len(lines) { + + bufStr := "" + bold := false + dim := false + col := 0 + colour := [3]float32{0, 0, 0} + cells := lines[y].Cells() + + for x := 0; x < colCount; x++ { + if x < len(cells) { + cell := cells[x] + if bufStr != "" && (cell.Attr().Dim != dim || cell.Attr().Bold != bold || colour != cell.Fg()) { + var alpha float32 = 1.0 + if dim { + alpha = 0.5 + } + gui.renderer.DrawCellText(bufStr, uint(col), uint(y), alpha, colour, bold) + col = x + bufStr = "" + } + dim = cell.Attr().Dim + colour = cell.Fg() + bold = cell.Attr().Bold + r := cell.Rune() + if r == 0 { + r = ' ' + } + bufStr += string(r) + } + } + if bufStr != "" { + var alpha float32 = 1.0 + if dim { + alpha = 0.5 + } + gui.renderer.DrawCellText(bufStr, uint(col), uint(y), alpha, colour, bold) + } + } + + } + gui.renderOverlay() +} + func (gui *GUI) createWindow() (*glfw.Window, error) { if err := glfw.Init(); err != nil { return nil, fmt.Errorf("Failed to initialise GLFW: %s", err)