package tomo import "sync" import "image" import "git.tebibyte.media/tomo/tomo/data" import "git.tebibyte.media/tomo/tomo/canvas" // Backend is any Tomo implementation. Backends handle window creation, layout, // rendering, and events so that there can be as many platform-specific // optimizations as possible. type Backend interface { // These methods create new Objects. The backend must reject any Object // that was not made by it. NewBox () Box NewTextBox () TextBox NewCanvasBox () CanvasBox NewSurfaceBox () (SurfaceBox, error) NewContainerBox () ContainerBox // NewWindow creates a normal Window and returns it. NewWindow (WindowKind, image.Rectangle) (Window, error) // NewTexture creates a new canvs.Texture from an image. The backend // must reject any texture that was not made by it. NewTexture (image.Image) canvas.TextureCloser // NewCanvas creates a new canvas.Canvas with the specified bounds. The // backend must reject any canvas that was not made by it. NewCanvas (image.Rectangle) canvas.CanvasCloser // ColorRGBA returns the RGBA of a color according to the current style, // as specified in color.Color.RGBA. It may be rendered invalid if the // visual style changes, but the Backend must send a StyleChange event // to all managed boxes when this happens. ColorRGBA (id Color) (r, g, b, a uint32) // IconTexture returns the canvas.Texture of an Icon. It may be closed // and therefore rendered invalid if the icon set changes, but the // Backend must send an IconSetChange event to all managed boxes when // this happens. IconTexture (Icon, IconSize) canvas.Texture // MimeIconTexture returns the canvas.Texture of an icon corresponding // to the specified MIME type. It may be closed and therefore rendered // invalid if the icon set changes, but the Backend must send an // IconSetChange event to all managed boxes when this happens. MimeIconTexture (data.Mime, IconSize) canvas.Texture // Run runs the event loop until Stop is called, or the Backend // experiences a fatal error. Run () error // Stop must unblock Run. This behavior may only be called from within // tomo.Stop. Stop () // Do performs a callback function in the event loop thread as soon as // possible. This method must be safe to call concurrently. Do (func ()) } var backendLock sync.Mutex var backend Backend func assertBackend () { if backend == nil { panic("nil backend") } } // SetBackend sets the Backend that functions in this package will call upon. // This function will panic if there is already a Backend running. func SetBackend (back Backend) { backendLock.Lock() defer backendLock.Unlock() if backend != nil { panic("SetBackend called while another backend was running") } backend = back }