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) } } } }