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 }