#!/bin/sh

GetID() {
  xwininfo -root -all | grep "$1" | { read A B; echo $A; }
}

Up() { # ID
  xwit -raise -id "$1"
}

Catch() { # ID
  xse -win "$1" '<FocusIn> Normal Pointer'
}

KeyIze() { # string [noenter]
  for c in `echo "$1" | sed '
s/ //g
s/	//g
s/[^\\]/& /g
'`
  do
    case "$c" in
      # TODO more keysyms

      "!") echo "Shift<Key>exclam";;
      '"') echo "Shift<Key>quotedbl";;
      "#") echo "Shift<Key>numbersign";;
      "$") echo "Shift<Key>dollar";;
      "%") echo "Shift<Key>percent";;
      "&") echo "Shift<Key>ampersand";;
      "'") echo "Shift<Key>apostrophe";;
      "(") echo "Shift<Key>parenleft";;
      ")") echo "Shift<Key>parenright";;
      "*") echo "Shift<Key>asterisk";;
      "+") echo "<Key>plus";;
      ",") echo "<Key>comma";;
      "-") echo "<Key>minus";;
      ".") echo "<Key>period";;
      "/") echo "<Key>slash";;
      ":") echo "Shift<Key>colon";;
      ";") echo "<Key>semicolon";;
      "<") echo "Shift<Key>less";;
      "=") echo "Shift<Key>equal";;
      ">") echo "Shift<Key>greater";;
      "?") echo "Shift<Key>question";;
      "@") echo "Shift<Key>at";;
      "[") echo "<Key>bracketleft";;
      "\\") echo "<Key>backslash";;
      "]") echo "<Key>bracketright";;
      "^") echo "Shift<Key>asciicircum";;
      "_") echo "Shift<Key>underscore";;
      '`') echo "<Key>grave";;
      "{") echo "Shift<Key>braceleft";;
      "|") echo "Shift<Key>bar";;
      "}") echo "Shift<Key>braceright";;
      "~") echo "Shift<Key>asciitilde";;

      \\1) echo "<Key>F1" ;;
      \\2) echo "<Key>F2" ;;
      \\3) echo "<Key>F3" ;;
      \\4) echo "<Key>F4" ;;
      \\5) echo "<Key>F5" ;;
      \\6) echo "<Key>F6" ;;
      \\7) echo "<Key>F7" ;;
      \\8) echo "<Key>F8" ;;
      \\9) echo "<Key>F9" ;;
      \\0) echo "<Key>F10" ;;

      \\E) echo "<Key>esacape" ;;
      \\U) echo "<Key>Up" ;;
      \\D) echo "<Key>Down" ;;
      \\L) echo "<Key>Left" ;;
      \\R) echo "<Key>Right" ;;
      \\n|
) echo "<Key>Return" ;;
      \\t|) echo "<Key>Tab" ;;
      \\\\) echo "<Key>backslash" ;;
      # TODO \any_other (e. g. \k)
      # TODO controls
      ) echo "<Key>space" ;;
      A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z) echo "Shift<Key>$c" ;;
      *)  echo "<Key>$c" ;;
    esac
  done
}

SendKey() { # id key1 [key2 ...]
  local id="$1"
  shift
  xse -win "$id" "$@"
}

# TODO getopts
# TODO some useful xse/xwit/wmcntrl events
ID=`GetID "$1"`
Up "$ID"
Catch "$ID"
SendKey "$ID" `KeyIze "$2"`