Application must now manually call application.Draw in all cases

This behavior is way more consistent, and it makes the drawing code
a bit simpler.
This commit is contained in:
Sasha Koshka 2022-11-11 23:24:20 -05:00
parent c865f7146a
commit e4f97a918a
2 changed files with 17 additions and 30 deletions

View File

@ -53,6 +53,11 @@ type Backend struct {
paddingY int paddingY int
descent int descent int
} }
memory struct {
windowWidth int
windowHeight int
}
} }
func (backend *Backend) Run (channel chan(stone.Event)) { func (backend *Backend) Run (channel chan(stone.Event)) {
@ -87,6 +92,16 @@ func (backend *Backend) Draw () {
backend.drawLock.Lock() backend.drawLock.Lock()
defer backend.drawLock.Unlock() defer backend.drawLock.Unlock()
boundsChanged :=
backend.memory.windowWidth != backend.metrics.windowWidth ||
backend.memory.windowHeight != backend.metrics.windowHeight
backend.memory.windowWidth = backend.metrics.windowWidth
backend.memory.windowHeight = backend.metrics.windowHeight
if boundsChanged {
backend.reallocateCanvas()
}
backend.drawCells(true) backend.drawCells(true)
backend.canvas.XDraw() backend.canvas.XDraw()
backend.canvas.XPaint(backend.window.Id) backend.canvas.XPaint(backend.window.Id)
@ -152,10 +167,6 @@ func (backend *Backend) handleXEvent (event xgb.Event) {
if sizeChanged { if sizeChanged {
configureEvent = configureEvent =
backend.compressConfigureNotify(configureEvent) backend.compressConfigureNotify(configureEvent)
// TODO: remove draw functions from reallocate canvas,
// and only reallocate when drawing and the window
// dimensions have changed
backend.reallocateCanvas()
backend.application.SetSize(backend.calculateBufferSize()) backend.application.SetSize(backend.calculateBufferSize())
backend.channel <- stone.EventResize { } backend.channel <- stone.EventResize { }
} }
@ -214,9 +225,6 @@ func (backend *Backend) calculateBufferSize () (width, height int) {
} }
func (backend *Backend) reallocateCanvas () { func (backend *Backend) reallocateCanvas () {
backend.drawLock.Lock()
defer backend.drawLock.Unlock()
if backend.canvas != nil { if backend.canvas != nil {
backend.canvas.Destroy() backend.canvas.Destroy()
} }
@ -230,28 +238,7 @@ func (backend *Backend) reallocateCanvas () {
return backend.colors[stone.ColorApplication] return backend.colors[stone.ColorApplication]
}) })
// backend.drawRune(0, 0, 'T')
// backend.drawRune(1, 0, 'h')
// backend.drawRune(2, 0, 'e')
// backend.drawRune(4, 0, 'q')
// backend.drawRune(5, 0, 'u')
// backend.drawRune(6, 0, 'i')
// backend.drawRune(7, 0, 'c')
// backend.drawRune(8, 0, 'k')
// backend.drawRune(0, 1, 'b')
// backend.drawRune(1, 1, 'r')
// backend.drawRune(2, 1, 'o')
// backend.drawRune(3, 1, 'w')
// backend.drawRune(4, 1, 'n')
// backend.drawRune(6, 1, 'f')
// backend.drawRune(7, 1, 'o')
// backend.drawRune(8, 1, 'x')
backend.drawCells(true)
backend.canvas.XSurfaceSet(backend.window.Id) backend.canvas.XSurfaceSet(backend.window.Id)
backend.canvas.XDraw()
backend.canvas.XPaint(backend.window.Id)
} }
func (backend *Backend) drawCells (forceRedraw bool) (areas []image.Rectangle) { func (backend *Backend) drawCells (forceRedraw bool) (areas []image.Rectangle) {

View File

@ -33,14 +33,12 @@ func main () {
if err != nil { panic(err) } if err != nil { panic(err) }
redraw() redraw()
application.Draw()
go tick() go tick()
for { for {
select { select {
case <- tickPing: case <- tickPing:
redraw() redraw()
application.Draw()
case event := <- channel: case event := <- channel:
switch event.(type) { switch event.(type) {
@ -72,6 +70,8 @@ func redraw () {
application.SetRune(5, 1, ':') application.SetRune(5, 1, ':')
application.SetRune(6, 1, rune(second / 10 + 48)) application.SetRune(6, 1, rune(second / 10 + 48))
application.SetRune(7, 1, rune(second % 10 + 48)) application.SetRune(7, 1, rune(second % 10 + 48))
application.Draw()
} }
func tick () { func tick () {