#!/bin/bash # # Workaround per "pidgin" (per problema finestra non visibile ed istanza "zombie"). # Lancia una 2a istanza del programma per attivare la finestra di pidgin. Poi viene monitorizzata # con "dbus" l'uscita. La 1a istanza esce poiché trova già la 1a attiva (ma è servita per attivare la finestra), # e quindi memorizzo l'evento sulla variabile esportata QUIT impostandolo a true, cosicché, alla successiva uscita, # stavolta reale, lo script termina i processi di pidgin, senza lasciare istanze zombie. pid=$(ps ax | sed -rn 's/^\s*([0-9]+?)\s.+?[0-9]\s\/usr\/bin\/pidgin$/\1/p') # Verifico che non sia già attivo pidgin (è prevista una sola istanza). [[ -z "$pid" ]] || exit 0 /usr/bin/pidgin & /usr/bin/pidgin & export QUIT=false # Per testare quando è realmente il momento di uscire # (la 1a volta no perché è il 2° processo che chiude da # solo ed in tal caso non devo uscire --> QUIT=false) # Monitorizzo gli eventi di pidgin. dbus-monitor --profile interface="im.pidgin.purple.PurpleInterface" | while read -r type timest ser send dest pth interf memb; do #echo "$memb" if [[ "$memb" == "GtkblistHiding" ]]; then # È stato dato click sulla chiusura della finestra. SaveIFS="$IFS" IFS=$'\n' for l in $(wmctrl -lp); do # Lista le finestre attive. #echo "$l" win=$(echo "$l" | sed -n '/^.*Lista\scontatti$/p') # Cerco la finestra di pidgin if ! [[ -z "$win" ]]; then if $QUIT; then # uscita #echo ">$win<" # Ricerco i processi attivi di pidgin per terminarli. # /usr/bin/pidgin. for pid1 in $(ps ax | sed -rn 's/^\s*([0-9]+?)\s.+?[0-9]\s\/usr\/bin\/pidgin$/\1/p'); do #echo "$pid1" kill "$pid1" done #echo "----" # /usr/local/bin/pidgin (questo script). for pid2 in $(ps ax | sed -rn 's/^\s*([0-9]+?)\s.+?[0-9]\s\/bin\/bash\s\/usr\/local\/bin\/pidgin$/\1/p'); do #echo "$pid2" kill "$pid2" done fi fi done QUIT=true # La 1a uscita della finestra è fittizia perché proviene dalla 2a istanza # che è stata automaticamente chiusa. # Perciò imposto questa var globale per attivare effettivamente l'uscita alla # prossima chiusura della finestra, stavolta reale. IFS="$SaveIFS" fi done exit