Question Comment exécutez-vous une application dans bash et sélectionnez le moniteur sur lequel il s'exécute?


J'ai une question difficile à trouver pour la réponse (je me retrouve toujours avec des réponses pour la manipulation de mon moniteur). J'écris un script shell bash pour m'aider avec mon code dev et j'ai deux moniteurs.

Lorsque je lance mon exécutable que j'ai compilé, je veux lui demander de s'exécuter sur un moniteur particulier (différent du moniteur sur lequel mon terminal est ouvert pour que je puisse voir le débogage sur un écran et avoir l'application sur un autre).

Comment pourrais-je y aller? Quelque chose comme:

./myProject > but run on monitor 2

myProject est mon exécutable binaire.

Merci a tous.


11
2017-08-21 14:43


origine


Réponses:


Si vous exécutez des affichages séparés sur chaque moniteur (moins probable ces jours-ci), le DISPLAY variable d'environnement est ce que vous voulez.

Si vous utilisez Xinerama (en répartissant un affichage logique sur plusieurs moniteurs):

  • Mis à part: vocabulaire X11: un "affichage" est un ou plusieurs "écrans" avec des périphériques d'entrée; par exemple. clavier et souris, par exemple un "siège". Un "écran" est un canevas logique partiellement ou totalement affiché sur un ou plusieurs "moniteurs"; Lorsque vous utilisez plusieurs moniteurs pour un "écran", les fenêtres peuvent être partiellement affichées sur chaque moniteur, mais partagent le même X11 DISPLAY identifiant; cela s'appelle Xinerama. le DISPLAY le format est hôte  :  numéro d'affichage  .  id-écran, par exemple sur mon installation Xinerama les deux moniteurs font partie de l'écran 0 sur un numéro d'affichage qui compte à partir de 0 avec chaque utilisateur connecté sur le même hôte. Les "sièges" sont des groupes logiques de moniteur + d'entrée utilisant un matériel différent; plusieurs "affichages" peuvent se produire en utilisant la commutation de "console virtuelle", ce qui permet à plusieurs utilisateurs de se connecter à une seule machine "siège".

La plupart des boîtes à outils graphiques vous permettent de spécifier la géométrie de la fenêtre à l’aide du --geometry ou -geometry commutateur.

  • Qt utilise l'ancien style MIT -geometry forme. GTK + / Gnome utilise le style GNU --geometry.

  • Cela suppose que vous autorisez Qt à post-traiter votre ligne de commande, par exemple qui passe argv dans QtApplication ou similaire.

L'affichage logique aura une résolution qui est la somme des résolutions dans chaque direction de l'arrangement de vos moniteurs. Par exemple, j'ai 2 × 1920 × 1080 écrans connectés en ce moment. xrandr rapports:

Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 8192 x 8192

Pour afficher une fenêtre sur le moniteur de droite, je peux donner une chaîne de géométrie qui a son x coordonnées entre 1920 et 3839 (inclus).

Le format habituel est: largeur  x  la taille  ±  x-offset  ±  y-offset - mais la largeur et la hauteur sont facultatives, si vous préférez prendre les valeurs par défaut. le ± sont + compter par rapport au haut / à gauche, ou - compter par rapport au bas / à droite.

Donc, par exemple:

gedit --geometry 800x600+1920+0  # set size at top-left of right screen
gedit --geometry +1920+100       # default size at top-left of right screen
gedit --geometry -0+0            # default size at top-right of entire display

Malheureusement, le seul moyen programmatique que je connaisse pour déterminer la zone d'affichage sur chaque moniteur à partir du shell serait d'analyser la sortie de xrandr; par exemple.

$ xrandr
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 8192 x 8192
LVDS1 connected (normal left inverted right x axis y axis)
   1366x768       60.0 +
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 510mm x 287mm
   1920x1080      60.0*+
   1680x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x720       60.0  
   1024x768       60.0  
   800x600        60.3  
   640x480        60.0  
   720x400        70.1  
HDMI1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 510mm x 287mm
   1920x1080      60.0*+
   1680x1050      59.9  
   1280x1024      60.0  
   1440x900       59.9  
   1280x720       60.0  
   1024x768       60.0  
   800x600        60.3  
   640x480        60.0  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)

