#!/bin/zsh
setopt no_unset warn_create_global extended_glob

typeset -gA app_match_title app_match_class app_cmd
typeset -g app_id=0

add_app() {
	app_match_title[$app_id]=$1
	app_match_class[$app_id]=$2
	shift 2
	app_cmd[$app_id]="${(pj:\0:)@}"
	app_id=$(( $app_id + 1 ))
}

launch_app() {
	"${(0@)app_cmd[$1]}" &!
}
typeset -f -t launch_app


add_app '*weechat*'	'"weechat:*" "URxvt"'	c.tmux weechat.ccx -s weechat weechat-curses
add_app '*profanity*'	'"profanity:*" "URxvt"'	c.tmux profanity.ccx -s profanity profanity
add_app '*iamb*'	'"iamb:*" "URxvt"'	c.tmux iamb.ccx -s iamb iamb
add_app '\[telegram.ccx:*'	'"telegram-desktop" "TelegramDesktop"'	xsvc-in-container-xpra telegram.ccx telegram-desktop
add_app '\[signal.ccx:*'	'"signal" "Signal"'	xsvc-in-container-xpra signal.ccx signal-desktop
add_app '\[signal2.ccx:*'	'"signal" "Signal"'	xsvc-in-container-xpra signal2.ccx signal-desktop


main() {
	local winid title class app
	xwininfo_full="$(xwininfo -tree -root)" || exit $?
	sed <<<"$xwininfo_full" -nEe '/^ *0x[0-9a-f]+ ".*\+[0-9]+\+[0-9]+$/{s/^ *(0x[0-9a-f]+) "(.*)": \((.*)\)  [0-9]+x[0-9]+\+[0-9]+\+[0-9]+  \+[0-9]+\+[0-9]+$/\1\t\2\t\3/;p}' |\
	while IFS=$'\t' read winid title class; do
		for app in ${(k)app_match_title}; do
			if [[ $title == $~app_match_title[$app] && $class == $~app_match_class[$app] ]]; then
				unset "app_match_title[$app]"
				unset "app_match_class[$app]"
				printf 'window %s matches application %s\n' $winid $app
			fi
		done
	done
	for app in ${(k)app_match_title}; do
		launch_app $app
	done
}

#set -x
main