#!/bin/sh cd "$(dirname "$0")" || exit 1 if test "$#" -eq 0; then set -- for font in \ /usr/share/fonts/TTF/DejaVuSans.ttf \ /usr/share/fonts/TTF/Jigmo.ttf \ /usr/share/fonts/TTF/Jigmo2.ttf \ /usr/share/fonts/noto/NotoSansCJK-Regular.ttc do if test -f "$font"; then set -- "$@" "$font" fi done if test "$#" -eq 0; then echo "run.sh: no default font found; pass a font file" >&2 exit 1 fi fi if ! test -x ./strans; then echo "run.sh: ./strans is not executable; run make first" >&2 exit 1 fi if test -n "${DISPLAY-}" && ! test -x xim/strans-xim; then echo "run.sh: xim/strans-xim is not executable; run make first" >&2 exit 1 fi case ${XDG_RUNTIME_DIR-} in /) ipc=/strans.sock ;; /*/) ipc=${XDG_RUNTIME_DIR}strans.sock ;; /*) ipc=${XDG_RUNTIME_DIR}/strans.sock ;; *) ipc=/tmp/strans.$(id -u) ;; esac if test -n "${XDG_CONFIG_HOME-}"; then busdir=$XDG_CONFIG_HOME/ibus/bus elif test "${HOME+x}" = x; then busdir=$HOME/.config/ibus/bus else echo "run.sh: HOME or XDG_CONFIG_HOME is required for IBus discovery" >&2 exit 1 fi strans_pid= xim_pid= cleanup() { status=$? trap - 0 1 2 15 if test -n "$xim_pid"; then kill "$xim_pid" 2>/dev/null || : wait "$xim_pid" 2>/dev/null || : xim_pid= fi if test -n "$strans_pid"; then kill "$strans_pid" 2>/dev/null || : wait "$strans_pid" 2>/dev/null || : strans_pid= fi exit "$status" } ibusready() { for address in "$busdir"/*; do test -f "$address" || continue foundpid= foundaddress= while IFS= read -r line; do case $line in IBUS_DAEMON_PID="$strans_pid") foundpid=1 ;; IBUS_ADDRESS=unix:abstract=strans-"$strans_pid",*) foundaddress=1 ;; esac done <"$address" if test -n "$foundpid" && test -n "$foundaddress"; then return 0 fi done return 1 } trap cleanup 0 trap 'exit 129' 1 trap 'exit 130' 2 trap 'exit 143' 15 ./strans map "$@" & strans_pid=$! attempt=0 while test "$attempt" -lt 10; do if test -S "$ipc" && ibusready; then break fi if ! kill -0 "$strans_pid" 2>/dev/null; then wait "$strans_pid" status=$? strans_pid= if test "$status" -eq 0; then status=1 fi echo "run.sh: daemon exited before publishing IPC and IBus endpoints" >&2 exit "$status" fi attempt=$((attempt + 1)) if test "$attempt" -lt 10; then sleep 1 fi done if test "$attempt" -eq 10; then echo "run.sh: daemon did not publish IPC and IBus endpoints within 10 seconds" >&2 exit 1 fi echo "run.sh: daemon $strans_pid is ready" if test -z "${DISPLAY-}"; then echo "run.sh: DISPLAY is unset; XIM will not be started" wait "$strans_pid" status=$? strans_pid= exit "$status" fi xim/strans-xim & xim_pid=$! echo "run.sh: started XIM $xim_pid; press Ctrl-C to stop both processes" wait "$xim_pid" status=$? xim_pid= exit "$status"