#!/bin/rc rfork . acme.rc mainpid=$pid nl=' ' imfs=/n/irc/freenode ipipe=/n/ircpipe bind '#|' $ipipe fn ircwin { datafd='' winid=$1 shift echo -n scroll > /mnt/acme/$winid/ctl echo -n NoScroll Join > /mnt/acme/$winid/tag if(~ $1 main){ winname irc {cat $imfs/event | winwrite data}& } if(~ $1 sub){ datafd=$3/data winname $2 dpipe=/n/dpipe spipe=/n/spipe bind '#|' $dpipe bind '#|' $spipe { awk '{print "IRC", $0; fflush}' < $datafd >$dpipe/data & # (FIX: this proc does not get killed ^) awk ' /^IRC/{ if(lock != 1) { printf("length: %s in '^$winid^'\n", length($0)) > "/fd/2"; sub("^IRC", ""); print $0; fflush; } else { printf("locked\n") > "/fd/2"; } } /^hold/{ lock = 1; printf("ok\n") > "'^$spipe/data^'"; close("'^$spipe/data^'"); } /^unhold/{ lock = 0; fflush; } ' < $dpipe/data1 > /mnt/acme/$winid/data <[5]/mnt/acme/$winid/addr }& } catpid=$apid wineventloop echo DEBUG killing: $apid echo kill > /proc/$catpid/notepg } fn event { switch($1$2){ case KI # keyboard: char insterted in body if(! ~ $datafd '' && ~ $9 $nl){ pos=`{cat /mnt/acme/$winid/addr} p1=$pos(1) if(test $3 -gt $p1){ {echo hold > $dpipe/data; read}<$spipe/data1 echo -n 'dot=addr' >/mnt/acme/$winid/ctl echo -n '.,' > /mnt/acme/$winid/addr pos=`{cat /mnt/acme/$winid/addr} p1=$pos(1) line = `{cat /mnt/acme/$winid/data} echo -n '#'$p1,'#'$pos(2) > /mnt/acme/$winid/addr echo -n '' > /mnt/acme/$winid/data echo unhold > $dpipe/data echo -n $line > $datafd } if not echo -n '$' > /mnt/acme/$winid/addr } case Mx # button 2 in tag args=`{echo $9} # turn string into list if(~ $args(1) Join) echo join ''^$args(2-)^'' > $imfs/ctl # (TODO: auto-open window on new join) if(~ $9 Reconn && ~ $winid $topwin) echo -n reconnect > $imfs/0/ctl if(~ $9 NoScroll) echo -n noscroll > /mnt/acme/$winid/ctl if(~ $9 Scroll) echo -n scroll > /mnt/acme/$winid/ctl if(~ $9 Del){ if(~ $winid $topwin) echo Del > $ipipe/data if not{ echo -n 'Del '^$winid > $ipipe/data winwriteevent $* } } if(! ~ $9 Del && ! ~ $9 Reconn && ! ~ $9 NoScroll && ! ~ $9 Scroll && ! ~ $args(1) Join) winwriteevent $* case ML # button 3 in body args=`{echo $9} echo Open $args > $ipipe/data # (TODO: handle new user?) found=`{read $ipipe/data} if(~ $found none) winwriteevent $* } } #TODO fn mainproc { while() { m=`{read $ipipe/data1} switch($m(1)) { case Open for(j in $m(2-)) # O(n^2) but data is small for(i in $imfs/[0-9]*){ n=`{cat $i/name} if(~ $n $j){ match=1 show=`{awk ' $6 == "irc/'$n'"{ print $1 } ' /mnt/acme/index} if(! ~ $show ''){ echo show > /mnt/acme/$show/ctl show='' } if not{ newwindow winds=($winid $winds) ircwin $winid sub irc/$n $i & } } } if(~ $match '0') echo none > $ipipe/data1 if(~ $match '1') echo -n '' > $ipipe/data1 match=0 case Del if(~ $m(2) ''){ for(i in $winds) echo delete > /mnt/acme/$i/ctl echo DEBUG exiting... exit } if not winds=`{echo $winds | sed 's/( |^)'^$m(2)^'( |$)/ /g'} } #dostuff } } # startup: create main # window newwindow winds=($winid) topwin=$winid ircwin $winid main & # begin the main proc mainproc exit