// WaitEnd waits for user input func WaitEnd() { r := bufio.NewReader(os.Stdin) for { c, _ := r.ReadByte() if c == '\n' { break } } openvg.RestoreTerm() openvg.Finish() }
// loop through slides with a pause func loop(filename string, w, h, slidenum int, n time.Duration) { openvg.SaveTerm() defer openvg.RestoreTerm() var d deck.Deck var err error d, err = deck.Read(filename, w, h) if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } openvg.RawTerm() r := bufio.NewReader(os.Stdin) imap := make(map[string]image.Image) loadimage(d, imap) var start int var sd time.Duration for pass := 0; ; pass++ { if pass == 0 { start = slidenum } else { start = 0 } for i := start; i < len(d.Slide); i++ { if readcmd(r) == 'q' { return } showslide(d, imap, i) pd, err := time.ParseDuration(d.Slide[i].Duration) if err != nil { sd = n } else { sd = pd } time.Sleep(sd) } } }
func main() { var resize = flag.Bool("resize", false, "Resize image to fit the screen.") var bgcolor = flag.String("bg", "black", "Background color (named color or rgb(r,g,b)).") var fgcolor = flag.String("fg", "white", "text color (named color or rgb(r,g,b)).") var title = flag.String("t", "", "text annotation") var fontsize = flag.Float64("fp", 2.0, "fontsize %") var px = flag.Float64("px", 50, "x position %") var py = flag.Float64("py", 50, "y position %") var texty = flag.Float64("ty", 0, "text y %") var exit_code int defer func() { os.Exit(exit_code) }() flag.Usage = func() { fmt.Fprintf(os.Stderr, `usage: %s [ flags ] image-path Set specified image as an overlay screen via OpenVG lib. Default is to put this image to the center. `, os.Args[0]) flag.PrintDefaults() exit_code = 1 return } flag.Parse() if flag.NArg() != 1 { fmt.Fprintf(os.Stderr, "Exactly one image-path argument must be specified.\n") flag.Usage() exit_code = 2 return } openvg.SaveTerm() w, h := openvg.Init() openvg.RawTerm() defer openvg.Finish() defer openvg.RestoreTerm() img, err := getimage(flag.Args()[0], w, h, *resize) if err != nil { exit_code = 3 return } ib := img.Bounds() imw, imh := ib.Max.X-ib.Min.X, ib.Max.Y-ib.Min.Y sig_chan := make(chan os.Signal, 1) signal.Notify(sig_chan, os.Interrupt, os.Kill, syscall.SIGHUP, syscall.SIGTERM, syscall.SIGALRM) openvg.Start(w, h) openvg.BackgroundColor(*bgcolor) var x, y openvg.VGfloat if *px < 0 || *px > 100 { x = openvg.VGfloat(w)/2 - openvg.VGfloat(imw)/2 } else { x = openvg.VGfloat(w)*openvg.VGfloat(*px/100) - openvg.VGfloat(imw)/2 } if *py < 0 || *py > 100 { y = openvg.VGfloat(h)/2 - openvg.VGfloat(imh)/2 } else { y = openvg.VGfloat(h)*openvg.VGfloat(*py/100) - openvg.VGfloat(imh)/2 } openvg.Img(x, y, img) if len(*title) > 0 { var typ openvg.VGfloat fs := openvg.VGfloat(*fontsize/100.0) * openvg.VGfloat(w) if *texty == 0 { typ = y - fs*1.5 } else { typ = openvg.VGfloat(h) * openvg.VGfloat(*texty/100) } openvg.FillColor(*fgcolor) openvg.TextMid(x+openvg.VGfloat(imw)/2, typ, *title, "sans", int(fs)) } openvg.End() _ = <-sig_chan }
func usage(s string) { openvg.RestoreTerm() fmt.Fprintf(os.Stderr, "%s [command]\n\tdemo sec\n\tastro\n\ttest ...\n\trand n\n\trotate n ...\n\timage\n\ttext\n\tfontsize\n\traspi\n\tgradient\n\tadvert\n", s) }
// interact controls the display of the deck func interact(filename, searchterm string, w, h, slidenum int, gp float64) { openvg.SaveTerm() defer openvg.RestoreTerm() var d deck.Deck var err error d, err = deck.Read(filename, w, h) if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } openvg.RawTerm() r := bufio.NewReader(os.Stdin) lastslide := len(d.Slide) - 1 if slidenum > lastslide { slidenum = lastslide } if slidenum < 0 { slidenum = 0 } if len(searchterm) > 0 { sr := deck.Search(d, searchterm) if sr >= 0 { slidenum = sr } } n := slidenum xray := 1 initial := 0 imap := make(map[string]image.Image) // respond to keyboard commands, 'q' to exit for cmd := byte('0'); cmd != 'q'; cmd = readcmd(r) { switch cmd { // read/reload case 'r', 18: // r, Ctrl-R d, err = deck.Read(filename, w, h) if err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) return } loadimage(d, imap) openvg.Background(0, 0, 0) xray = 1 showslide(d, imap, n) // save slide case 's', 19: // s, Ctrl-S openvg.SaveEnd(fmt.Sprintf("%s-slide-%04d", filename, n)) // first slide case '0', '1', 1, '^': // 0,1,Ctrl-A,^ initial++ if initial == 1 { loadimage(d, imap) n = slidenum } else { n = 0 } showslide(d, imap, n) // last slide case '*', 5, '$': // *, Crtl-E, $ n = lastslide showslide(d, imap, n) // next slide case '+', 'n', '\n', ' ', '\t', '=', 14: // +,n,newline,space,tab,equal,Crtl-N n++ if n > lastslide { n = 0 } showslide(d, imap, n) // previous slide case '-', 'p', 8, 16, 127: // -,p,Backspace,Ctrl-P,Del n-- if n < 0 { n = lastslide } showslide(d, imap, n) // x-ray case 'x', 24: // x, Ctrl-X xray++ showslide(d, imap, n) if xray%2 == 0 { showgrid(d, n, gp) } // Escape sequence from remotes case 27: remote, rerr := r.ReadString('~') if len(remote) > 2 && rerr == nil { switch remote[1] { case '3': // blank screen openvg.Start(d.Canvas.Width, d.Canvas.Height) openvg.FillColor("black") openvg.Rect(0, 0, openvg.VGfloat(d.Canvas.Width), openvg.VGfloat(d.Canvas.Height)) openvg.End() case '5': // back n-- if n < 0 { n = lastslide } showslide(d, imap, n) case '6': // forward n++ if n > lastslide { n = 0 } showslide(d, imap, n) } } // search case '/', 6: // slash, Ctrl-F openvg.RestoreTerm() searchterm, serr := r.ReadString('\n') openvg.RawTerm() if serr != nil { continue } if len(searchterm) > 2 { ns := deck.Search(d, searchterm[0:len(searchterm)-1]) if ns >= 0 { showslide(d, imap, ns) n = ns } } } } }