La distribution MINT propose un utilitaire de configuration des écrans multiples (ou écran + vidéoprojecteur) accessible par le menu des applications (Paramètres > Affichage) ou par le classique raccourci windows-P

La confihguration par défaut semble directement fonctionnelle, rien à faire de particulier, tant mieux !
L’utilisation d’un vidéoprojecteur interactif nécessite un peu de configuration. Ce qui suit a été testé avec un VPI Epson EB-695 Wi. Sur le poste utilisé, l’écran principal est connecté en HDMI à la tour et le vidéoprojecteur est sur la sortie VGA et branché en USB pour l’interactivité.
Ces vidéoprojecteurs sont linux friendly et disposent d’un mode ubuntu en plus d’un mode windows - macOS. Le changement se fait par le menu Avancé > Easy Interactive Fonction > Mode fonct. crayon du VPI.
Un problème apparait en bureau étendu : la surface interactive du VPI correspond à l’ensemble du bureau, écran principal compris. Le curseur est alors complètement décorrelé de la position du stylet. Pour corriger celà, il faut « mapper » l’entrée (stylet - VPI) et la sortie (l’« écran » VGA) avec des commandes du type xinput map-to-output
La commande xinputliste l’ensemble des pérphériques d’entrée :
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Dell KB216 Wired Keyboard Consumer Control id=12 [slave pointer (2)]
⎜ ↳ PixArt Dell MS116 USB Optical Mouse id=13 [slave pointer (2)]
⎜ ↳ EPSON EPSON EPSON 695Wi/695WT Mouse id=16 [slave pointer (2)]
⎜ ↳ EPSON EPSON EPSON 695Wi/695WT Mouse id=17 [slave pointer (2)]
⎜ ↳ EPSON EPSON EPSON 695Wi/695WT Mouse id=18 [slave pointer (2)]
⎜ ↳ EPSON EPSON EPSON 695Wi/695WT id=19 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Dell KB216 Wired Keyboard id=10 [slave keyboard (3)]
↳ Dell KB216 Wired Keyboard System Control id=11 [slave keyboard (3)]
↳ Dell WMI hotkeys id=14 [slave keyboard (3)]
↳ Dell KB216 Wired Keyboard Consumer Control id=15 [slave keyboard (3)]
Ce sont les 4 lignes EPSON EPSON EPSON 695Wi/695WT qui nous intéressent et pour lesquelles l’id doit être utilisé avec la commande
xinput map-to-output 16 DP-2
où 16 est l’un des identifiants listé par xinput et DP-2 l’identifiant de l’écran correpsondant au VPI. Malheuresement ces identifiants ne sont pas fixes et peuvent changer d’un démarrage du poste à l’autre.
Pour déterminer le nom de l’écran correspondant au VPI, la commande xrandr renvoie des lignes du type :
Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 16384 x 16384
HDMI-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 477mm x 268mm
(...)
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
DP-2 connected 1280x800+1920+0 (normal left inverted right x axis y axis) 0mm x 0mm
(...)
HDMI-3 disconnected (normal left inverted right x axis y axis)
Un script /usr/local/bin/map-epson.sh permet de lancer les quatre lignes de commandes nécessaires :
#!/bin/sh
xinput | grep EPSON | grep -oP '(?<=id=)[0-9]+' | xargs -I % xinput map-to-output % DP-2
Fichier qui doit bien sûr être exécutable :
chmod +x /usr/local/bin/map-epson.sh
Pour que la commande magique xinput | grep ... soit lancée au branchement USB du VPI ou lors de son allumage, on utilise un évènement udev
Créez le fichier /etc/udev/rules.d/90-usbepson.rules :
ACTION=="add|remove", SUBSYSTEM=="input", ENV{DEVLINKS}=="*usb-EPSON_EPSON_EPSON_695Wi_695WT-mouse*", RUN+="/usr/local/bin/map-epson2.sh"
Puis rechargez les règles avec udevadm control --reload.
Créez le script /usr/local/bin/map-epson2.sh :
#!/bin/sh
USER_NAME=$(loginctl list-sessions | awk '$6=="active" {print $3}')
# renvoie le nom de l'utilisateur actuellement connecté avec une session graphique active
DISPLAY_VALUE=":0.0"
# à adapter si besoin
su - "$USER_NAME" -c "export DISPLAY=$DISPLAY_VALUE; sh -c \"xinput | grep EPSON | grep -oP '(?<=id=)[0-9]+' | xargs -I % xinput map-to-output % DP-2 \"" &
Fichier qui doit bien sûr être exécutable :
chmod +x /usr/local/bin/map-epson2.sh
Si le VPI est déjà branché et allumé à l’ouverture de session, il faut lancer la commande magique.
Pour cela, créez un fichier /etc/xdg/autostart/VPIepson.desktop :
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=VPI epson
Comment=Calibrage du VPI EPSON
Exec=/usr/local/bin/map-epson.sh
OnlyShowIn=XFCE;
RunHook=0
StartupNotify=false
Terminal=false
Hidden=false
Reste à faire :
Ce qui suit a été prévu pour mes premiers essais avec la distribution lubuntu. L’utilitaire natif de MINT est plus convivial et s’utilise assez facilement. Ce qui suit est donc laissé pour archivage (et si quelqu’un y trouve une utilité)
Pour les postes des salles reliés à un vidéoprojecteur, il faut permettre aux utilisateurs d’utiliser ce matériel de façon simple, rapide et conviviale.
xrandr est l’utilitaire qui permet de définir la résolution, l’organisation et les transformations des sorties d’écran de l’ordinateur. C’est un utilitaire en ligne de commande mais il existe des interfaces graphiques en surcouche à xrandr : arandr, lxrandr, lxconfig-mon, …
xrandr est complexe d’utilisation et très peu convivial : il est inutilisable par un utilisateur débutant. Les interfaces graphiques sont plus accessibles mais proposent un nombre de combinaisons inutilement important et pour la plupart inadaptées aux utilisations courantes (peu ergonomiques, résolutions inadaptées, …)
Dans la pratique, pour les postes de salle de classe, seules trois combinaisons sont réellement pertinentes : écran seul, bureau étendu et bureau cloné.
nirdvideo est un petit utilitaire (python 3 - tkinter) qui permet, avec seulement trois boutons, de lancer trois commandes xrandr et configurer l’affichage. La difficulté, pour l’administrateur, consiste à écrire ces trois lignes de commande.

