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)