Comment lancer une application dans bash et sélectionner le moniteur sur lequel elle s'exécute?

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

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

Comment pourrais-je aller sur le faire cette? Quelque chose comme:

./myProject > but run on monitor 2

myProject est mon exécutable binaire.

Merci à tous.

10
demandé sur Kevin Panko 2013-08-21 18:43:40

5 réponses

si vous lancez 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 (diffusion d'un affichage logique sur plusieurs moniteurs), cependant:

  • mis de côté: X11 vocabulaire: un "écran" est un ou plusieurs "écrans" avec des dispositifs d'entrée; p.ex. clavier et souris, A. K. A. un siège."Un" écran "est une toile logique qui est partiellement ou complètement affichée sur un ou plusieurs "moniteurs"; en utilisant plusieurs moniteurs pour un "écran", les fenêtres peuvent être partiellement affichées sur chaque moniteur, mais partager le même X11 DISPLAY identifier; ceci s'appelle Xinerama. DISPLAY le format est accueil:affichage-nombre.écran-id, donc par exemple sur ma configuration Xinerama les deux moniteurs font partie de l'écran 0 sur l'affichage du numéro de compte à partir de 0 avec chaque utilisateur connecté sur le même hôte. "Sièges" sont des groupes logiques de moniteur+entrée qui utilisent un matériel différent; plusieurs " affichages "peuvent se produire en utilisant la commutation" console virtuelle", ce qui est la façon dont Gnome et KDE permettent à plusieurs utilisateurs de se connecter sur une seule machine" seat".

la plupart des utilitaires GUI vous permettent de spécifier la géométrie de la fenêtre en utilisant le --geometry ou -geometry switch.

  • Qt utilise le style MIT plus ancien -geometry formulaire. GTK+ / Gnome utilise le style GNU --geometry.

  • ce suppose que vous autorisez Qt à post-traiter votre ligne de commande, par exemple passer argv en QtApplication ou similaire.

La "logique de l'affichage" 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 affichages 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 droit, je peux donner une chaîne de géométrie qui a son x coordonne entre 1920 ... 3839 (inclus).

Le format habituel est: largeurxhauteur±X-offset±Y-offset - mais la largeur et la hauteur sont facultatifs, si vous préférez prendre les valeurs par défaut. ±+ pour compter par rapport au point haut/la gauche ou - pour compter par rapport au bas/droite.

Donc, pour 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 de l'affichage sur chaque moniteur à partir du shell serait de séparer la sortie de xrandr; e.g.

$ 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 ", - ",  +  - 1, ",",  +  - 1, "\n" }'
0,0 - 1919,1079
1920,0 - 3839,1079

(vous devriez normalement éviter de fendre la perl un-liner sur deux lignes dans le shell, mais le '\...' il y a un truc pour le rendre lisible.)

7
répondu BRPocock 2013-08-21 17:15:53

un fifo

ouvrez une fenêtre de terminal sur le moniteur que vous voulez que la sortie apparaisse et faites

mkfifo /tmp/myfifo
cat /tmp/myfifo

puis sur le terminal source ne

./myProject >/tmp/myfifo

Ceci suppose que c'est une application console. S'il est Graphique, alors vous aurez besoin d'une autre approche, qui dépendra de ce windowing manager + toolkit que vous utilisez.

4
répondu Oliver Matthews 2013-08-21 14:48:43

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

il y a beaucoup de questions presque identiques comme celle-ci qui flottent autour des différents sites D'échange de piles 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 juste depuis que personne d'autre ne l'a mentionné sur ce fil.

(il y en a un autre appelé Devil's Pie et un autre appelé Compiz si vous recherchez pour ceux qui sont trop, vous trouverez la Q&A qui je parle)

wmctrl est le genre 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 la correspondance de fenêtre par titre de fenêtre ou pid (non compatible avec tous les types de windows x-managed)

Quelques ressources utiles:

je connecte un second moniteur à gauche ou sur le à droite selon l'endroit où je travaille chaque jour, et je pense que la solution pour moi impliquera

  • trouver les dimensions à partir de xrandr (comme indiqué dans BRPocock's réponse),
  • analyse que de dire qui est l'externe connecté moniteur (VGA/HDMI etc.) plutôt que celui intégré,
  • spécifier une dimension à donner à une fenêtre maximisée sur l'écran connecté (c'est-à-dire l'offset Gauche/Droite/Haut/Bas, qui va changer selon côté de l'écran)

en Laissant mes notes et [finalement] code produit ici au cas où cela serait utile à quelqu'un d'autre.

4
répondu Louis Maddox 2017-04-13 12:22:42

Tout ce que vous devez faire est de définir la DISPLAY variable d'environnement avant de lancer votre application.

pour savoir à quoi vous devez le configurer, lancez ce qui suit sur le moniteur sur lequel vous voulez qu'il apparaisse:

echo $DISPLAY

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

alors vous pouvez spécifier que vous voulez que votre application s'exécute sur cet écran comme ceci:

DISPLAY=:0.1 ./my_app
2
répondu John Ledbetter 2013-08-21 15:59:57

comme votre application utilise QT, vous utilisez probablement KDE. System Settings > Window Behavior > Advanced, définissez PlacementUnder Mouse. Cliquez sur le moniteur désiré, Alt + Tab pour passer à votre terminal, et démarrer le programme.

0
répondu Fabio A. Correa 2013-08-21 15:56:02