#!/usr/bin/env bash
###############################################################################
# BRLTTY - A background process providing access to the console screen (when in
#          text mode) for a blind person using a refreshable braille display.
#
# Copyright (C) 1995-2023 by The BRLTTY Developers.
#
# BRLTTY comes with ABSOLUTELY NO WARRANTY.
#
# This is free software, placed under the terms of the
# GNU Lesser General Public License, as published by the Free Software
# Foundation; either version 2.1 of the License, or (at your option) any
# later version. Please see the file LICENSE-LGPL for details.
#
# Web Page: http://brltty.app/
#
# This software is maintained by Dave Mielke <dave@mielke.cc>.
###############################################################################

. "$(dirname "${0}")/brltty-prologue.sh"

usageSummary="\
Run a shell or terminal manager via the brltty-pty terminal emulator
and brltty using its Terminal Emulator screen driver.

Syntax: ${programName} [shell] [-option ...]

This script is especially useful on platforms that don't support a native screen driver.
This newer method may (should) be used in preference to the older method of
running brltty in conjunction with its provided patch to the screen program.

All of the arguments to this script are interpreted as brltty options,
with the following exceptions:
* If the first argument is -h then this usage summary is displayed.
* If the first argument doesn't begin with - (i.e. it isn't an option)
  then it's interpreted as the shell to run, and the rest of the arguments
  are interpreted as brltty options.

The shell may be specified via either its name or its path. It's also okay
to specify a terminal manager rather than a shell. For example:
* ${programName} screen
* ${programName} tmux

If the shell isn't specified on the command line then, in decreasing
precedence, one of the following is used:
1: If set, the \$BRLTTY_TERM_SHELL environment variable.
2: If set, the \$SHELL environment variable.
3: The default shell (sh).

Brltty is run as root so that it can access the braille device. If its
set-user-id bit is set and/or if this script is already running as root
then it's run directly. If neither, it's run via sudo. In this case, you
may wish to consider configuring sudo so that it won't prompt for the
user's password since the braille device wouldn't be operational yet.

If the copy of this script in its installed location is used then the
installed brltty is run. If, however, the copy in the top-level directory
of the source tree is used then brltty in the build tree (which needn't
be installed) is run.

"

shellCommand=""

[ "${#}" -eq 0 ] || {
   argument="${1}"

   [ "${argument}" = "-h" ] && {
      echo -n "${usageSummary}"
      exit 0
   }

   [ "${#argument}" -eq 0 ] || {
      [ "${argument:0:1}" = "-" ] || {
         shellCommand="${argument}"
         shift 1
      }
   }
}

[ -t 0 ] || semanticError "standard input isn't a terminal"
[ -t 1 ] || semanticError "standard output isn't a terminal"

findSiblingCommand brlttyPath brltty run-brltty || {
   semanticError "brltty not found"
}

[ -n "${shellCommand}" ] || shellCommand="${BRLTTY_TERM_SHELL}"
[ -n "${shellCommand}" ] || shellCommand="${SHELL}"
[ -n "${shellCommand}" ] || shellCommand="sh"

findHostCommand shellPath "${shellCommand}" || {
   semanticError "shell not found: ${shellCommand}"
}

screenDriver="em"
screenParameters=()

addScreenParameter() {
   local name="${1}"
   local value="${2}"

  screenParameters+=("-X${screenDriver}:${name}=${value}")
}

currentUser="$(id -u)"
currentGroup="$(id -g)"

addScreenParameter shell "${shellPath}"
addScreenParameter user "${currentUser}"
addScreenParameter group "${currentGroup}"
addScreenParameter directory "${PWD}"
addScreenParameter home "${HOME}"

SUDO="sudo --bell --preserve-env --preserve-env=USER,LOGNAME --"
[ -u "${brlttyPath}" ] && SUDO=""
[ "${currentUser}" -eq 0 ] && SUDO=""

exec ${SUDO} "${brlttyPath}" -n -z -x"${screenDriver}" "${screenParameters[@]}" "${@}"
exit "${?}"
