John Floren avatar John Floren committed 822f1d6 Merge

Merged with jjlandg

Comments (0)

Files changed (20)

 Linux/386/bin/mkext
 *.sbl
 parallel-push
+appl/wm/toolbar.b.old
+dis/wm/toolbar.dis
+push-common.sh

appl/cmd/buttonserver.b

+implement ButtonServer;
+
+include "sys.m";
+sys : Sys;
+include "draw.m";
+include "styx.m";
+styx: Styx;
+Rmsg, Tmsg: import styx;
+include "styxservers.m";
+styxservers: Styxservers;
+Styxserver, Navigator: import styxservers;
+nametree: Nametree;
+Tree: import nametree;
+include "cfg.m";
+cfg: Cfg;
+include "arg.m";
+arg : Arg;
+
+cfgfile := "/etc/buttonserver.cfg";
+mntflg := Sys->MBEFORE;
+mntpt := "/dev";
+Qroot, Qbuttons : con big iota;
+
+ButtonServer: module {
+	init: fn(nil: ref Draw->Context, args: list of string);
+};
+
+Reader: adt {
+	msgs: chan of ref Tmsg.Read;
+	fid: ref Styxservers->Fid;
+	data: chan of string;
+};
+
+MAX_READERS : con 1024;
+
+readers := array [MAX_READERS] of Reader;
+
+init(nil: ref Draw->Context, args: list of string)
+{
+	sys = load Sys Sys->PATH;
+	styx = load Styx Styx->PATH;
+	styx->init();
+	styxservers = load Styxservers Styxservers->PATH;
+	styxservers->init(styx);
+	nametree = load Nametree Nametree->PATH;
+	nametree->init();
+	arg = load Arg Arg->PATH;
+	arg->init(args);
+	while((c := arg->opt()) != 0) {
+		case c {
+		'c' => cfgfile = arg->arg();
+		* => sys->print("unrecognized option %c\n", c);
+		}
+	}
+	cfg = load Cfg Cfg->PATH;
+	if(cfg->init(cfgfile) != "") {
+		raise sys->sprint("could not access configuration file %s", cfgfile);
+	}
+
+	for(i := 0; i < MAX_READERS; i++) {
+		readers[i].fid = nil;
+	}
+
+	spawn read_events();
+
+	styxpipe := array [2] of ref Sys->FD;
+	sys->pipe(styxpipe);
+	(tree, treeop) := nametree->start();
+	tree.create(Qroot, dir(".", 8r555|Sys->DMDIR, Qroot));
+	tree.create(Qroot, dir("buttons", 8r666, Qbuttons));
+	(tchan, srv) := Styxserver.new(styxpipe[0], Navigator.new(treeop), Qroot);
+	# sys->mount will never return if we call it directly here
+	spawn mounter(styxpipe[1]);
+
+	while((gm := <- tchan) != nil) {
+		pick m := gm {
+			Read =>
+				(fid, err) := srv.canread(m);
+				if(fid == nil) {
+					sys->print("error getting fid: %s\n", err);
+				}
+				if(fid.path == Qbuttons) {
+					reader := get_reader(fid, srv);
+					deliver_msg(reader, m);
+				} else {
+					srv.default(gm);
+				}
+			Clunk =>
+				fid := srv.clunk(m);
+				if(fid != nil && fid.path == Qbuttons) {
+					free_reader(fid);
+				}
+								
+			* =>		
+				srv.default(gm);
+		}
+	}
+	tree.quit();
+}
+
+read_events()
+{
+	fd := sys->open("/dev/events", sys->OREAD);
+	for(;;) {
+		newstr : string;
+		buf := array[64] of byte;
+		n := sys->read(fd, buf, len buf);
+		buf = buf[:n];
+		str := string buf;
+		for(i := 0; i < MAX_READERS; i++) {
+			if(readers[i].fid != nil) {
+				reader := readers[i];
+				reader.data <-= str;
+			}
+		}
+	}
+}
+
+mounter(styxfd : ref Sys->FD)
+{
+	if(sys->mount(styxfd, nil, mntpt, mntflg, nil) < 0) {
+		sys->print("fail: ButtonServer mount failed: %r\n");
+	}
+}
+
+dir(name: string, perm: int, qid: big): Sys->Dir
+{
+	d := sys->zerodir;
+	d.name = name;
+	d.uid = "me";
+	d.gid = "me";
+	d.qid.path = qid;
+	if (perm & Sys->DMDIR)
+		d.qid.qtype = Sys->QTDIR;
+	else
+		d.qid.qtype = Sys->QTFILE;
+	d.mode = perm;
+	return d;
+}
+
+get_reader(fid: ref Styxservers->Fid, srv: ref Styxserver) : Reader
+{
+	for(i := 0; i < MAX_READERS; i++) {
+		if(readers[i].fid == fid) {
+			return readers[i];
+		}
+	}
+
+	# reader was not found, create new entry
+	for(i = 0; i < MAX_READERS; i++) {
+		if(readers[i].fid == nil) {
+			readers[i].fid = fid;
+			readers[i].msgs = chan of ref Tmsg.Read;
+			readers[i].data = chan of string;
+			spawn read_msgs(readers[i], srv);
+			return readers[i];
+		}
+	}
+	raise(sys->sprint("not enough space for new reader"));
+	return readers[0];
+}
+
+deliver_msg(reader: Reader, msg: ref Tmsg.Read)
+{
+	reader.msgs <-= msg;
+}
+
+read_msgs(reader: Reader, srv: ref Styxserver)
+{
+	for(;;) {
+		str: string;
+		msg := <- reader.msgs;
+		while(1) {
+			str = <- reader.data;
+			str = interpret(str);
+			if(str != "") {
+				reply := ref Rmsg.Read(msg.tag, nil);
+				reply.data = array of byte str;
+				srv.reply(reply);
+				break;
+			}
+		}
+	}
+}
+
+interpret(event : string) : string
+{
+	str: string;
+	a: ref Cfg->Record;
+	lst := cfg->lookup(event[:len event - 1]);
+	if(lst == nil) return "";
+	(str, a) = hd lst;
+	if(str == nil) str = "";
+	return str + "\n";
+}
+
+free_reader(fid: ref Styxservers->Fid)
+{
+	for(i := 0; i < MAX_READERS; i++) {
+		if(readers[i].fid == fid) {
+			readers[i].fid = nil;
+		}
+	}
+}
 	bind.dis\
 	# bit2gif.dis\
 	broke.dis\
+	buttonserver.dis\
 	bytes.dis\
 	cal.dis\
 	calc.dis\

appl/wm/keyboard.b

 #KEYSIZE: con 13;
 #KEYSPACE: con 2;
 KEYSIZE: con 46;
-SPECIALKEYSIZE: con KEYSIZE * 3 / 2;
+SPECIALKEYSIZE: con 69;
 KEYHEIGHT: con 40;
 KEYSPACE: con 2;
 KEYBORDER: con 1;
 KEYGAP: con KEYSPACE - (2 * KEYBORDER);
 #ENDGAP: con 2 - KEYBORDER;
 ENDGAP: con 0;
+keysize: int;
+specialkeysize: int;
+space: int;
+
+tbtop: ref Tk->Toplevel;
+screenr: Rect;
 
 Key: adt {
 	name: string;
 	# shifted
 	array[] of {
 		"Esc", "Tab", "\"",  "`", "\\{", "\\}", "_", "+", "<-", nil,
-		"@", "#", "$", "%", "^", "&", "*", "(", ")", "|", nil,
+		"!", "@", "#", "$", "%", "^", "&", "*", "(", ")", nil,
 		"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P",nil,
 		"A", "S", "D", "F", "G", "H", "J", "K", "L", ":", nil,
 		"Z", "X", "C", "V", "B", "N", "M", "<", ">", "?", nil,
-		"Caps", "Shift", " ", "Ctrl", "!", nil,
+		"Caps", "Shift", " ", "Ctrl", "|", nil,
 	},
 };
 
 		array[len keys[0]] of int,
 		array[len keys[1]] of int,
 	};
