From ce7f686f9e9b30bf1dc7f39cef8c7896103d0dd0 Mon Sep 17 00:00:00 2001 From: Richard Grenville Date: Sun, 11 Nov 2012 13:02:14 +0800 Subject: [PATCH] Misc: compton-trans: Performance optimization Reduce abundant calls to xwininfo in compton-trans further. Helpful for performance but you can't expect too much from a bash script anyway. --- bin/compton-trans | 48 +++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/bin/compton-trans b/bin/compton-trans index 55b29ed7..4e557757 100755 --- a/bin/compton-trans +++ b/bin/compton-trans @@ -24,12 +24,11 @@ fi window= opacity= cur= -active= i= while getopts "scn:w:o:" option; do case "$option" in - s) window="" ;; + s) wprefix=''; window='' ;; c) active=$(xprop -root -notype "_NET_ACTIVE_WINDOW" \ | sed 's/^.*\(0x\S*\).*$/\1/') @@ -57,43 +56,48 @@ fi # Get ID of the target window if [ -z "$wprefix" ]; then - wid=$(xwininfo | sed -n 's/^xwininfo:.*: \(0x[[:xdigit:]]*\).*$/\1/p') + treeout=$(xwininfo -children -frame) else - wid=$(xwininfo $wprefix"$window" | sed -n 's/^xwininfo:.*: \(0x[[:xdigit:]]*\).*$/\1/p') + 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 -treeout="$(xwininfo -id "$wid" -children)" - # 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 -# Get the whole window tree -treeout="$(xwininfo -root -tree)" +# 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 + 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 -# 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) - if [ -z "$topmost" ]; then echo "Failed to find the highest parent window below root of the" \ "selected window."