#!/bin/bash

# transset in a bash script
# copyright (c) 2011, christopher jeffrey

# usage:
# by window id
#trans -w "$WINDOWID" -o 75
# by name
#trans -n "urxvt" -o 75
# by current window
#trans -c -o 75
# by selection
#trans -s -o 75
# increment current window 5%
#trans -c -o +5

if [ -z "$(which xprop)" -o -z "$(which xwininfo)" ]; then
  echo "Please install x11-utils/xorg-xprop/xorg-xwininfo." >&2
  exit 1
fi

window=
opacity=
cur=
root=
parent=
active=

while getopts "scn:w:o:" OPTION; do
  case "$OPTION" in
    s) window="" ;;
    c)
      active=$(xprop -root -notype "_NET_ACTIVE_WINDOW" \
        | sed 's/^.*\(0x\S*\).*$/\1/')
      window="-id $active"
    ;;
    n) window="-name $OPTARG" ;;
    w) window="-id $OPTARG" ;;
    o) opacity="$OPTARG" ;;
  esac
done

root=$(xwininfo -all -root \
  | grep "Root window id" \
  | sed 's/^.*\(0x\S*\).*$/\1/')

parent=$window
while [ true ]; do
  parent=$(xwininfo -all $parent \
    | grep Parent \
    | sed 's/^.*\(0x\S*\).*$/\1/')
  if [ "$parent" = "$root" ]; then
    break
  fi
  parent="-id $parent"
  window=$parent
done

inc=$(echo "$opacity" | sed 's/^\(+\|-\).*$\|^.*$/\1/')
if [ -n "$inc" ]; then
  cur=$(xprop $window -notype "_NET_WM_WINDOW_OPACITY" \
    | sed 's/^.*\b\([0-9]\+\).*$\|^.*$/\1/')
  [ -z "$cur" ] && cur=$((0xffffffff))
  cur=$((cur*100/0xffffffff))
  opacity=$(echo "$opacity" | sed 's/\(\+\|\-\)//')
  if [ "$inc" = "+" ]; then
    opacity=$((cur+opacity))
  else
    opacity=$((cur-opacity))
  fi
fi

if [ -n "$opacity" ] && [ -n "$window" ]; then
  [ $opacity -le 0 ] && opacity=0
  [ $opacity -ge 100 ] && opacity=100
  opacity=$((opacity*0xffffffff/100))
  xprop $window -f _NET_WM_WINDOW_OPACITY 32c \
    -set _NET_WM_WINDOW_OPACITY "$opacity"
fi