#!/bin/sh
# Copyright (C) 2007 Jonathan Moore Liles
#
# Maintainer: Jonathan Moore Liles
#
# stumpish is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# stumpish is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this software; see the file COPYING. If not, see
# .
### STUMPwm Interactive SHell.
DELAY=0.01
if ! sleep $DELAY 2>/dev/null >&2
then
DELAY=1
fi
# replace -E with -r option for old versions of GNU sed
if ! sed -E 1p /dev/null 2>/dev/null; then
sed() { shift; command sed -r "$@"; }
fi
# parse C-style backslash sequences by default
if [ "$(echo -e foo)" = foo ]; then
echo() { builtin echo -e "$@"; }
fi
wait_result ()
{
while true
do
RESULT=$(xprop -root -f STUMPWM_COMMAND_RESULT 8s \
STUMPWM_COMMAND_RESULT 2>/dev/null |
sed -E 's/\\([[:digit:]]+)/\\0\1/g')
if echo "$RESULT" | grep -v -q 'not found.$'
then
break
fi
sleep $DELAY
done
xprop -root -remove STUMPWM_COMMAND_RESULT
if echo "$RESULT" | grep -q '= $'
then
return 0
fi
echo "$RESULT" |
sed -E 's/[^"\\n]+"//
/^"[[:space:]]*$/d
s/(^|[^\\])\\n/\1\
/g
s/\\(["\\n])/\1/g
s/\^([*[:digit:]]+|[Bbn])//g'
}
send_cmd ()
{
local cmd="$1"
if [ "$cmd" = "stumpwm-quit" ]
then
cmd=quit
elif [ "$cmd" = "quit" ]
then
exit
fi
xprop -root -f STUMPWM_COMMAND 8s -set STUMPWM_COMMAND "$cmd"
wait_result
}
usage ()
{
cat <&2
}
tput ()
{
local cap1=$1 cap2=$2
shift 2
command tput $cap1 $@ 2>/dev/null ||
command tput $cap2 $@ 2>/dev/null
}
READLINE=yes
if [ "x$1" = "x-r" ]
then
READLINE=no
shift 1
fi
if [ $# -gt 0 ]
then
[ "$1" = "--help" ] && usage
if [ "$1" = "-e" ]
then
if [ $# -ne 2 ]
then
echo "'-e' requires exactly one argument!"
exit
fi
shift 1
IFS=''
ARGS=$(cat /dev/stdin)
send_cmd "$1 $ARGS"
else
IFS=' '
send_cmd "$*"
fi
else
if [ -t 0 ]
then
if ! type rlwrap 2>/dev/null >&2
then
warn rlwrap not found, command completion won\'t work
elif [ $READLINE = yes ]
then
COMMANDS="${TMPDIR:-/tmp}/stumpish.commands.$$"
echo $(send_cmd "commands") |
sed -E 's/[[:space:]]+/\
/g' |
sort > "$COMMANDS"
trap 'rm -f "$COMMANDS"' exit int term
rlwrap -b '' -f "$COMMANDS" "$0" -r
exit
fi
tput AF setaf 5
echo Welcome to the STUMPwm Interactive SHell.
tput me sgr0
echo 'Type \c'
tput AF setaf 2
echo 'commands\c'
tput me sgr0
echo \ for a list of commands.
while read -p '> ' REPLY
do
tput md bold
tput AF setaf 2
send_cmd "$REPLY"
tput me sgr0
done
else
while read REPLY
do
send_cmd "$REPLY"
done
fi
fi