Téléchargement : Archive compressée
Les fichiers sont les suivants : - le script python de l’interface utilisateur /usr/local/bin/nirdvideo-gui - le script non-interactif pour charger les préférences utilisateur /usr/local/bin/nirdvideo (voir pour remplacer par un simple fichier .desktop ?) - le fichier de configuration /usr/local/share/nirdvideo/config.json - les images /usr/local/share/nirdvideo/etendu.png, clone.pnget ecran.png pour les boutons - le fichier d’autostart /etc/xdg/autostart/nirdvideoauto.desktop
À l’utilisation, un fichier utilisateur ~/.config/nirdvideo/prefs.json est créé, il contient le dernier réglage effectué par l’interface graphique. (remplaçable par un .desktop ?)
Branchez et allumez le vidéoprojecteur. Lancez la commande xrandr sans paramètre : elle affichera les écrans connectés et une liste de résolutions possibles. Par exemple :
Screen 0: minimum 320 x 200, current 2720 x 900, maximum 16384 x 16384
HDMI-1 connected primary 1440x900+0+0 (normal left inverted right x axis y axis) 410mm x 257mm
1440x900 59.90*+ 74.98
1280x1024 75.02 72.05 70.00 60.02
1024x768 75.03 70.07 60.00
800x600 72.19 75.00 60.32 56.25
640x480 75.00 72.81 66.67 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)
DP-2 connected 1280x800+1440+0 (normal left inverted right x axis y axis) 0mm x 0mm
1280x800 59.81*+
1600x1200 60.00
1680x1050 59.95
1400x1050 74.87
1600x900 60.00
1280x1024 75.02
1440x900 84.84
1280x960 85.00
1366x768 59.79
1152x864 75.00
1280x720 60.00
1024x768 85.00 75.03 70.07 60.00
832x624 74.55
800x600 72.19 75.00 60.32 56.25
640x480 75.00 72.81 66.67 59.94
720x400 87.85 70.08
HDMI-3 disconnected (normal left inverted right x axis y axis)
Cela permet de connaitre les noms des écrans (ici HDMI-1 pour le moniteur et DP-2̀ pour le vidéoprojecteur) et les résolutions « préférées » : les lignes suivis par un +. Il y a donc dans cet exemple, un écran de résolution 1440 × 900 sur le port HDMI-1 et un vidéoprojecteur de résolution 1280×800 sur le port VGA (DP-2)
xrandrDans ce qui suit, pour des raisons de lisibilité et pour mettre en évidence leur syntaxe, ces commandes xrandr sont écrites sur plusieurs lignes. Dans le fichier de configuration, il faut les remettre sur une seule ligne et supprimer les commentaires.
Les exemples qui suivent sont prévus pour la situation évoquée plus haut : un écran de résolution 1440 × 900 sur le port HDMI-1 et un vidéoprojecteur de résolution 1280×800 sur le port DP-2.
Écran seul :
xrandr
--output HDMI-1 # tout ce qui suit concerne le port HDMI jusqu'au --output suivant
--primary # écran principal
--mode 1920x1080 # résolution optimale
--pos 0x0 # position par défaut
--output DP-2
--off # sortie désactivée
Bureau étendu :
xrandr
--output HDMI-1
--primary
--mode 1920x1080
--pos 0x0 # l'écran est placé à gauche
--output DP-2
--mode 1280x1024
--pos 1920x0 # l'écran est déplacé à droite de la largeur de HDMI-1
L’écran principal est alors à gauche et le vidéoprojecteur à droite. Pour faire le contraire, il suffit de modifier les paramètres --pos
xrandr
--output HDMI-1
--primary
--mode 1920x1080
--pos 0x1024 # l'écran est décalé à droite de la largeur de DP-2
--output DP-2
--mode 1280x1024
--pos 0x0 # l'écran est à gauche
Écran cloné (solution simple mais pas forcément terrible) :
Dans le cas où les deux écrans ont la même résolution (ou s’ils ont une résolution commune affichée par xrandr), le code xrandr est simple :
xrandr
--output HDMI-1
--mode 1280x1024
--output DP-2
--mode 1280x1024
--same-as HDMI-1 # C'est cette ligne qui provoque le clonage
Mais si les écrans n’ont pas le même format (16/9 et 3/4), l’une des deux images sera déformée. Cette solution n’est utilisable qu’avec des écrans de même format et de résolution semblable.
Écran cloné (meilleure solution)
Pour des écrans très différents, il est possible de cloner sans déformation en restreignant l’affichage à la résolution la plus basse. Dans ce cas, sur l’écran le plus grand, la zone active est bordée d’un cadre noir inactif.

