Vous n'êtes pas identifié(e).
voila je me lance dans un petit projet d'auto configuration du multiscreen !
Le script pour le momment détecte automatiquement le nombre d'écran et les aligne en bureau étendu, a l'avenir il aceptera un fichier de configuration pour personalisé l'enplacement des écrans.
Nom du script : vp-screen
#!/bin/bash
version=0.4
#######################################################################################
# fonction pour afficher ce que fait le scrip
#######################################################################################
fnusage() {
echo "vp-screen $version
-c <config file>
--config <config file>
-d daemon mode, autoconfiguration if hotplug/hotunplug screen
--dadmon daemon mode, autoconfiguration if hotplug/hotunplug screen
-h show this message
--help sowh this message
-r <ip> <port> <resolution> activate remote security
--remotedesktop <ip> <port> <resolution> activate remote security
-s Show available monitor
--show Show available monitor
-v show version
--version show version"
}
#######################################################################################
#######################################################################################
# fonction pour deplacer les fenetres aux coordonées négatives
#######################################################################################
fnmovewin() {
x=40 ; y=40
while read id sticky xw yw xs ys host win ; do
if [[ "$sticky" == "0" && ( $xw = -* || $yw = -* ) ]]
then
wmctrl -i -r $id -e 0,$x,$y,-1,-1
x=$(($x + 40))
y=$(($y + 40))
fi
done < <(wmctrl -lG)
unset x
unset y
}
#######################################################################################
#######################################################################################
# fonction pour définir la position des écan par rapport au fichier de conf ou en auto
#######################################################################################
fn_vpscreendef() {
# test du paramètrage et applacation utilisateur ou automatique :
if [[ -n "$monconf" ]]
then
# si fichier conf avec valeur valide : application des setting
while read screen size ; do
(( s=$s+1 ))
ecran[$s]="$screen:$size"
done < <(xrandr | grep --no-group-separator -A1 -P '^(?!VIRTUAL).* connected' | awk '{print $1}' | sed 'N;s/\n/ /g')
# unset $s for service loop
unset s
for mon in $monconf
do
if [[ "${mon#*:}" = L* ]]
then
xrds[${mon%%:*}]="--output ${ecran[${mon%%:*}]%%:*} --mode ${ecran[${mon%%:*}]##*:} --left-of ${ecran[${mon##*:}]%%:*} "
elif [[ "${mon#*:}" = R* ]]
then
xrds[${mon%%:*}]="--output ${ecran[${mon%%:*}]%%:*} --mode ${ecran[${mon%%:*}]##*:} --right-of ${ecran[${mon##*:}]%%:*} "
else
xrds[${mon%%:*}]="--output ${ecran[${mon%%:*}]%:*} --mode ${ecran[${mon%%:*}]##*:} "
fi
done
else
# si pas de fichier de conf ou valeur non trouver : alors application automatique des ecrans trouver
while read screen size ; do
(( s=$s+1 ))
ecran[$s]="$screen:$size"
if [[ "$s" = 1 ]]
then
xrdb="$xrdb --output ${ecran[$s]%%:*} --mode ${ecran[$s]##*:} "
else
(( er=er+1 ))
xrds[$er]="--output ${ecran[$s]%%:*} --mode ${ecran[$s]##*:} --right-of ${ecran[$er]%%:*} "
fi
done < <(xrandr | grep --no-group-separator -A1 -P '^(?!VIRTUAL).* connected' | awk ' {print $1}' | sed 'N;s/\n/ /g')
# unset $s for service loop
unset s
fi
}
#######################################################################################
#######################################################################################
# fonction d'application des écrans définis
#######################################################################################
fnvpscreenapply() {
# importation du fichier de conf ##
source ${confile:=~/.vp-screenrc}
###################################
#######base de la commande :#######
xrdb="xrandr --output VIRTUAL1 --off "
###################################
#définition des écran disconected #
while read discoscreen ; do
(( d=d+1 ))
discoscreen[$d]="$discoscreen"
xrdd[$d]="--output ${discoscreen[$d]} --off "
done < <(xrandr | grep -P '^(?!VIRTUAL).* disconnected' | awk '{print $1}')
###################################
# unset $d for service loop
unset d
###################################
# calcul du nombre d'ecran ########
nbm=$(xrandr | grep -c -P '^(?!VIRTUAL).* connected')
# définition du parametrage utilisateur :
eval monconf="\$m$nbm"
###################################
### generation des options pour les ecrans actif##
fn_vpscreendef
##################################################
## application des settings :
## de base et ecran déconectées ##
$xrdb${xrdd[*]}
#unset $xrdd for service loop
unset xrdd
sleep 1
## des ecran actif : #############
cxs="debut"
while [[ -n "$cxs" ]] ; do
(( cs=$cs+1 ))
if [[ -n ${xrds[$cs]} ]]
then
xrandr ${xrds[$cs]}
sleep 1
fi
cxs=${xrds[$cs]}
done
#unset $cs $cxs $xrds for service loop
unset xrds
unset cs
unset cxs
}
#######################################################################################
#######################################################################################
# fonction pour relancer nitrogen si il est présent
#######################################################################################
fnnitro() {
if hash nitrogen 2> /dev/null
then
nitrogen --restore
fi
}
#######################################################################################
#######################################################################################
# fonction pour exécuté le script en mode service pour le hotplug/unplug des écrans
#######################################################################################
fnvp-screenservice() {
nmd=$(grep 'disconnected' /sys/class/drm/card*/status | wc -l )
while : ; do
if [[ $nmd = $(grep 'disconnected' /sys/class/drm/card*/status | wc -l ) ]]
then
echo $nmd > /dev/null
else
nmd=$(grep 'disconnected' /sys/class/drm/card*/status | wc -l )
fnvpscreenapply
fnnitro
fnmovewin
fi
sleep 3
done
}
#######################################################################################
#######################################################################################
# fonction pour exécuté le script avec secuisation d'une prise de bureau à distance
#######################################################################################
fnremotedesktop() {
rm ~/.screenlayout/disconected
rm ~/.screenlayout/conected
xrandr --addmode VIRTUAL1 $resordp
while :
do
netstat -ant | grep "$iprdp:$portrdp .*ESTABLISHED" > /dev/null
if [[ "$?" = "0" ]]
then
if [[ -f ~/.screenlayout/conected ]]
then
touch ~/.screenlayout/conected
else
##~/.screenlayout/Off.sh
while read discoscreen ; do
(( rd=rd+1 ))
discoscreen[$rd]="$discoscreen"
xrdrd[$rd]="--output ${discoscreen[$d]} --off "
done < <(xrandr | grep -P '^(?!VIRTUAL1).*connected' | awk '{print $1}')
xrandr ${xrdrd[*]}
xrandr --output VIRTUAL1 --mode $resordp
unset xrdrd
touch ~/.screenlayout/conected
rm ~/.screenlayout/disconected 2> /dev/null
fi
else
if [[ -f ~/.screenlayout/disconected ]]
then
touch ~/.screenlayout/disconected
if [[ $nmd = $(grep 'disconnected' /sys/class/drm/card*/status | wc -l ) ]]
then
echo $nmd > /dev/null
else
nmd=$(grep 'disconnected' /sys/class/drm/card*/status | wc -l )
fnvpscreenapply
fnnitro
fnmovewin
fi
sleep 3
else
fnvpscreenapply
fnnitro
fnmovewin
touch ~/.screenlayout/disconected
rm ~/.screenlayout/conected 2> /dev/null
rm -rf ~/.nx/*
fi
fi
sleep 2
done
}
#######################################################################################
#######################################################################################
# Début du script !
#######################################################################################
### Gestion des options ###########
while [[ -n "$1" ]] ; do
case $1 in
-c|--config)
if [[ -n "$2" && "$2" != -* ]]
then
confile=$2
shift
else
fnusage
exit 1
fi
;;
-d|--daemon)
daemon="yes"
;;
-r|--remotedesktop)
if [[ -n "$2" && "$2" != -* && -n "$3" && "$3" != -* && -n "$4" && "$4" != -* ]]
then
iprdp=$2
portrdp=$3
resordp=$4
fnremotedesktop
else
fnusage
exit 1
fi
;;
-s|--show)
echo -e "list of your monitors plugged :\nNumber\tid\tName\t\tresolution"
while read screen size ; do
(( s=$s+1 ))
name=$(monitor-parse-edid /sys/class/drm/card*${screen%%[[:digit:]]*}-$(echo ${screen##*[[:alpha:]]} | sed 's/-/+/'| bc -l)/edid | sed -n 's/^Name: \(.*$\)/\1/p')
echo -e "$s\t$screen\t${name:-no name\t}\t$size"
done < <(xrandr | grep --no-group-separator -A1 -P '^(?!VIRTUAL).* connected' | awk '{print $1}' | sed 'N;s/\n/ /g')
exit 0
;;
-v|--version)
echo "vp-screen $version"
exit 0
;;
--)
break
;;
*|-h|--help)
fnusage
exit 0
;;
esac
shift
done
###################################
if [[ "$daemon" = yes ]]
then
fnvp-screenservice
else
fnvpscreenapply
fnnitro
fnmovewin
fi
la suite au prochain numero Merci a Coreblah pour la puissance de son grep
Edit : Voila la version 4 :
possibilité de le lancer en mode "daemon", permettant la gestion automatique du plug unplug d'ecran ( très pratique avec une docking station )
possibilité de lancer le script en mode : "remote desktop", permetant de sécurisé les écran physique quand on prend sa station en VNC, no machin, etc..
Et plien de truc en plus , optimisation, etc...
Merci de me faire le plus de retour, de testé avec des pc a plusieur carte graphique, etc, et me remonté les bug.
Dernière modification par penthium2 (13-11-2015 18:04:33)
vi est mon ami pour la vie
Ph'nglui nglw-nafh Cthulhu R'lyeh wgah-nagl fhtagn
Hors ligne
Voila la version 0.1 du script !!
Il gère maintenant la possibilité d'un fichier de conf ~ /.vp-screenrc :
# Configuration file for vp-screen
#
#
# First run vp-screen -s to show your available screen
#
# Then store in this file your configuration choise like that :
#
# <id screen>:<position>
# L for left
# C for center
# R for right
#
# Exemple for Dual monitor :
# 1:L 2:R
#
# Exemple for Triple monitor :
# 2:L 1:C 3:R
#
# Exemple for Quad monitor :
# 2:L 3:L 1:C 4:R
#
#
# Your can chose your configuration to 4 monitor
# m2 = 2 monitors
# m3 = 3 monitors
# m4 = 4 monitors
#
# Exemple :
# triple screen
# m3="2:L:1 1:C 3:R:1"
# quad screen
# m4="1:L:2 2:L4 3:C 4:R:2"
#
m2="1:C 2:R:1"
m3="3:L:1 1:C 2:R:1"
m4=""
Et voila le script vp-screen
#!/bin/bash
version=0.1
fnusage() {
echo "vp-screen $version
-c <config file>
--config <config file>
-h show this message
--help sowh this message
-s Show available monitor
--show Show available monitor
-v show version
--version show version"
}
while [[ -n "$1" ]] ; do
case $1 in
-c|--config)
if [[ -n "$2" && "$2" != -* ]]
then
confile=$2
shift
else
fnusage
exit 1
fi
;;
-s|--show)
echo -e "list of your monitors plugged :\nNumber\tName\tresolution"
while read screen size ; do
(( s=$s+1 ))
echo -e "$s\t$screen\t$size"
done < <(xrandr | grep --no-group-separator -A1 '^[^V].* connected' | awk '/^[^V].*$/ {print $1}' | sed 'N;s/\n/ /g')
exit 0
;;
-v|--version)
echo "vp-screen $version"
exit 0
;;
--)
break
;;
*|-h|--help)
fnusage
exit 0
;;
esac
shift
done
# importation du fichier de conf
source ${confile:=~/.vp-screenrc}
# calcul du nombre d'ecran
nbm=$(xrandr | grep -c '^[^V].* connected')
# définition du parametrage utilisateur :
eval monconf="\$m$nbm"
#
#base de la commande :
xrdb="xrandr --output VIRTUAL1 --off "
# test du paramètrage et applacation utilisateur ou automatique :
if [[ -n "$monconf" ]]
then
# si fichier conf avec valeur valide : application des setting
while read screen size ; do
(( s=$s+1 ))
ecran[$s]="$screen:$size"
done < <(xrandr | grep --no-group-separator -A1 '^[^V].* connected' | awk '/^[^V].*$/ {print $1}' | sed 'N;s/\n/ /g')
for mon in $monconf
do
if [[ "${mon#*:}" = L* ]]
then
xrds[${mon%%:*}]="--output ${ecran[${mon%%:*}]%%:*} --mode ${ecran[${mon%%:*}]##*:} --left-of ${ecran[${mon##*:}]%%:*} "
elif [[ "${mon#*:}" = R* ]]
then
xrds[${mon%%:*}]="--output ${ecran[${mon%%:*}]%%:*} --mode ${ecran[${mon%%:*}]##*:} --right-of ${ecran[${mon##*:}]%%:*} "
else
xrds[${mon%%:*}]="--output ${ecran[${mon%%:*}]%:*} --mode ${ecran[${mon%%:*}]##*:} "
fi
done
else
# si pas de fichier de conf ou valeur non trouver : alors application automatique des ecrans trouver
while read screen size ; do
(( s=$s+1 ))
ecran[$s]="$screen:$size"
if [[ "$s" = 1 ]]
then
xrdb="$xrdb --output ${ecran[$s]%%:*} --mode ${ecran[$s]##*:} "
else
(( er=er+1 ))
xrds[$er]="--output ${ecran[$s]%%:*} --mode ${ecran[$s]##*:} --right-of ${ecran[$er]%%:*} "
fi
done < <(xrandr | grep --no-group-separator -A1 '^[^V].* connected' | awk '/^[^V].*$/ {print $1}' | sed 'N;s/\n/ /g')
fi
$xrdb${xrds[*]}
vi est mon ami pour la vie
Ph'nglui nglw-nafh Cthulhu R'lyeh wgah-nagl fhtagn
Hors ligne
Projet intéressant, je n'ai pas encore testé sur une autre distro que viperr afin de voir si il est portable.
Utiliser des logiciels propriétaires, c'est comme les plats préparés, on est incapable de dire les conservateurs qu'ils contiennent, on dira toujours que c'est bon, mais ça ne remplacera jamais le repas fait maison par sa maman.
]:D #! Crunchbang & Archlinux GNU/Linux User ]:D
Hors ligne
Voila la version 4 :
possibilité de le lancer en mode "daemon", permettant la gestion automatique du plug unplug d'ecran ( très pratique avec une docking station )
possibilité de lancer le script en mode : "remote desktop", permetant de sécurisé les écran physique quand on prend sa station en VNC, no machin, etc..
Et plien de truc en plus , optimisation, etc...
Merci de me faire le plus de retour, de testé avec des pc a plusieur carte graphique, etc, et me remonté les bug.
Le sctpit est en haut
vi est mon ami pour la vie
Ph'nglui nglw-nafh Cthulhu R'lyeh wgah-nagl fhtagn
Hors ligne