// clearCanvas erases all your pencil marks. func clearCanvas(canvas *xgraphics.Image, win *xwindow.Window) { log.Println("Clearing canvas...") canvas.For(func(x, y int) xgraphics.BGRA { return bg }) canvas.XDraw() canvas.XPaint(win.Id) }
// This is a slightly modified version of xgraphics.XShowExtra that does // not set any resize constraints on the window (so that it can go // fullscreen). func showImage(im *xgraphics.Image, name string, quit bool) *xwindow.Window { if len(name) == 0 { name = "xgbutil Image Window" } w, h := im.Rect.Dx(), im.Rect.Dy() win, err := xwindow.Generate(im.X) if err != nil { xgbutil.Logger.Printf("Could not generate new window id: %s", err) return nil } // Create a very simple window with dimensions equal to the image. win.Create(im.X.RootWin(), 0, 0, w, h, 0) // Make this window close gracefully. win.WMGracefulClose(func(w *xwindow.Window) { xevent.Detach(w.X, w.Id) keybind.Detach(w.X, w.Id) mousebind.Detach(w.X, w.Id) w.Destroy() if quit { xevent.Quit(w.X) } }) // Set WM_STATE so it is interpreted as a top-level window. err = icccm.WmStateSet(im.X, win.Id, &icccm.WmState{ State: icccm.StateNormal, }) if err != nil { // not a fatal error xgbutil.Logger.Printf("Could not set WM_STATE: %s", err) } // Set _NET_WM_NAME so it looks nice. err = ewmh.WmNameSet(im.X, win.Id, name) if err != nil { // not a fatal error xgbutil.Logger.Printf("Could not set _NET_WM_NAME: %s", err) } // Paint our image before mapping. im.XSurfaceSet(win.Id) im.XDraw() im.XPaint(win.Id) // Now we can map, since we've set all our properties. // (The initial map is when the window manager starts managing.) win.Map() return win }
// SetRoot sets the given background as the root window background. func SetRoot(X *xgbutil.XUtil, bg *xgraphics.Image) error { root := X.RootWin() if err := bg.XSurfaceSet(root); err != nil { return err } bg.XDraw() bg.XPaint(root) // FIXME: This doesn't set the pixmap persistently. As soon as the program // exits, the pixmap is destroyed. Find a way to make it persistent. xprop.ChangeProp32(X, root, "_XROOTPMAP_ID", "PIXMAP", uint(bg.Pixmap)) xprop.ChangeProp32(X, root, "ESETROOT_PMAP_ID", "PIXMAP", uint(bg.Pixmap)) return nil }
func updater(img *xgraphics.Image, win *xwindow.Window) { //We keep track of times based on 1024 frames frame := 0 start := time.Now() var genStart, drawStart time.Time var genTotal, drawTotal time.Duration for { frame = frame + 1 if frame > 1024 { frame = 0 log.Printf("Time elapsed: %s\n", time.Now().Sub(start)) log.Printf("Time generate: %s\n", genTotal) log.Printf("Time drawing: %s\n", drawTotal) start = time.Now() drawTotal, genTotal = 0, 0 } genStart = time.Now() var x, y, i int for y = 0; y < 768; y++ { //set last pixel back to black img.SetBGRA(frame-1, y, xgraphics.BGRA{0, 0, 0, 255}) for i = 0; i < 10; i++ { x = i + frame if x > 1024 { x = 1024 } img.SetBGRA(x, y, xgraphics.BGRA{0, 0, 255, 255}) } } genTotal += time.Now().Sub(genStart) drawStart = time.Now() //hopefully using checked will block us from drawing again before x //draws although XDraw might block anyway, we can check for an error //here err := img.XDrawChecked() if err != nil { log.Println(err) return } //img.XDraw() img.XPaint(win.Id) drawTotal += time.Now().Sub(drawStart) } }