+
+	(t, wcmd) := tkclient->toplevel(ctxt, "", "Kbd", 0);
+	cmd(t, ". configure -bd 0 -relief flat");
+
+	(tbtop, nil) = tkclient->toplevel(ctxt, nil, nil, Tkclient->Plain);
+	setwidth(tbtop);
+	
+	specials = array[] of {
+	Backspace =>		Key("<-", '\b', specialkeysize, nil, 0),
+	Tab =>			Key("Tab", '\t', specialkeysize, nil, 0),
+	Backslash =>		Key("\\\\", '\\', keysize, nil, 0),
+	CapsLock =>		Key("Caps", Keyboard->Caps, keysize, nil, 0),
+	Return =>		Key("Enter", '\n', specialkeysize, nil, 0),
+	Shift =>		Key("Shift", Keyboard->LShift, specialkeysize, nil, 0),
+	Esc =>			Key("Esc", 8r33, keysize, nil, 0),
+	Ctrl =>			Key("Ctrl", Keyboard->LCtrl, keysize, nil, 0),
+	Alt =>			Key("Alt", Keyboard->LAlt, specialkeysize, nil, 0),
+	Space =>			Key(" ", ' ', space, nil, 0),
+	Space+1 =>		Key("Return", '\n', specialkeysize, nil, 0),
+	};
+
 	setindex(keys[0], keyvals[0], specials);
 	setindex(keys[1], keyvals[1], specials);
 
-
-	(t, wcmd) := tkclient->toplevel(ctxt, "", "Kbd", winopts);
-	cmd(t, ". configure -bd 0 -relief flat");
-
 	for(i := 0; i < len keys[0]; i++)
 		if(keys[0][i] != nil)
 			cmd(t, sys->sprint("button .b%d -takefocus 0 -font %s -width %d -height %d -bd %d -activebackground %s -text {%s} -command 'send keypress %d",
-				i, FONT, KEYSIZE, KEYHEIGHT, KEYBORDER, background, keys[0][i], keyvals[0][i]));
+				i, FONT, keysize, KEYHEIGHT, KEYBORDER, background, keys[0][i], keyvals[0][i]));
 
 	for(i = 0; i < len specials; i++) {
 		k := specials[i];
-		for(xl := k.x; xl != nil; xl = tl xl)
+		for(xl := k.x; xl != nil; xl = tl xl) {
 			cmd(t, sys->sprint(".b%d configure -font %s -width %d", hd xl, SPECFONT, k.size));
+		}
 	}
 
 	# pack buttons in rows
 	r := t.screenr;
 	off := (r.dx()-w)/2;
 	cmd(t, sys->sprint(". configure -x %d -y %d", r.min.x+off, r.max.y-h));
-	tkclient->onscreen(t, nil);
+	tkclient->onscreen(t, "onscreen");
 	tkclient->startinput(t, "ptr" :: nil);
 
 	spawn handle_keyclicks(t, wcmd, taskbar);
 }
 
