summaryrefslogtreecommitdiff
path: root/x/x.go
diff options
context:
space:
mode:
authorhhvn <dev@hhvn.uk>2023-11-16 20:45:11 +0000
committerhhvn <dev@hhvn.uk>2023-11-18 19:54:50 +0000
commit2b7504f96fcb8878ac5ed089940868517a74da79 (patch)
treeff0b24c32b5d037427ffa4a664caf48b8484046e /x/x.go
parent2a8069eb9606af55f76ac43e187ca83a7dd6957f (diff)
Create x package
Diffstat (limited to 'x/x.go')
-rw-r--r--x/x.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/x/x.go b/x/x.go
new file mode 100644
index 0000000..ff00484
--- /dev/null
+++ b/x/x.go
@@ -0,0 +1,100 @@
+package x // import "hhvn.uk/hbspbar/x"
+
+import (
+ "os"
+ "image"
+
+ "hhvn.uk/hbspbar/config"
+ "hhvn.uk/hbspbar/common"
+
+ "github.com/jezek/xgb"
+ "github.com/jezek/xgb/xproto"
+ "github.com/jezek/xgbutil"
+ "github.com/jezek/xgbutil/xgraphics"
+ "github.com/BurntSushi/freetype-go/freetype/truetype"
+)
+
+var InitErr error
+var X *xgb.Conn
+var XU *xgbutil.XUtil
+var Screen *xproto.ScreenInfo
+
+var font *truetype.Font
+var tw, th int
+var tbpad int
+
+func init() {
+ var err error
+
+ X, err = xgb.NewConn()
+ if err != nil {
+ InitErr = err
+ return
+ }
+
+ XU, err = xgbutil.NewConnXgb(X)
+ if err != nil {
+ InitErr = err
+ return
+ }
+
+ setup := xproto.Setup(X)
+ Screen = setup.DefaultScreen(X)
+
+ read, err := os.Open(config.Font)
+ if err != nil {
+ InitErr = common.Perror("os.Open", err)
+ return
+ }
+
+ font, err = xgraphics.ParseFont(read)
+ if err != nil {
+ InitErr = common.Perror("xgraphics.ParseFont", err)
+ return
+ }
+
+ test := xgraphics.New(XU, image.Rect(0, 0, int(config.FontSize * 10), int(config.FontSize * 10)))
+ tw, th, _ = test.Text(0, 0, int2BGRA(config.Fg), config.FontSize, font, "X")
+ tbpad = (int(config.H) - th) / 2
+}
+
+func int2BGRA(argb uint32) (xgraphics.BGRA) {
+ return xgraphics.BGRA{
+ B: uint8( argb & 0x000000ff),
+ G: uint8((argb & 0x0000ff00) >> 8),
+ R: uint8((argb & 0x00ff0000) >> 16),
+ A: uint8((argb & 0xff000000) >> 24) }
+}
+
+func GraphicReInit(i **xgraphics.Image, r image.Rectangle) {
+ if *i != nil {
+ (*i).Destroy()
+ }
+
+ *i = xgraphics.New(XU, r)
+}
+
+func DrawText(i *xgraphics.Image, x int, col uint32, text string) (int, error) {
+ nx, _, err := i.Text(x, config.FontYPad,
+ int2BGRA(col), config.FontSize, font, text)
+ return nx - x, err
+}
+
+func TextWidth(text string) (int) {
+ return tw * len(text)
+}
+
+func DrawRect(i *xgraphics.Image, x, y, w, h int, c uint32, fill bool) {
+ col := int2BGRA(c)
+
+ var ix, iy int
+
+ for ix = x; ix < x + w; ix++ {
+ for iy = y; iy < y + h; iy++ {
+ if fill || ix == x || ix == x + w - 1 ||
+ iy == y || iy == y + h - 1 {
+ i.Set(ix, iy, col)
+ }
+ }
+ }
+}