#!/bin/zsh # vim: sts=2 sw=2 et setopt no_unset warn_create_global typeset -gA display_to_container read_map() { local record container display for record in /run/display-container-map/*=*(N); do record=${record:t} display=${record%%=*} container=${record#*=} display_to_container[$display]=$container done } process_server() { local disp=$1 wid w_desktop w_pid w_host w_title (( $+display_to_container[$disp] )) || return local -a l cmd=( env DISPLAY=:$disp ) [[ -e /run/Xauthority.$disp ]] && cmd+=( XAUTHORITY=/run/Xauthority.$disp ) $cmd wmctrl -lp | while IFS=' ' read -r wid w_desktop w_pid w_host w_title; do l=( $disp $display_to_container[$disp] $((wid)) $w_desktop $w_pid $w_host $w_title ) printf '%s\n' "${(@pj:\t:)l}" done } main() { read_map local sock for sock in /tmp/.X11-unix/X*; do process_server ${sock##*/X} done } #typeset -f -t main main "$@"