#!/bin/sh # # compton-trans # transset in a bash script # Copyright (c) 2011-2012, Christopher Jeffrey # # Usage: # By window id # $ compton-trans -w "$WINDOWID" 75 # By name # $ compton-trans -n "urxvt" 75 # By current window # $ compton-trans -c 75 # By selection # $ compton-trans 75 # $ compton-trans -s 75 # Increment current window 5% # $ compton-trans -c +5 # "command" is a shell built-in, faster than "which" if test -z "$(command -v xprop)" -o -z "$(command -v xwininfo)"; then echo "Please install x11-utils/xorg-xprop/xorg-xwininfo." >& 2 exit 1 fi window= opacity= cur= i= # Read options while getopts "scn:w:o:" option; do case "$option" in s) wprefix=''; window='' ;; c) active=$(xprop -root -notype "_NET_ACTIVE_WINDOW" \ | sed 's/^.*\(0x\S*\).*$/\1/') wprefix='-id '; window="$active" ;; n) wprefix='-name '; window="$OPTARG" ;; w) wprefix='-id '; window="$OPTARG" ;; o) opacity="$OPTARG" ;; \?) exit 1;; esac done # Read positional arguments shift $(($OPTIND - 1)) [ -n "$1" ] && opacity="$1" # Validate opacity value if [ -z "$opacity" ]; then echo "No opacity specified." exit 1 fi opacity="$(echo "$opacity" \ | sed -rn 's/^[[:space:]]*([+-]?[[:digit:]]+)[[:space:]]*$/\1/p')" if [ -z "$opacity" ]; then echo "Invalid opacity value." exit 1 fi # Get ID of the target window if [ -z "$wprefix" ]; then treeout=$(xwininfo -children -frame) else treeout=$(xwininfo -children $wprefix"$window") fi wid=$(echo "$treeout" | sed -n 's/^xwininfo:.*: \(0x[[:xdigit:]]*\).*$/\1/p') if [ -z "$wid" ]; then echo "Failed to find window." exit 1 fi # Make sure it's not root window if echo "$treeout" | fgrep "Parent window id: 0x0" > /dev/null; then echo "Cannot set opacity on root window." exit 1 fi # If it's already the topmost window if echo "$treeout" | grep "Parent window id: 0x[[:xdigit:]]* (the root window)" > /dev/null; then topmost="$wid" else # Get the whole window tree treeout="$(xwininfo -root -tree)" if [ -z "$treeout" ]; then echo "Failed to get root window tree." exit 1 fi # Find the line number of the target window in the window tree lineno="$(echo -n "$treeout" | grep -nw "$wid" | head -n1 | cut -d ':' -f 1)" if [ -z "$lineno" ]; then echo "Failed to find window in window tree." exit 1 fi # Find the highest ancestor of the target window below topmost=$(echo -n "$treeout" | head -n $(($lineno + 1)) | sed -n 's/^ \(0x[[:xdigit:]]*\).*/\1/p' | tail -n1) fi if [ -z "$topmost" ]; then echo "Failed to find the highest parent window below root of the" \ "selected window." exit 1 fi # Calculate the desired opacity if echo "$opacity" | grep '^[+-]' > /dev/null; then sign=$(echo "$opacity" | cut -b1) cur=$(xprop -id "$topmost" -notype "_NET_WM_WINDOW_OPACITY" \ | sed 's/^.*\b\([0-9]\+\).*$\|^.*$/\1/') [ -z "$cur" ] && cur=0xffffffff cur=$((cur * 100 / 0xffffffff)) opacity="$(echo "$opacity" | sed 's/^[+-]//')" opacity=$(($cur $sign $opacity)) fi [ $opacity -lt 0 ] && opacity=0 [ $opacity -gt 100 ] && opacity=100 # Set opacity opacity=$(($opacity * 0xffffffff / 100)) xprop -id "$topmost" -f _NET_WM_WINDOW_OPACITY 32c \ -set _NET_WM_WINDOW_OPACITY "$opacity"