codice:
#!/bin/sh
#
# xstart
#
# Copyright (c) 2003, Luigi A. Bassetti.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
#
# Alternativa a "startx", permette di selezionare un window manager
# come argomento del comando (esempio "xstart kde").
# Nota 1: alcuni avvertimenti di particolare importanza li ho
# scritti in maiuscolo.
# Nota 2: per i più pignoli ;-), ho usato il termine "funzione"
# per definire alcuni blocchi di codice, so che per la precisione
# avrei dovuto usare termini come "costrutto" o similari, però
# ho preferito rendere più snella la lettura dei commenti senza
# voler insistere su "precisi tecnicismi" ;-)
#
# Vorrei ringraziare l'amico Velenux del forum Linux di
# "html.it" per gli ottimi suggerimenti che mi ha dato
# nella realizzazione dei link che permettono il caricamento
# dei vari window manager con la Slackware, mentre per la
# funzione di apertura dei window manager in console virtuali
# diverse contemporaneamente ringrazio l'amico Gianluca del
# mio LUG (LinuxVar, il LUG di Varese, http://www.linuxvar.it)
# che mi ha dato l'input.
#
#
############ INIZIO DELLE VARIABILI GLOBALI ###############
#
# Il percorso degli "xinitrc" corrispondenti ai vari window
# manager
#
XINITRC_PATH=/etc/X11/xinit/xinitrc.
#
# La seguente costante contiene il nome del file "~/.xinitrc"
# salvato
#
MYXINITRC_SAVE=~/.xstart_save.xinitrc
#
# Il file "xinitrc" nella home
#
MYXINITRC=~/.xinitrc
#
# La seguente variabile conta quanti window manager sono aperti
# nel sistema, la stessa sarà usata da più funzioni più avanti.
#
wm_counter=$((`ps --user root | grep X | grep -v grep | wc -l`))
#
# Variabile che verifica se si è in una console "tty"
#
mytty=`tty | grep tty`
#
# NOTA: ci sarà una o più variabili anche più avanti, ho cercato
# di raggrupparle il più possibile qua per un discorso di ordine,
# però ci potrebbero essere dei casi dove risulta una scelta
# migliore scriverle in posizioni che non compromettano
# l'efficienza o la velocità del programma.
#
################# FINE DELLE VARIABILI GLOBALI #################
#
# Valuta se il sistema è configurato in modo da poter funzionare
# con questo programma.
# Ho scritto xstart basandomi su Slackware 9.x
#
ls $XINITRC_PATH* > /dev/null 2>&1
if [ "$?" != 0 ] ; then
echo
echo "Attenzione! Questo sistema non è adatto per l'uso"
echo -n "di questo programma! Invio per uscire..."
read
echo
exit 1
fi
#
# Viene salvato il file "~/.xinitrc"
#
if [ "$1" = "--myxinitrc-save" ] ; then
if [ -f "$MYXINITRC_SAVE" ] ; then
echo
echo "Attenzione: \"$MYXINITRC_SAVE\" è già stato"
echo -n "creato, invio per uscire..."
read
echo
exit 1
else
echo
echo "Salvo il file \"$MYXINITRC\" nel file"
echo -n "\"$MYXINITRC_SAVE\"..."
`mv $MYXINITRC $MYXINITRC_SAVE`
# Viene creato un link simbolico "~/.xinitrc" al file
# salvato in quanto potrebbe succedere di usare "startx"
# dopo avere eseguito questa opzione ma prima di avere
# eseguito una prima volta xstart, poi serve sopratutto
# per il fatto che lo stesso programma deve trovare un
# link simbolico di nome "~/xinitrc" per funzionare.
`ln -s $MYXINITRC_SAVE $MYXINITRC`
`sleep 2`
echo " fatto"
`sleep 1`
echo
echo "Attenzione: per ripristinare il file \"$MYXINITRC\""
echo "originale eseguire l'opzione \"--myxinitrc-restore\""
echo -n "o farlo manualmente, invio per uscire..."
read
echo
exit 0
fi
fi
#
# Controlla che il file "~/.xinitrc" sia un link simbolico
# e non un file, in quest'ultimo caso chiede di eseguire
# l'opzione "--myxinitrc-save" per salvare il file originale
# ed esce dal programma.
#
if [ ! -h "$MYXINITRC" ] && [ "$1" != "--help" ] ; then
echo
echo "ATTENZIONE: ESEGUIRE L'OPZIONE \"--myxinitrc-save\""
echo "PER SALVARE IL FILE \"$MYXINITRC\" ORIGINALE, INVIO"
echo -n "PER USCIRE..."
read
echo
exit 1
fi
#
# L'opzione "-q" stampa i window manager che si possono selezionare
#
if [ "$1" = "-q" ] ; then
echo
echo "I window manager selezionabili sono:"
echo
exec ls $XINITRC_PATH* | sort | cut -d'.' -f2
echo
echo "per selezionarne uno digitare il nome"
echo "come argomento (esempio \"xstart kde\")."
echo
exit 0
#
# Opzione per controllare quanti window manager sono aperti e
# quanti se ne possono aprire ancora.
#
elif [ "$1" = "--display-counter" ] ; then
echo
echo "Window Manager aperti: $wm_counter"
wm_remaining=$((6 - $wm_counter))
if [ "$wm_remaining" -eq 0 ] ; then
echo
echo "Non si possono più aprire altri window manager."
echo
exit 1
elif [ "$wm_remaining" -gt 0 ] && [ "$wm_remaining" -le 6 ] ; then
echo
echo "Window Manager che si possono ancora aprire: $wm_remaining"
echo
exit 0
else
echo
echo "Risultano $wm_reamining window manager aperti."
echo "Attenzione, il massimo dovrebbe essere 6, se"
echo "sono stati aperti tutti con questo programma"
echo "per favore segnalere la cosa a luigi.b@aliceposta.it."
echo "Grazie :-)"
fi
#
# L'opzione "--myxinitrc-restore" ripristina il file
# precedentemente salvato dal programma.
# Vedi anche le note sopra.
#
elif [ "$1" = "--myxinitrc-restore" ] ; then
echo
echo -n "Sto ripristinando il file..."
`mv $MYXINITRC_SAVE $MYXINITRC`
`sleep 2`
echo " fatto!"
`sleep 1`
echo
exit 0
#
# L'opzione "--help" stampa un aiuto
#
elif [ "$1" = "--help" ] ; then
echo
echo -e "\n\n\033[1mxstart\033[0m è un comando che va a sostituire startx.
Più che sostituire sarebbe meglio dire integrare
in quanto alla fine viene comunque eseguito startx.
Le opzioni possibili sono:
--help stampa questo scritto
-q elenca i window manager
disponibili.
--myxinitrc-save crea una copia di backup del
file \"~/.xinitrc\" nel file
\"~/.xstart_save.xinitrc\".
si può ripristinare con
l'opzione \"--myxinitrc-restore\"
--myxinitrc-restore ripristina il file \"~/.xinitrc\"
originale.
Se si vuole farlo manualmente
bisogna rinominare il file
\"~/.xstart_save.xinitrc\"
precedentemente salvato dal
programma sovrascrivendo il
link simbolico creato da
xstart.
--display-counter Visualizza il numero dei window
manager aperti e il numero di
quanti se ne possono ancora aprire.
L'uso è semplice, per avviare un window manager
basta dare il suo nome come argomento (esempio:
\"xstart kde\"), se viene dato il comando xstart
senza argomenti verrà caricato l'ultimo window
manager usato.
Anche la gestione dei window manager multipli è
molto semplice, basta accedere ad una console
virtuale non utilizzata con X e usare
normalmente il programma.
L'unica accortezza nel caso che si decida di
lanciare il programma in background, ovvero
con l'opzione \"&\", è di usare un'altra
console vistuale, in caso contrario il sistema
restituirà un errore.
Con l'opzione \"--display-counter\" si visualizza
da qualsiasi posizione il numero di window manager
aperti.
Per qualsiasi problema inviare una mail a
luigi.b@aliceposta.it
(\"q\" per uscire)
Buon divertimento... :-)" | less -r
echo
exit 0
#
# Crea il link simbolico allo "/etc/X11/xinit/xinitrc"
# corrispondente al window manager selezionato.
#
elif [ -e "$XINITRC_PATH$1" ] ; then
`ln -sf $XINITRC_PATH$1 ~/.xinitrc`
#
# Se il window manager indicato non esiste non verrà
# creato nessun link, verrà chiesto se si desidera
# avviare l'ultimo window manager usato, in caso
# contrario verrà stampato un messaggio di aiuto
# e verrà restituito il prompt dei comandi
#
elif [ ! -z "$1" ] ; then
echo
echo "ATTENZIONE: \"$1\" non è un window manager presente"
echo "nel sistema e non è un'opzione valida, digitate \"yes\""
echo "e invio per avviare l'ultimo window manager usato,"
echo "invio per visualizzare un messaggio di aiuto e"
echo -n "tornare al prompt..."
read option
if [ "$option" != "yes" ] ; then
echo
echo "Usate l'opzione \"-q\" per visualizzare"
echo "i window manager disponibili o l'opzione"
echo "\"--help\" per visualizzare le opzioni"
echo "disponibili."
echo
exit 1
fi
fi
#
# Controlla di essere in una console virtuale "tty", in
# caso contrario stampa un messaggio di errore ed esce.
#
if [ -z "$mytty" ] ; then
echo
echo "Attenzione: non si può avviare un window"
echo -n "manager da questa console, invio per uscire..."
read
echo
exit 1
fi
#
# Controlla se ci sono più di 6 window manager aperti, questo
# perchè è il massimo gestibile in modo semplice con i tasti
# Fx, comunque 6... direi che bastano!!! ;-)
# Potrebbe considerarsi una funzione poco utile visto che
# comunque ogni window manager si può aprire da una console
# virtuale e queste al massimo sono 6, però ho preferito
# scriverla per una questione di sicurezza, non... si sa mai!!!
#
if [ "$wm_counter" -gt 6 ] ; then
echo
echo "Attenzione: non si possono aprire più di 6 window manager."
echo -n "Invio per uscire......"
read
echo exit 1
fi
#
# Variabile contenente i numeri dei display aperti. Ho deciso di
# scriverla qua in quanto rallenta leggermente l'esecuzione del
# programma e a volte si ha solo bisogno di usare xstart per una
# opzione.
#
DISPLAY_OPENED=`ps --user root l | grep 'X :' | grep -v grep | cut -d: -f3 | cut -c1 | sort`
#
# Funzione per determinare il primo display disponibile (su 6).
#
for display in "0" "1" "2" "3" "4" "5" ; do
for counter in 1 2 3 4 5 6 ; do
# Divide i numeri dei display uno a uno
display_test=`echo $DISPLAY_OPENED | tr -d " " | cut -c$counter`
# Se "display" trova una corrispondenza con "display_test"
# allora il numero contenuto in display corrisponde a un
# numero di display occupato, assegna una stringa nulla
# a "display" (che sevirà anche al ciclo esterno) ed esce
# dal ciclo.
if [ "$display" = "$display_test" ] ; then
display=""
break
fi
done
# Se "display" non contiene una stringa nulla allora non c'è
# una corrispondenza con il relativo display aperto, questo
# vuol dire che si può aprire questo display.
if [ ! -z "$display" ] ; then
break
fi
done
#
# Funzioni per avvertire che c'è già uno o più window manager aperto,
# visualizzare quanti ne sono aperti e opzione per continuare o uscire.
#
if [ "$wm_counter" -ge 1 ] ; then
if [ "$wm_counter" -eq 1 ] ; then
echo
echo "Attenzione: c'è già un window manager aperto, se si vuole"
echo "continuare premere invio, altrimenti digitare 1 e invio"
echo "per uscire."
else
echo
echo "Attenzione: ci sono già $wm_counter window manager aperti, se si"
echo "vuole continuare premere invio, altrimenti digitare 1 e invio"
echo "per uscire."
fi
echo "Nel caso si continui, per accedere a questo window manager"
echo "da un'altro window manager o una console usare la combinazione"
echo "di tasti Ctrl+Alt+Fx in cui x è un tasto compreso tra \"F7\" e"
echo -n "\"F12\"............"
read option
if [ "$option" -eq 1 ] ; then
echo
exit 1
fi
`startx -- :$display`
exit 0
else
`startx`
exit 0
fi