summaryrefslogtreecommitdiff
path: root/appl/wm/sam.b
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 17:07:39 +0000
commit37da2899f40661e3e9631e497da8dc59b971cbd0 (patch)
treecbc6d4680e347d906f5fa7fca73214418741df72 /appl/wm/sam.b
parent54bc8ff236ac10b3eaa928fd6bcfc0cdb2ba46ae (diff)
20060303a
Diffstat (limited to 'appl/wm/sam.b')
-rw-r--r--appl/wm/sam.b230
1 files changed, 230 insertions, 0 deletions
diff --git a/appl/wm/sam.b b/appl/wm/sam.b
new file mode 100644
index 00000000..02f12f4d
--- /dev/null
+++ b/appl/wm/sam.b
@@ -0,0 +1,230 @@
+implement Samterm;
+
+include "sys.m";
+sys: Sys;
+fprint, sprint, FD: import sys;
+stderr, logfd: ref FD;
+
+include "draw.m";
+draw: Draw;
+
+include "samterm.m";
+
+include "samtk.m";
+samtk: Samtk;
+
+include "samstub.m";
+samstub: Samstub;
+Samio, Sammsg: import samstub;
+
+samio: ref Samio;
+
+ctxt: ref Context;
+
+init(context: ref draw->Context, nil: list of string)
+{
+ recvsam: chan of ref Sammsg;
+
+ sys = load Sys Sys->PATH;
+ draw = load Draw Draw->PATH;
+ stderr = sys->fildes(2);
+
+ logfd = sys->create("samterm.log", sys->OWRITE, 8r666);
+ if (logfd == nil) {
+ fprint(stderr, "Can't create samterm.log\n");
+ logfd = stderr;
+ }
+
+ fprint(logfd, "Samterm started\n");
+
+ pgrp := sys->pctl(sys->NEWPGRP, nil);
+
+ ctxt = ref Context(
+ context,
+ 1000, # initial tag
+
+ 0, # lock
+
+ nil, # keysel
+ nil, # scrollsel
+ nil, # buttonsel
+ nil, # menu2sel
+ nil, # menu3sel
+ nil, # titlesel
+ nil, # tags
+
+ nil, # menus
+ nil, # texts
+
+ nil, # cmd
+ nil, # which
+ nil, # work
+ pgrp, # pgrp
+ logfd # logging file descriptor
+ );
+
+ samtk = load Samtk Samtk->PATH;
+ if (samtk == nil) {
+ fprint(stderr, "Can't load %s\n", Samtk->PATH);
+ return;
+ }
+ samtk->init(ctxt);
+
+ samstub = load Samstub Samstub->PATH;
+ if (samstub == nil) {
+ fprint(stderr, "Can't load %s\n", Samstub->PATH);
+ return;
+ }
+ samstub->init(ctxt);
+
+ (samio, recvsam) = samstub->start();
+ if (samio == nil) {
+ fprint(stderr, "couldn't start samstub\n");
+ return;
+ }
+ samstub->outTs(samstub->Tversion, samstub->VERSION);
+
+ samstub->startcmdfile();
+
+ samstub->setlock();
+
+ for(;;) if (ctxt.lock == 0) alt {
+ (win, menu) := <-ctxt.titlesel =>
+ samstub->cleanout();
+ fl := ctxt.flayers[win];
+ tag := fl.tag;
+ if ((i := samtk->whichtext(tag)) < 0)
+ samtk->panic("samterm: whichtext");
+ t := ctxt.texts[i];
+ samtk->newcur(t, fl);
+ case menu {
+ "exit" =>
+ if (ctxt.flayers[win].tag == 0) {
+ samstub->outT0(samstub->Texit);
+ f := sprint("#p/%d/ctl", pgrp);
+ if ((fd := sys->open(f, sys->OWRITE)) != nil)
+ sys->write(fd, array of byte "killgrp\n", 8);
+ return;
+ }
+ samstub->close(win, tag);
+ "resize" =>
+ samtk->resize(fl);
+ samstub->scrollto(fl, fl.scope.first);
+ "task" =>
+ spawn samtk->titlectl(win, menu);
+ * =>
+ samtk->titlectl(win, menu);
+ }
+
+
+ (win, m1) := <-ctxt.buttonsel =>
+ samstub->cleanout();
+ fl := ctxt.flayers[win];
+ tag := fl.tag;
+ if (samtk->buttonselect(fl, m1)) {
+ samstub->outTsl(samstub->Tdclick, tag, fl.dot.first);
+ samstub->setlock();
+ }
+ (win, m2) := <-ctxt.menu2sel =>
+ samstub->cleanout();
+ fl := ctxt.flayers[win];
+ tag := fl.tag;
+ if ((i := samtk->whichtext(tag)) < 0)
+ samtk->panic("samterm: whichtext");
+ t := ctxt.texts[i];
+ samtk->newcur(t, fl);
+ case m2 {
+ "cut" =>
+ samstub->cut(t, fl);
+ "paste" =>
+ samstub->paste(t, fl);
+ "snarf" =>
+ samstub->snarf(t, fl);
+ "look" =>
+ samstub->look(t, fl);
+ "exch" =>
+ fprint(ctxt.logfd, "debug -- exch: %d, %s\n", win, m2);
+ "send" =>
+ samstub->send(t, fl);
+ "search" =>
+ samstub->search(t, fl);
+ * =>
+ samtk->panic("samterm: editmenu");
+ }
+ (win, m3) := <-ctxt.menu3sel =>
+ samstub->cleanout();
+ fl := ctxt.flayers[win];
+ tag := fl.tag;
+ if ((i := samtk->whichtext(tag)) < 0)
+ samtk->panic("samterm: whichtext");
+ t := ctxt.texts[i];
+ samtk->newcur(t, fl);
+ case m3 {
+ "new" =>
+ samstub->startnewfile();
+ "zerox" =>
+ samstub->zerox(t);
+ "close" =>
+ if (win != 0) {
+ samstub->close(win, tag);
+ }
+ "write" =>
+ samstub->outTs(samstub->Twrite, tag);
+ samstub->setlock();
+ * =>
+ for (i = 0; i < len ctxt.menus; i++) {
+ if (ctxt.menus[i].name == m3) {
+ break;
+ }
+ }
+ if (i == len ctxt.menus)
+ samtk->panic("init: can't find m3");
+ t = ctxt.menus[i].text;
+ t.flayers = samtk->append(tl t.flayers, hd t.flayers);
+ samtk->newcur(t, hd t.flayers);
+
+ }
+ (win, c) := <-ctxt.keysel =>
+ if (ctxt.which != ctxt.flayers[win]) {
+ fprint(ctxt.logfd, "probably can't happen\n");
+ samstub->cleanout();
+ tag := ctxt.flayers[win].tag;
+ if ((i := samtk->whichtext(tag)) < 0)
+ samtk->panic("samterm: whichtext");
+ samtk->newcur(ctxt.texts[i], ctxt.flayers[win]);
+ }
+ samstub->keypress(c[1:len c -1]);
+ (win, c) := <-ctxt.scrollsel =>
+ if (ctxt.which != ctxt.flayers[win]) {
+ samstub->cleanout();
+ tag := ctxt.flayers[win].tag;
+ if ((i := samtk->whichtext(tag)) < 0)
+ samtk->panic("samterm: whichtext");
+ samtk->newcur(ctxt.texts[i], ctxt.flayers[win]);
+ }
+ (pos, lines) := samtk->scroll(ctxt.which, c);
+ if (lines > 0) {
+ samstub->outTsll(samstub->Torigin,
+ ctxt.which.tag, pos, lines);
+ samstub->setlock();
+ } else if (pos != -1)
+ samstub->scrollto(ctxt.which, pos);
+ h := <-recvsam =>
+ if (samstub->inmesg(h)) {
+ samstub->outT0(samstub->Texit);
+ fname := sprint("#p/%d/ctl", pgrp);
+ if ((fdesc := sys->open(fname, sys->OWRITE)) != nil)
+ sys->write(fdesc, array of byte "killgrp\n", 8);
+ return;
+ }
+ } else {
+ h := <-recvsam;
+ if (samstub->inmesg(h)) {
+ samstub->outT0(samstub->Texit);
+ fname := sprint("#p/%d/ctl", pgrp);
+ if ((fdesc := sys->open(fname, sys->OWRITE)) != nil)
+ sys->write(fdesc, array of byte "killgrp\n", 8);
+ return;
+ }
+ }
+}