diff --git a/backends/x/window.go b/backends/x/window.go index 7fb34b0..7dd4f12 100644 --- a/backends/x/window.go +++ b/backends/x/window.go @@ -227,15 +227,33 @@ func (window *window) NewModal (width, height int) (elements.Window, error) { 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) + if err != nil { return nil, err } + panel.setClientLeader(window.window) + panel.setType("UTILITY") return panel, err } +func (window *window) setType (ty string) error { + return ewmh.WmWindowTypeSet ( + window.backend.connection, + window.xWindow.Id, + []string { "_NET_WM_WINDOW_TYPE_" + ty }) +} + +func (window *window) setClientLeader (leader *window) error { + // FIXME: doe not fucking work + hints, _ := icccm.WmHintsGet(window.backend.connection, window.xWindow.Id) + if hints == nil { + hints = &icccm.Hints { } + } + hints.Flags |= icccm.HintWindowGroup + hints.WindowGroup = leader.xWindow.Id + return icccm.WmHintsSet ( + window.backend.connection, + window.xWindow.Id, + hints) +} + func (window *window) Show () { if window.child == nil { window.xCanvas.For (func (x, y int) xgraphics.BGRA { diff --git a/examples/panels/main.go b/examples/panels/main.go new file mode 100644 index 0000000..a9110f7 --- /dev/null +++ b/examples/panels/main.go @@ -0,0 +1,40 @@ +package main + +import "fmt" +import "git.tebibyte.media/sashakoshka/tomo" +import "git.tebibyte.media/sashakoshka/tomo/elements" +import "git.tebibyte.media/sashakoshka/tomo/layouts/basic" +import "git.tebibyte.media/sashakoshka/tomo/elements/basic" +import _ "git.tebibyte.media/sashakoshka/tomo/backends/all" +import "git.tebibyte.media/sashakoshka/tomo/elements/containers" + +func main () { + tomo.Run(run) +} + +func run () { + window, _ := tomo.NewWindow(2, 2) + window.SetTitle("Main") + + container := containers.NewContainer(basicLayouts.Vertical { true, true }) + container.Adopt(basicElements.NewLabel("Main window", false), true) + window.Adopt(container) + + window.OnClose(tomo.Stop) + window.Show() + + createPanel(window, 0) + // createPanel(window, 1) + // createPanel(window, 2) + // createPanel(window, 3) +} + +func createPanel (parent elements.MainWindow, id int) { + window, _ := parent.NewPanel(2, 2) + title := fmt.Sprint("Panel #", id) + window.SetTitle(title) + container := containers.NewContainer(basicLayouts.Vertical { true, true }) + container.Adopt(basicElements.NewLabel(title, false), true) + window.Adopt(container) + window.Show() +} diff --git a/tomo.go b/tomo.go index 8ed327b..eb36c8e 100644 --- a/tomo.go +++ b/tomo.go @@ -40,10 +40,9 @@ func Do (callback func ()) { } // NewWindow creates a new window using the current backend, and returns it as a -// Window. If the window could not be created, an error is returned explaining -// why. If this function is called without a running backend, an error is -// returned as well. -func NewWindow (width, height int) (window elements.Window, err error) { +// MainWindow. If the window could not be created, an error is returned +// explaining why. +func NewWindow (width, height int) (window elements.MainWindow, err error) { assertBackend() return backend.NewWindow(width, height) }