package tomo import "sync" import "image" import "errors" import "git.tebibyte.media/tomo/tomo/canvas" var backendLock sync.Mutex var backend Backend // Run initializes a backend, runs the specified callback function, and runs the // event loop in that order. This function blocks until Stop is called, or the // backend experiences a fatal error. func Run (callback func ()) error { loadPlugins() if backend != nil { return errors.New("there is already a backend running") } back, err := Initialize() if err != nil { return err } backendLock.Lock() backend = back backendLock.Unlock() callback() return backend.Run() } func assertBackend () { if backend == nil { panic("nil backend") } } // Stop stops the backend, unblocking run. Run may be called again after calling // Stop. func Stop () { assertBackend() backend.Stop() backendLock.Lock() backend = nil backendLock.Unlock() } // Do performs a callback function in the event loop thread as soon as possible. func Do (callback func ()) { backendLock.Lock() if backend != nil { backend.Do(callback) } backendLock.Unlock() } // NewWindow creates and returns a window within the specified bounds on screen. func NewWindow (bounds image.Rectangle) (MainWindow, error) { assertBackend() return backend.NewWindow(bounds) } // NewPlainWindow is like NewWindow, but it creates an undecorated window that // does not appear in window lists. It is intended for creating things like // docks, panels, etc. func NewPlainWindow (bounds image.Rectangle) (MainWindow, error) { assertBackend() return backend.NewPlainWindow(bounds) } // NewBox creates and returns a basic Box. func NewBox () Box { assertBackend() return backend.NewBox() } // NewTextBox creates and returns a Box that can display text. func NewTextBox () TextBox { assertBackend() return backend.NewTextBox() } // NewCanvasBox creates and returns a Box that can display custom graphics. func NewCanvasBox () CanvasBox { assertBackend() return backend.NewCanvasBox() } // NewContainerBox creates and returns a Box that can contain other boxes. func NewContainerBox () ContainerBox { assertBackend() return backend.NewContainerBox() } // NewTexture creates a new texture from an image. When no longer in use, it // must be freed using Close(). func NewTexture (source image.Image) canvas.TextureCloser { assertBackend() return backend.NewTexture(source) }