# power-xfce

## HoX

Dopo giorni di lavoro inizio finalmente ad intravedere la possibilità di fare ciò che voglio io con xfce4 e visto che ci sto sclerando sopra vi informo su cosa sono riuscito a fare sperando che a qualcuno interessi...

1. Ogni workspace ha un suo wallpaper

Per abilitare questa funzione bisogna (almeno per ora... ci sto lavorando su) rinunciare alle icone sul desktop e al menù a cascata sul desktop con il tasto destro del mouse... se si è disposti a ciò inserire script (vedi dopo) in Autostart ("Settings"->"Autostarted application")

```

#!/bin/bash

#Cambia il wallpaper sulla rootwindow in base al workspace

#Controlla il workspace iniziale

OLD_WORKSPACE=`xprop -root | grep ^_NET_CURRENT_DESKTOP | tail -c 2`

CURRENT_WORKSPACE=$OLD_WORKSPACE

#cartella contenente i wallpaper

DESKTOP_DIR=~/.desktop

while true

do

   CURRENT_WORKSPACE=`xprop -root | grep ^_NET_CURRENT_DESKTOP | tail -c 2`

        #controlla se è cambiato il workspace e in tal caso aggiorna lo sfondo

   if [[ CURRENT_WORKSPACE -ne OLD_WORKSPACE ]]

   then

      OLD_WORKSPACE=$CURRENT_WORKSPACE

      feh --bg-scale $DESKTOP_DIR/$CURRENT_WORKSPACE.jpg

   fi

done

```

I wallpaper devono essere copiati nella cartella ~/.desktop e devono avere il nome "<numero_workspace da 0 a X>.jpg"... questo almeno per ora... lo imposterò poi meglio

2. Abilitare il composite sulla root window

Per abilitare il composite sulla root window (cosa normalmente non possibile) è necessario emergere XFCE con il seguente comando:

```
CFLAGS="$CFLAGS -DMONITOR_ROOT_PIXMAP" emerge -1 xfwm4
```

e poi impostarlo normalmente da "Settings"->"Window Manager Tweaks"

TO-DO

Wallpaper che cambia ogni N secondi

Wallpaper di formati diversi dal jpg

Supporto per wallpaper animati tramite xscreensaver -root

Cambiamento pannelli da un workspace all'altro

Inserimento icone desktop

PS:se avete richieste e/o suggerimenti e/o critiche e/o ritenete che questo "how-to" sia del tutto inutile siete pregati di avvisare

----------

## ProT-0-TypE

domanda da niubbo.. ma le icone nel desktop non ci sono già nell'ultima versione di xfce?

----------

## HoX

 *ProT-0-TypE wrote:*   

> domanda da niubbo.. ma le icone nel desktop non ci sono già nell'ultima versione di xfce?

 

si... xò sono gestite da xfdesktop e (come detto) per avere più wallpaper (uno o più per ogni workspace) bisogna usare la root window e rinunciare alle a xfdesktop (e di conseguenza alle icone sul desktop)...

avevo provato a risolvere questo problema usando il comando xfdesktop --reload dopo aver modificato il file ~/.config/xfce4/mcs_settings/desktop.xml dove è contenuto il parametro del wallpaper, ma per ora non ho avuto successo...

al momento sto lavorando (con successo?!) alla possibilità di cambiare wallpaper ogni tot secondi e al supporto per formati diversi dal jpg

----------

## ProT-0-TypE

si vede che uso Gnome?   :Laughing: 

----------

## HoX

 *ProT-0-TypE wrote:*   

> si vede che uso Gnome?  

 

già... ma sbaglio o gnome usa direttamente la root window anzichè un fake come xfce4 e kde?

----------

## Cazzantonio

Non è che a breve è previsto che supporti l'apertura predefinita di determinati programmi su specifici desktop vero? Bisogna ancora appoggiarsi a programmi esterni?

Lo so di essere schizzinoso ma potrò interessarmi a xfce (che mi piace... davvero!) solo quando supporterà nativamente questa feature per me indispensabile.   :Smile: 

----------

## HoX

 *Cazzantonio wrote:*   

