x-backend #2

Merged
sashakoshka merged 34 commits from x-backend into main 2022-11-14 21:40:25 -07:00
6 changed files with 92 additions and 13 deletions
Showing only changes of commit 23a04a9cdb - Show all commits

View File

@ -1,5 +1,6 @@
package stone package stone
import "image"
import "image/color" import "image/color"
// Application represents an application. // Application represents an application.
@ -7,17 +8,11 @@ type Application struct {
DamageBuffer DamageBuffer
title string title string
icons []image.Image
backend Backend backend Backend
config Config config Config
} }
// SetTitle sets the application's title. If in a window, it will appear as the
// window's name.
func (application *Application) SetTitle (title string) {
application.title = title
application.backend.SetTitle(title)
}
// Run initializes the application, starts it, and then returns a channel that // Run initializes the application, starts it, and then returns a channel that
// broadcasts events. If no suitable backend can be found, an error is returned. // broadcasts events. If no suitable backend can be found, an error is returned.
func (application *Application) Run () ( func (application *Application) Run () (
@ -49,6 +44,36 @@ func (application *Application) Run () (
return return
} }
// SetTitle sets the application's title. If in a window, it will appear as the
// window's name.
func (application *Application) SetTitle (title string) (err error) {
application.title = title
if application.backend != nil {
err = application.backend.SetTitle(title)
}
return
}
func (application *Application) Title () (title string) {
title = application.title
return
}
func (application *Application) SetIcon (sizes []image.Image) (err error) {
application.icons = sizes
if application.backend != nil {
err = application.backend.SetIcon(sizes)
}
return
}
func (application *Application) Icon () (sizes []image.Image) {
sizes = application.icons
return
}
// Config returns a pointer to the application's configuration. // Config returns a pointer to the application's configuration.
func (application *Application) Config () (config *Config) { func (application *Application) Config () (config *Config) {
config = &application.config config = &application.config

BIN
assets/scaffold16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
assets/scaffold32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -5,8 +5,8 @@ import "errors"
type Backend interface { type Backend interface {
Run (channel chan(Event)) Run (channel chan(Event))
SetTitle (title string) SetTitle (title string) (err error)
SetIcon (icons []image.Image) SetIcon (icons []image.Image) (err error)
} }
type BackendFactory func (application *Application) (backend Backend, err error) type BackendFactory func (application *Application) (backend Backend, err error)

View File

@ -7,7 +7,7 @@ import "image"
import "github.com/jezek/xgb" import "github.com/jezek/xgb"
import "github.com/jezek/xgbutil" import "github.com/jezek/xgbutil"
import "github.com/jezek/xgb/xproto" import "github.com/jezek/xgb/xproto"
// import "github.com/jezek/xgbutil/ewmh" import "github.com/jezek/xgbutil/ewmh"
import "github.com/jezek/xgbutil/xevent" import "github.com/jezek/xgbutil/xevent"
import "github.com/jezek/xgbutil/xwindow" import "github.com/jezek/xgbutil/xwindow"
import "github.com/jezek/xgbutil/xgraphics" import "github.com/jezek/xgbutil/xgraphics"
@ -68,12 +68,46 @@ func (backend *Backend) Run (channel chan(stone.Event)) {
} }
} }
func (backend *Backend) SetTitle (title string) { func (backend *Backend) SetTitle (title string) (err error) {
err = ewmh.WmNameSet(backend.connection, backend.window.Id, title)
return
} }
func (backend *Backend) SetIcon (icons []image.Image) { func (backend *Backend) SetIcon (icons []image.Image) (err error) {
wmIcons := []ewmh.WmIcon { }
for _, icon := range icons {
width := icon.Bounds().Max.X
height := icon.Bounds().Max.Y
wmIcon := ewmh.WmIcon {
Width: uint(width),
Height: uint(height),
Data: make ([]uint, width * height),
}
// manually convert image data beacuse of course we have to do
// this
index := 0
for y := 0; y < height; y ++ {
for x := 0; x < width; x ++ {
r, g, b, a := icon.At(x, y).RGBA()
r >>= 8
g >>= 8
b >>= 8
a >>= 8
wmIcon.Data[index] =
(uint(a) << 24) |
(uint(r) << 16) |
(uint(g) << 8) |
(uint(b) << 0)
index ++
}}
wmIcons = append(wmIcons, wmIcon)
}
err = ewmh.WmIconSet(backend.connection, backend.window.Id, wmIcons)
return
} }
func (backend *Backend) handleXEvent (event xgb.Event) { func (backend *Backend) handleXEvent (event xgb.Event) {
@ -192,6 +226,8 @@ func factory (application *stone.Application) (output stone.Backend, err error)
0) 0)
backend.window.Map() backend.window.Map()
backend.window.Listen(xproto.EventMaskStructureNotify) backend.window.Listen(xproto.EventMaskStructureNotify)
backend.SetTitle(application.Title())
backend.SetIcon(application.Icon())
// create a canvas // create a canvas
backend.canvas = xgraphics.New ( backend.canvas = xgraphics.New (

View File

@ -3,11 +3,29 @@ package main
import "os" import "os"
import "fmt" import "fmt"
import "time" import "time"
import "image"
import _ "image/png"
import "git.tebibyte.media/sashakoshka/stone" import "git.tebibyte.media/sashakoshka/stone"
import _ "git.tebibyte.media/sashakoshka/stone/backends/x" import _ "git.tebibyte.media/sashakoshka/stone/backends/x"
func main () { func main () {
application := &stone.Application { } application := &stone.Application { }
application.SetTitle("hellorld")
application.SetSize(12, 2)
iconFile16, err := os.Open("assets/scaffold16.png")
if err != nil { panic(err) }
icon16, _, err := image.Decode(iconFile16)
if err != nil { panic(err) }
iconFile16.Close()
iconFile32, err := os.Open("assets/scaffold32.png")
if err != nil { panic(err) }
icon32, _, err := image.Decode(iconFile32)
if err != nil { panic(err) }
iconFile16.Close()
application.SetIcon([]image.Image { icon16, icon32 })
channel, err := application.Run() channel, err := application.Run()
if err != nil { panic(err) } if err != nil { panic(err) }