Résolu le 10-11-20 Gerer le passage d'un a deux ecrans (xrandr)

Questions concernant les composants
Répondre
Avatar du membre
david37
modérateur
Messages : 3884
Enregistré le : lun. 22 août 2016 05:06

Gerer le passage d'un a deux ecrans (xrandr)

Message par david37 »

Salut a tous !
Une fois n'est pas coutume, j'ai envie de partager avec vous un problème et une partie de la solution que j'ai trouve mais qui n'est pas encore totalement satisfaisante a mon gout.

Voila le topo:

J'utilise un ordinateur portable (Dell Latitude E7240 avec LM19.3 Xfce dessus) que je connecte de temps a autre a mon écran sur mon bureau (via un adaptateur HDMI / VGA). Dans ce cas la, l’écran est mon écran principal et l’écran du portable me sert de second écran a droite du premier.

Parfois quand je veux travailler ailleurs qu'a mon bureau, j’emmène mon pc portable avec moi mais quand je reviens le brancher a mon écran, il perd la configuration et la disposition des écrans.

Comme j'avais pas envie de passer mon temps a jouer avec l'interface "Display" de xfce, je me suis tourne vers xrandr.
En farfouillant, je me suis aperçu que je pouvais definir ma configuration avec deux petites lignes.
Tout d'abord j'ai identifier mes ecrans avec:

Code : Tout sélectionner

xrandr
qui me donne les infos suivantes:

Code : Tout sélectionner

Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 16384 x 16384
eDP-1 connected 1366x768+1920+0 (normal left inverted right x axis y axis) 277mm x 156mm
   1366x768      60.00*+  40.00  
   1360x768      59.80    59.96  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   800x512       60.17  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   720x450       59.89  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   680x384       59.80    59.96  
   640x400       59.88    59.98  
   576x432       60.06  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  
HDMI-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 476mm x 268mm
   1920x1080     60.00*+  59.94  
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1152x864      75.00  
   1280x720      60.00    59.94  
   1024x768      75.03    60.00  
   800x600       75.00    60.32  
   720x480       60.00    59.94  
   640x480       75.00    60.00    59.94  
   720x400       70.08  
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
L’écran de mon pc portable s'appelle eDP-1 et l’écran de bureau HDMI-1. Donc en rentrant ces deux lignes, je peux avoir ma configuration:

Code : Tout sélectionner

xrandr --output HDMI-1 --mode 1920x1080 --primary
xrandr --output eDP-1 --mode 1366x768 --right-of HDMI-1
La ou ça se complique c'est que pour éviter de taper ces lignes a la main a chaque fois, j'ai voulu créer un script pour le lancer rapidement.
L’idée était que ce script devait se lancer a chaque connexion a ma session, identifier le nombre d’écrans connectes et si il y'en a deux, exécuter les deux commandes ci-dessus.
Donc j'en suis arrive au script suivant:

Code : Tout sélectionner

#!/bin/sh

nb_screen=`xrandr | egrep -c ' connected'`

if [ $nb_screen -eq 2 ]
then
    echo "There is $nb_screen screens detected"
    xrandr --output HDMI-1 --mode 1920x1080 --primary
    xrandr --output eDP-1 --mode 1366x768 --right-of HDMI-1

else
    echo "There is only $nb_screen screen detected, no multi-screen configuration possible"
    xrandr --auto

fi
Au final, ça marche très bien j'ai juste a faire:

Code : Tout sélectionner

sh script_xrandr.sh
Par contre, j'ai toutes les peines du monde a le rendre "actif" des l'ouverture de la session. J'ai essaye de mettre ce script dans le dossier /etc/X11/Xsession.d/ (sous le nom 45x11-xrandr, puis aussi en 99x11-xrandr) et également de l'ajouter a liste des programmes au démarrage. Mais rien n'y fait, ça bugue a chaque fois.
Soit ça prend pas en compte le script, soit je me retrouve avec les écrans superposes.

En gros mes questions sont:
  1. Est-ce que mon script est correct ?
  2. Et ou dois-je placer mon script pour qu'il soit exécuté a chaque fois que je me log a ma session ?
J'ai réussi a gérer mes configurations d’écrans en utilisant le paquet autorandr mais je voulais me faire une solution maison juste pour me donner l'occasion d’écrire un script. Donc j'accepte toutes les solutions mais je preferais une pour faire marcher mon script ;)
PC1: Mobo: Gigabyte B550 AORUS Elite 2 / CPU: AMD Ryzen 7 3700X / GPU: MSI Radeon RX 580 Armor / RAM: 32 GB @3600 MHz CL16 / SSD: Samsung 970 EVO 500 GB / LM 20.2 Xfce
PC2: HP Pavilion 15 / AMD Ryzen 5 5500U with Radeon Graphics / 16GB RAM / 500 GB SSD / Debian 11 Xfce
PC3: Dell-Latitude E7240 / 2.1GHz i7-4600U / Intel Haswell-ULT HD 4400 / 8GB RAM / 250 GB Hard Drive / LM 20.2 Xfce

Avatar du membre
cyrille
Administrateur du site
Messages : 12399
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Gerer le passage d'un a deux ecrans (xrandr)

Message par cyrille »

Salut David
J'ai lu en vitesse
Pour le script, juste l'affectation de variable

