user@linuxtrack:~ $ python -c 'print("Soyez les bienvenus !")'

Vous n'êtes pas identifié(e).

#1 06-11-2015 16:55:37

penthium2
Modérateur

Projet : script d'auto configuration de la gestion du multiscreen

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 big_smile Cthulhu Merci a Coreblah pour la puissance de son grep big_smile

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.

Cthulhu

Dernière modification par penthium2 (13-11-2015 18:04:33)


vi est mon ami pour la vie
Viperr
Ph'nglui nglw-nafh Cthulhu R'lyeh wgah-nagl fhtagn

Hors ligne

#2 10-11-2015 15:27:02

penthium2
Modérateur

Re : Projet : script d'auto configuration de la gestion du multiscreen

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[*]}

Cthulhu


vi est mon ami pour la vie
Viperr
Ph'nglui nglw-nafh Cthulhu R'lyeh wgah-nagl fhtagn

Hors ligne

#3 10-11-2015 19:34:56

IceF0x
#! Gourou Linux

Re : Projet : script d'auto configuration de la gestion du multiscreen

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

#4 13-11-2015 18:05:03

penthium2
Modérateur

Re : Projet : script d'auto configuration de la gestion du multiscreen

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  Cthulhu


vi est mon ami pour la vie
Viperr
Ph'nglui nglw-nafh Cthulhu R'lyeh wgah-nagl fhtagn

Hors ligne

Pied de page des forums