src.hhvn.uk > hbspbar > file > drw > x.go

custom status bar for bspwm
Log | Files | Refs

x.go (2294B)


      1 package drw // import "hhvn.uk/hbspbar/drw"
      2 
      3 import (
      4 	"os"
      5 	"log"
      6 	"image"
      7 
      8 	"hhvn.uk/hbspbar/config"
      9 	"hhvn.uk/hbspbar/common"
     10 
     11 	"github.com/jezek/xgb"
     12 	"github.com/jezek/xgb/xproto"
     13 	"github.com/jezek/xgbutil"
     14 	"github.com/jezek/xgbutil/icccm"
     15 	"github.com/jezek/xgbutil/ewmh"
     16 	"github.com/jezek/xgbutil/xgraphics"
     17 	"github.com/BurntSushi/freetype-go/freetype/truetype"
     18 )
     19 
     20 type eventwrap struct {
     21 	Ev  xgb.Event
     22 	Err error
     23 }
     24 
     25 var InitErr error
     26 var XClosed chan bool
     27 
     28 var xc      *xgb.Conn
     29 var xu      *xgbutil.XUtil
     30 var screen  *xproto.ScreenInfo
     31 var font    *truetype.Font
     32 
     33 func init() {
     34 	var err error
     35 
     36 	xc, err = xgb.NewConn()
     37 	if err != nil {
     38 		InitErr = err
     39 		return
     40 	}
     41 
     42 	xu, err = xgbutil.NewConnXgb(xc)
     43 	if err != nil {
     44 		InitErr = err
     45 		return
     46 	}
     47 
     48 	setup := xproto.Setup(xc)
     49 	screen = setup.DefaultScreen(xc)
     50 
     51 	read, err := os.Open(config.Font)
     52 	if err != nil {
     53 		InitErr = common.Perror("os.Open", err)
     54 		return
     55 	}
     56 
     57 	font, err = xgraphics.ParseFont(read)
     58 	if err != nil {
     59 		InitErr = common.Perror("xgraphics.ParseFont", err)
     60 		return
     61 	}
     62 
     63 	XClosed = make(chan bool)
     64 
     65 	go func() { for {
     66 		ev, err := xc.WaitForEvent()
     67 		if ev == nil && err == nil {
     68 			XClosed <- true
     69 			return
     70 		}
     71 		if err != nil {
     72 			log.Printf("X.WaitForEvents: %v\n", err)
     73 		}
     74 	}}()
     75 }
     76 
     77 type Window struct {
     78 	id xproto.Window
     79 }
     80 
     81 func WindowCreate(x, y, w, h uint) (*Window, error) {
     82 	var win Window
     83 	var err error
     84 
     85 	win.id, err = xproto.NewWindowId(xc)
     86 	if err != nil {
     87 		return nil, common.Perror("xproto.NewWindowId", err)
     88 	}
     89 
     90 	xproto.CreateWindow(xc, screen.RootDepth, win.id, screen.Root,
     91 		int16(x), int16(y), uint16(w), uint16(h), 0,
     92 		xproto.WindowClassInputOutput, screen.RootVisual,
     93 		xproto.CwBackPixel|xproto.CwEventMask, []uint32{
     94 			0x00000000,
     95 			xproto.EventMaskStructureNotify })
     96 
     97 	class := icccm.WmClass{"hbspbar", "hbspbar"}
     98 	icccm.WmClassSet(xu, win.id, &class)
     99 
    100 	ewmh.WmWindowTypeSet(xu, win.id, []string{"_NET_WM_WINDOW_TYPE_DOCK"})
    101 
    102 	err = xproto.MapWindowChecked(xc, win.id).Check()
    103 	if err != nil {
    104 		return nil, common.Perror("xproto.MapWindow", err)
    105 	}
    106 
    107 	return &win, nil
    108 }
    109 
    110 func (w *Window) Paint(i image.Image) {
    111 	xgr := xgraphics.NewConvert(xu, i)
    112 
    113 	xgr.XSurfaceSet(w.id)
    114 	xgr.XDraw()
    115 	xgr.XPaint(w.id)
    116 	xgr.Destroy()
    117 }
    118 
    119 func (w *Window) Destroy() {
    120 	xproto.DestroyWindow(xc, w.id)
    121 }