ref: 7ab986f91583e5a07f3e9b6c7f528b047e9f707d
dir: /riow/
#!/bin/rc rfork ne # these are shown on every desktop sticky=('cat clock' clock desktop kbmap stats winwatch) alt=0 ctl=0 shift=0 curdesktop=1 fn scrsize { s=`{syscall -o read 0 buf 60 </dev/screen >[2]/dev/null} screenw=$s(4) screenh=$s(5) } fn winread { syscall -o read 0 buf 120 <$1/wctl >[2]/dev/null } fn winlabel { cat $1/label } fn curwindow { for(f in /dev/wsys/*){ a=`{winread $f} if(~ $a(5) current) basename $f } } fn togglefullscreen { winid=`{curwindow} if(! ~ $#winid 0){ f=/dev/wsys/^$winid a=`{winread $f} scrsize if(~ $a(1) 0 && ~ $a(2) 0 && ~ $a(3) $screenw && ~ $a(4) $screenh){ if(test -f /env/winsize_^$winid) echo resize -r `{cat /env/winsize_^$winid} >$f/wctl } if not { echo -n $a(1 2 3 4) >/env/winsize_^$winid echo resize -r 0 0 9999 9999 >$f/wctl } } } fn desktop { # find and remember the current window if(~ $shift 0){ winid=`{curwindow} if(! ~ $#winid 0) echo -n $winid >/env/windeskcur_^$curdesktop if not rm -f /env/windeskcur_^$curdesktop } hide=() for(f in /dev/wsys/*){ winid=`{basename $f} if(! ~ `{winlabel $f} $sticky && ! test -f /env/winsticky_^$winid){ a=`{winread $f} if(~ $shift 1){ # moving the current window elsewhere if(~ $a(5) current){ echo -n $1 >/env/windesk_^$winid hide=($hide $f/wctl) } } if not { # go through all visible windows if(~ $a(6) visible){ # assign to the current one echo -n $curdesktop >/env/windesk_^$winid # it was visible, make sure riow doesn't think otherwise later on rm -f /env/winhidden_^$winid # and hide later hide=($hide $f/wctl) } if not { # hidden windesk=`{test -f /env/windesk_^$winid && cat /env/windesk_^$winid} if(~ $windesk $1){ # unhide if should be shown now # unless it's supposed to stay hidden, of course if(! test -f /env/winhidden_^$winid) echo unhide >$f/wctl } # and remember it was hidden on the desktop we're still on if(~ $windesk $curdesktop && ! test -f /env/winhidden_^$winid) touch /env/winhidden_^$winid } } } } if(~ $shift 0){ if(test -f /env/windeskcur_^$1){ winid=`{cat /env/windeskcur_^$1} if(test -d /dev/wsys/^$winid && test -f /env/windesk_^$winid && ~ `{cat /env/windesk_^$winid} $1) echo current >/dev/wsys/^$winid^/wctl } curdesktop=$1 } for(w in $hide) echo hide >$w } fn togglesticky { winid=`{curwindow} if(! ~ $#winid 0){ if(test -f /env/winsticky_^$winid) rm -f /env/winsticky_^$winid if not touch /env/winsticky_^$winid } } fn handle { # K is key down # k is key up # c is key (and repeat) with the shift applied key='' # depending on the shift state (1 → !) ukey='' # stays the same regardless of the shift state m=$1 state=0 if(~ $1 k) state=1 shift if(~ $m K && ~ $#* 0){ alt=0 ctl=0 shift=0 } if not while(! ~ $#* 0){ if(~ $1 alt || ~ $1 ctl || ~ $1 shift) eval '$1=$state' if not { if(~ $m c) key=$1 if(~ $m k) ukey=$1 } shift } if(~ $ctl 0 && ~ $alt 0){ if(~ $shift 0){ if(~ $key enter) window if(~ $key f) togglefullscreen if(~ $key s) togglesticky } if(~ $ukey [0-9] && ! ~ $ukey $curdesktop) desktop $ukey } } scrsize fn work { echo ' '^$curdesktop while(s=`{read}){ handle $s echo ' '^$curdesktop } } gkbd | work | aux/statusmsg -k -w `{echo $screenw-100|bc}^,`{echo $screenh-60|bc}^,$screenw^,$screenh desktop