web-dev-qa-db-fra.com

Scripting Gnome Image Viewer dans une configuration à double écran

J'essaie d'utiliser la commande eye of gnome pour ouvrir deux instances de la visionneuse d'images sur deux écrans distincts. Le problème est, si j'utilise la commande:

eog -s --display=DVI-0 image.jpg

il indique qu'il ne peut pas ouvrir l'écran (mon hypothèse est qu'il se réfère aux écrans X). Existe-t-il un moyen d'ouvrir une instance sur chaque écran?

1
WxPilot

Il y a deux problèmes ici:

  1. ayant deux instances distinctes (ou au moins des fenêtres) de eog
  2. contrôler sur quel écran ils ouvrent

La première est simple: option --new-instance faire l'affaire.

La seconde est plus compliquée. L'argument --display fait référence au serveur X à utiliser, pas au nom de l'écran et/ou du moniteur (terminologie xorg.conf). Donc --display n'est pas la bonne idée à utiliser.

Lors de l'émission eog --fullscreen image.jpg sur un terminal, l'image ouverte sur le même écran que le terminal. Je suppose donc qu'il existe un moyen de dire à Gtk de s'ouvrir sur un écran précis. (NB: l'option -s est pour le diaporama, i; e. Si vous voulez une seule image, préférez le plein écran.)

D'après la documentation de GTK/Gdk et le code source d'eog, il semble que eog crée un popup avec l'image et demande à gdk de le mettre en plein écran. Gdk demande alors au gestionnaire de fenêtres de définir la "fenêtre" du popup plein écran. La décision d'ouvrir l'image sur tel ou tel écran appartient donc au gestionnaire de fenêtres.

wmctrl semble être le bon outil pour communiquer avec le gestionnaire de fenêtres. Voici une ébauche d'un script faisant cela.

#!/bin/bash
#open two fullscreen windows
eog --fullscreen --new-instance image1.jpg&
#wait until windows are actually created
while [ 1 ]; do 
   found=$(wmctrl -l |grep 'image1.jpg'); 
   if ! [[ -z "$found" ]]; then 
      break; 
   fi; 
done;
#move first win to the left
wmctrl -r 'image1.jpg' -e 1,0,0,-1,-1

eog --fullscreen --new-instance image2.jpg&
#wait
while [ 1 ]; do 
   found=$(wmctrl -l |grep 'image2.jpg'); 
   if ! [[ -z "$found" ]]; then 
      break; 
   fi; 
done;
#move
wmctrl -r 'image2.jpg' -e 1,1280,0,-1,-1

Mais vous devez remplacer 1280 par votre largeur d'écran réelle. Notez également que, comme le script utilise des noms de fenêtre pour les identifier, cela ne fonctionnera pas si des fenêtres portant des noms similaires ('image1', 'image2') existent sur votre bureau.

3
Rémi