The base tomo module only retains a singleton backend
This commit is contained in:
		
							parent
							
								
									cd8371a3f3
								
							
						
					
					
						commit
						363779a947
					
				@ -1,4 +1,4 @@
 | 
			
		||||
package canvas
 | 
			
		||||
package artist
 | 
			
		||||
 | 
			
		||||
import "image"
 | 
			
		||||
import "image/draw"
 | 
			
		||||
@ -2,12 +2,11 @@ package artist
 | 
			
		||||
 | 
			
		||||
import "image"
 | 
			
		||||
import "image/color"
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
			
		||||
 | 
			
		||||
type Icon interface {
 | 
			
		||||
	// Draw draws the icon to the destination canvas at the specified point,
 | 
			
		||||
	// using the specified color (if the icon is monochrome).
 | 
			
		||||
	Draw (destination canvas.Canvas, color color.RGBA, at image.Point)
 | 
			
		||||
	Draw (destination Canvas, color color.RGBA, at image.Point)
 | 
			
		||||
 | 
			
		||||
	// Bounds returns the bounds of the icon.
 | 
			
		||||
	Bounds () image.Rectangle
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
package artist
 | 
			
		||||
 | 
			
		||||
import "image"
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
			
		||||
 | 
			
		||||
// Pattern is capable of drawing to a canvas within the bounds of a given
 | 
			
		||||
// clipping rectangle.
 | 
			
		||||
@ -10,5 +9,5 @@ type Pattern interface {
 | 
			
		||||
	// specified bounds. The given bounds can be smaller or larger than the
 | 
			
		||||
	// bounds of the destination canvas. The destination canvas can be cut
 | 
			
		||||
	// using canvas.Cut() to draw only a specific subset of a pattern.
 | 
			
		||||
	Draw (destination canvas.Canvas, bounds image.Rectangle)
 | 
			
		||||
	Draw (destination Canvas, bounds image.Rectangle)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										41
									
								
								backend.go
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								backend.go
									
									
									
									
									
								
							@ -1,7 +1,6 @@
 | 
			
		||||
package tomo
 | 
			
		||||
 | 
			
		||||
import "image"
 | 
			
		||||
import "errors"
 | 
			
		||||
 | 
			
		||||
// Backend represents a connection to a display server, or something similar.
 | 
			
		||||
// It is capable of managing an event loop, and creating windows.
 | 
			
		||||
@ -32,33 +31,21 @@ type Backend interface {
 | 
			
		||||
	SetConfig (Config)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BackendFactory represents a function capable of constructing a backend
 | 
			
		||||
// struct. Any connections should be initialized within this function. If there
 | 
			
		||||
// any errors encountered during this process, the function should immediately
 | 
			
		||||
// stop, clean up any resources, and return an error.
 | 
			
		||||
type BackendFactory func () (backend Backend, err error)
 | 
			
		||||
var backend Backend
 | 
			
		||||
 | 
			
		||||
// RegisterBackend registers a backend factory. When an application calls
 | 
			
		||||
// tomo.Run(), the first registered backend that does not throw an error will be
 | 
			
		||||
// used.
 | 
			
		||||
func RegisterBackend (factory BackendFactory) {
 | 
			
		||||
	factories = append(factories, factory)
 | 
			
		||||
// GetBackend returns the currently running backend.
 | 
			
		||||
func GetBackend () Backend {
 | 
			
		||||
	return backend
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var factories []BackendFactory
 | 
			
		||||
 | 
			
		||||
func instantiateBackend () (backend Backend, err error) {
 | 
			
		||||
	// find a suitable backend
 | 
			
		||||
	for _, factory := range factories {
 | 
			
		||||
		backend, err = factory()
 | 
			
		||||
		if err == nil && backend != nil { return }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// if none were found, but there was no error produced, produce an
 | 
			
		||||
	// error
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		err = errors.New("no available backends")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return
 | 
			
		||||
// SetBackend sets the currently running backend. The backend can only be set
 | 
			
		||||
// once—if there already is one then this function will do nothing.
 | 
			
		||||
func SetBackend (b Backend) {
 | 
			
		||||
	if backend != nil { return }
 | 
			
		||||
	backend = b
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bounds creates a rectangle from an x, y, width, and height.
 | 
			
		||||
func Bounds (x, y, width, height int) image.Rectangle {
 | 
			
		||||
	return image.Rect(x, y, x + width, y + height)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,4 +0,0 @@
 | 
			
		||||
// Package canvas provides a canvas interface that is able to return a pixel
 | 
			
		||||
// buffer for drawing. This makes it considerably more efficient than the
 | 
			
		||||
// standard draw.Image.
 | 
			
		||||
package canvas
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
package tomo
 | 
			
		||||
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/artist"
 | 
			
		||||
 | 
			
		||||
// Element represents a basic on-screen object. Extended element interfaces are
 | 
			
		||||
// defined in the ability module.
 | 
			
		||||
@ -8,7 +8,7 @@ type Element interface {
 | 
			
		||||
	// Draw causes the element to draw to the specified canvas. The bounds
 | 
			
		||||
	// of this canvas specify the area that is actually drawn to, while the
 | 
			
		||||
	// Entity bounds specify the actual area of the element.
 | 
			
		||||
	Draw (canvas.Canvas)
 | 
			
		||||
	Draw (artist.Canvas)
 | 
			
		||||
 | 
			
		||||
	// Entity returns this element's entity.
 | 
			
		||||
	Entity () Entity
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
package tomo
 | 
			
		||||
 | 
			
		||||
import "image"
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
			
		||||
import "git.tebibyte.media/sashakoshka/tomo/artist"
 | 
			
		||||
 | 
			
		||||
// Entity is a handle given to elements by the backend. Extended entity
 | 
			
		||||
// interfaces are defined in the ability module.
 | 
			
		||||
@ -28,5 +28,5 @@ type Entity interface {
 | 
			
		||||
	// labels. If there is no parent element (that is, the element is
 | 
			
		||||
	// directly inside of the window), the backend will draw a default
 | 
			
		||||
	// background pattern.
 | 
			
		||||
	DrawBackground (canvas.Canvas)
 | 
			
		||||
	DrawBackground (artist.Canvas)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								tomo.go
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								tomo.go
									
									
									
									
									
								
							@ -1,63 +0,0 @@
 | 
			
		||||
package tomo
 | 
			
		||||
 | 
			
		||||
import "image"
 | 
			
		||||
 | 
			
		||||
var backend Backend
 | 
			
		||||
 | 
			
		||||
// Run initializes a backend, calls the callback function, and begins the event
 | 
			
		||||
// loop in that order. This function does not return until Stop() is called, or
 | 
			
		||||
// the backend experiences a fatal error.
 | 
			
		||||
func Run (callback func ()) (err error) {
 | 
			
		||||
	backend, err = instantiateBackend()
 | 
			
		||||
	if err != nil { return }
 | 
			
		||||
	if callback != nil { callback() }
 | 
			
		||||
	err = backend.Run()
 | 
			
		||||
	backend = nil
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stop gracefully stops the event loop and shuts the backend down. Call this
 | 
			
		||||
// before closing your application.
 | 
			
		||||
func Stop () {
 | 
			
		||||
	if backend != nil { backend.Stop() }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Do executes the specified callback within the main thread as soon as
 | 
			
		||||
// possible. This function can be safely called from other threads.
 | 
			
		||||
func Do (callback func ()) {
 | 
			
		||||
	assertBackend()
 | 
			
		||||
	backend.Do(callback)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewEntity generates an entity for an element using the current backend.
 | 
			
		||||
func NewEntity (owner Element) Entity {
 | 
			
		||||
	assertBackend()
 | 
			
		||||
	return backend.NewEntity(owner)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewWindow creates a new window using the current backend, and returns it as a
 | 
			
		||||
// MainWindow. If the window could not be created, an error is returned
 | 
			
		||||
// explaining why.
 | 
			
		||||
func NewWindow (bounds image.Rectangle) (window MainWindow, err error) {
 | 
			
		||||
	assertBackend()
 | 
			
		||||
	return backend.NewWindow(bounds)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetTheme sets the theme of all open windows.
 | 
			
		||||
func SetTheme (theme Theme) {
 | 
			
		||||
	backend.SetTheme(theme)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetConfig sets the configuration of all open windows.
 | 
			
		||||
func SetConfig (config Config) {
 | 
			
		||||
	backend.SetConfig(config)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Bounds creates a rectangle from an x, y, width, and height.
 | 
			
		||||
func Bounds (x, y, width, height int) image.Rectangle {
 | 
			
		||||
	return image.Rect(x, y, x + width, y + height)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func assertBackend () {
 | 
			
		||||
	if backend == nil { panic("no backend is running") }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user