Vidéoprojection

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

Utilitaire

La confihguration par défaut semble directement fonctionnelle, rien à faire de particulier, tant mieux !

Videoprojecteur interactif

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

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

Réglage au branchement/allumage du VPI

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

Réglage à l’ouverture de session

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 :

Vidéoprojection (archive)

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.

Utilitaires natifs

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é.

NIRDvidéo

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.

nirdvideo

Installation

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 ?)

Configuration

Découvrir le matériel

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)

Commandes xrandr

Dans 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.

Bureau cloné sans déformation

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

Fichier de configuration

É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.

Autostart

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