diff options
author | Jonas Gunz <himself@jonasgunz.de> | 2020-09-07 22:51:52 +0200 |
---|---|---|
committer | Jonas Gunz <himself@jonasgunz.de> | 2020-09-07 22:51:52 +0200 |
commit | 88bb6bd888956407fb27deb00e9c38aef0162896 (patch) | |
tree | 9ee7c746b622b0054d0397076408765c7ba1d28a | |
parent | d7175b3f24c105906c698e5bc07f61c221e50bc0 (diff) | |
download | dotfiles-88bb6bd888956407fb27deb00e9c38aef0162896.tar.gz |
+ get-window-class.sh
-rwxr-xr-x | scripts/get-window-class.sh | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/scripts/get-window-class.sh b/scripts/get-window-class.sh new file mode 100755 index 0000000..f46f65e --- /dev/null +++ b/scripts/get-window-class.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +# i3-get-window-criteria - Get criteria for use with i3 config commands + +# To use, run this script, then click on a window. +# Output is in the format: [<name>=<value> <name>=<value> ...] + +# Known problem: when WM_NAME is used as fallback for the 'title="<string>"' criterion, +# quotes in "<string>" are not escaped properly. This is a problem with the output of `xprop`, +# reported upstream: https://bugs.freedesktop.org/show_bug.cgi?id=66807 + +PROGNAME=`basename "$0"` + +# Check for xwininfo and xprop +for cmd in xwininfo xprop; do + if ! which $cmd > /dev/null 2>&1; then + echo "$PROGNAME: $cmd: command not found" >&2 + exit 1 + fi +done + +match_int='[0-9][0-9]*' +match_string='".*"' +match_qstring='"[^"\\]*(\\.[^"\\]*)*"' # NOTE: Adds 1 backreference + +{ + # Run xwininfo, get window id + window_id=`xwininfo -int | sed -nre "s/^xwininfo: Window id: ($match_int) .*$/\1/p"` + echo "id=$window_id" + + # Run xprop, transform its output into i3 criteria. Handle fallback to + # WM_NAME when _NET_WM_NAME isn't set + xprop -id $window_id | + sed -nr \ + -e "s/^WM_CLASS\(STRING\) = ($match_qstring), ($match_qstring)$/instance=\1\nclass=\3/p" \ + -e "s/^WM_WINDOW_ROLE\(STRING\) = ($match_qstring)$/window_role=\1/p" \ + -e "/^WM_NAME\(STRING\) = ($match_string)$/{s//title=\1/; h}" \ + -e "/^_NET_WM_NAME\(UTF8_STRING\) = ($match_qstring)$/{s//title=\1/; h}" \ + -e '${g; p}' +} | sort | tr "\n" " " | sed -r 's/^(.*) $/[\1]\n/' |