diff options
Diffstat (limited to 'appl/wm/about.b')
| -rw-r--r-- | appl/wm/about.b | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/appl/wm/about.b b/appl/wm/about.b new file mode 100644 index 00000000..615f106b --- /dev/null +++ b/appl/wm/about.b @@ -0,0 +1,72 @@ +implement WmAbout; + +include "sys.m"; + sys: Sys; + +include "draw.m"; + draw: Draw; + Display, Image: import draw; + +include "tk.m"; + tk: Tk; + +include "tkclient.m"; + tkclient: Tkclient; + +WmAbout: module +{ + init: fn(ctxt: ref Draw->Context, argv: list of string); +}; + +tkcfg(version: string): array of string +{ + return array[] of { + "frame .f -bg black -borderwidth 2 -relief ridge", + "label .b -bg black -bitmap @/icons/inferno.bit", + "label .l1 -bg black -fg #ff5500 -text {Inferno "+ version + "}", + "pack .b .l1 -in .f", + "pack .f -ipadx 4 -ipady 2", + "pack propagate . 0", + "update", + }; +} + +init(ctxt: ref Draw->Context, nil: list of string) +{ + sys = load Sys Sys->PATH; + if (ctxt == nil) { + sys->fprint(sys->fildes(2), "about: no window context\n"); + raise "fail:bad context"; + } + + draw = load Draw Draw->PATH; + tk = load Tk Tk->PATH; + tkclient= load Tkclient Tkclient->PATH; + + tkclient->init(); + (t, menubut) := tkclient->toplevel(ctxt, "", "About Inferno", 0); + + tkcmds := tkcfg(rf("/dev/sysctl")); + for (i := 0; i < len tkcmds; i++) + tk->cmd(t,tkcmds[i]); + + tkclient->onscreen(t, nil); + tkclient->startinput(t, "ptr"::nil); + stop := chan of int; + spawn tkclient->handler(t, stop); + while((menu := <-menubut) != "exit") + tkclient->wmctl(t, menu); + stop <-= 1; +} + +rf(name: string): string +{ + fd := sys->open(name, Sys->OREAD); + if(fd == nil) + return nil; + buf := array[128] of byte; + n := sys->read(fd, buf, len buf); + if(n < 0) + n = 0; + return string buf[0:n]; +} |
