ref: d180b70c6c69ffe8168cc8571772ad6e15ac6aba
dir: /init.myr/
use std use thread use sys use "types" use "chan" use "font" use "image" use "pack" use "draw" use "event" pkg draw = const open : (-> std.result(display#, err)) const close : (dpy : display# -> void) const getwindow : (dpy : display#, ref : refresh -> std.result(image#, err)) ;; const open = { var infobuf : byte[12*12] /* 12 infos, 12 bytes each */ var r, clipr, font var dpy /* connect */ dpy = std.zalloc() dpy.imageid = 1 dpy.scrid = (std.getpid() : int32) dpy.ctlfd = std.try(std.open("/dev/draw/new", std.Ordwr | std.Ocexec)) match std.read(dpy.ctlfd, infobuf[:]) | `std.Err e: -> `std.Err `Edpy | `std.Ok 0: -> `std.Err `Edpy | `std.Ok n: match setup(dpy, infobuf[:n]) | `std.Ok void: | `std.Err e: -> `std.Err e ;; ;; /* set up default images */ r = [.x0=0, .y0=0,.x1=1,.y1=1] clipr = [.x0=-0x3FFFFFFF, .y0=-0x3FFFFFFF, .x1=0x3FFFFFFF, .y1=0x3FFFFFFF] dpy.black = genallocimage(dpy, 0, Refnone, dpy.root.chan, DBlack, true, r, clipr) dpy.white = genallocimage(dpy, 0, Refnone, dpy.root.chan, DWhite, true, r, clipr) dpy.opaque = genallocimage(dpy, 0, Refnone, dpy.root.chan, DOpaque, true, r, clipr) /* load up default font */ font = std.getenvv("font", Dfont) match openfont(dpy, font) | `std.Ok ft: dpy.dfont = ft | `std.Err e: -> `std.Err e ;; -> `std.Ok dpy } const setup = {dpy, infobuf var info : byte[:][Ninfo] var buf : byte[12*Ninfo] var mp, kp, rp var p if std.bstrtok(info[:], infobuf).len != Ninfo -> `std.Err `Edpy ;; p = std.bfmt(buf[:], "/dev/draw/{}/data", info[0]) dpy.datafd = std.try(std.open(p, std.Ordwr | std.Ocexec)) /* open device fds */ p = std.bfmt(buf[:], "/dev/draw/{}/refresh", info[0]) dpy.qmtx = thread.mkmtx() dpy.refrfd = std.try(std.open(p, std.Ordwr | std.Ocexec)) dpy.mousefd = std.try(std.open("/dev/mouse", std.Ordwr | std.Ocexec)) dpy.kbdfd = std.try(std.open("/dev/kbd", std.Ordwr | std.Ocexec)) mp = std.try(thread.spawn({; mouseproc(dpy)})) kp = std.try(thread.spawn({; kbdproc(dpy)})) rp = std.try(thread.spawn({; refrproc(dpy)})) sys.atexit(std.fndup({; kill(mp)})) sys.atexit(std.fndup({; kill(kp)})) sys.atexit(std.fndup({; kill(rp)})) /* parse out root image properties */ dpy.ctldir = std.get(std.intparse(info[0])) dpy.buf = std.slalloc(iounit(dpy.datafd) + 5) /* slop for flush */ dpy.root = std.zalloc() parseimgfmt(dpy.root, info[:]) -> `std.Ok void } const initfont = {dpy var font font = std.getenvv("font", "/lib/font/bit/vga/unicode.font") match openfont(dpy, font) | `std.Err e: -> `std.Err `Efont | `std.Ok f: dpy.dfont = f -> `std.Ok void ;; } const getwindow = {dpy, ref var obuf : byte[128], buf : byte[128] var on, fd, img, win var r on = 0 :retry match std.open("/dev/winname", std.Oread) | `std.Ok f: fd = f | `std.Err e: -> `std.Err `Ewin ;; match std.read(fd, buf[:]) | `std.Err e: -> `std.Err `Edpy | `std.Ok n: match namedimage(dpy, buf[:n]) | `std.Ok i: img = i | `std.Err e: /* * theres a race where the winname can change after * we read it, so keep trying as long as the name * keeps changing. */ if !std.sleq(buf[:n], obuf[:on]) std.close(fd) std.slcp(obuf[:n], buf[:n]) on = n goto retry ;; -> `std.Err `Edpy ;; ;; r = inset(img.r, Borderwidth) dpy.screen = allocscreen(dpy, img, dpy.white, false) win = allocimage(dpy, r, DWhite, false) if flush(dpy) -> `std.Ok win else -> `std.Err `Edpy ;; } const close = {dpy // freescreen(dpy.screen) // freeimage(dpy.root) std.slfree(dpy.buf) std.close(dpy.ctlfd) std.close(dpy.datafd) std.close(dpy.refrfd) std.close(dpy.mousefd) std.close(dpy.kbdfd) std.free(dpy) } /* Format: 3 r M 4 (0000000000457def 11 00) 8192 512 /rc/lib/rcmain */ const iounit = {fd var args : byte[:][10] var buf : byte[128] var cfd, ret var path path = std.bfmt(buf[:], "#d/{}ctl", fd) cfd = std.try(std.open(path, std.Oread)) match std.read(cfd,buf[:]) | `std.Ok n: std.bstrtok(args[:], buf[:n]) ret = std.get(std.intparse(args[7])) | `std.Err e: ret = -1 ;; std.close(cfd); -> ret } const kill = {pid match std.open(std.fmt("/proc/{}/note", pid), std.Owrite) | `std.Ok fd: std.write(fd, "kill") | `std.Err e: /* already gone */ ;; }