awesome/utils/awesome-client

97 lines
2.3 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env bash
# Use bash's pipefail option to get errors during failure in a command
# pipeline. This is useful to get notified about an error from dbus-send
# when used with "|tail".
set -o pipefail
if [ -t 0 ] # is a tty.
then
# rlwrap provides readline functionality for "read", which is more enhanced
# than bash's "read" itself.
# It can be disabled/overridden using 'AWESOME_RLWRAP= awesome-client'.
if [ -z "${AWESOME_RLWRAP+x}" ]; then
AWESOME_RLWRAP="$(command -v rlwrap 2>/dev/null)"
fi
if [ -n "$AWESOME_RLWRAP" ]
then
if [ "$A_RERUN" = "" ]
then
A_RERUN="no" exec "$AWESOME_RLWRAP" "$0" "$@"
fi
READ_ARGS=""
else
# No rlwrap: use bash's readline.
READ_ARGS="-e"
fi
fi
DBUS_SEND=dbus-send
command -v ${DBUS_SEND} > /dev/null
if test $? = 1
then
echo "E: Unable to find" ${DBUS_SEND}
exit 1
fi
DBUS_PATH=/
DBUS_DEST=org.awesomewm.awful
DBUS_METHOD=${DBUS_DEST}.Remote.Eval
FATAL_ERRORS=1
a_dbus_send()
{
$DBUS_SEND --dest=$DBUS_DEST --type=method_call --print-reply \
$DBUS_PATH $DBUS_METHOD string:"$1" | tail -n +2
ret=$?
if [ "$ret" != 0 ] && [ "$FATAL_ERRORS" != 0 ]; then
echo "E: $DBUS_SEND failed." >&2
exit $ret
fi
}
print_help()
{
echo "Usage: awesome-client [-h|--help] [command [command...]]
awesome window manager remote execution
awesome-client is a remote command line interface to awesome.
It communicates with awesome via D-Bus, allowing remote execution of Lua code.
Run without a command to enter REPL (read-eval-print-loop) mode.
For examples see \`man awesome-client\`."
}
if [ $# -ne 0 ]
then
# check for command-line arguments
ARGS=()
for arg in "$@"; do
if [ "$arg" = "-h" ] || [ "$arg" = "--help" ]; then
print_help
exit 0
else
ARGS+=("$arg")
fi
done
# run arguments
for arg in "${ARGS[@]}"; do
a_dbus_send "$arg"
done
elif [ -t 0 ]
then
FATAL_ERRORS=0
while read $READ_ARGS -p "awesome# " -r line
do
if [ "$line" = "" ]; then
continue
fi
a_dbus_send "$line"
done
else
a_dbus_send "$(cat)"
fi
# vim: filetype=sh:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80