summaryrefslogtreecommitdiff
path: root/appl/wm/date.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/wm/date.b')
-rw-r--r--appl/wm/date.b78
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");
+}