> Lo so di essere schizzinoso ma potrò interessarmi a xfce (che mi piace... davvero!) solo quando supporterà nativamente questa feature per me indispensabile.  

 

Avevo il tuo stesso problema... ma anzichè gettare la spugna ho preferito scrivermi questo script per risolvermi il problema e se poi lo implementeranno fa lo stesso... per ora mi diverto  :Very Happy: 

cmq il mio "programma" si sta generalizzando... ora il programma base gestisce solo il cambio di workspace e delega a dei plugin (altri script o programmi) tutto il resto tra cui:

cambio wallpaper su root window

wallpaper che cambiano ogni x secondi su root window

panel diverse da un workspace al successivo

e per ora ho sviluppato solo questi tre... il vantaggio di non fossilizzarsi solo su xfce4 (come avevo pensato di fare all'inizio) è che si può aggiungere qualunque funzione per qualunque DE...

Sto anche studiando un sistema per trasformare il wallpaper in un calendario gestibile dai pannelli... ma per quello ci metterò un po' di più

----------

## TwoMinds

...xfce è bello e leggero... optionals si trovano negli extras... perché non implementi qualcosa tipo xfce4-bglist-editor, che sembra scomparso però...  :Neutral: 

----------

## HoX

 *TwoMinds wrote:*   

> ...xfce è bello e leggero... optionals si trovano negli extras... perché non implementi qualcosa tipo xfce4-bglist-editor, che sembra scomparso però... 

 

quello lì ti elenca solo i background disponibili, ma non ti permette di fare l'associazione tra workspace e background.

Usando il mio script è possibile personalizzare non solo xfce (che sto usando per i test), ma eventualmente anche di personalizzare KDE, GNOME o qualunque altro DE/WM in X che supporti workspace multipli.

----------

## TwoMinds

...si lo so... infatti ho scritto "qualcosa tipo"... l'idea del plugin rende più consistente e feconda la realizzazione... imho...

----------

## HoX

 *TwoMinds wrote:*   

> l'idea del plugin rende più consistente e feconda la realizzazione... imho...

 

In che senso?

----------

## TwoMinds

...nel senso: un plugin stile goodies di xfce ha più potenzialità che una serie di script... non voglio dire è sbagliato... ci mancherebbe!!!... il bello è che ci sono molti modi per ottenere gli stessi risultati... realizzando un plugin si potrebbe aspirare a renderlo un vero goodies, richiamare più attenzione, sperare anche in aiuto etc... senza contare i vantaggi di potersi appoggiare "nativamente" a xfce... sempre imho...

----------

## HoX

 *TwoMinds wrote:*   

> ...nel senso: un plugin stile goodies di xfce ha più potenzialità che una serie di script... non voglio dire è sbagliato... ci mancherebbe!!!... il bello è che ci sono molti modi per ottenere gli stessi risultati... realizzando un plugin si potrebbe aspirare a renderlo un vero goodies, richiamare più attenzione, sperare anche in aiuto etc... senza contare i vantaggi di potersi appoggiare "nativamente" a xfce... sempre imho...

 

Il problema è che in quel caso sarebbe funzionale solo per XFCE... con lo script "pluggabile" invece si può supportare qualunque DE....  come supporto il goodies è sicuramente migliore, come versatilità però preferisco il plugin... cmq per ora sto lavorando al plugin (con soddisfazione)... magari appena finisco cerco un po' di doc è faccio un plugin-goodies (più limitato) per XFCE

----------

## TwoMinds

 *Anema wrote:*   

> Il problema è che in quel caso sarebbe funzionale solo per XFCE... con lo script "pluggabile" invece si può supportare qualunque DE....  come supporto il goodies è sicuramente migliore, come versatilità però preferisco il plugin... cmq per ora sto lavorando al plugin (con soddisfazione)... magari appena finisco cerco un po' di doc è faccio un plugin-goodies (più limitato) per XFCE

 

...si certo... solo xfce... il topic si intitola "power xfce"... :) ...continua a riportare qualsiasi progresso qui... li seguirò volentieri... buon lavoro... ^_^

----------

