From 1f1d3c9545569364e7eb0bca57aa37cd55953305 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 16 Oct 2019 14:40:29 +0200 Subject: [PATCH] [ADD][SCRIPTS] i3-get-window-criteria script This makes it easier to write an i3 filter command, by just executing the script and clicking on the window you want to filter. --- scripts/i3-get-window-criteria | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 scripts/i3-get-window-criteria diff --git a/scripts/i3-get-window-criteria b/scripts/i3-get-window-criteria new file mode 100755 index 0000000..57588be --- /dev/null +++ b/scripts/i3-get-window-criteria @@ -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: [= = ...] + +# Known problem: when WM_NAME is used as fallback for the 'title=""' criterion, +# quotes in "" 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 ! command -v $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 8u -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/'