mirror of https://github.com/0intro/wmii
182 lines
3.1 KiB
Plaintext
Executable File
182 lines
3.1 KiB
Plaintext
Executable File
|
|
# For the time being, this file follows the lisp bracing
|
|
# convention. i.e.:
|
|
# if(frob this) {
|
|
# frob that
|
|
# if(frob theother) {
|
|
# unfrob this
|
|
# unfrob that}}
|
|
|
|
wmiiscript=$1
|
|
wmiikeys=()
|
|
|
|
wi_newline='
|
|
'
|
|
|
|
echo Start $wmiiscript | wmiir write /event >[2]/dev/null \
|
|
|| exit write
|
|
|
|
if(~ $scriptname '')
|
|
scriptname=$wmiiscript
|
|
|
|
# Blech.
|
|
if(! test -x $PLAN9/bin/read)
|
|
fn read { sh -c 'read -r x || exit 1; echo $x' }
|
|
|
|
fn wi_atexit {}
|
|
fn sigexit {
|
|
wi_atexit
|
|
}
|
|
|
|
fn wi_fatal {
|
|
echo $scriptname: Fatal: $*
|
|
exit fatal
|
|
}
|
|
|
|
fn wi_notice {
|
|
xmessage $scriptname: Notice: $*
|
|
}
|
|
|
|
fn wi_readctl { wmiir read /ctl | sed -n 's/^'$1' (.*)/\1/p' }
|
|
|
|
wmiifont=`{wi_readctl font}
|
|
wmiinormcol=`{wi_readctl normcolors}
|
|
wmiifocuscol=`{wi_readctl focuscolors}
|
|
|
|
fn wi_fnmenu {
|
|
group=$1^Menu-$2 last=$group^_last fns=`{wi_getfuns $group} {
|
|
shift 2
|
|
if(! ~ $#fns 0) {
|
|
res = `{wmii9menu -i $"($last) $fns} \
|
|
if(! ~ $res '') {
|
|
($last) = $res
|
|
$group-$res $*}}}
|
|
}
|
|
|
|
fn wi_fn-p {
|
|
rc -c 'whatis '$1 >[2]/dev/null | grep -s '^fn '
|
|
}
|
|
|
|
fn wi_proglist {
|
|
# XXX: maxdepth is not POSIX compliant.
|
|
ifs=: { find -L `{echo -n $*} -type f -a -maxdepth 1 \
|
|
'(' -perm -0100 -o -perm -0010 -o -perm -0001 ')' >[2]/dev/null \
|
|
| sed 's,.*/,,' | sort | uniq}
|
|
}
|
|
|
|
fn wi_actions {
|
|
{ wi_proglist $WMII_CONFPATH
|
|
wi_getfuns Action
|
|
} | sort | uniq
|
|
}
|
|
|
|
fn wi_script {
|
|
noprog=true prog=() {
|
|
if(~ $1 -f) {
|
|
shift
|
|
noprog=/dev/null
|
|
}
|
|
prog = `{rc -c 'path=$confpath whatis '$1 >[2]/dev/null \
|
|
| grep -v '^fn |=' || echo $noprog}
|
|
shift; echo $prog $*}
|
|
}
|
|
|
|
|
|
fn wi_initkeys {
|
|
ifs=() {
|
|
wmiikeys = `{wmiir read /keys} {
|
|
mykeys = `{comm -23 \
|
|
<{wi_getfuns Key | sort | uniq} \
|
|
<{echo $wmiikeys | sort | uniq}}
|
|
{echo $wmiikeys; wi_getfuns Key} \
|
|
| sort | uniq \
|
|
| wmiir write /keys }}
|
|
fn wi_atexit {
|
|
wi_cleankeys
|
|
}
|
|
}
|
|
|
|
fn wi_cleankeys {
|
|
ifs=() {
|
|
wmiikeys = `{wmiir read /keys} {
|
|
comm -23 <{echo $wmiikeys | sort | uniq} \
|
|
<{echo $mykeys} \
|
|
| wmiir write /keys }}
|
|
}
|
|
|
|
fn wi_runcmd { @{
|
|
rfork ns
|
|
path=$oldpath
|
|
if(~ $1 -t) {
|
|
shift
|
|
* = (wihack -tags `{wmiir read /tag/sel/ctl | sed 1q} $*) }
|
|
fn `{env | 9 sed -n 's/^fn#([^=]+).*/\1/p'}
|
|
mykeys=()
|
|
if(! ~ $* '')
|
|
eval exec $* & }
|
|
}
|
|
|
|
fn wi_getfuns {
|
|
env | sed -n 's/^fn#'^$1^'-([^=]+).*/\1/p' | sort | uniq
|
|
}
|
|
|
|
for(i in Key Event Action '*Menu')
|
|
fns=`{wi_getfuns $i} {
|
|
if(! ~ $fns '')
|
|
fn $i-^$fns}
|
|
|
|
fn wi_tags {
|
|
wmiir ls /tag | sed 's,/,,; /^sel$/d'
|
|
}
|
|
|
|
fn wi_seltag {
|
|
wmiir read /tag/sel/ctl | sed 1q
|
|
}
|
|
|
|
fn wi_selclient {
|
|
wmiir read /client/sel/ctl | sed 1q
|
|
}
|
|
|
|
fn wi_readevent {
|
|
wmiir read /event
|
|
}
|
|
|
|
fn wi_eventloop {
|
|
wi_initkeys
|
|
|
|
wi_readevent |
|
|
while(ifs=$wi_ewlinel{wi_event=`{read}}) {
|
|
ifs=$wi_newline{
|
|
wi_arg=`{echo $wi_event | sed 's/^[^ ]+ //'}}
|
|
* = `{echo $wi_event}
|
|
event = $1; shift
|
|
Event-$"event $*
|
|
} >[2]/dev/null </dev/null
|
|
true
|
|
}
|
|
|
|
fn Event-Key {
|
|
Key-$1 $1
|
|
}
|
|
|
|
fn Event-Quit {
|
|
exit
|
|
}
|
|
|
|
fn Event-Start {
|
|
if(~ $1 $wmiiscript)
|
|
exit
|
|
}
|
|
|
|
fn Action {
|
|
cmd=$1 action=Action-$"cmd { shift
|
|
if(! ~ $cmd '') {
|
|
if(wi_fn-p $action)
|
|
$action $*
|
|
if not
|
|
wi_runcmd `{wi_script $cmd} $*
|
|
}
|
|
}
|
|
}
|
|
|