## HoX

 *TwoMinds wrote:*   

> ...si certo... solo xfce... il topic si intitola "power xfce"...  ...continua a riportare qualsiasi progresso qui... li seguirò volentieri... buon lavoro... ^_^

 

E lo so... all'inizio avevo puntato su xfce e quindi l'avevo chiamato così... poi mi sono reso conto di poter usare lo stessa sistema per andare oltre e quindi ho deciso di generalizzarlo. cmq ti terrò informato

----------

## HoX

Rieccomi!!! Dopo numerosi tentativi e altrettanto numerosi "così non mi piace, riparto da 0" eccovi le prime ultra-alpha (probabilmente le ricambierò) del mio progettino:

Allora questo è lo script principale:

```
#!/bin/bash

### WsM ###

### WsM - Workspace Manager consente di modificare le impostazioni di ogni singolo workspace tramite appositi plugin

##Informazioni varie sul programma

NAME=WsM

VERSION=0.1a

AUTHOR="HoX"

DESCRIPTION="Personalizza ogni workspace tramite plugin esterni"

USAGE="`basename $0` [Opzioni]

   --config   -c   =<config-file>      Usa un altro file di configurazione

   --log      -l   =<log-file>      Usa un altro log file

   --version   -v   Versione del programma

   --help      -h   Questa schermata

   --quit      -q   Chiude tutti i processi WsM attivi

   --restart   -r   Riavvia WsM"

### Lettura argomenti

#Gli argomenti sono passati nelle seguenti forme:

#   --nome-argomento=<valore>   

#   -n=<valore>

#(NB: non tutti gli argomenti richiedono un valore)

##Funzioni per la lettura degli argomenti

#Legge il nome dell'argomento

getArg() {

   echo $1 | cut -d'=' -f1

}

#Legge il valore dell'argomento

getArgValue() {

   echo $1 | cut -d'=' -f2

}

#Mostra [nome,versione,autore] del software

showInfo() {

   echo -n "$NAME - version $VERSION (by $AUTHOR)"

}

#Avvia la scansione degli argomenti

for i in $@

do

   case "`getArg $i`" in

      "-v" | "--version" )   

         showInfo

         exit 0 ;;

      "-h" | "--help" )

         showInfo

         echo "$DESCRIPTION"

         echo "$USAGE"

         exit 0 ;;

      "-c" | "--config" )

         CONFIG_FILE=`getArgValue $i` ;;

      "-l" | "--log" )

         LOG_FILE=`getArgValue $i` ;;

   esac

done

#Controlli inerenti al file di configurazione

if [ -z $CONFIG_FILE ]

then

   CONFIG_FILE=~/.config/WsM.conf

fi

if [ ! -e $CONFIG_FILE ]

then

   echo "Impossibile trovare il file di configurazione: $CONFIG_FILE"

   echo "Per specificare un file di configurazione personalizzato usare il comando: "

   echo "           CONFIG_FILE=<file-di-configurazione> $0"

   exit 1

fi

#Carica la cartella con le librerie

LIBS_DIR=`grep LIBS_DIR $CONFIG_FILE | grep -v '\#' | cut -f2` #cartella contenente le librerie

if [ ! -d $LIBS_DIR ]

then

   echo "Impossibile aprire la directory con le librerie: $LIBS_DIR"

   exit 1

fi

#Funzioni varie

###Funzioni per gestire il file di configurazione

##   Il file di configurazione e' scritto in formato

##   NOME_OPZIONE <tab> OPZIONE <tab> VALORE_OPZIONE

#Legge l'opzione $1 nel file di configurazione

getOption() {

   grep $1 $CONFIG_FILE | grep -v '\#' | cut -f2

}

#Legge il valore dell'opzione $1 nel file di configurazione

getOptionValue() {

   grep $1 $CONFIG_FILE | grep -v '\#' | cut -f3

}

##Funzioni riguardanti i workspace

#Restituisce il numero dei workspace

getWorkspaceNum() {

   xprop -root | grep ^_NET_NUMBER_OF_DESKTOPS | cut -d' ' -f3

}

#Restituisce il numero del workspace attuale

getWorkspace() {

   xprop -root | grep ^_NET_CURRENT_DESKTOP | cut -d' ' -f3

}

#Legge tutti i comandi del workspace $1 ($1 e' un intero)

getWorkspaceCommand() {

   local LOADING_WORKSPACE_COMMAND="`getOption WORKSPACE_$1_COMMAND`"

   local LOADING_WORKSPACE_COMMAND_NUMBER=`echo "$LOADING_WORKSPACE_COMMAND" | wc -l`

   local LOADED_WORKSPACE_COMMAND=""

   for (( c=1 ; c <= $LOADING_WORKSPACE_COMMAND_NUMBER ; c++ ))

   do

      COMMAND_NUMBER_C=`echo "$LOADING_WORKSPACE_COMMAND" | head -n $c | tail -n 1`

      LOADED_WORKSPACE_COMMAND="$LOADED_WORKSPACE_COMMAND `echo "$PLUGIN" | grep "$COMMAND_NUMBER_C" | cut -f2`;"

   done

   LOADED_WORKSPACE_COMMAND="`echo $LOADED_WORKSPACE_COMMAND | tr ';' '\n'`"

   echo "$LOADED_WORKSPACE_COMMAND"

}

#Legge tutti gli argomenti passati ai comandi del workspace $1

getWorkspaceCommandArguments() {

        local ARGUMENTS_REQUIRED="`getOptionValue WORKSPACE_$1_COMMAND`"

   local ARGUMENTS_REQUIRED_NUMBER=`echo "$ARGUMENTS_REQUIRED" | wc -l`

        local ARGUMENTS_READY=""

   for (( c=1 ; c <= $ARGUMENTS_REQUIRED_NUMBER ; c++ ))

   do

           for i in `echo "$ARGUMENTS_REQUIRED" | head -n $c | tail -n 1`

           do

                   case $i in

                      "CONFIG" )

                    ARGUMENTS_READY="$ARGUMENTS_READY -c=$CONFIG_FILE" ;;    

   

            "LOG" )

               ARGUMENTS_READY="$ARGUMENTS_READY -l=$LOG_FILE" ;;

   

                      "WORKSPACE")

               ARGUMENTS_READY="$ARGUMENTS_READY -w=$CURRENT_WORKSPACE" ;;

   

                      * )

               ARGUMENTS_READY="$ARGUMENTS_READY $i" ;;

                   esac

           done

      ARGUMENTS_READY="$ARGUMENTS_READY;"

   done

        echo "$ARGUMENTS_READY" | tr ';' '\n'

}

switchWorkspace() {

   #Uccide i processi avviati dal workspace precedente

   if [[ $OLD_WORKSPACE -ne $WORKSPACE_NUMBER ]]

   then

      kill $PID_COLLECTOR   

   fi

   #Conta quanti comandi devono essere eseguiti per il prossimo workspace

   echo $CURRENT_WORKSPACE >> ~/ciao

   local COMMAND_NUMBER=`echo "${WORKSPACE_COMMAND[$CURRENT_WORKSPACE]}" | wc -l`

   #Avvia i processi del nuovo workspace

   PID_COLLECTOR=""

   for (( c=1 ; c <= $COMMAND_NUMBER ; c++ ))

   do

      echo $c "<" $COMMAND_NUMBER >> ~/ciao

      COMMAND=`echo "${WORKSPACE_COMMAND[$CURRENT_WORKSPACE]}" | head -n $c | tail -n 1` 

      echo $c $COMMAND >> ~/ciao

      COMMAND_ARGUMENTS=`echo "${WORKSPACE_COMMAND_ARGUMENTS[$CURRENT_WORKSPACE]}" | head -n $c | tail -n 1`

      echo $c $COMMAND_ARGUMENTS >> ~/ciao

      RUN_COMMAND="$COMMAND $COMMAND_ARGUMENTS"

      echo $c $RUN_COMMAND >> ~/ciao

      $RUN_COMMAND >> $LOG_FILE &

      PID_COLLECTOR="$PID_COLLECTOR $!"

   done

}

#Avvia il log file

if [ -z "$LOG_FILE" ]

then

   LOG_FILE=`getOption LOG_FILE`

fi

if [ -z "$LOG_FILE" ]

then

   LOG_FILE=/dev/stdout

fi

DATE_FORMAT=`getOption DATE_FORMAT`

if [ -z "$DATE_FORMAT" ]

then

   DATE_FORMAT="%d/%m/%y - %H.%M.%S"

fi

   

#Azzera il file di log

#echo -n "" > $LOG_FILE

#Funzione per inviare messaggi al LogFile

logMsg() {

   echo `date +"$DATE_FORMAT"`: $@ >> $LOG_FILE

}

#Avvia il programma

logMsg WsM: Avviato WsM

#Carica le impostazioni sui workspace

WORKSPACE_NUMBER=`getWorkspaceNum` #Numero massimo di Workspace

logMsg WsM: Numero massimo di workspace: $WORKSPACE_NUMBER

#Imposta OLD_WORKSPACE al numero massimo di workspace

OLD_WORKSPACE=$WORKSPACE_NUMBER

#Carica i plugin

logMsg WsM: Caricamento plugin...

PLUGIN="`grep PLUGIN $CONFIG_FILE | grep -v '\#' | cut -f2,3`"

logMsg WsM: "Fatto! (Caricati `echo "$PLUGIN" | wc -l` plugin)"

#Carica le impostazioni (plugin -> argomenti) per ogni workspace

logMsg WsM: Caricamento comandi...

for ((w=0; w < WORKSPACE_NUMBER; w++))

do

      WORKSPACE_COMMAND[$w]="`getWorkspaceCommand $w`"

      WORKSPACE_COMMAND_ARGUMENTS[$w]="`getWorkspaceCommandArguments $w`"

done

logMsg Fatto!

#Ciclo principale

while true

do

   CURRENT_WORKSPACE=`getWorkspace`

   if [[ $CURRENT_WORKSPACE -ne $OLD_WORKSPACE ]]

   then

      switchWorkspace

      OLD_WORKSPACE=$CURRENT_WORKSPACE

   fi

   sleep 0.5

done

```