$ xrandr | perl -ne 'if (/(\d+)x(\d+)\+(\d+)\+(\d+)/) '\
> ' { print "$3,$4 - ", $3 + $1 - 1, ",", $4 + $2 - 1, "\n" }'
0,0 - 1919,1079
1920,0 - 3839,1079

(Normalement, vous voudriez éviter de diviser le liner Perl en deux lignes du shell, mais le '\...' astuce est de le rendre lisible sur SO.)


7
2017-08-21 17:15



Utiliser un fifo

ouvrir une fenêtre de terminal sur le moniteur sur lequel vous voulez que la sortie apparaisse et le faire

mkfifo /tmp/myfifo
cat /tmp/myfifo

puis sur le terminal source faire

./myProject >/tmp/myfifo

Cela suppose qu'il s'agit d'une application console. Si c'est graphique, vous aurez besoin d'une autre approche, qui dépendra de ce que vous utilisez avec le gestionnaire de fenêtres et la boîte à outils.


4
2017-08-21 14:48



le --geometry réponse donnée ci-dessus et acceptée ne fonctionnera tout simplement pas dans de nombreux cas ...

Il y a beaucoup de questions presque identiques comme celle-ci qui flottent autour des différents sites StackExchange et AskUbuntu, la réponse que j'ai finalement trouvée (sur une distribution Linux Mint basée sur Ubuntu 14.04) est d'utiliser wmctrl. Je laisse une réponse car personne d'autre ne l'a mentionné sur ce sujet.

(Il y en a un autre appelé Devil's Pie et un autre appelé Compiz Si vous recherchez ceux que vous recherchez, vous trouverez les questions et réponses dont je parle)

wmctrl est le type d'outil Unix simple que vous recherchez probablement si vous écrivez des scripts Bash. J'ai aussi vu quelqu'un suggérer d'utiliser xdotool, dépend de l'objectif spécifique.

wmctrl offre une correspondance de fenêtre par titre de fenêtre ou pid (non compatible avec tous les types de fenêtres gérées par X)

Quelques ressources utiles:

Je connecte un deuxième moniteur à gauche ou à droite selon où je travaille chaque jour, et je pense que la solution pour moi impliquera

  • trouver les dimensions de xrandr (comme représenté sur la BRPocockla réponse),
  • analyser cela pour dire quel est le moniteur externe connecté (VGA / HDMI etc.) plutôt que le intégré,
  • spécifiant une dimension à donner à une fenêtre agrandie sur l'écran connecté (c'est-à-dire le décalage gauche / droite / haut / bas, qui changera selon le côté de l'écran utilisé)

Laissant mes notes et [éventuellement] du code produit ici au cas où il serait utile à quelqu'un d'autre.


3
2018-06-23 19:01



Tout ce que vous devez faire est de définir le DISPLAY variable environnementale avant d'exécuter votre application.

Pour savoir à quoi vous devez le configurer, exécutez les opérations suivantes sur le moniteur sur lequel vous souhaitez qu’elles apparaissent:

echo $DISPLAY

Vous devriez voir, par exemple :0.1 ou :0.0.

Ensuite, vous pouvez spécifier que vous souhaitez que votre application s'exécute sur cet écran comme suit:

DISPLAY=:0.1 ./my_app

2
2017-08-21 15:59



Comme votre application utilise QT, vous utilisez probablement KDE. Dans System Settings > Window Behavior > Advanced, ensemble Placement à Under Mouse. Cliquez sur le moniteur souhaité, ALT + Tab pour basculer vers votre terminal et démarrez le programme.


0
2017-08-21 15:56