code: purgatorio

ref: ccd7f9f1597e56d121e1d05cf6af86f688ef2c48
dir: /appl/wm/about.b/

View raw version
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];
}