questo è un WsM.conf di esempio:

```
#LIBS_DIR e' la directory in cui si trovano alcune funzioni necessarie al corretto funzionamento di WsM

LIBS_DIR   /usr/share/testScript/WsMLibs

#Informazioni per il log

LOG_FILE   /dev/stdout

DATE_FORMAT   "%d/%m/%y - %H.%M.%S"

#Plugin

PLUGIN   setWallpaper   /usr/share/testScript/WsMPlugins/setWallpaper

PLUGIN   multiWall   /usr/share/testScript/WsMPlugins/multiWall

#Impostazioni per i workspace

WORKSPACE_0_COMMAND   setWallpaper   SCALE /media/Images/Dark_Girl.jpg

WORKSPACE_1_COMMAND   setWallpaper   SCALE /media/Images/Redhead.jpg

WORKSPACE_2_COMMAND   setWallpaper   SCALE /media/Images/Animali/Gentoo_Penguin.jpg

WORKSPACE_3_COMMAND   setWallpaper   SCALE /media/Images/Fantasy/Angel_Sexy_0.jpg
```

e questi sono i primi due plugin:

setWallpaper

```
#!/bin/bash

### setWallpaper ###

### Cambia il wallpaper sulla root-window corrente usando feh (che è pertanto necessario)

##Informazioni varie sul programma

NAME=setWallpaper

VERSION=0.1

AUTHOR="HoX"

DESCRIPTION="Imposta lo sfondo sulla root-window usando feh"

USAGE="setWallpaper Modo File_immagine

   Modo deve essere uno dei seguenti:

      SCALE   Immagine adattata alle dimensioni dello schermo

      CENTER   Immagine centrata

      TILE   Immagine affiancata

      SEAMLESS   Immagine senza giunture"

#Variabili

FEH_ARGS="" #gli argomenti che saranno passati a feh

FEH_BG_FILE="" #il nome del file di sfondo

#Prepare FEH_ARGS 

case $1 in 

   "-h" | "--help" )

      echo "$NAME - $VERSION ($AUTHOR)"

      echo $DESCRIPTION

      echo $USAGE ;;

   "SCALE" )

      FEH_ARGS="--bg-scale" ;;

   "CENTER" )

      FEH_ARGS="--bg-center" ;;

   "TILE" )

      FEH_ARGS="--bg-tile" ;;

   "SEAMLESS" ) 

      FEH_ARGS="--bg-seamless" ;;

   * )

      echo `date`: setWallpaper: Impossibile impostare lo sfondo!

      echo $USAGE ;;

esac 

#Imposta il file FEH_BG_FILE

FEH_BG_FILE=$2

if [[ ! -e $2 ]]

then

   echo `date`: setWallpaper: "Non esiste il file d'immagine selezionato"

   exit 1

fi

feh $FEH_ARGS $FEH_BG_FILE

if [ $? ]

then

   echo "`date +"%d/%m/%y - %H.%M.%S"`: setWallpaper: File di sfondo ($FEH_BG_FILE) impostato con successo"

else

   echo "`date +"%d/%m/%y - %H.%M.%S"`: setWallpaper: Errore durante l'impostazione dello sfondo ($FEH_BG_FILE)"

fi
```

