Added the ability to make different window types

This commit is contained in:
Sasha Koshka 2023-03-24 00:34:25 -04:00
parent fff5ad4d96
commit d710d13f0d
3 changed files with 52 additions and 3 deletions

View File

@ -21,9 +21,9 @@ type Backend interface {
Do (callback func ())
// NewWindow creates a new window with the specified width and height,
// and returns a struct representing it that fulfills the Window
// and returns a struct representing it that fulfills the MainWindow
// interface.
NewWindow (width, height int) (window elements.Window, err error)
NewWindow (width, height int) (window elements.MainWindow, err error)
// Copy puts data into the clipboard.
Copy (data.Data)

View File

@ -14,6 +14,7 @@ import "git.tebibyte.media/sashakoshka/tomo/canvas"
import "git.tebibyte.media/sashakoshka/tomo/elements"
// import "runtime/debug"
type mainWindow struct { *window }
type window struct {
backend *Backend
xWindow *xwindow.Window
@ -35,11 +36,21 @@ type window struct {
func (backend *Backend) NewWindow (
width, height int,
) (
output elements.Window,
output elements.MainWindow,
err error,
) {
if backend == nil { panic("nil backend") }
window, err := backend.newWindow(width, height)
output = mainWindow { window }
return output, err
}
func (backend *Backend) newWindow (
width, height int,
) (
output *window,
err error,
) {
window := &window { backend: backend }
window.xWindow, err = xwindow.Generate(backend.connection)
@ -86,6 +97,7 @@ func (backend *Backend) NewWindow (
window.reallocateCanvas()
backend.windows[window.xWindow.Id] = window
output = window
return
}
@ -195,6 +207,30 @@ func (window *window) SetIcon (sizes []image.Image) {
wmIcons)
}
func (window *window) NewModal (width, height int) (elements.Window, error) {
modal, err := window.backend.newWindow(width, height)
icccm.WmTransientForSet (
window.backend.connection,
modal.xWindow.Id,
window.xWindow.Id)
ewmh.WmStateSet (
window.backend.connection,
modal.xWindow.Id,
[]string { "_NET_WM_STATE_MODAL" })
return modal, err
}
func (window mainWindow) NewPanel (width, height int) (elements.Window, error) {
panel, err := window.backend.newWindow(width, height)
hints, _ := icccm.WmHintsGet(window.backend.connection, panel.xWindow.Id)
hints.WindowGroup = window.xWindow.Id
icccm.WmHintsSet (
window.backend.connection,
panel.xWindow.Id,
hints)
return panel, err
}
func (window *window) Show () {
if window.child == nil {
window.xCanvas.For (func (x, y int) xgraphics.BGRA {

View File

@ -25,6 +25,9 @@ type Window interface {
// for some backends.
SetIcon (sizes []image.Image)
// NewModal creates a new modal dialog window.
NewModal (width, height int) (window Window, err error)
// Show shows the window. The window starts off hidden, so this must be
// called after initial setup to make sure it is visible.
Show ()
@ -38,3 +41,13 @@ type Window interface {
// OnClose specifies a function to be called when the window is closed.
OnClose (func ())
}
// MainWindow is a window capable of owning multiple sub-windows.
type MainWindow interface {
Window
// NewPanel creates a panel window that is semantically tied to this
// window. This is intended to be used for utility windows, tool bars,
// torn-off menus, etc.
NewPanel (width, height int) (window Window, err error)
}