Added the ability to make different window types
This commit is contained in:
		
							parent
							
								
									fff5ad4d96
								
							
						
					
					
						commit
						d710d13f0d
					
				@ -21,9 +21,9 @@ type Backend interface {
 | 
				
			|||||||
	Do (callback func ())
 | 
						Do (callback func ())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// NewWindow creates a new window with the specified width and height,
 | 
						// 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.
 | 
						// 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 puts data into the clipboard.
 | 
				
			||||||
	Copy (data.Data)
 | 
						Copy (data.Data)
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,7 @@ import "git.tebibyte.media/sashakoshka/tomo/canvas"
 | 
				
			|||||||
import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
					import "git.tebibyte.media/sashakoshka/tomo/elements"
 | 
				
			||||||
// import "runtime/debug"
 | 
					// import "runtime/debug"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type mainWindow struct { *window }
 | 
				
			||||||
type window struct {
 | 
					type window struct {
 | 
				
			||||||
	backend *Backend
 | 
						backend *Backend
 | 
				
			||||||
	xWindow *xwindow.Window
 | 
						xWindow *xwindow.Window
 | 
				
			||||||
@ -35,11 +36,21 @@ type window struct {
 | 
				
			|||||||
func (backend *Backend) NewWindow (
 | 
					func (backend *Backend) NewWindow (
 | 
				
			||||||
	width, height int,
 | 
						width, height int,
 | 
				
			||||||
) (
 | 
					) (
 | 
				
			||||||
	output elements.Window,
 | 
						output elements.MainWindow,
 | 
				
			||||||
	err error,
 | 
						err error,
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
	if backend == nil { panic("nil backend") }
 | 
						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 := &window { backend: backend }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	window.xWindow, err = xwindow.Generate(backend.connection)
 | 
						window.xWindow, err = xwindow.Generate(backend.connection)
 | 
				
			||||||
@ -86,6 +97,7 @@ func (backend *Backend) NewWindow (
 | 
				
			|||||||
	window.reallocateCanvas()
 | 
						window.reallocateCanvas()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	backend.windows[window.xWindow.Id] = window
 | 
						backend.windows[window.xWindow.Id] = window
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	output = window
 | 
						output = window
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -195,6 +207,30 @@ func (window *window) SetIcon (sizes []image.Image) {
 | 
				
			|||||||
		wmIcons)
 | 
							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 () {
 | 
					func (window *window) Show () {
 | 
				
			||||||
	if window.child == nil {
 | 
						if window.child == nil {
 | 
				
			||||||
		window.xCanvas.For (func (x, y int) xgraphics.BGRA {
 | 
							window.xCanvas.For (func (x, y int) xgraphics.BGRA {
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,9 @@ type Window interface {
 | 
				
			|||||||
	// for some backends.
 | 
						// for some backends.
 | 
				
			||||||
	SetIcon (sizes []image.Image)
 | 
						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
 | 
						// Show shows the window. The window starts off hidden, so this must be
 | 
				
			||||||
	// called after initial setup to make sure it is visible.
 | 
						// called after initial setup to make sure it is visible.
 | 
				
			||||||
	Show ()
 | 
						Show ()
 | 
				
			||||||
@ -38,3 +41,13 @@ type Window interface {
 | 
				
			|||||||
	// OnClose specifies a function to be called when the window is closed.
 | 
						// OnClose specifies a function to be called when the window is closed.
 | 
				
			||||||
	OnClose (func ())
 | 
						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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user