summaryrefslogtreecommitdiff
path: root/drw/x.go
diff options
context:
space:
mode:
authorhhvn <dev@hhvn.uk>2023-11-18 15:02:35 +0000
committerhhvn <dev@hhvn.uk>2023-11-18 19:55:19 +0000
commit6a1ca4bae672d7b6edc50c9a31b0404467714edb (patch)
tree265f534184fa2b0a5fcbc8f5f0c0da7d6df58d0b /drw/x.go
parent6117c8a98a39cd8bc1ca6b2436b6dab8873053f9 (diff)
Move all xgb using functions to drw
Diffstat (limited to 'drw/x.go')
-rw-r--r--drw/x.go81
1 files changed, 74 insertions, 7 deletions
diff --git a/drw/x.go b/drw/x.go
index 70b29da..53e8aa1 100644
--- a/drw/x.go
+++ b/drw/x.go
@@ -2,6 +2,7 @@ package drw // import "hhvn.uk/hbspbar/drw"
import (
"os"
+ "image"
"image/color"
"hhvn.uk/hbspbar/config"
@@ -10,36 +11,44 @@ import (
"github.com/jezek/xgb"
"github.com/jezek/xgb/xproto"
"github.com/jezek/xgbutil"
+ "github.com/jezek/xgbutil/icccm"
+ "github.com/jezek/xgbutil/ewmh"
"github.com/jezek/xgbutil/xgraphics"
"github.com/BurntSushi/freetype-go/freetype"
"github.com/BurntSushi/freetype-go/freetype/truetype"
)
+type eventwrap struct {
+ Ev xgb.Event
+ Err error
+}
+
var InitErr error
-var X *xgb.Conn
-var XU *xgbutil.XUtil
-var Screen *xproto.ScreenInfo
+var Events chan *eventwrap
+var xc *xgb.Conn
+var xu *xgbutil.XUtil
+var screen *xproto.ScreenInfo
var font *truetype.Font
var ft *freetype.Context
func init() {
var err error
- X, err = xgb.NewConn()
+ xc, err = xgb.NewConn()
if err != nil {
InitErr = err
return
}
- XU, err = xgbutil.NewConnXgb(X)
+ xu, err = xgbutil.NewConnXgb(xc)
if err != nil {
InitErr = err
return
}
- setup := xproto.Setup(X)
- Screen = setup.DefaultScreen(X)
+ setup := xproto.Setup(xc)
+ screen = setup.DefaultScreen(xc)
read, err := os.Open(config.Font)
if err != nil {
@@ -57,6 +66,18 @@ func init() {
ft.SetDPI(72)
ft.SetFont(font)
ft.SetFontSize(config.FontSize)
+
+ Events := make(chan *eventwrap)
+
+ go func() { for {
+ ev, err := xc.WaitForEvent()
+ w := eventwrap{ev, err}
+
+ select {
+ default:
+ Events <- &w
+ }
+ }}()
}
func int2rgb(argb uint32) (color.RGBA) {
@@ -66,3 +87,49 @@ func int2rgb(argb uint32) (color.RGBA) {
R: uint8((argb & 0x00ff0000) >> 16),
A: uint8((argb & 0xff000000) >> 24) }
}
+
+type Window struct {
+ id xproto.Window
+}
+
+func WindowCreate(x, y, w, h uint) (*Window, error) {
+ var win Window
+ var err error
+
+ win.id, err = xproto.NewWindowId(xc)
+ if err != nil {
+ return nil, common.Perror("xproto.NewWindowId", err)
+ }
+
+ xproto.CreateWindow(xc, screen.RootDepth, win.id, screen.Root,
+ int16(x), int16(y), uint16(w), uint16(h), 0,
+ xproto.WindowClassInputOutput, screen.RootVisual,
+ xproto.CwBackPixel|xproto.CwEventMask, []uint32{
+ config.Bg,
+ xproto.EventMaskStructureNotify })
+
+ class := icccm.WmClass{"hbspbar", "hbspbar"}
+ icccm.WmClassSet(xu, win.id, &class)
+
+ ewmh.WmWindowTypeSet(xu, win.id, []string{"_NET_WM_WINDOW_TYPE_DOCK"})
+ ewmh.WmStateSet(xu, win.id, []string{"_NET_WM_STATE_STICKY", "_NET_WM_STATE_ABOVE"})
+
+ err = xproto.MapWindowChecked(xc, win.id).Check()
+ if err != nil {
+ return nil, common.Perror("xproto.MapWindow", err)
+ }
+
+ return &win, nil
+}
+
+func (w *Window) Paint(i image.Image) {
+ xgr := xgraphics.NewConvert(xu, i)
+
+ xgr.XSurfaceSet(w.id)
+ xgr.XDraw()
+ xgr.XPaint(w.id)
+}
+
+func (w *Window) Destroy() {
+ xproto.DestroyWindow(xc, w.id)
+}