aboutsummaryrefslogtreecommitdiff
path: root/bin/picom-trans
diff options
context:
space:
mode:
Diffstat (limited to 'bin/picom-trans')
-rwxr-xr-xbin/picom-trans407
1 files changed, 0 insertions, 407 deletions
diff --git a/bin/picom-trans b/bin/picom-trans
deleted file mode 100755
index b686128..0000000
--- a/bin/picom-trans
+++ /dev/null
@@ -1,407 +0,0 @@
-#!/bin/sh
-# SPDX-License-Identifier: MIT
-
-#
-# picom-trans
-# Copyright (c) 2021, Subhaditya Nath
-# Based on previous works of Christopher Jeffrey
-#
-
-#
-# Conforming to POSIX-1.2007
-# https://pubs.opengroup.org/onlinepubs/9699919799
-#
-
-# Usage:
-# $ picom-trans [options] [+|-]opacity
-# By window id
-# $ picom-trans -w "$WINDOWID" 75
-# By name
-# $ picom-trans -n "urxvt" 75
-# By current window
-# $ picom-trans -c 75
-# By selection
-# $ picom-trans 75
-# $ picom-trans -s 75
-# Increment current window 5%
-# $ picom-trans -c +5
-# Delete current window's opacity
-# $ picom-trans -c --delete
-# Toggle current window's opacity between 90 and unset
-# $ picom-trans -c --toggle 90
-# Reset all windows
-# $ picom-trans --reset
-
-
-# Save $0 now to print correct value while printing from functions.
-# Printing errormsgs from functions using "$0" prints the function name
-# instead of the executable name.
-EXE_NAME="$0"
-
-
-# Instead of printing the full path to this file (e.g. /usr/bin/picom-trans)
-# only print the base name (i.e. picom-trans)
-EXE_NAME="$(basename "$EXE_NAME")"
-
-
-print_usage()
-{ #{{
- echo "Usage: $EXE_NAME [options] [+|-]opacity"
- echo ""
- echo "Options:"
- echo " -h, --help Print this help message."
- echo " -o, --opacity OPACITY Specify the new opacity value in range 0-100 for the window. If"
- echo " prefixed with + or -, increment or decrement from the current"
- echo " opacity of the target window."
- echo ""
- echo "Actions:"
- echo " -g, --get Print current opacity of the target window."
- echo " -d, --delete Delete opacity of the target window."
- echo " -t, --toggle Toggle the target window's opacity, i.e. set if not already set"
- echo " and delete else."
- echo " -r, --reset Reset opacity for all windows."
- echo ""
- echo "Window Selection:"
- echo " -s, --select Select target window with mouse cursor. (DEFAULT)"
- echo " -c, --current Select the currently active window as target."
- echo " -n, --name WINDOW_NAME Specify and try to match a window name."
- echo " -w, --window WINDOW_ID Specify the window id of the target window."
-} #}}
-
-
-parse_args()
-{ #{{
- i=1 # because we start from "$1", not from "$0"
- while [ $i -le $# ]
- do
- #### [START] Convert GNU longopts to POSIX equivalents ####
- if [ "$1" = "--${1##--}" ] # check if $1 is a longopt
- then
- # Catch invalid options
- case "$1" in
- (--opacity=|--name=|--window=)
- echo "$EXE_NAME: option ${1%=} needs a value" >&2
- exit 1;;
- (--opacity|--name|--window)
- test $i -eq $# \
- && echo "$EXE_NAME: option $1 needs a value" >&2 \
- && exit 1;;
- esac
-
- # Separate "--ARG=VAL" into "--ARG" "VAL"
- case "$1" in
- (--opacity=*|--name=*|--window=*)
- ARG="$(echo "$1" | sed -E 's/(--[^=]+)=.*$/\1/')"
- VAL="${1##${ARG}=}"
- shift && set -- "$ARG" "$VAL" "$@"
- esac
-
- # Turn into short form
- case "$1" in
- (--help|--opacity|--get|--delete|--toggle|--reset|--select|--current|--name|--window)
- ARG=${1#-} # remove one '-' from prefix
- ARG="$(echo "$ARG" | cut -c -2)" # get first two characters
- shift && set -- "$ARG" "$@"
- esac
-
- # If the argument still starts with --, it is an invalid argument
- case "$1" in
- (--*)
- echo "$EXE_NAME: illegal option $1" >&2
- exit 1
- esac
- fi
- #### [END] Convert GNU longopts to POSIX equivalents ####
-
-
- #### [START] Prepend '-o' to standalone opacity values ####
- # Iterate over every argument and check if it is an opacity without the -o
- # option in the previous argument. If so, then prepend the -o option.
- # e.g. Turn this -
- # picom-trans -c +10 -s
- # into this -
- # picom-trans -c -o +10 -s
- #
- # NOTE: Don't touch arguments that are preceded by -o, -w, or -n (i.e. the
- # options that take a value.)
- # e.g. This -
- # picom-trans -w 75 -o 90
- # should NOT be turned into this -
- # picom-trans -w -o 75 -o 90
- # We ensure this by checking the "$#"th (i.e. the last) argument. If
- # argument is an option that needs a value, we don't do anything to $1.
- #
- # NOTE: we are using printf because most echo implementations aren't
- # POSIX-compliant. For example, according to POSIX.1-2017, echo doesn't
- # support any options, so,
- # $ echo "-n"
- # should output -
- # -n
- # But it doesn't. It instead interprets the "-n" as the option -n, which,
- # in most implementations, means that the trailing newline should not be
- # printed.
- if echo "$1" | grep -qE '^[+-]?[[:digit:]]+%?$' && \
- ! eval "printf '%s' \"\${$#}\"" | grep -q '^-[hdtrgsc]*[own]$'
- # NOTE: eval "printf '%s' \"\${$#}\"" means 'print the last argument'
- # NOTE: The letters inside the first square brackets (ie. hdtrgsc) are
- # the same as those in the getopts argument, minus those that are
- # followed by a ':'
- # NOTE: The letters inside the second square brackets (ie. own) are
- # the same as those in the getopts argument, minus those that are
- # NOT followed by a ':'
- then
- set -- "$@" "-o"
- i=$(( i + 1 ))
- fi
- #### [END] Prepend '-o' to standalone opacity values ####
-
-
- # Prepare for next iteration
- ARG="$1"
- shift && set -- "$@" "$ARG"
- i=$(( i + 1 ))
- done
-
-
- # NOTE: DO NOT ATTEMPT TO USE "$OPTIND" INSIDE THE getopts LOOP
- # - https://github.com/yshui/picom/pull/634#discussion_r654571535
- # - https://www.mail-archive.com/austin-group-l%40opengroup.org/msg04112.html
- OPTIND=1
- while getopts 'ho:dtrgsn:w:c' OPTION
- do
- case "$OPTION" in
- (h) print_usage; exit 0;;
- (o) target_opacity="$OPTARG";;
- (d) action=delete;;
- (t) action=toggle;;
- (r) action=reset;;
- (g) action=get;;
- (s) winidtype=; winid=;;
- (n) winidtype=-name; winid="$OPTARG";;
- (w) winidtype=-id; winid="$OPTARG";;
- (c) winidtype=-id; winid="$(get_focused_window_id)";;
- (\?) exit 1
- esac
- done
-} #}}
-
-
-get_target_window_id()
-{ #{{
-
- # Get the output of xwininfo
- if test -z "$winidtype"
- then xwininfo_output="$(xwininfo -children -frame)"
- elif test "$winidtype" = "-name"
- then xwininfo_output="$(xwininfo -children -name "$winid")"
- elif test "$winidtype" = "-id"
- then
- # First, check if supplied window id is valid
- if ! echo "$winid" | grep -Eiq '^[[:space:]]*(0x[[:xdigit:]]+|[[:digit:]]+)[[:space:]]*$'
- then
- echo "Bad window ID" >&2
- exit 1
- fi
- xwininfo_output="$(xwininfo -children -id "$winid")"
- fi
-
- # Extract window id from xwininfo output
- winid="$(echo "$xwininfo_output" | sed -n 's/^xwininfo:.*: \(0x[[:xdigit:]]*\).*$/\1/p')"
- if test -z "$winid"
- then
- echo "Failed to find window" >&2
- exit 1
- fi
-
- # Make sure it's not root window
- if echo "$xwininfo_output" | grep -Fq "Parent window id: 0x0"
- then
- echo "Cannot set opacity on root window" >&2
- exit 1
- fi
-
- # If it's not the topmost window, get the topmost window
- if ! echo "$xwininfo_output" | grep -q 'Parent window id: 0x[[:xdigit:]]* (the root window)'
- then
- window_tree="$(xwininfo -root -tree)"
- if test -z "$window_tree"
- then
- echo "Failed to get root window tree" >&2
- exit 1
- fi
-
- # Find the highest ancestor of the target window
- winid="$(echo "$window_tree" \
- | sed -n "/^\s*$winid/q;s/^ \(0x[[:xdigit:]]*\).*/\1/p" \
- | tail -n 1)"
- if test -z "$winid"
- then
- echo "Failed to find window in window tree" >&2
- exit 1
- fi
- fi
- if test -z "$winid"
- then
- echo "Failed to find the highest parent window below root of the selected window" >&2
- exit 1
- fi
-
- echo "$winid"
-} #}}
-
-get_focused_window_id()
-{ #{{
- id="$(xprop -root -notype -f _NET_ACTIVE_WINDOW 32x '$0' _NET_ACTIVE_WINDOW)"
- echo "${id#_NET_ACTIVE_WINDOW}"
-} #}}
-
-get_current_opacity()
-{ #{{
- # Gets current opacity in the range 0-100
- # Doesn't output anything if opacity isn't set
- cur="$(xprop -id "$winid" -notype -f _NET_WM_WINDOW_OPACITY 32c '$0' _NET_WM_WINDOW_OPACITY)"
- cur="${cur#_NET_WM_WINDOW_OPACITY}"
- cur="${cur%:*}"
- test -n "$cur" &&
- cur=$(( cur * 100 / 0xffffffff ))
- echo "$cur"
-} #}}
-
-
-get_opacity()
-{ #{{
- cur="$(get_current_opacity)"
- test -z "$cur" && cur=100 # Unset opacity means fully opaque
- echo "$cur"
- exit 0
-} #}}
-
-delete_opacity()
-{ #{{
- xprop -id "$winid" -remove _NET_WM_WINDOW_OPACITY
- exit 0
-} #}}
-
-reset_opacity() # Reset opacity of all windows
-{ #{{
- for winid in $(xwininfo -root -tree | sed -n 's/^ \(0x[[:xdigit:]]*\).*/\1/p')
- do xprop -id "$winid" -remove _NET_WM_WINDOW_OPACITY 2>/dev/null
- done
- exit 0
-} #}}
-
-set_opacity()
-{ #{{
- if ! echo "$target_opacity" | grep -qE '^[+-]?[[:digit:]]+%?$'
- then
- if test -z "$target_opacity"
- then echo "No opacity specified" >&2
- else echo "Invalid opacity specified: $target_opacity" >&2
- fi
- exit 1
- fi
-
- # strip trailing '%' sign, if any
- target_opacity="${target_opacity%%%}"
-
- if echo "$target_opacity" | grep -q '^[+-]'
- then
- current_opacity="$(get_current_opacity)"
- test -z "$current_opacity" && current_opacity=100
- target_opacity=$(( current_opacity + target_opacity ))
- fi
-
- test $target_opacity -lt 0 && target_opacity=0
- test $target_opacity -gt 100 && target_opacity=100
-
- target_opacity=$(( target_opacity * 0xffffffff / 100 ))
- xprop -id "$winid" -f _NET_WM_WINDOW_OPACITY 32c \
- -set _NET_WM_WINDOW_OPACITY "$target_opacity"
-
- exit $?
-} #}}
-
-toggle_opacity()
-{ #{{
- # If opacity is currently set, unset it.
- # If opacity is currently unset, set opacity to the supplied value. If no
- # value is supplied, we default to 100%.
- if test -z "$(get_current_opacity)"
- then
- test -n "$target_opacity" || target_opacity=100
- set_opacity
- else
- delete_opacity
- fi
-} #}}
-
-
-# Warn about rename of compton to picom
-case "$0" in
- *compton-trans*) echo "Warning: compton has been renamed, please use picom-trans instead" >&2;;
-esac
-
-
-# Check if both xwininfo and xprop are available
-if ! command -v xprop >/dev/null || ! command -v xwininfo >/dev/null
-then
- echo "The command xwininfo or xprop is not available. They might reside in a package named xwininfo, xprop, x11-utils, xorg-xprop, or xorg-xwininfo" >&2
- exit 1
-fi
-
-
-# No arguments given. Show help.
-if test $# -eq 0
-then
- print_usage >&2
- exit 1
-fi
-
-
-# Variables
-# action is set to 'set' by default
-action=set
-winid=
-winidtype=
-target_opacity=
-
-# If there's only one argument, and it's a valid opacity
-# then take it as target_opacity. Else, parse all arguments.
-if test $# -eq 1 && echo "$1" | grep -qE '^[+-]?[[:digit:]]+%?$'
-then
- target_opacity=$1
- shift
-else
- parse_args "$@"
-fi
-
-
-# reset_opacity doesn't need $winid
-case $action in
- (reset) reset_opacity;;
-esac
-
-# Any other action needs $winid
-#
-# NOTE: Do NOT change the order of winid= and winidtype= below
-# the output of get_target_window_id depends on $winidtype
-#
-# NOTE: If get_target_window_id returns with a non-zero $?
-# that must mean that some error occured. So, exit with that same $?
-#
-winid=$(get_target_window_id) || exit $?
-winidtype=-id
-case $action in
- (set) set_opacity;;
- (get) get_opacity;;
- (delete) delete_opacity;;
- (toggle) toggle_opacity;;
-esac
-
-
-# We should never reach this part of the file
-echo "This sentence shouldn't have been printed. Please file a bug report." >&2
-exit 128
-
-
-# vim:ft=sh:ts=4:sts=4:sw=2:et:fdm=marker:fmr=#{{,#}}:nowrap