Zenity!


Probabilmente tutti già conoscevano zenity tranne me. Si tratta di un tool con cui poter “dialogare” con Gnome per mandare notifiche all’utente da riga di comando (fondamentalmente popup con vari widget). Ad ogni modo mi sono trovato ad avere il seguente problema. Io e mio figlio Filippo (7 anni) condividiamo lo stesso desktop a casa (c’è crisi…) e siccome tutti e due giochiamo a World of Warcraft e il desktop in questione ha come sistema operativo Ubuntu 9.04 mi sono ritrovato ad avere qualche problema per via del tempo necessario per far partire Wow con wine senza dare alcun feedback (Filippo ha il click un po’ compulsivo e si ritrovava con 4 finestre…). Dopo vari test e copia-incolla qua e là ho preparato uno script per far partire il gioco che “cerca” di evitare gli startup “concorrenti” e al tempo da un feedback minimo all’utente (grazie a zenity che a tale scopo si è dimostrato fenomenale) 🙂

#!/bin/bash
(
PID_FILE=~/.wow.pid
LOG_FILE=~/.wow.log
LOCK_FILE=~/.wow.lock
ZENITY=/usr/bin/zenity
ALREADY_RUNNING=0
if [ -f $LOCK_FILE ]; then
	#echo 100
	#zenity --info --text "World of Warcraft è già in esecuzione (cod. 1)"
	zenity --question --text "World of Warcraft potrebbe essere in fase di esecuzione, vuoi sbloccare l'avvio?"
	if [ $? -eq 0 ]; then
		rm -rf $LOCK_FILE
	else
		echo 100
		exit 1
	fi
fi
echo "true" > $LOCK_FILE
if [ -f $PID_FILE ]; then
	RUNNING_PID=`cat $PID_FILE`
	echo "Running process PID: $RUNNING_PID"
	echo 1
	sleep 1
	CHECK_PROCESS=`ps -p $RUNNING_PID|grep -v 'PID TTY          TIME CMD'`
	echo 2
	sleep 1
	echo "Running process details: $CHECK_PROCESS"
	if [ "$CHECK_PROCESS" = "" ]; then
		echo "PID no longer used by Wow.exe"
	else
		ALREADY_RUNNING=1
		echo "Wow.exe is already running with PID=$RUNNING_PID [$CHECK_PROCESS]" >> $LOG_FILE
		#zenity --info --text "World of Warcraft è già in esecuzionen(PID=$RUNNING_PID [$CHECK_PROCESS])"
	fi
	echo 3
	sleep 1
fi
if [ "$ALREADY_RUNNING" = "1" ]; then
	echo "Wow.exe is already running"
	sleep 1
	echo 100
	rm -rf $LOCK_FILE
	zenity --info --text "World of Warcraft è già in esecuzione (cod. 2)"
	exit 1
fi
echo "Starting Wow.exe"
echo 4
env WINE_CURSOR=anything padsp wine "C:World of WarcraftWow.exe" -opengl > $LOG_FILE 2>&1 &
echo $! > $PID_FILE
rm -rf $LOCK_FILE
for a in `seq 5 100` ;
do
echo $a;
sleep 0.10;
done
)| zenity --auto-close --progress --text="Avvio di World of Warcraft in corso..." --title="World of Warcraft"

Alcune note:

– la variabile “WINE_CURSOR” serve per una patch che ho applicato a wine per poter avere il cursore hardware (altrimenti assente in WOW quando lanciato in modalità opengl)

– padsp è un wrapper pulse per OSS (migliora le performance sonore altrimenti un po’ scadenti)

– i vari “echo <numero>” servono a far avanzare la progress bar di zenity (in pratica lo script vero e proprio è quello tra parentesi tonde, viene messo in pipe con zenity che interpreta le righe con numero per far avanzare la barra)

Advertisements