From f807c8df357056225f4fe71f46045bb854177f46 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Wed, 9 Nov 2022 22:33:18 -0500 Subject: [PATCH] Handle actual X events --- backends/x/x.go | 66 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 10 deletions(-) diff --git a/backends/x/x.go b/backends/x/x.go index a514a65..aa7f8f7 100644 --- a/backends/x/x.go +++ b/backends/x/x.go @@ -1,8 +1,13 @@ package x import "image" +import "image/color" +// import "golang.org/x/image/font" +// import "golang.org/x/image/font/basicfont" +import "github.com/jezek/xgb" import "github.com/jezek/xgbutil" +import "github.com/jezek/xgb/xproto" // import "github.com/jezek/xgbutil/ewmh" import "github.com/jezek/xgbutil/xevent" import "github.com/jezek/xgbutil/xwindow" @@ -25,12 +30,14 @@ type Backend struct { } metrics struct { - cellWidth int - cellHeight int - padding int - paddingX int - paddingY int - descent int + windowWidth int + windowHeight int + cellWidth int + cellHeight int + padding int + paddingX int + paddingY int + descent int } } @@ -40,6 +47,19 @@ func (backend *Backend) Run (channel chan(stone.Event)) { for { select { case <- backend.ping.before: + // if the queue is empty, don't dequeue anything because + // it would cause a fucking segfault lmao (???) + if !xevent.Empty(backend.connection) { + event, err := xevent.Dequeue(backend.connection) + if err != nil { + // TODO: do something with err + } + + if event != nil { + backend.handleXEvent(event) + } + } + <- backend.ping.after case <- backend.ping.quit: @@ -57,6 +77,25 @@ func (backend *Backend) SetIcon (icons []image.Image) { } +func (backend *Backend) handleXEvent (event xgb.Event) { + switch event.(type) { + case xproto.ConfigureNotifyEvent: + configureEvent := event.(xproto.ConfigureNotifyEvent) + + newWidth := int(configureEvent.Width) + newHeight := int(configureEvent.Height) + sizeChanged := + backend.metrics.windowWidth != newWidth || + backend.metrics.windowHeight != newHeight + backend.metrics.windowWidth = newWidth + backend.metrics.windowHeight = newHeight + + if sizeChanged { + // TODO: resize and rebind canvas + } + } +} + func (backend *Backend) shutDown () { backend.channel <- stone.EventQuit { } } @@ -96,6 +135,8 @@ func factory (application *stone.Application) (output stone.Backend, err error) backend.metrics.cellHeight backend.metrics.paddingX = backend.metrics.padding backend.metrics.paddingY = backend.metrics.padding + backend.metrics.windowWidth, + backend.metrics.windowHeight = backend.calculateWindowSize() // connect to X backend.connection, err = xgbutil.NewConn() @@ -104,20 +145,25 @@ func factory (application *stone.Application) (output stone.Backend, err error) if err != nil { return } // create the window - windowWidth, windowHeight := backend.calculateWindowSize() backend.window.Create ( backend.connection.RootWin(), - 0, 0, windowWidth, windowHeight, + 0, 0, + backend.metrics.windowWidth, backend.metrics.windowHeight, 0) backend.window.Map() + backend.window.Listen(xproto.EventMaskStructureNotify) // create a canvas backend.canvas = xgraphics.New ( backend.connection, image.Rect ( 0, 0, - windowWidth, - windowHeight)) + backend.metrics.windowWidth, + backend.metrics.windowHeight)) + + for i := 8; i < 64; i ++ { + backend.canvas.Set(8, i, color.RGBA { R: 0xFF, A: 0xFF }) + } backend.bindCanvas() // attatch graceful close handler