La commande xrandr est plus complexe et nécessite (pas trouvé plus simple) 4 commandes successives.
xrandr # première commande, défini les résolutions et le clonage
--output DP-2
--mode 1280×800
--output HDMI-1
--mode 1920x1080
--same-as DP-2
xrandr # limite la zone active à la résolution la plus basse
--output DP-2
--panning 1280×800
xrandr # même limite pour l'écran plus large
--output HDMI-1
--panning 1280×800
xrandr
--fb 1280×800 # le « framebuffer » est la surface utile, même taille que précédemment
--output eDP-1
--transform 1,0,-240,0,1,-90,0,0,1 # matrice de transformation
C’est la matrice de transformation qui va centrer l’image sur l’écran principal. Les deux valeurs pertinentes sont la troisième et la sixième, respectivement le décalage de 240 pixels vers la droite (valeur négative) et de 90 pixels vers le bas (négative là aussi)
Ces quatre commandes seront chaînées en une seule ligne dans le fichier de configuration en les séparant par un ;
xrandr --output DP-2 --mode 1280×800 --output HDMI-1 --mode 1920x1080 --same-as DP-2 ; xrandr --output DP-2 --panning 1280×800 ; xrandr --output HDMI-1 --panning 1280×800 ; xrandr
--fb 1280×800 --output eDP-1 --transform 1,0,-240,0,1,-90,0,0,1
Éditez le fichier /usr/local/share/nirdvideo/config.json. Celui-ci a pour structure :
{
"etendu": {
"cmd": "xrandr ...",
"description": "Écrans étendus"
},
"clone": {
"cmd": "xrandr ...",
"description": "Clonage écran et projecteur"
},
"ecran": {
"cmd": "xrandr ...",
"description": "Écran seul"
},
"defaut": "etendu"
}
Les lignes "cmd": sont les commandes xrandr à lancer. La configuration par défaut est donnée par la ligne "defaut": qui prend pour valeur une des entrées qui précèdent.
Pour chaque ligne "cmd":copiez-collez (entre guillemets " ") la ligne de commande qui lui correspond.
L’utilisateur retrouve à chaque démarrage son dernier réglage ou le réglage défini par défaut. Pour cela le fichier nirdvideoauto.desktop est placé dans /etc/xdg/autostart
Celui-ci va exécuter à chaque démarrage le script /usr/local/bin/nirdvideo