Sasha Koshka
437aef0c27
Now it supports things like parenting elements before they are added to a window and elements no longer have to constantly check for a nil entity
65 lines
2.0 KiB
Go
65 lines
2.0 KiB
Go
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.
|
|
type Backend interface {
|
|
// Run runs the backend's event loop. It must block until the backend
|
|
// experiences a fatal error, or Stop() is called.
|
|
Run () error
|
|
|
|
// Stop stops the backend's event loop.
|
|
Stop ()
|
|
|
|
// Do executes the specified callback within the main thread as soon as
|
|
// possible. This method must be safe to call from other threads.
|
|
Do (callback func ())
|
|
|
|
// NewEntity creates a new entity for the specified element.
|
|
NewEntity (owner Element) Entity
|
|
|
|
// NewWindow creates a new window within the specified bounding
|
|
// rectangle. The position on screen may be overridden by the backend or
|
|
// operating system.
|
|
NewWindow (bounds image.Rectangle) (MainWindow, error)
|
|
|
|
// SetTheme sets the theme of all open windows.
|
|
SetTheme (Theme)
|
|
|
|
// SetConfig sets the configuration of all open windows.
|
|
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)
|
|
|
|
// 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)
|
|
}
|
|
|
|
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
|
|
}
|