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:
		
							parent
							
								
									c865f7146a
								
							
						
					
					
						commit
						e4f97a918a
					
				@ -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) {
 | 
				
			||||||
 | 
				
			|||||||
@ -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 () {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user