ref: 908cf58516331f7334225ecbc81e8eb2c0fa0c04
parent: 68f7c9be66955e2a113f29af61de4542b6c0a9d1
author: Romi Hervier <r@sansfontieres.com>
date: Thu Dec 21 14:25:47 EST 2023
start (not so) fresh
--- /dev/null
+++ b/README.md
@@ -1,0 +1,4 @@
+# 9front-config
+
+My 9front configs, scripts, and patches. Run `mk` to get started and
+reboot. Third party tools can be fetched with the fetch script.
--- /dev/null
+++ b/bin/acme/Move
@@ -1,0 +1,33 @@
+#!/bin/rc
+rfork n
+if(! ~ `{pwd} /mail/fs/*){
+ echo Must run in mail directory >[1=2]
+ exit 'bad dir'
+}
+# -- tgt...IMAP mail box name
+tgt=$*
+if(~ $#tgt 0){
+ echo No target folder specified >[1=2]
+ exit usage
+}
+# -- src...extract upas mail box name from tag
+# 's/^\/([^ ]+).*$/\1/' … get path excl. initial '/'
+# 's/\/$//' … drop final '/'
+# 's/[^\/]+\///g' … drop everything before last '/'
+# '1q' … stop processing after 1 line
+src=`{sed 's/^\/([^ ]+).*$/\1/
+s/\/$//
+s/[^\/]+\///g
+1q' /mnt/acme/$winid/tag}
+if(! ~ $#src 1){
+ echo Could not determine source folder >[1=2]
+ exit usage
+}
+# -- msgs...extract message numbers from selection in window
+msgs=`{ssam 'x/.*\n/ s/^([0-9]*).*\n/\1 /' /mnt/acme/$winid/rdsel}
+if(~ $#msgs 0){
+ echo No messages selected >[1=2]
+ exit usage
+}
+# -- move $msgs from $src to $tgt
+echo move $src $msgs $tgt > /mail/fs/ctl
--- /dev/null
+++ b/bin/acmenail
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+ptrap edit '.*' +action '^shodata' +filename '^/mail'
+acme -f $sans -F $monospace -l /tmp/acme.dump
--- /dev/null
+++ b/bin/cclock
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+window 0,732,182,1080 games/catclock -c
--- /dev/null
+++ b/bin/clear
@@ -1,0 +1,10 @@
+#!/bin/rc
+# clears all the output from programs,
+# leaving only the command prompts
+
+grep `{echo -n '^'^$prompt(1)} </dev/text | \
+ grep -v '^'^$prompt(1)^'(clear|"")' | \
+ uniq >/tmp/clearing.$pid
+
+cp /tmp/clearing.$pid /dev/text
+rm -f /tmp/clearing.$pid
--- /dev/null
+++ b/bin/facesstart
@@ -1,0 +1,6 @@
+#!/bin/rc
+
+m=/mail/fs
+window 0,404,182,736 faces -c -m $m/Inbox -m $m/9 \
+ -m $m/OpenBSD -m $m/Miscs-Lists -m $m/sr.ht-discuss \
+ -m $m/Feed -m $m/Lobsters
--- /dev/null
+++ b/bin/fml
@@ -1,0 +1,13 @@
+#!/bin/rc
+# Create the mail header that contains the from field
+# A lazy way to handle aliases on Fastmail
+
+header=/mail/box/$user/headers
+switch($1) {
+case r # My day-to-day email address ;)
+ echo 'From: romi <romi@grtsk.net>' > $header
+case rh # My dev email address :^)
+ echo 'From: Romi Hervier <r@sansfontieres.com>' > $header
+case *
+ echo No.
+}
--- /dev/null
+++ b/bin/git/cia
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+git/commit -e $*
--- /dev/null
+++ b/bin/git/st
@@ -1,0 +1,5 @@
+#!/bin/rc -e
+
+gitroot=`{git/conf -r}
+cd $gitroot && git/fs
+git/walk -f M -f A -f R $*
--- /dev/null
+++ b/bin/grid
@@ -1,0 +1,32 @@
+#!/bin/rc
+
+srv tcp!registry.9p.zone!6675 registry /n/registry
+srv -c tcp!9p.zone!9991 9p.zone.disk /n/disk
+
+fn clean {
+ echo $1 | sed 's/.*!([^!]+)!.*/\1/'
+}
+
+for(s in /n/registry/tcp*){
+ s=`{basename $s}
+ srv $s `{clean $s} /n/^`{clean $s}
+}
+
+>/tmp/chatcat cat <<'...'
+#!/bin/rc
+chan=$1
+label $chan
+cat /n/chat.9p.zone/$chan &
+while() cat | sed '1s/^/'$nick' → /' >>/n/chat.9p.zone/$chan
+...
+chmod +x /tmp/chatcat
+
+>/tmp/gridrio cat <<'...'
+#!/bin/rc
+window -scroll -r 0 0 9999 9999 /tmp/chatcat chat
+...
+chmod +x /tmp/gridrio
+
+nick=$user
+
+exec rio -s -i /tmp/gridrio
--- /dev/null
+++ b/bin/hombre
@@ -1,0 +1,12 @@
+#!/bin/rc
+ppi=157
+
+if(~ $#* 0){
+ echo 'Usage: hombre x manpage'
+ exit
+}
+if(~ $#* 2)
+ d=$1' '$2
+if not
+ d=$1
+window 'man -t '$d' | page -p '$ppi' -R'
--- /dev/null
+++ b/bin/md
@@ -1,0 +1,21 @@
+#!/bin/rc
+ppi=157
+
+if(test -e /bin/netsurf)
+ browser=netsurf
+if not
+ browser='mothra -a'
+
+if(! test -e /bin/markdown){
+ echo 'You need discount (see 9front’s extras)'
+ exit
+}
+
+if(~ $#* 0){
+ echo 'Usage: md [file]'
+ exit
+}
+d=$1
+f=`{basename $d}
+c='<meta charset="utf-8" />' # netsurf needs this
+window -r 50 50 800 800 -cd `{pwd} 'ramfs;echo '''$c''' > /tmp/'$f'.html; markdown -f 1.0 '$d' >> /tmp/'$f'.html; '$browser' file:///tmp/'$f'.html'
--- /dev/null
+++ b/bin/mush
@@ -1,0 +1,14 @@
+#!/bin/rc
+# rcpu to my servers.
+rfork e
+
+dest=$1.$domain
+
+if(~ $#* 0){
+ echo Usage: mush server [commands…]
+ exit
+}
+if not if (~ $#2 0)
+ rcpu -h $dest
+if not if (~ $#2 1)
+ rcpu -h $dest -u -c $2
--- /dev/null
+++ b/bin/nailstart
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+window 182,0,1920,1080 acmenail
--- /dev/null
+++ b/bin/pdf
@@ -1,0 +1,16 @@
+#!/bin/rc
+ppi=157
+
+if(~ $#* 0){
+ echo 'Usage: pdf [file] [page]'
+ exit
+}
+
+d=$1
+
+if(~ $#2 1){
+ p=$2
+ window -cd `{pwd} page -R -p $ppi -j $d!$p $d
+}
+if not
+ window -cd `{pwd} page -R -p $ppi $d
--- /dev/null
+++ b/bin/riostart
@@ -1,0 +1,6 @@
+#!/bin/rc
+
+window -hide -scroll cat /dev/kprint
+window -scroll
+~ $console 0 || window -scroll -hide console
+window theme
--- /dev/null
+++ b/bin/rircx
@@ -1,0 +1,5 @@
+#!/bin/rc
+rfork
+rimport asinru.sansfontieres.com /srv
+rimport asinru.sansfontieres.com /tmp
+ircx -s libera $*
--- /dev/null
+++ b/bin/roi
@@ -1,0 +1,7 @@
+#!/bin/rc
+
+facesstart
+statsstart
+nailstart
+cclock
+window riow
--- /dev/null
+++ b/bin/s
@@ -1,0 +1,7 @@
+#!/bin/rc
+# My base sam config.
+rfork
+font=$monospace
+
+bind /bin/aux/samterm.$sysname /bin/aux/samterm
+sam -a $*
--- /dev/null
+++ b/bin/sd
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+sam -d $*
--- /dev/null
+++ b/bin/solo
@@ -1,0 +1,6 @@
+#!/bin/rc
+# Sam but you can’t plumb it.
+rfork n
+
+unmount /mnt/plumb
+s $*
--- /dev/null
+++ b/bin/sp
@@ -1,0 +1,8 @@
+#!/bin/rc
+# Sam but it spawns a ptrapped window for the current and child
+# directories.
+
+
+pth=`{pwd}
+
+window -cd $pth 'ptrap edit ''^'$pth/'''; s'
--- /dev/null
+++ b/bin/statsstart
@@ -1,0 +1,5 @@
+#!/bin/rc
+font=$monospace
+opts=-l8zmfe
+window 0,0,182,204 stats $opts $sysname
+window 0,200,182,408 stats $opts beep.$domain
--- /dev/null
+++ b/bin/theme
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+cat $home/lib/themes/rio/$sysname > /mnt/wsys/theme
+grep softscreen /dev/vgactl >> /dev/vgactl
--- /dev/null
+++ b/bin/todostart
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+facesgreet='※ Buffered Tasks'
+window 0,306,400,408 faces -c -im /mail/fs/Later
--- /dev/null
+++ b/bin/topwin
@@ -1,0 +1,3 @@
+#!/bin/rc
+
+window 400,0,1920,265 $*
--- /dev/null
+++ b/bin/zuke
@@ -1,0 +1,5 @@
+#!/bin/rc
+theme=$zuketheme
+font=$sansserif
+
+audio/mkplist /n/music | audio/zuke -c aAt
--- /dev/null
+++ b/cfg/beep/cpustart
@@ -1,0 +1,4 @@
+#!/bin/rc
+
+auth/secstored
+auth/secstore -n -G factotum >> /mnt/factotum/ctl
--- /dev/null
+++ b/cfg/toothless/termrc
@@ -1,0 +1,6 @@
+#!/bin/rc
+
+TIMESYNCARGS=(-n pool.ntp.org)
+
+aux/acpi
+ip/ipconfig loopback /dev/null 127.0.0.1
--- /dev/null
+++ b/fetch
@@ -1,0 +1,22 @@
+#!/bin/rc
+
+mkdir -p $home/src
+cd $home/src
+repositories=(\
+gits://shithub.us/ori/Nail \
+gits://shithub.us/kvik/clone \
+gits://shithub.us/sigrid/riow \
+gits://shithub.us/sigrid/bar \
+gits://shithub.us/sigrid/femtolisp \
+https://github.com/netsurf-plan9/nsport)
+
+for(i in $repositories) {
+ switch($1) {
+ case update
+ cd `{basename $i}; git/pull; cd ..;
+ case clone
+ git/clone $i
+ case *
+ echo what; exit
+ }
+}
--- /dev/null
+++ b/git/config
@@ -1,0 +1,3 @@
+[user]
+ name = Romi Hervier
+ email = r@sansfontieres.com
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,42 @@
+</$objtype/mkfile
+
+all = $home/lib/profile $home/lib/plumbing $home/lib/git $home/lib/bin /cfg/$sysname $home/lib/themes $objtype/bin/prompt
+
+all:V: $all
+
+clean:V:
+ rm -rf $all
+
+$home/lib/profile: profile
+ cp $prereq $target
+
+$home/lib/plumbing: plumbing
+ cp $prereq $target
+
+$home/lib/git: git
+ rm -rf $target
+ clone $prereq $target
+
+$home/lib/themes: themes
+ rm -rf $target
+ clone $prereq $target
+
+$home/lib/bin: bin
+ rm -f $target/*
+ rm -f $target/git/*
+ rm -f $target/acme/*
+ mkdir -p $target/git
+ mkdir -p $target/acme
+ cp $prereq/git/* $target/git/
+ cp $prereq/acme/* $target/acme/
+ cp $prereq/* $target
+
+/cfg/$sysname: cfg/$sysname
+ rm -rf $target
+ clone $prereq $target
+
+/$objtype/bin/prompt: prompt.$O
+ $LD -o $target $prereq
+
+%.$O: %.c
+ $CC $CFLAGS src/$stem.c
--- /dev/null
+++ b/patches/catclock.diff
@@ -1,0 +1,12 @@
+diff 845f8d12e4e417aaafaa6e62a80bf03856e7d906 uncommitted
+--- a/sys/src/games/catclock.c
++++ b/sys/src/games/catclock.c
+@@ -225,7 +225,7 @@
+ if(xredraw || tm.min!=otm.min || tm.hour!=otm.hour){
+ if(xredraw){
+ draw(screen, screen->r, display->white, nil, ZP);
+- border(screen, screen->r, 4, display->black, ZP);
++ // border(screen, screen->r, 4, display->black, ZP);
+ replclipr(screen, 0, insetrect(screen->r, 4));
+ //bitblt(&screen, screen.r.min, &screen, screen.r, Zero);
+ //border(&screen, screen.r, 4, F);
--- /dev/null
+++ b/patches/faces_lazy.diff
@@ -1,0 +1,74 @@
+diff 845f8d12e4e417aaafaa6e62a80bf03856e7d906 uncommitted
+--- a/sys/src/cmd/faces/main.c
++++ b/sys/src/cmd/faces/main.c
+@@ -73,7 +73,7 @@
+ ulong now;
+
+ Point datep = { 8, 6 };
+-Point facep = { 8, 6+0+4 }; /* 0 updated to datefont->height in init() */
++Point facep = { 8, 6 }; /* 0 updated to datefont->height in init() */
+ Point enddate; /* where date ends on display; used to place arrows */
+ Rectangle leftr; /* location of left arrow on display */
+ Rectangle rightr; /* location of right arrow on display */
+@@ -98,7 +98,7 @@
+ initplumb();
+
+ /* make background color */
+- bgrnd = allocimagemix(display, DPalebluegreen, DWhite);
++ bgrnd = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E3FAFF);
+ blue = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x008888FF); /* blue-green */
+ left = allocimage(display, leftright, GREY1, 0, DWhite);
+ right = allocimage(display, leftright, GREY1, 0, DWhite);
+@@ -119,9 +119,9 @@
+ mediumfont = font;
+ datefont = font;
+
+- facep.y += datefont->height;
++ facep.y += 0;
+ if(datefont->height & 1) /* stipple parity */
+- facep.y++;
++ facep.y += 0;
+ faces = nil;
+ }
+
+@@ -351,7 +351,7 @@
+ free(ofaces);
+ nfaces++;
+ setlast();
+- drawarrows();
++ /* drawarrows(); */
+ faces[0] = f;
+ drawface(f, 0);
+ flushimage(display, 1);
+@@ -430,7 +430,7 @@
+ memmove(faces+j, faces+j+1, (nfaces-(j+1))*sizeof(Face*));
+ nfaces--;
+ setlast();
+- drawarrows();
++ /* drawarrows(); */
+ }
+
+ void
+@@ -493,7 +493,7 @@
+ drawtime();
+ for(i=0; i<nfaces; i++)
+ drawface(faces[i], i);
+- drawarrows();
++ /* drawarrows(); */
+ flushimage(display, 1);
+ }
+
+@@ -712,11 +712,11 @@
+ init();
+ unlockdisplay(display); /* initdraw leaves it locked */
+ display->locking = 1; /* tell library we're using the display lock */
+- setdate();
++ /* setdate(); */
+ eresized(0);
+
+ pids[Mainp] = getpid();
+- startproc(timeproc, Timep);
++ /* startproc(timeproc, Timep); */
+ startproc(mouseproc, Mousep);
+ if(initload)
+ for(i = 0; i < nmaildirs; i++)
--- /dev/null
+++ b/patches/samterm.beep.diff
@@ -1,0 +1,96 @@
+diff -r 175f3e344edd sys/src/cmd/samterm/flayer.c
+--- a/sys/src/cmd/samterm/flayer.c Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/flayer.c Sat Feb 20 13:42:52 2021 +0100
+@@ -29,18 +29,22 @@
+ lDrect = r;
+
+ /* Main text is yellowish */
+- maincols[BACK] = allocimagemix(display, DPaleyellow, DWhite);
+- maincols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DDarkyellow);
+- maincols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, DYellowgreen);
+- maincols[TEXT] = display->black;
+- maincols[HTEXT] = display->black;
++ maincols[BACK] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF);
++ maincols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xCD664DFF);
++ maincols[BORD] = allocimage(display, Rect(0,0,2,2), CMAP8, 1, 0x8795BFFF);
++ draw(maincols[BORD], Rect(1,1,2,2), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF), nil, ZP);
++ draw(maincols[BORD], Rect(0,0,1,1), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF), nil, ZP);
++ maincols[TEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x4F5165FF);
++ maincols[HTEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF);
+
+ /* Command text is blueish */
+- cmdcols[BACK] = allocimagemix(display, DPalebluegreen, DWhite);
+- cmdcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPalegreygreen);
+- cmdcols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, DPurpleblue);
+- cmdcols[TEXT] = display->black;
+- cmdcols[HTEXT] = display->black;
++ cmdcols[BACK] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x4F5165FF);
++ cmdcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF);
++ cmdcols[BORD] = allocimage(display, Rect(0,0,2,2), CMAP8, 1, 0x8795BFFF);
++ draw(cmdcols[BORD], Rect(1,1,2,2), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF), nil, ZP);
++ draw(cmdcols[BORD], Rect(0,0,1,1), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF), nil, ZP);
++ cmdcols[TEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E8E8FF);
++ cmdcols[HTEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xCD664DFF);
+ }
+
+ void
+diff -r 175f3e344edd sys/src/cmd/samterm/menu.c
+--- a/sys/src/cmd/samterm/menu.c Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/menu.c Sat Feb 20 13:42:52 2021 +0100
+@@ -45,21 +45,21 @@
+ };
+
+ char *menu2str[] = {
+- "cut",
+- "paste",
+- "snarf",
+- "plumb",
+- "look",
++ "Cut",
++ "Paste",
++ "Snarf",
++ "Plumb",
++ "Look",
+ "<rio>",
+ 0, /* storage for last pattern */
+ };
+
+ char *menu3str[] = {
+- "new",
+- "zerox",
+- "resize",
+- "close",
+- "write",
++ "New",
++ "Zerox",
++ "Resize",
++ "Close",
++ "Write",
+ };
+
+ Menu menu2 = {0, genmenu2};
+diff -r 175f3e344edd sys/src/cmd/samterm/mkfile
+--- a/sys/src/cmd/samterm/mkfile Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/mkfile Sat Feb 20 13:42:52 2021 +0100
+@@ -1,6 +1,6 @@
+ </$objtype/mkfile
+
+-TARG=samterm
++TARG=samterm.$sysname
+ OFILES=main.$O\
+ icons.$O\
+ menu.$O\
+diff -r 175f3e344edd sys/src/cmd/samterm/scroll.c
+--- a/sys/src/cmd/samterm/scroll.c Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/scroll.c Sat Feb 20 13:42:52 2021 +0100
+@@ -93,8 +93,9 @@
+ if(!eqrect(r2, l->lastsr)){
+ l->lastsr = r2;
+ draw(b, r1, l->f.cols[BORD], nil, ZP);
+- draw(b, r2, l->f.cols[BACK], nil, r2.min);
++ draw(b, r2, allocimage(display, Rect(0,0,2,2), screen->chan, 1, 0x8795BFFF), nil, r2.min);
+ r2 = r1;
++ r2.max.x = r2.max.x+1;
+ r2.min.x = r2.max.x-1;
+ draw(b, r2, l->f.cols[BORD], nil, ZP);
+ if(b!=l->f.b)
--- /dev/null
+++ b/patches/samterm.toothless.diff
@@ -1,0 +1,96 @@
+diff -r 175f3e344edd sys/src/cmd/samterm/flayer.c
+--- a/sys/src/cmd/samterm/flayer.c Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/flayer.c Sat Feb 20 13:42:52 2021 +0100
+@@ -29,18 +29,22 @@
+ lDrect = r;
+
+ /* Main text is yellowish */
+- maincols[BACK] = allocimagemix(display, DPaleyellow, DWhite);
+- maincols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DDarkyellow);
+- maincols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, DYellowgreen);
+- maincols[TEXT] = display->black;
+- maincols[HTEXT] = display->black;
++ maincols[BACK] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xFFFFFFFF);
++ maincols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E3FAFF);
++ maincols[BORD] = allocimage(display, Rect(0,0,2,2), CMAP8, 1, 0x858585FF);
++ draw(maincols[BORD], Rect(1,1,2,2), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xFFFFFFFF), nil, ZP);
++ draw(maincols[BORD], Rect(0,0,1,1), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xFFFFFFFF), nil, ZP);
++ maincols[TEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x222222FF);
++ maincols[HTEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x222222FF);
+
+ /* Command text is blueish */
+- cmdcols[BACK] = allocimagemix(display, DPalebluegreen, DWhite);
+- cmdcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPalegreygreen);
+- cmdcols[BORD] = allocimage(display, Rect(0,0,2,2), screen->chan, 1, DPurpleblue);
+- cmdcols[TEXT] = display->black;
+- cmdcols[HTEXT] = display->black;
++ cmdcols[BACK] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xEEEEEEFF);
++ cmdcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xE2E3FAFF);
++ cmdcols[BORD] = allocimage(display, Rect(0,0,2,2), CMAP8, 1, 0x858585FF);
++ draw(cmdcols[BORD], Rect(1,1,2,2), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xEEEEEEFF), nil, ZP);
++ draw(cmdcols[BORD], Rect(0,0,1,1), allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xEEEEEEFF), nil, ZP);
++ cmdcols[TEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x222222FF);
++ cmdcols[HTEXT] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x222222FF);
+ }
+
+ void
+diff -r 175f3e344edd sys/src/cmd/samterm/menu.c
+--- a/sys/src/cmd/samterm/menu.c Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/menu.c Sat Feb 20 13:42:52 2021 +0100
+@@ -45,21 +45,21 @@
+ };
+
+ char *menu2str[] = {
+- "cut",
+- "paste",
+- "snarf",
+- "plumb",
+- "look",
++ "Cut",
++ "Paste",
++ "Snarf",
++ "Plumb",
++ "Look",
+ "<rio>",
+ 0, /* storage for last pattern */
+ };
+
+ char *menu3str[] = {
+- "new",
+- "zerox",
+- "resize",
+- "close",
+- "write",
++ "New",
++ "Zerox",
++ "Resize",
++ "Close",
++ "Write",
+ };
+
+ Menu menu2 = {0, genmenu2};
+diff -r 175f3e344edd sys/src/cmd/samterm/mkfile
+--- a/sys/src/cmd/samterm/mkfile Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/mkfile Sat Feb 20 13:42:52 2021 +0100
+@@ -1,6 +1,6 @@
+ </$objtype/mkfile
+
+-TARG=samterm
++TARG=samterm.$sysname
+ OFILES=main.$O\
+ icons.$O\
+ menu.$O\
+diff -r 175f3e344edd sys/src/cmd/samterm/scroll.c
+--- a/sys/src/cmd/samterm/scroll.c Sat Feb 20 12:55:42 2021 +0100
++++ b/sys/src/cmd/samterm/scroll.c Sat Feb 20 13:42:52 2021 +0100
+@@ -93,8 +93,9 @@
+ if(!eqrect(r2, l->lastsr)){
+ l->lastsr = r2;
+ draw(b, r1, l->f.cols[BORD], nil, ZP);
+- draw(b, r2, l->f.cols[BACK], nil, r2.min);
++ draw(b, r2, allocimage(display, Rect(0,0,2,2), screen->chan, 1, 0xEEEEEEFF), nil, r2.min);
+ r2 = r1;
++ r2.max.x = r2.max.x+1;
+ r2.min.x = r2.max.x-1;
+ draw(b, r2, l->f.cols[BORD], nil, ZP);
+ if(b!=l->f.b)
--- /dev/null
+++ b/plumbing
@@ -1,0 +1,17 @@
+# to update: cp $home/lib/plumbing /mnt/plumb/rules
+
+editor = sam
+browser = netsurf
+
+# Thanks Sigrid
+type is text
+data matches 'https://(www.)?youtube[^ ]+'
+plumb start window yt ''''$0''''
+
+# Thanks Sirjofri
+type is text
+data matches '9fs://([^ /]+)/([^ ]+/)([^ ]*)'
+plumb start window 9fs $1 && cd /n/$1/$2 && ls -l $3 && rc -i
+
+include basic
+
--- /dev/null
+++ b/profile
@@ -1,0 +1,95 @@
+bind -qa $home/bin/rc /bin
+bind -qa $home/bin/$cputype /bin
+bind -qa $home/lib/bin /bin
+bind -qa $home/lib/bin/git /bin/git
+bind -qa $home/lib/bin/acme /acme/bin
+
+fontlib=$home/lib/font/bit
+fontsize=14
+monospace=$fontlib/pragmata/pragmata.$fontsize.font
+fontsize=16
+sans=$fontlib/inter/inter.$fontsize.font
+font=$sans
+tabstop=2
+
+domain=grtsk.com
+
+mailserver=fastmail.com
+mailuser=telecom@sansfontieres.com
+maildirs=(Inbox Archive Sent 9 Feed Lobsters Miscs-Lists OpenBSD sr.ht-discuss Todo)
+
+fn open_mailboxes {
+ upas/fs -f /imaps/imap.$mailserver/$mailuser
+ for(i in $maildirs){
+ echo open /imaps/imap.$mailserver/$mailuser/$i $i > /mail/fs/ctl &
+ }
+}
+
+fn load_factotum{
+ ipso -l || load_factotum
+}
+
+fn setup_secstore{ # see /cfg/$sysname/termrc
+ secstore=tcp!127.0.0.1!5356
+ auth/secstored -s $secstore
+ load_factotum
+}
+
+fn wifi{
+ grep node '#l1'/ether1/ifstats
+ echo -n 'essid='
+ essid=`{read}
+ bind -a '#l1' /net
+ aux/wpa -s $essid -p /net/ether1
+ ip/ipconfig ether /net/ether1
+}
+
+switch($service){
+case terminal
+ webcookies
+ webfs
+ setup_secstore
+ wifi
+ plumber
+ open_mailboxes
+ echo -n accelerated > '#m/mousectl'
+ echo -n 'res 3' > '#m/mousectl'
+ prompt=('; ' ' ')
+ fn term%{ $* }
+ rio -si riostart
+case cpu
+ bind /mnt/term/dev/cons /dev/cons
+ bind -q /mnt/term/dev/consctl /dev/consctl
+ >[2] /dev/null {
+ cp /dev/sysname /mnt/term/dev/label
+ if(wsys=`{cat /mnt/term/env/wsys} && ~ $#wsys 1) {
+ wsys=/mnt/term^$wsys
+ }
+ if not {
+ wsys=()
+ }
+ }
+ bind -a /mnt/term/dev /dev
+ prompt=(''$sysname'; ' ' ')
+ fn cpu%{ $* }
+ if(! test -e /mnt/term/dev/wsys){
+ # call from drawterm
+ if(test -e /mnt/term/dev/secstore){
+ auth/factotum -n
+ read -m /mnt/term/dev/secstore >/mnt/factotum/ctl
+ echo >/mnt/term/dev/secstore
+ }
+ if not
+ auth/factotum
+ webcookies
+ webfs
+ plumber
+ rio
+ }
+case con
+ prompt=('cpu% ' ' ')
+}
+
+# Some aliases
+fn vis{s $*}
+fn sma{s $*}
--- /dev/null
+++ b/themes/rio/beep
@@ -1,0 +1,20 @@
+rioback dddddd
+back e2e8e8
+high abb7ba
+border abb7ba
+text 4f5165
+htext e2e8e8
+title 8795bf
+ltitle 4f5165
+hold cd664d
+lhold d49b82
+palehold d49b82
+paletext 75878f
+size cd664d
+menubar 846d21
+menuback e2e8e8
+menuhigh cd664d
+menubord cd664d
+menutext 4f5165
+menuhtext e2e8e8
+
--- /dev/null
+++ b/themes/rio/toothless
@@ -1,0 +1,20 @@
+rioback eeeeee
+back ffffff
+high e2e3fa
+border 858585
+text 222222
+htext 222222
+title 858585
+ltitle cccccc
+hold 0063db
+lhold a4adee
+palehold a4adee
+paletext 858585
+size d11100
+menubar 846d21
+menuback ffffff
+menuhigh ffffff
+menubord db6600
+menutext 222222
+menuhtext db6600
+