diff options
| author | hhvn <dev@hhvn.uk> | 2023-11-18 15:02:35 +0000 |
|---|---|---|
| committer | hhvn <dev@hhvn.uk> | 2023-11-18 19:55:19 +0000 |
| commit | 6a1ca4bae672d7b6edc50c9a31b0404467714edb (patch) | |
| tree | 265f534184fa2b0a5fcbc8f5f0c0da7d6df58d0b /drw | |
| parent | 6117c8a98a39cd8bc1ca6b2436b6dab8873053f9 (diff) | |
Move all xgb using functions to drw
Diffstat (limited to 'drw')
| -rw-r--r-- | drw/x.go | 81 |
1 files changed, 74 insertions, 7 deletions
@@ -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) +} |