+setwidth(top: ref Tk->Toplevel)
+{
+
+	r := top.screenr;
+	keysize = (r.dx() - 9) / 10;
+	specialkeysize = keysize * 3 / 2;
+	space = keysize * 4;
+
+}
+
 setindex(keys: array of string, keyvals: array of int, spec: array of Key)
 {
 	for(i := 0; i < len keys; i++){

appl/wm/keyboard.b.old

-implement Keybd;
-
-#
-# extensive revision of code originally by N. W. Knauft
-#
-# Copyright © 1997 Lucent Technologies Inc.  All rights reserved.
-# Revisions Copyright © 1998 Vita Nuova Limited.  All rights reserved.
-# Rewritten code Copyright © 2001 Vita Nuova Holdings Limited.  All rights reserved.
-#
-# To do:
-#	input from file
-#	calculate size
-
-include "sys.m";
-        sys: Sys;
-
-include "draw.m";
-        draw: Draw;
-	Rect, Point: import draw;
-
-include "tk.m";
-        tk: Tk;
-
-include "tkclient.m";
-        tkclient: Tkclient;
-
-include "arg.m";
-
-include "keyboard.m";
-
-Keybd: module
-{
-	init:	fn(nil: ref Draw->Context, nil: list of string);
-};
-
-FONT: con "/fonts/lucidasans/boldlatin1.6.font";
-SPECFONT: con "/fonts/lucidasans/unicode.6.font";
-
-# size in pixels
-#KEYSIZE: con 16;
-#KEYSIZE: con 13;
-#KEYSPACE: con 2;
-KEYSIZE: con 40;
-KEYHEIGHT: con 35;
-KEYSPACE: con 2;
-KEYBORDER: con 1;
-KEYGAP: con KEYSPACE - (2 * KEYBORDER);
-#ENDGAP: con 2 - KEYBORDER;
-ENDGAP: con 0;
-
-Key: adt {
-	name: string;
-	val:	int;
-	size:	int;
-	x:	list of int;
-	on:	int;
-};
-
-background: con "#dddddd";
-
-Backspace, Tab, Backslash, CapsLock, Return, Shift, Ctrl, Esc, Alt, Space: con iota;
-
-specials := array[] of {
-Backspace =>		Key("<-", '\b', 28, nil, 0),
-Tab =>			Key("Tab", '\t', 26, nil, 0),
-Backslash =>		Key("\\\\", '\\', KEYSIZE, nil, 0),
-CapsLock =>		Key("Caps", Keyboard->Caps, 40, nil, 0),
-Return =>			Key("Enter", '\n', 36, nil, 0),
-Shift =>			Key("Shift", Keyboard->LShift, 45, nil, 0),
-Esc =>			Key("Esc", 8r33, 21, nil, 0),
-Ctrl =>			Key("Ctrl", Keyboard->LCtrl, 36, nil, 0),
-Alt =>			Key("Alt", Keyboard->LAlt, 22, nil, 0),
-Space =>			Key(" ", ' ', 300, nil, 0),
-Space+1 =>		Key("Return", '\n', 36, nil, 0),
-};
-
-keys:= array[] of {
-	# unshifted
-	array[] of {
-		"Esc", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", "\\\\", "<-", nil,
-		"Tab", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", "`", nil,
-		"Ctrl", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "'", "Enter", nil,
-		"Shift", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "Shift", nil,
-		"Caps", "Alt", " ", "Alt", nil,
-	},
-
-	# shifted
-	array[] of {
-		"Esc", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", "|", "~", nil,
-		"Tab", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "\\{", "\\}", "<-", nil,
-		"Ctrl", "A", "S", "D", "F", "G", "H", "J", "K", "L", ":", "\"", "Return", nil,
-		"Shift", "Z", "X", "C", "V", "B", "N", "M", "<", ">", "?", "Shift", nil,
-		"Caps", "Alt", " ", "Alt", nil,
-	},
-};
-
-keyvals: array of array of int;
-noexit := 0;
-
-init(ctxt: ref Draw->Context, args: list of string)
-{
-	sys = load Sys Sys->PATH;
-	if (ctxt == nil) {
-		sys->fprint(sys->fildes(2), "keyboard: no window context\n");
-		raise "fail:bad context";
-	}
-	draw = load Draw Draw->PATH;
-	tk = load Tk Tk->PATH;
-	tkclient = load Tkclient Tkclient->PATH;
-	arg := load Arg Arg->PATH;
-
-	taskbar := 0;
-	winopts := Tkclient->Hide;
-	arg->init(args);
-	while ((opt := arg->opt()) != 0) {
-		case opt {
-		't' =>
-			taskbar = 1;
-		'e' =>
-			noexit = 1;
-			winopts = 0;
-		* =>
-			sys->fprint(sys->fildes(2), "usage: keyboard [-et]\n");
-			raise "fail:usage";
-		}
-	}
-
-	sys->pctl(Sys->NEWPGRP, nil);
-	tkclient->init();
-
-	keyvals = array[] of {
-		array[len keys[0]] of int,
-		array[len keys[1]] of int,
-	};
-	setindex(keys[0], keyvals[0], specials);
-	setindex(keys[1], keyvals[1], specials);
-
-
-	(t, wcmd) := tkclient->toplevel(ctxt, "", "Kbd", winopts);
-	cmd(t, ". configure -bd 0 -relief flat");
-
-	for(i := 0; i < len keys[0]; i++)
-		if(keys[0][i] != nil)
-			cmd(t, sys->sprint("button .b%d -takefocus 0 -font %s -width %d -height %d -bd %d -activebackground %s -text {%s} -command 'send keypress %d",
-				i, FONT, KEYSIZE, KEYHEIGHT, KEYBORDER, background, keys[0][i], keyvals[0][i]));
-
-	for(i = 0; i < len specials; i++) {
-		k := specials[i];
-		for(xl := k.x; xl != nil; xl = tl xl)
-			cmd(t, sys->sprint(".b%d configure -font %s -width %d", hd xl, SPECFONT, k.size));
-	}
-
-	# pack buttons in rows
-	i = 0;
-	for(j:=0; i < len keys[0]; j++){
-		rowf := sys->sprint(".f%d", j);
-		cmd(t, "frame "+rowf);
-		cmd(t, sys->sprint("frame .pad%d -height %d", j, KEYGAP));
-		if(ENDGAP){
-			cmd(t, rowf + ".pad -width " + string ENDGAP);
-			cmd(t, "pack " + rowf + ".pad -side left");
-		}
-		for(; keys[0][i] != nil; i++){
-			label := keys[0][i];
-			expand := label != "\\\\" && len label > 1;
-			cmd(t, "pack .b" + string i + " -in "+ rowf + " -side left -fill x -expand "+string expand);
-			if(keys[0][i+1] != nil && KEYGAP > 0){
-				padf := sys->sprint("%s.pad%d", rowf, i);
-				cmd(t, "frame " + padf + " -width " + string KEYGAP);
-				cmd(t, "pack " + padf + " -side left");
-			}
-		}
-		if(ENDGAP){
-			padf := sys->sprint("%s.pad%d", rowf, i);
-			cmd(t, "frame " + padf + " -width " + string ENDGAP);
-			cmd(t, "pack " + padf + " -side left");
-		}
-		i++;
-	}
-	nrow := j;
-
-	# pack rows in frame
-	for(j = 0; j < nrow; j++)
-		cmd(t, sys->sprint("pack .f%d .pad%d -fill x -in .", j, j));
-
-	(w, h) := (int cmd(t, ". cget -width"), int cmd(t, ". cget -height"));
-	r := t.screenr;
-	off := (r.dx()-w)/2;
-	cmd(t, sys->sprint(". configure -x %d -y %d", r.min.x+off, r.max.y-h));
-	tkclient->onscreen(t, nil);
-	tkclient->startinput(t, "ptr" :: nil);
-
-	spawn handle_keyclicks(t, wcmd, taskbar);
-}
-
-setindex(keys: array of string, keyvals: array of int, spec: array of Key)
-{
-	for(i := 0; i < len keys; i++){
-		if(keys[i] == nil)
-			continue;
-		val := keys[i][0];
-		if(len keys[i] > 1 && val == '\\')
-			val = keys[i][1];
-		for(j := 0; j < len spec; j++)
-			if(spec[j].name == keys[i]){
-				if(!inlist(i, spec[j].x))
-					spec[j].x = i :: spec[j].x;
-				val = spec[j].val;
-				break;
-			}
-		keyvals[i] = val;
-	}
-}
-
-inlist(i: int, l: list of int): int
-{
-	for(; l != nil; l = tl l)
-		if(hd l == i)
-			return 1;
-	return 0;
-}
-
-handle_keyclicks(t: ref Tk->Toplevel, wcmd: chan of string, taskbar: int)
-{
-	keypress := chan of string;
-	tk->namechan(t, keypress, "keypress");
-
-	if(taskbar)
-		tkclient->wmctl(t, "task");
-
-	cmd(t,"update");
-
-	collecting := 0;
-	collected := "";
-	for(;;)alt {
-	k := <-keypress =>
-		c := int k;
-		case c {
-		Keyboard->Caps =>
-			active(t, Ctrl, 0);
-			active(t, Shift, 0);
-			active(t, Alt, 0);
-			active(t, CapsLock, -1);
-			redraw(t);
-		Keyboard->LShift =>
-			active(t, Shift, -1);
-			redraw(t);
-		Keyboard->LCtrl =>
-			active(t, Alt, 0);
-			active(t, Ctrl, -1);
-			active(t, Shift, 0);
-			redraw(t);
-		Keyboard->LAlt =>
-			active(t, Alt, -1);
-			active(t, Ctrl, 0);
-			active(t, Shift, 0);
-			redraw(t);
-			if(specials[Alt].on){
-				collecting = 1;
-				collected = "";
-			}else
-				collecting = 0;
-		* =>
-			if(collecting){
-				collected[len collected] = c;
-				c = latin1(collected);
-				if(c < -1)
-					continue;
-				collecting = 0;
-				if(c == -1){
-					for(i := 0; i < len collected; i++)
-						sendkey(t, collected[i]);
-					continue;
-				}
-			}
-			show := specials[Ctrl].on | specials[Alt].on | specials[Shift].on;
-			if(specials[Ctrl].on)
-				c &= 16r1F;
-			active(t, Ctrl, 0);
-			active(t, Alt, 0);
-			active(t, Shift, 0);
-			if(show)
-				redraw(t);
-			sendkey(t, c);
-		}
-	m := <-t.ctxt.ptr =>
-		tk->pointer(t, *m);
-	s := <-t.ctxt.ctl or
-	s = <-t.wreq or
-	s = <-wcmd =>
-		if (s == "exit" && noexit)
-			s = "task";
-		tkclient->wmctl(t, s);
-	}
-}
-
-sendkey(t: ref Tk->Toplevel, c: int)
-{
-	sys->fprint(t.ctxt.connfd, "key %d", c);
-}
-
-active(t: ref Tk->Toplevel, keyno: int, on: int)
-{
-	key := specials[keyno:];
-	if(on < 0)
-		key[0].on ^= 1;
-	else
-		key[0].on = on;
-	for(xl := key[0].x; xl != nil; xl = tl xl){
-		col := background;
-		if(key[0].on)
-			col = "white";
-		cmd(t, ".b"+string hd xl+" configure -bg "+col+ " -activebackground "+col);
-	}
-}
-
-redraw(t: ref Tk->Toplevel)
-{
-	shifted := specials[Shift].on;
-	bank := keys[shifted];
-	vals := keyvals[shifted];
-	for(i:=0; i<len bank; i++) {
-		key := bank[i];
-		val := vals[i];
-		if(key != nil){
-			if(specials[CapsLock].on && len key == 1){
-				if(key[0]>='A' && key[0]<='Z')	# true if also shifted
-					key[0] += 'a'-'A';
-				else if(key[0] >= 'a' && key[0]<='z')
-					key[0] += 'A'-'a';
-				val = key[0];
-			}
-			cmd(t, ".b" + string i + " configure -text {" + key + "} -command 'send keypress " + string val);
-		}
-  	}
-	cmd(t, "update");
-}
-
-#
-# The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
-# prefix of latintab[j].ld only when j<i.
-#
-Cvlist: adt
-{
-	ld:	string;	# must be seen before using this conversion
-	si:	string;	#  options for last input characters
-	so:	string;	# the corresponding Rune for each si entry
-};
-latintab: array of Cvlist = array[] of {
-	(" ", " i",	"␣ı"),
-	("!~", "-=~",	"≄≇≉"),
-	("!", "!<=>?bmp",	"¡≮≠≯‽⊄∉⊅"),
-	("\"*", "IUiu",	"ΪΫϊϋ"),
-	("\"", "\"AEIOUYaeiouy",	"¨ÄËÏÖÜŸäëïöüÿ"),
-	("$*", "fhk",	"ϕϑϰ"),
-	("$", "BEFHILMRVaefglopv",	"ℬℰℱℋℐℒℳℛƲɑℯƒℊℓℴ℘ʋ"),
-	("\'\"", "Uu",	"Ǘǘ"),
-	("\'", "\'ACEILNORSUYZacegilnorsuyz",	"´ÁĆÉÍĹŃÓŔŚÚÝŹáćéģíĺńóŕśúýź"),
-	("*", "*ABCDEFGHIKLMNOPQRSTUWXYZabcdefghiklmnopqrstuwxyz",	"∗ΑΒΞΔΕΦΓΘΙΚΛΜΝΟΠΨΡΣΤΥΩΧΗΖαβξδεφγθικλμνοπψρστυωχηζ"),
-	("+", "-O",	"±⊕"),
-	(",", ",ACEGIKLNORSTUacegiklnorstu",	"¸ĄÇĘĢĮĶĻŅǪŖŞŢŲąçęģįķļņǫŗşţų"),
-	("-*", "l",	"ƛ"),
-	("-", "+-2:>DGHILOTZbdghiltuz~",	"∓­ƻ÷→ÐǤĦƗŁ⊖ŦƵƀðǥℏɨłŧʉƶ≂"),
-	(".", ".CEGILOZceglz",	"·ĊĖĠİĿ⊙Żċėġŀż"),
-	("/", "Oo",	"Øø"),
-	("1", "234568",	"½⅓¼⅕⅙⅛"),
-	("2", "-35",	"ƻ⅔⅖"),
-	("3", "458",	"¾⅗⅜"),
-	("4", "5",	"⅘"),
-	("5", "68",	"⅚⅝"),
-	("7", "8",	"⅞"),
-	(":", ")-=",	"☺÷≔"),
-	("<!", "=~",	"≨⋦"),
-	("<", "-<=>~",	"←«≤≶≲"),
-	("=", ":<=>OV",	"≕⋜≡⋝⊜⇒"),
-	(">!", "=~",	"≩⋧"),
-	(">", "<=>~",	"≷≥»≳"),
-	("?", "!?",	"‽¿"),
-	("@\'", "\'",	"ъ"),
-	("@@", "\'EKSTYZekstyz",	"ьЕКСТЫЗекстыз"),
-	("@C", "Hh",	"ЧЧ"),
-	("@E", "Hh",	"ЭЭ"),
-	("@K", "Hh",	"ХХ"),
-	("@S", "CHch",	"ЩШЩШ"),
-	("@T", "Ss",	"ЦЦ"),
-	("@Y", "AEOUaeou",	"ЯЕЁЮЯЕЁЮ"),
-	("@Z", "Hh",	"ЖЖ"),
-	("@c", "h",	"ч"),
-	("@e", "h",	"э"),
-	("@k", "h",	"х"),
-	("@s", "ch",	"щш"),
-	("@t", "s",	"ц"),
-	("@y", "aeou",	"яеёю"),
-	("@z", "h",	"ж"),
-	("@", "ABDFGIJLMNOPRUVXabdfgijlmnopruvx",	"АБДФГИЙЛМНОПРУВХабдфгийлмнопрувх"),
-	("A", "E",	"Æ"),
-	("C", "ACU",	"⋂ℂ⋃"),
-	("Dv", "Zz",	"DŽDž"),
-	("D", "-e",	"Ð∆"),
-	("G", "-",	"Ǥ"),
-	("H", "-H",	"Ħℍ"),
-	("I", "-J",	"ƗIJ"),
-	("L", "&-Jj|",	"⋀ŁLJLj⋁"),
-	("N", "JNj",	"NJℕNj"),
-	("O", "*+-./=EIcoprx",	"⊛⊕⊖⊙⊘⊜ŒƢ©⊚℗®⊗"),
-	("P", "P",	"ℙ"),
-	("Q", "Q",	"ℚ"),
-	("R", "R",	"ℝ"),
-	("S", "123S",	"¹²³§"),
-	("T", "-u",	"Ŧ⊨"),
-	("V", "=",	"⇐"),
-	("Y", "R",	"Ʀ"),
-	("Z", "-ACSZ",	"Ƶℤ"),
-	("^", "ACEGHIJOSUWYaceghijosuwy",	"ÂĈÊĜĤÎĴÔŜÛŴŶâĉêĝĥîĵôŝûŵŷ"),
-	("_\"", "AUau",	"ǞǕǟǖ"),
-	("_,", "Oo",	"Ǭǭ"),
-	("_.", "Aa",	"Ǡǡ"),
-	("_", "AEIOU_aeiou",	"ĀĒĪŌŪ¯āēīōū"),
-	("`\"", "Uu",	"Ǜǜ"),
-	("`", "AEIOUaeiou",	"ÀÈÌÒÙàèìòù"),
-	("a", "ben",	"↔æ∠"),
-	("b", "()+-0123456789=bknpqru",	"₍₎₊₋₀₁₂₃₄₅₆₇₈₉₌♝♚♞♟♛♜•"),
-	("c", "$Oagu",	"¢©∩≅∪"),
-	("dv", "z",	"dž"),
-	("d", "-adegz",	"ð↓‡°†ʣ"),
-	("e", "$lmns",	"€⋯—–∅"),
-	("f", "a",	"∀"),
-	("g", "$-r",	"¤ǥ∇"),
-	("h", "-v",	"ℏƕ"),
-	("i", "-bfjps",	"ɨ⊆∞ij⊇∫"),
-	("l", "\"$&\'-jz|",	"“£∧‘łlj⋄∨"),
-	("m", "iou",	"µ∈×"),
-	("n", "jo",	"nj¬"),
-	("o", "AOUaeiu",	"Å⊚Ůåœƣů"),
-	("p", "Odgrt",	"℗∂¶∏∝"),
-	("r", "\"\'O",	"”’®"),
-	("s", "()+-0123456789=abnoprstu",	"⁽⁾⁺⁻⁰ⁱ⁲⁳⁴⁵⁶⁷⁸⁹⁼ª⊂ⁿº⊃√ß∍∑"),
-	("t", "-efmsu",	"ŧ∃∴™ς⊢"),
-	("u", "-AEGIOUaegiou",	"ʉĂĔĞĬŎŬ↑ĕğĭŏŭ"),
-	("v\"", "Uu",	"Ǚǚ"),
-	("v", "ACDEGIKLNORSTUZacdegijklnorstuz",	"ǍČĎĚǦǏǨĽŇǑŘŠŤǓŽǎčďěǧǐǰǩľňǒřšťǔž"),
-	("w", "bknpqr",	"♗♔♘♙♕♖"),
-	("x", "O",	"⊗"),
-	("y", "$",	"¥"),
-	("z", "-",	"ƶ"),
-	("|", "Pp|",	"Þþ¦"),
-	("~!", "=",	"≆"),
-	("~", "-=AINOUainou~",	"≃≅ÃĨÑÕŨãĩñõũ≈"),
-};
-
-#
-# Given 5 characters k[0]..k[4], find the rune or return -1 for failure.
-#
-unicode(k: string): int
-{
-	c := 0;
-	for(i:=1; i<5; i++){
-		r := k[i];
-		c <<= 4;
-		if('0'<=r && r<='9')
-			c += r-'0';
-		else if('a'<=r && r<='f')
-			c += 10 + r-'a';
-		else if('A'<=r && r<='F')
-			c += 10 + r-'A';
-		else
-			return -1;
-	}
-	return c;
-}
-
-#
-# Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for
-# failure, or something < -1 if n is too small.  In the latter case, the result
-# is minus the required n.
-#
-latin1(k: string): int
-{
-	n := len k;
-	if(k[0] == 'X' || n>1 && k[0] == 'x' && k[1]!='O')	# 'x' to avoid having to Shift as well
-		if(n>=5)
-			return unicode(k);
-		else
-			return -5;
-	for(i := 0; i < len latintab; i++){
-		l := latintab[i];
-		if(k[0] == l.ld[0]){
-			if(n == 1)
-				return -2;
-			c := 0;
-			if(len l.ld == 1)
-				c = k[1];
-			else if(l.ld[1] != k[1])
-				continue;
-			else if(n == 2)
-				return -3;
-			else
-				c = k[2];
-			for(p:=0; p < len l.si; p++)
-				if(l.si[p] == c && p < len l.so)
-					return l.so[p];
-			return -1;
-		}
-	}
-	return -1;
-}
-
-cmd(top: ref Tk->Toplevel, c: string): string
-{
-	e := tk->cmd(top, c);
-	if (e != nil && e[0] == '!')
-		sys->fprint(sys->fildes(2), "keyboard: tk error on '%s': %s\n", c, e);
-	return e;
-}
 	unibrowse.dis\
 	view.dis\
 	vt.dis\
+	windowbar.dis\
 	wish.dis\
 	wm.dis\
 	wmplay.dis\

appl/wm/toolbar.b

 
 MAXCONSOLELINES:	con 1024;
 
-# execute this if no menu items have been created
-# by the init script.
-defaultscript :=
-	"{menu shell " +
-		"{{autoload=std; load $autoload; pctl newpgrp; wm/sh}&}}";
-
 tbtop: ref Tk->Toplevel;
 screenr: Rect;
+channel: ref Tk->Toplevel;
+context : ref Draw->Context;
+launched := 0;
+
+whichmenu := 0;
+# Name, command
+menu := array[] of {
+	array[] of { # folder 0 / default
+	"Files", "wm/ftree",
+	"Edit", "wm/edit",
+	"Charon", "charon",
+	"Manual", "wm/man",
+	"Shell", "wm/sh",
+	"Calendar", "wm/calendar",
+	"->System", "folder:1",
+	"->Misc", "folder:2",
+	"->Games", "folder:3"
+	}, array[] of { # folder 1
+	"Debugger", "wm/deb",
+	"Module manager", "wm/rt",
+	"Task manager", "wm/task",
+	"Memory monitor", "wm/memory",
+	"About", "wm/about"
+	}, array[] of { # folder2
+	"Clock", "wm/date",
+	"Colors", "wm/colors",
+	"Coffee", "wm/coffee",
+	"Polyhedra", "wm/polyhedra"
+	}, array[] of { # folder 3
+	"Tetris", "wm/tetris",
+	"Bounce", "wm/bounce"
+	}
+};
 
 badmodule(p: string)
 {
-	sys->fprint(stderr(), "toolbar: cannot load %s: %r\n", p);
+	sys->fprint(sys->fildes(2), "toolbar: cannot load %s: %r\n", p);
 	raise "fail:bad module";
 }
 
 
 	arg->init(argv);
 	arg->setusage("toolbar [-s] [-p]");
-	startmenu := 1;
 #	ownsnarf := (sys->open("/chan/snarf", Sys->ORDWR) == nil);
 	ownsnarf := sys->stat("/chan/snarf").t0 < 0;
 	while((c := arg->opt()) != 0){
 		case c {
 		's' =>
-			startmenu = 0;
+			;
 		'p' =>
 			ownsnarf = 1;
 		* =>
 	}
 
 	exec := chan of string;
-	task := chan of string;
+	launchchannel := chan of string;
 
-	tbtop = toolbar(ctxt, startmenu, exec, task);
+	tbtop = toolbar(ctxt, exec, nil);
 	tkclient->startinput(tbtop, "ptr" :: "control" :: nil);
-	layout(tbtop);
-
+	tkclient->onscreen(tbtop, "exact");
+	
 	shctxt := Context.new(ctxt);
 	shctxt.addmodule("wm", myselfbuiltin);
 
 	donesetup := 0;
 	spawn setup(shctxt, setupfinished);
 
+	cmd := chan of string;
+
 	snarf: array of byte;
 #	write("/prog/"+string sys->pctl(0, nil)+"/ctl", "restricted"); # for testing
 	for(;;) alt{
 		wmctl(tbtop, s);
 	s := <-exec =>
 		# guard against parallel access to the shctxt environment
-		if (donesetup){
-			{
- 				shctxt.run(ref Listnode(nil, s) :: nil, 0);
-			} exception {
-			"fail:*" =>	;
+		if (s != "launcher") {
+			sys->fprint(sys->fildes(2), "s = %s\n", s);
+			if (donesetup){
+				{
+ 					shctxt.run(ref Listnode(nil, s) :: nil, 0);
+				} exception {
+				"fail:*" =>	;
+				}
 			}
 		}
-	detask := <-task =>
-		deiconify(detask);
+		if (s == "launcher") {
+			launcher(tbtop, launchchannel, whichmenu);
+		}
+	cmd := <-launchchannel =>
+		launch(ctxt, cmd, tbtop, launchchannel);
 	(off, data, nil, wc) := <-snarfIO.write =>
 		if(wc == nil)
 			break;
 	args := str->unquoted(c);
 	if(args == nil)
 		return;
-	n := len args;
 
 	case hd args{
 	"request" =>
 		# request clientid args...
-		if(n < 3)
-			return;
-		args = tl args;
-		clientid := hd args;
-		args = tl args;
-		err := handlerequest(clientid, args);
-		if(err != nil)
-			sys->fprint(sys->fildes(2), "toolbar: bad wmctl request %#q: %s\n", c, err);
 	"newclient" =>
 		# newclient id
 		;
 	"delclient" =>
 		# delclient id
-		deiconify(hd tl args);
+		;
 	"rect" =>
 		tkclient->wmctl(top, c);
-		layout(top);
+		tkclient->onscreen(tbtop, "exact");
 	* =>
 		tkclient->wmctl(top, c);
 	}
 }
 
-handlerequest(clientid: string, args: list of string): string
-{
-	n := len args;
-	case hd args {
-	"task" =>
-		# task name
-		if(n != 2)
-			return "no task label given";
-		iconify(clientid, hd tl args);
-	"untask" or
-	"unhide" =>
-		deiconify(clientid);
-	* =>
-		return "unknown request";
-	}
-	return nil;
-}
-
-iconify(id, label: string)
-{
-	label = condenselabel(label);
-	e := tk->cmd(tbtop, "button .toolbar." +id+" -command {send task "+id+"} -takefocus 0");
-	cmd(tbtop, ".toolbar." +id+" configure -text '" + label);
-	if(e[0] != '!')
-		cmd(tbtop, "pack .toolbar."+id+" -side left -fill y");
-	cmd(tbtop, "update");
-}
-
-deiconify(id: string)
-{
-	e := tk->cmd(tbtop, "destroy .toolbar."+id);
-	if(e == nil){
-		tkclient->wmctl(tbtop, sys->sprint("ctl %q untask", id));
-		tkclient->wmctl(tbtop, sys->sprint("ctl %q kbdfocus 1", id));
-	}
-	cmd(tbtop, "update");
-}
-
-layout(top: ref Tk->Toplevel)
-{
-	r := top.screenr;
-	h := 32;
-	if(r.dy() < 480)
-		h = tk->rect(top, ".b", Tk->Border|Tk->Required).dy();
-	cmd(top, ". configure -x " + string r.min.x +
-			" -y " + string (r.max.y - h) +
-			" -width " + string r.dx() +
-			" -height " + string h);
-	cmd(top, "update");
-	tkclient->onscreen(tbtop, "exact");
-}
-
-toolbar(ctxt: ref Draw->Context, startmenu: int,
-		exec, task: chan of string): ref Tk->Toplevel
+toolbar(ctxt: ref Draw->Context, exec, task: chan of string): ref Tk->Toplevel
 {
 	(tbtop, nil) = tkclient->toplevel(ctxt, nil, nil, Tkclient->Plain);
 	screenr = tbtop.screenr;
 
-	cmd(tbtop, "button .b -text {XXX}");
-	cmd(tbtop, "pack propagate . 0");
+	tk->namechan(tbtop, exec, "exec");
 
-	tk->namechan(tbtop, exec, "exec");
-	tk->namechan(tbtop, task, "task");
 	cmd(tbtop, "frame .toolbar");
-	if (startmenu) {
-		cmd(tbtop, "menubutton .toolbar.start -menu .m -borderwidth 0 -bitmap vitasmall.bit");
-		cmd(tbtop, "pack .toolbar.start -side left");
+	cmd(tbtop, "button .toolbar.start -borderwidth 0 -bitmap vitasmall.bit -width " + string screenr.dx() + " -height 64 -command {send exec launcher}");
+	cmd(tbtop, "pack .toolbar.start -side left -in .toolbar");
+	cmd(tbtop, "pack .toolbar -fill x -in .");
+
+	return tbtop;
+}
+
+launcher(tbtop:ref Tk->Toplevel, launchchannel: chan of string, whichmenu: int)
+{
+	if(launched == 1) {
+		cmd(tbtop, "destroy .launcher");
+		launched = 0;
+		cmd(tbtop, ".toolbar configure -borderwidth 0");
+		cmd(tbtop, "update");
+		return;
 	}
-	cmd(tbtop, "pack .toolbar -fill x");
-	cmd(tbtop, "menu .m");
-	return tbtop;
+
+	tk->namechan(tbtop, launchchannel, "channel");
+
+	cmd(tbtop, ".toolbar.start configure -borderwidth 1");
+
+	cmd(tbtop, "frame .launcher");
+	for(i := 0; i * 4 < len menu[whichmenu]; i++) {
+		j := (i * 4);
+		cmd(tbtop, sys->sprint("frame .launcher.line%d", i));
+		if (j + 2 == len menu[whichmenu]) {
+			cmd(tbtop, sys->sprint("button .launcher.line%d.b1 -borderwidth 1 -text %s -height 64 -width %d -command {send channel %s}", i, menu[whichmenu][j], screenr.dx(), menu[whichmenu][j + 1]));
+			cmd(tbtop, sys->sprint("pack .launcher.line%d.b1 -side left -in .launcher.line%d", i, i));
+		} else {
+			cmd(tbtop, sys->sprint("button .launcher.line%d.b1 -borderwidth 1 -text %s -height 64 -width %d -command {send channel %s}", i, menu[whichmenu][j], (screenr.dx() / 2), menu[whichmenu][j + 1]));
+			cmd(tbtop, sys->sprint("button .launcher.line%d.b2 -borderwidth 1 -text %s -height 64 -width %d -command {send channel %s}", i, menu[whichmenu][j + 2], (screenr.dx() / 2), menu[whichmenu][j + 3]));
+			cmd(tbtop, sys->sprint("pack .launcher.line%d.b1 .launcher.line%d.b2 -side left -in .launcher.line%d", i, i, i));
+		}
+		cmd(tbtop, sys->sprint("pack .launcher.line%d -fill x -in .launcher", i));
+	}
+	cmd(tbtop, "pack .launcher -fill x -in .");
+	cmd(tbtop, "update");
+
+	launched = 1;
+}
+
+launch(ctxt: ref Draw->Context, appl: string, tbtop: ref Tk->Toplevel, launchchannel: chan of string)
+{
+	if (len appl == 8 && appl[:7] == "folder:") {
+		whichmenu = int sys->sprint("%c", appl[7]);
+		launcher(tbtop, launchchannel, whichmenu);
+		launcher(tbtop, launchchannel, whichmenu);
+		whichmenu = 0;
+		return;
+	}
+	sh := load Sh Sh->PATH;
+	argv := appl :: nil;
+	sh->run(ctxt, "{$*&}" :: argv);
+
+	launcher(tbtop, launchchannel, whichmenu);
 }
 
 setup(shctxt: ref Context, finished: chan of int)
 {
 	ctxt := shctxt.copy(0);
 	ctxt.run(shell->stringlist2list("run"::"/lib/wmsetup"::nil), 0);
-	# if no items in menu, then create some.
-	if (tk->cmd(tbtop, ".m type 0")[0] == '!')
-		ctxt.run(shell->stringlist2list(defaultscript::nil), 0);
 	cmd(tbtop, "update");
 	finished <-= 1;
 }
 		sys->fprint(sys->fildes(2), "wm: cannot load wm as a builtin\n");
 		raise "fail:usage";
 	}
-	ctxt.addbuiltin("menu", myselfbuiltin);
-	ctxt.addbuiltin("delmenu", myselfbuiltin);
 	ctxt.addbuiltin("error", myselfbuiltin);
 	return nil;
 }
 runbuiltin(c: ref Context, sh: Sh,
 			cmd: list of ref Listnode, nil: int): string
 {
-	case (hd cmd).word {
-	"menu" =>	return builtin_menu(c, sh, cmd);
-	"delmenu" =>	return builtin_delmenu(c, sh, cmd);
-	}
 	return nil;
 }
 
 	return nil;
 }
 
-stderr(): ref Sys->FD
-{
-	return sys->fildes(2);
-}
-
-word(ln: ref Listnode): string
-{
-	if (ln.word != nil)
-		return ln.word;
-	if (ln.cmd != nil)
-		return shell->cmd2string(ln.cmd);
-	return nil;
-}
-
-menupath(title: string): string
-{
-	mpath := ".m."+title;
-	for(j := 0; j < len mpath; j++)
-		if(mpath[j] == ' ')
-			mpath[j] = '_';
-	return mpath;
-}
-
-builtin_menu(nil: ref Context, nil: Sh, argv: list of ref Listnode): string
-{
-	n := len argv;
-	if (n < 3 || n > 4) {
-		sys->fprint(stderr(), "usage: menu topmenu [ secondmenu ] command\n");
-		raise "fail:usage";
-	}
-	primary := (hd tl argv).word;
-	argv = tl tl argv;
-
-	if (n == 3) {
-		w := word(hd argv);
-		if (len w == 0)
-			cmd(tbtop, ".m insert 0 separator");
-		else
-			cmd(tbtop, ".m insert 0 command -label " + tk->quote(primary) +
-				" -command {send exec " + w + "}");
-	} else {
-		secondary := (hd argv).word;
-		argv = tl argv;
-
-		mpath := menupath(primary);
-		e := tk->cmd(tbtop, mpath+" cget -width");
-		if(e[0] == '!') {
-			cmd(tbtop, "menu "+mpath);
-			cmd(tbtop, ".m insert 0 cascade -label "+tk->quote(primary)+" -menu "+mpath);
-		}
-		w := word(hd argv);
-		if (len w == 0)
-			cmd(tbtop, mpath + " insert 0 separator");
-		else
-			cmd(tbtop, mpath+" insert 0 command -label "+tk->quote(secondary)+
-				" -command {send exec "+w+"}");
-	}
-	return nil;
-}
-
-builtin_delmenu(nil: ref Context, nil: Sh, nil: list of ref Listnode): string
-{
-	delmenu(".m");
-	cmd(tbtop, "menu .m");
-	return nil;
-}
-
-delmenu(m: string)
-{
-	for (i := int cmd(tbtop, m + " index end"); i >= 0; i--)
-		if (cmd(tbtop, m + " type " + string i) == "cascade")
-			delmenu(cmd(tbtop, m + " entrycget " + string i + " -menu"));
-	cmd(tbtop, "destroy " + m);
-}
-
 getself(): Shellbuiltin
 {
 	return myselfbuiltin;
 {
 	s := tk->cmd(top, c);
 	if (s != nil && s[0] == '!')
-		sys->fprint(stderr(), "tk error on %#q: %s\n", c, s);
+		sys->fprint(sys->fildes(2), "tk error on %#q: %s\n", c, s);
 	return s;
 }
 
 	raise "fail:error";
 }
 
-bufferproc(in, out: chan of string)
-{
-	h, t: list of string;
-	dummyout := chan of string;
-	for(;;){
-		outc := dummyout;
-		s: string;
-		if(h != nil || t != nil){
-			outc = out;
-			if(h == nil)
-				for(; t != nil; t = tl t)
-					h = hd t :: h;
-			s = hd h;
-		}
-		alt{
-		x := <-in =>
-			t = x :: t;
-		outc <-= s =>
-			h = tl h;
-		}
-	}
-}
-
 con_cfg := array[] of
 {
 	"frame .cons",

appl/wm/toolbar.sbl

-limbo .sbl 2.1
-Toolbar
-8
-toolbar.b
-sys.m
-draw.m
-tk.m
-tkclient.m
-sh.m
-string.m
-arg.m
-1241
-45.13,21 0
-13,21 0
-13,21 0
-13,21 0
-1,58 0
-1,58 0
-1,58 1
-23,54 0
-56,57 0
-1,58 0
-1,58 0
-46.1,24 2
-51.1,26 3
-52.1,28 4
-53.4,15 5
-54.2,23 6
-12,22 6
-2,23 6
-55.1,24 7
-56.4,13 8
-57.2,21 9
-12,20 9
-2,21 9
-59.1,31 10
-60.4,14 11
-61.2,25 12
-12,24 12
-2,25 12
-63.1,40 13
-64.4,19 14
-65.2,27 15
-12,26 15
-2,27 15
-66.1,17 16
-1,17 16
-68.1,25 17
-69.5,17 18
-70.2,21 19
-12,20 19
-2,21 19
-71.1,26 20
-72.5,15 21
-73.2,22 22
-12,21 22
-2,22 22
-75.1,42 23
-76.5,25 24
-77.2,34 25
-12,33 25
-2,34 25
-79.1,41 26
-11,35 26
-37,40 26
-1,41 26
-1,41 26
-81.1,37 27
-11,15 27
-17,24 27
-26,36 27
-1,37 27
-1,37 27
-82.1,39 28
-11,15 28
-17,24 28
-26,38 28
-1,39 28
-1,39 28
-84.1,16 29
-11,15 29
-1,16 29
-85.1,35 30
-15,34 30
-1,35 30
-86.1,15 31
-88.13,37 32
-23,36 32
-13,37 32
-13,37 32
-13,44 32
-1,44 32
-1,44 32
-1,44 32
-89.7,24 33
-7,24 33
-7,24 33
-7,24 33
-7,29 33
-90.7,8 34
-7,8 34
-7,8 34
-7,8 34
-92.3,16 35
-3,16 34
-94.3,15 36
-3,15 34
-96.3,15 37
-3,15 37
-3,15 34
-99.1,19 38
-1,19 38
-1,19 38
-100.1,10 39
-102.5,16 40
-103.14,28 41
-26,27 41
-14,28 41
-14,28 41
-2,75 41
-2,75 41
-2,75 42
-30,74 41
-2,75 41
-2,75 41
-104.2,20 43
-107.1,23 44
-108.1,23 45
-110.1,45 46
-17,21 46
-23,32 46
-34,38 46
-40,44 46
-1,45 46
-1,45 46
-111.1,55 47
-22,27 47
-51,54 47
-38,54 47
-29,54 47
-29,54 47
-29,54 48
-1,55 47
-112.1,14 49
-8,13 49
-1,14 49
-114.1,28 50
-23,27 50
-1,28 50
-1,28 50
-115.1,38 51
-1,7 51
-18,22 51
-24,37 51
-1,38 51
-118.4,12 52
-119.2,44 53
-27,34 53
-36,43 53
-2,44 53
-2,44 53
-120.5,19 54
-121.9,51 55
-21,50 55
-9,51 55
-9,51 55
-3,52 55
-3,52 55
-3,52 56
-3,52 55
-3,52 57
-123.2,112 58
-28,63 58
-65,111 58
-2,112 58
-2,112 59
-124.1,23 60
-125.1,30 61
-19,23 61
-25,29 61
-1,30 61
-126.5,20 62
-5,20 62
-5,27 62
-5,27 63
-127.2,12 64
-8,11 64
-2,12 64
-129.1,29 65
-130.1,15 66
-131.1,35 67
-13,19 67
-21,34 67
-1,35 67
-136.8,18 68
-8,22 68
-8,22 69
-8,22 68
-138.8,18 68
-8,22 68
-8,22 70
-8,22 68
-140.8,18 68
-8,22 68
-8,22 71
-8,22 68
-141.7,17 68
-7,17 68
-143.8,12 68
-8,12 68
-152.13,17 68
-13,17 68
-154.27,40 68
-27,40 68
-168.29,41 68
-29,41 68
-179.15,28 68
-15,28 68
-135.9,15 68
-9,15 68
-9,15 68
-9,15 68
-137.2,24 72
-15,20 72
-22,23 72
-2,24 72
-2,24 68
-139.2,24 73
-14,19 73
-21,23 73
-2,24 73
-2,24 74
-2,24 68
-2,24 68
-142.2,17 75
-8,13 75
-15,16 75
-2,17 75
-2,17 76
-2,17 68
-145.6,15 77
-147.5,47 78
-5,11 78
-16,36 78
-29,32 78
-34,35 78
-40,43 78
-16,43 78
-16,43 78
-16,43 79
-16,43 80
-45,46 78
-5,47 78
-5,47 78
-5,47 81
-5,47 82
-149.3,11 83
-3,11 84
-3,11 68
-153.2,19 85
-12,18 85
-2,19 85
-2,19 86
-2,19 68
-154.2,5 68
-7,11 68
-18,20 68
-18,20 87
-18,20 88
-155.5,14 89
-5,14 90
-5,14 91
-156.3,8 92
-157.6,14 93
-158.3,15 94
-3,15 95
-160.24,33 96
-13,21 96
-7,21 96
-7,33 96
-161.26,34 97
-20,34 97
-4,43 97
-162.4,22 98
-163.4,18 99
-4,18 100
-165.3,21 101
-167.10,18 102
-20,22 102
-2,23 102
-2,23 103
-2,23 104
-2,23 105
-2,23 68
-168.2,5 68
-7,13 68
-20,22 68
-20,22 106
-169.5,14 107
-5,14 108
-170.3,8 109
-171.13,22 110
-6,22 110
-172.11,14 111
-16,18 111
-3,19 111
-3,19 112
-3,19 113
-3,19 114
-173.3,8 115
-175.2,19 116
-176.10,19 117
-6,19 117
-177.3,16 118
-178.10,15 119
-10,22 119
-24,26 119
-2,27 119
-2,27 120
-2,27 121
-2,27 122
-2,27 68
-2,27 68
-186.1,25 123
-23,24 123
-1,25 123
-1,25 123
-187.4,15 124
-188.2,8 125
-189.1,14 126
-191.6,13 127
-6,13 127
-194.5,10 128
-195.3,9 129
-196.2,16 130
-197.2,21 131
-198.2,16 132
-199.2,38 133
-23,31 133
-33,37 133
-2,38 133
-2,38 133
-200.5,15 134
-201.15,29 135
-27,28 135
-15,29 135
-15,29 135
-3,78 135
-3,78 135
-3,78 136
-31,69 135
-71,72 135
-74,77 135
-3,78 135
-3,78 135
-3,78 137
-3,78 138
-214.0,1 139
-0,1 139
-207.2,23 140
-15,22 140
-12,22 140
-12,22 141
-2,23 140
-214.0,1 139
-209.2,25 142
-18,21 142
-23,24 142
-2,25 142
-2,25 142
-2,25 143
-210.2,13 144
-9,12 144
-2,13 144
-214.0,1 139
-212.2,25 145
-18,21 145
-23,24 145
-2,25 145
-2,25 145
-2,25 146
-214.0,1 139
-218.1,14 147
-219.6,13 148
-6,13 148
-222.5,11 149
-223.10,31 150
-3,31 150
-224.2,31 151
-10,18 151
-23,30 151
-20,30 151
-20,30 152
-2,31 151
-2,31 148
-227.2,21 153
-12,20 153
-2,21 153
-2,21 148
-229.9,26 154
-2,26 154
-231.8,11 155
-1,11 155
-236.1,29 156
-23,28 156
-1,29 156
-1,29 156
-237.1,88 157
-14,19 157
-21,43 157
-21,67 157
-21,70 157
-21,87 157
-21,87 158
-1,88 157
-1,88 157
-238.1,57 159
-5,10 159
-12,27 159
-12,48 159
-12,56 159
-12,56 160
-1,57 159
-1,57 159
-1,57 161
-239.4,8 162
-4,15 162
-240.2,55 163
-6,11 163
-13,32 163
-13,54 163
-13,54 164
-2,55 163
-2,55 163
-2,55 165
-241.1,21 166
-5,10 166
-12,20 166
-1,21 166
-1,21 166
-1,21 167
-242.0,1 168
-246.1,44 169
-14,19 169
-21,43 169
-1,44 169
-1,44 169
-247.4,12 170
-248.25,57 171
-37,52 171
-54,56 171
-25,57 171
-25,57 171
-2,58 171
-18,23 171
-18,23 171
-18,23 172
-2,58 171
-2,58 171
-2,58 173
-249.25,61 174
-37,56 174
-58,60 174
-25,61 174
-25,61 174
-2,62 174
-18,23 174
-18,23 174
-18,23 175
-2,62 174
-2,62 174
-2,62 176
-251.1,21 177
-5,10 177
-12,20 177
-1,21 177
-1,21 177
-1,21 178
-252.0,1 179
-256.1,17 180
-257.1,8 181
-258.4,10 182
-4,5 182
-4,10 182
-4,10 182
-4,16 182
-259.6,50 183
-15,18 183
-20,24 183
-26,49 183
-6,50 183
-6,50 183
-2,55 183
-2,55 183
-2,55 183
-2,55 183
-260.30,44 184
-10,44 184
-10,261.9 184
-19,32 184
-12,32 184
-260.10,261.32 184
-260.10,261.32 185
-260.10,262.13 184
-23,29 184
-23,24 184
-23,29 184
-23,29 184
-16,29 184
-260.10,262.29 184
-260.10,262.29 186
-260.10,263.14 184
-17,25 184
-260.10,263.25 184
-260.10,263.25 187
-260.1,263.26 184
-260.5,8 184
-5,8 184
-5,8 188
-1,263.26 184
-260.1,263.26 184
-260.1,263.26 189
-264.1,19 190
-5,8 190
-10,18 190
-1,19 190
-1,19 190
-1,19 191
-265.1,35 192
-20,25 192
-27,34 192
-1,35 192
-266.0,1 193
-271.16,67 194
-35,39 194
-41,44 194
-46,49 194
-51,66 194
-16,67 194
-16,67 194
-2,7 194
-2,7 195
-2,7 196
-272.1,24 197
-274.1,36 198
-5,10 198
-12,35 198
-1,36 198
-1,36 198
-1,36 199
-275.1,33 200
-5,10 200
-12,32 200
-1,33 200
-1,33 200
-1,33 201
-277.1,34 202
-14,19 202
-21,25 202
-27,33 202
-1,34 202
-1,34 202
-1,34 203
-278.1,34 204
-14,19 204
-21,25 204
-27,33 204
-1,34 204
-1,34 204
-1,34 205
-279.1,29 206
-5,10 206
-12,28 206
-1,29 206
-1,29 206
-1,29 207
-280.5,14 208
-281.2,87 209
-6,11 209
-13,86 209
-2,87 209
-2,87 209
-2,87 210
-282.2,46 211
-6,11 211
-13,45 211
-2,46 211
-2,46 211
-2,46 212
-284.1,36 213
-5,10 213
-12,35 213
-1,36 213
-1,36 213
-1,36 214
-285.1,22 215
-5,10 215
-12,21 215
-1,22 215
-1,22 215
-1,22 216
-286.8,13 217
-1,13 217
-291.1,23 218
-9,15 218
-21,22 218
-1,23 218
-1,23 218
-292.10,60 219
-56,59 219
-40,59 219
-33,59 219
-33,59 219
-33,59 220
-10,60 219
-10,60 219
-1,64 219
-1,5 219
-1,5 219
-1,5 221
-62,63 219
-1,64 219
-1,64 219
-1,64 222
-294.5,32 223
-13,18 223
-20,31 223
-5,32 223
-5,32 223
-5,35 223
-5,35 224
-5,42 223
-295.11,53 225
-49,52 225
-34,52 225
-34,52 225
-34,52 226
-11,53 225
-11,53 225
-2,57 225
-2,6 225
-2,6 225
-2,6 227
-55,56 225
-2,57 225
-2,57 225
-2,57 228
-296.1,21 229
-5,10 229
-12,20 229
-1,21 229
-1,21 229
-1,21 230
-297.1,15 231
-298.0,1 232
-302.4,13 233
-4,18 233
-303.2,11 234
-304.2,8 235
-305.8,17 236
-8,22 236
-26,31 236
-306.10,15 237
-10,21 237
-10,26 237
-3,26 237
-3,26 238
-307.3,21 239
-3,21 239
-308.7,13 240
-19,28 241
-15,28 241
-309.7,15 242
-7,22 242
-310.5,10 243
-308.30,33 244
-30,33 244
-311.3,20 245
-3,20 245
-312.3,6 246
-3,6 246
-314.2,21 247
-2,21 248
-316.8,13 249
-1,13 249
-321.5,17 250
-322.2,26 251
-323.14,28 252
-26,27 252
-14,28 252
-14,28 252
-2,66 252
-2,66 252
-2,66 253
-30,65 252
-2,66 252
-2,66 252
-324.2,20 254
-326.1,39 255
-1,5 255
-17,23 255
-25,38 255
-1,39 255
-327.1,42 256
-1,5 256
-17,26 256
-28,41 256
-1,42 256
-328.1,40 257
-1,5 257
-17,24 257
-26,39 257
-1,40 257
-329.8,11 258
-1,11 258
-334.8,11 259
-1,11 259
-340.6,14 260
-6,19 260
-341.18,42 261
-31,32 261
-34,36 261
-38,41 261
-18,42 261
-18,42 261
-11,42 261
-342.21,48 262
-37,38 262
-40,42 262
-44,47 262
-21,48 262
-21,48 262
-14,48 262
-344.8,11 263
-1,11 263
-350.8,11 264
-1,11 264
-360.5,19 265
-361.9,16 266
-2,16 266
-362.5,18 267
-363.9,34 268
-27,33 268
-9,34 268
-9,34 268
-2,34 268
-364.8,11 269
-1,11 269
-369.1,21 270
-370.5,11 271
-17,26 272
-13,26 272
-371.5,13 273
-5,20 273
-372.3,17 274
-370.28,31 275
-28,31 275
-373.8,13 276
-1,13 276
-378.1,14 277
-379.5,10 278
-14,19 278
-380.14,22 279
-14,22 279
-14,22 279
-14,22 279
-2,71 279
-2,71 279
-2,71 280
-24,70 279
-2,71 279
-2,71 279
-381.2,20 281
-383.16,23 282
-12,24 282
-1,29 282
-1,29 283
-384.11,18 284
-1,18 284
-1,18 285
-386.5,11 286
-387.2,20 287
-12,19 287
-2,20 287
-2,20 287
-388.6,11 288
-6,16 288
-389.3,38 289
-7,12 289
-14,37 289
-3,38 289
-3,38 289
-3,38 290
-3,38 291
-391.46,64 292
-56,63 292
-46,64 292
-46,64 292
-14,64 292
-14,392.27 292
-391.14,392.31 292
-391.14,392.37 292
-391.3,392.38 292
-391.7,12 292
-7,12 292
-7,12 293
-3,392.38 292
-391.3,392.38 292
-391.3,392.38 294
-391.3,392.38 295
-391.3,392.38 296
-394.15,24 297
-2,29 297
-2,29 298
-395.2,16 299
-397.2,28 300
-20,27 300
-2,28 300
-2,28 300
-398.2,43 301
-15,20 301
-22,42 301
-2,43 301
-2,43 301
-399.5,9 302
-5,16 302
-400.3,28 303
-7,12 303
-14,27 303
-3,28 303
-3,28 303
-3,28 304
-401.44,62 305
-54,61 305
-44,62 305
-44,62 305
-14,62 305
-14,72 305
-14,78 305
-3,79 305
-7,12 305
-7,12 305
-7,12 306
-3,79 305
-3,79 305
-3,79 307
-403.2,20 308
-12,19 308
-2,20 308
-2,20 308
-404.6,11 309
-6,16 309
-405.3,44 310
-7,12 310
-14,43 310
-3,44 310
-3,44 310
-3,44 311
-3,44 312
-407.48,68 313
-58,67 313
-48,68 313
-48,68 313
-14,47 313
-14,68 313
-14,68 314
-14,408.27 313
-407.14,408.29 313
-407.14,408.33 313
-407.3,408.34 313
-407.7,12 313
-7,12 313
-7,12 315
-3,408.34 313
-407.3,408.34 313
-407.3,408.34 316
-407.3,408.34 317
-407.3,408.34 318
-407.3,408.34 319
-407.3,408.34 320
-410.8,11 321
-1,11 321
-415.1,14 322
-9,13 322
-1,14 322
-416.1,22 323
-5,10 323
-12,21 323
-1,22 323
-1,22 323
-1,22 324
-417.8,11 325
-1,11 325
-422.15,43 326
-19,24 326
-26,42 326
-15,43 326
-15,43 326
-6,43 326
-6,43 327
-45,51 328
-423.6,41 329
-10,15 329
-17,29 329
-32,40 329
-17,40 329
-17,40 330
-17,40 331
-6,41 329
-6,41 329
-6,54 329
-6,54 332
-424.11,62 333
-15,20 333
-22,39 333
-42,50 333
-22,50 333
-22,50 334
-22,61 333
-22,61 335
-11,62 333
-11,62 333
-3,63 333
-3,63 333
-3,63 336
-3,63 333
-422.53,56 337
-53,56 337
-425.1,27 338
-5,10 338
-12,26 338
-1,27 338
-1,27 338
-1,27 339
-426.0,1 340
-430.8,21 341
-1,21 341
-435.1,21 342
-14,17 342
-19,20 342
-1,21 342
-1,21 342
-436.5,13 343
-17,21 343
-17,28 343
-437.14,22 344
-14,22 344
-14,22 344
-14,22 344
-2,54 344
-2,54 344
-2,54 345
-24,47 344
-49,50 344
-52,53 344
-2,54 344
-2,54 344
-438.8,9 346
-1,9 346
-443.1,57 347
-26,36 347
-17,36 347
-17,43 347
-17,43 348
-45,56 347
-1,57 347
-1,57 347
-444.4,13 349
-17,44 349
-29,31 349
-33,37 349
-39,43 349
-17,44 349
-17,44 349
-17,48 349
-445.9,11 350
-2,11 350
-446.8,9 351
-1,9 351
-451.13,27 352
-25,26 352
-13,27 352
-13,27 352
-1,43 352
-1,43 352
-1,43 353
-29,39 352
-41,42 352
-1,43 352
-1,43 352
-452.6,23 354
-16,17 354
-19,22 354
-6,23 354
-6,23 354
-1,35 354
-1,35 354
-25,34 354
-1,35 354
-1,35 354
-453.1,19 355
-496.1,48 356
-28,35 356
-37,47 356
-1,48 356
-1,48 356
-497.4,19 357
-498.11,56 358
-23,55 358
-11,56 358
-11,56 358
-2,56 358
-2,56 359
-499.2,8 360
-501.1,48 361
-28,35 361
-37,47 361
-1,48 361
-1,48 361
-502.4,19 362
-503.11,56 363
-23,55 363
-11,56 363
-11,56 363
-2,56 363
-2,56 364
-504.2,8 365
-507.1,13 366
-509.20,71 367
-39,43 367
-45,47 367
-49,54 367
-56,70 367
-20,71 367
-20,71 367
-510.5,11 368
-17,28 369
-13,28 369
-511.2,22 370
-6,9 370
-11,21 370
-11,21 370
-2,22 370
-2,22 370