diff options
Diffstat (limited to 'appl/wm/date.b')
| -rw-r--r-- | appl/wm/date.b | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/appl/wm/date.b b/appl/wm/date.b new file mode 100644 index 00000000..72278b7a --- /dev/null +++ b/appl/wm/date.b @@ -0,0 +1,78 @@ +implement WmDate; + +include "sys.m"; + sys: Sys; + +include "draw.m"; + draw: Draw; + +include "tk.m"; + tk: Tk; + +include "tkclient.m"; + tkclient: Tkclient; + +include "daytime.m"; + daytime: Daytime; + + +WmDate: module +{ + init: fn(ctxt: ref Draw->Context, argv: list of string); +}; + +tpid: int; + +init(ctxt: ref Draw->Context, nil: list of string) +{ + sys = load Sys Sys->PATH; + if (ctxt == nil) { + sys->fprint(sys->fildes(2), "date: no window context\n"); + raise "fail:bad context"; + } + draw = load Draw Draw->PATH; + tk = load Tk Tk->PATH; + tkclient= load Tkclient Tkclient->PATH; + daytime = load Daytime Daytime->PATH; + + sys->pctl(Sys->NEWPGRP, nil); + tkclient->init(); + (t, wmctl) := tkclient->toplevel(ctxt, "", "Date", 0); + + st := daytime->time()[0:19]; + tk->cmd(t, "label .d -label {"+st+"}"); + tk->cmd(t, "pack .d; pack propagate . 0"); + tkclient->onscreen(t, nil); + tkclient->startinput(t, "ptr"::nil); + tick := chan of int; + spawn timer(tick); + + for(;;) alt { + s := <-t.ctxt.kbd => + tk->keyboard(t, s); + s := <-t.ctxt.ptr => + tk->pointer(t, *s); + s := <-t.ctxt.ctl or + s = <-t.wreq or + s = <-wmctl => + tkclient->wmctl(t, s); + <-tick => + tk->cmd(t, ".d configure -label {"+daytime->time()[0:19]+"};update"); + } +} + +timer(c: chan of int) +{ + tpid = sys->pctl(0, nil); + for(;;) { + c <-= 1; + sys->sleep(1000); + } +} + +kill(pid: int) +{ + fd := sys->open("#p/"+string pid+"/ctl", sys->OWRITE); + if(fd != nil) + sys->fprint(fd, "kill"); +} |