e multiWall

```
#!/bin/bash

### multiWall ###

### plugin WsM ###

### Consente di avere il wallpaper che cambia ogni DELAY secondi

##Informazioni varie sul programma

NAME=multiWall

VERSION=0.1

AUTHOR="HoX"

DESCRIPTION="Cambia il wallpaper della root window periodicamente"

USAGE="multiWall [Opzioni] NomeLista

   --delay    -d   tempo   Imposta ogni quanto tempo cambia immagine (usa la notazione di sleep) [DEFAULT: 300s]

   --help     -h      Stampa questa pagina

   --random   -r      Ordine casuale

   --version   -v      Informazioni sulla versione"

DELAY_TIME=300

IS_RANDOM=false

for i in $@

do

   case `echo $i | cut -d'=' -f1` in 

      "--delay" | "-d" )

         DELAY_TIME=`echo $i | cut -d'=' -f2` ;;

      "--help" | "-h" )

         echo "$NAME - $VERSION ($AUTHOR)"

         echo "$DESCRIPTION"

         echo "$USAGE"

         exit 0 ;;

      "--random" | "-r" )

         IS_RANDOM=true ;;

      "--version" | "-v" )

         echo "$NAME - $VERSION ($AUTHOR)" 

         exit 0 ;;

      * )

         if [ "$i" != "${!#}" ]

         then

            echo "$i: Invalid argument" 

            exit 1

         fi ;;

   esac

done

LIST_NAME=${!#}

LIST_ENTRIES=`wc -l $LIST_NAME | cut -d' ' -f1`

CURRENT=1

while true

do

   if [ "$CURRENT" -gt "$LIST_ENTRIES" ]

   then

      CURRENT=1

   fi

   if [ $IS_RANDOM ]

   then

      CURRENT=$(( $RANDOM % $LIST_ENTRIES + 1 ))

   fi

   CURRENT_LIST_ITEM=`head -n $CURRENT $LIST_NAME | tail -n 1`

   CURRENT=$(( $CURRENT +1 ))

   feh --bg-scale $CURRENT_LIST_ITEM

   sleep $DELAY_TIME

done
```

che ve ne pare?! domande, suggerimenti, critiche?

----------

## skypjack

Ho deciso di passare a xfce, a che punto siamo con i lavori?  :Very Happy: 

----------

## HoX

 *skypjack wrote:*   

> Ho deciso di passare a xfce, a che punto siamo con i lavori? 

 

come puoi vedere dall'ultimo commento sono finiti... rimane xò il problema che devi rinunciare a xfdesktop (e quindi alle icone sul desktop) xkè uso direttamente la root window per lo sfondo e se vuoi usare il composite devi compilarlo in modo differente (cmq ho scritto tutto sopra)...

tra breve inseriro il cambio wallpaper anche su xfdesktop, ma da dei problemi di perfomance...

----------