Code : Tout sélectionner

nb_screen=`xrandr | egrep -c ' connected'`
à privilégier

Code : Tout sélectionner

nb_screen=$(xrandr | egrep -c ' connected')
Pour le démarrer au démarrage de la session
Tu peux le placer dans

Code : Tout sélectionner

~/.config/autostart
, tu crées un fichier LeSUperNom.desktop avec cette structure

Code : Tout sélectionner

[Desktop Entry]
Type=Application
Name=<Name of application as displayed>
Exec=<command to execute>
Icon=<full path to icon>
Comment=<optinal comments>
X-GNOME-Autostart-enabled=true
ça devrait le faire.

Perso. je rajouterais une gestion de l'erreur en redirigeant les errors vers un fichier de log

Ajout de la variable

Code : Tout sélectionner

# Log file
ERRFILE="/path/to/errors.txt"

puis dans ton script, redirection des erreurs

Code : Tout sélectionner

2>>"${ERRFILE}"
Ce qui donnerait

Code : Tout sélectionner

if [ $nb_screen -eq 2 ]
then
    echo "There is $nb_screen screens detected"
    xrandr --output HDMI-1 --mode 1920x1080 --primary 2>>"${ERRFILE}"
    xrandr --output eDP-1 --mode 1366x768 --right-of HDMI-1 2>>"${ERRFILE}"

else
    echo "There is only $nb_screen screen detected, no multi-screen configuration possible" 2>>"${ERRFILE}"
    xrandr --auto

fi
AInsi si ça plante, tu garde une trace
Bien sûr, claquer logrotate dessus afin de gérer ce fichier de log


Je n'ai rien tester, mais je pense que ça devrait le faire ;)
La ou ça se complique c'est que pour éviter de taper ces lignes a la main a chaque fois, j'ai voulu créer un script pour le lancer rapidement.
Sinon il y a la solution de l'alias

Code : Tout sélectionner

alias 2screens='xrandr --output HDMI-1 --mode 1920x1080 --primary && xrandr --output eDP-1 --mode 1366x768 --right-of HDMI-1'
Et pour l'appeler

Code : Tout sélectionner

$ 2screens
-penser à ressourcer le bashrc pour la prise en compte de l'alias

Le mieux étant de stocker les alias dans un fichier séparé du .bashrc : .bash_aliases et d'inclure dans le .bashrc

Code : Tout sélectionner

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
david37
modérateur
Messages : 3884
Enregistré le : lun. 22 août 2016 05:06

Re: Gerer le passage d'un a deux ecrans (xrandr)

Message par david37 »

Salut Cyrille,

Merci pour ta réponse. J'ai modifier mon script suivant tes recommandations (la définition de la variable ainsi que l’écriture des erreurs dans un fichier texte), enregistrer mon script dans mon home et créer le fichier .desktop dans mon dossier ~/.config/autostart.
Et tout marche nickel, j'ai essaye le passage deux écrans -> un écran et un écran -> deux écrans (en me log out a chaque fois) et tout marche nickel.

Donc merci beaucoup. J'ai pas essaye la méthode des alias mais je vais regarder ça et j'essaierai a l'occasion pour mon prochain script.

Encore merci :D
PC1: Mobo: Gigabyte B550 AORUS Elite 2 / CPU: AMD Ryzen 7 3700X / GPU: MSI Radeon RX 580 Armor / RAM: 32 GB @3600 MHz CL16 / SSD: Samsung 970 EVO 500 GB / LM 20.2 Xfce
PC2: HP Pavilion 15 / AMD Ryzen 5 5500U with Radeon Graphics / 16GB RAM / 500 GB SSD / Debian 11 Xfce
PC3: Dell-Latitude E7240 / 2.1GHz i7-4600U / Intel Haswell-ULT HD 4400 / 8GB RAM / 250 GB Hard Drive / LM 20.2 Xfce

Avatar du membre
alain
Administrateur du site
Messages : 14789
Enregistré le : dim. 11 oct. 2015 23:41
Localisation : Chelles
Contact :

Re: Gerer le passage d'un a deux ecrans (xrandr)

Message par alain »

Bonjour.

Sujet archivé (en lecture seule) car résolu.
Si besoin de rouvrir faire un MP à un membre de l'équipe ;)
@David, si tu ne me demande pas pour rouvrir, je ne t'en voudrait pas :l :lol:
PC are like air conditioning, they becomes useless when you open Windows (L.T)
PC1 : CM : ASRock 990FX | CPU: AMD FX 8350-8 cores, 4 GHz | RAM: 16 Go DDR3 1600 MHz | CG: ATI RX 580-8 Go | OS : LM 20.3 Uma Xfce 4.16 | K: 5.4
PC2
:Core2 Quad Q9650 @ 3 GHz | CG: Nvidia GTX 650TI | OS: LM 21.3 Xfce 4.18| K: 6.5
PC3 :Core i7-2600 @ 3,5 GHz | CG: ATI HD 4650 | OS: Emmade5 Xfce 4.18.0 | K: 6.1
PC4 : AMD Ryzen 5 3500X 4GHz | CG: GTX 970 | Ram : 8GB |OS : Debian 10.5 | K: 5.10
In a world without walls and fences, who needs windows and gates?

Répondre