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
Où myProject
est mon exécutable binaire.
Merci à tous.
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'écran0
sur l'affichage du numéro de compte à partir de0
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
enQtApplication
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: largeurx
hauteur±
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.)
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.
--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:
wmctrl
homme page- utilisateur doc 1
- utilisateur doc 2
- " Comment passer des applications de l'espace de travail 1 à l'espace de travail 2 en utilisant la commande?""
- réponse plus spécifique concernant la spécification des dimensions
- "
wmctrl
etxdotool
beau travail si vous définissez une fenêtre agrandie."
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.
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
comme votre application utilise QT, vous utilisez probablement KDE. System Settings > Window Behavior > Advanced
, définissez Placement
Under Mouse
. Cliquez sur le moniteur désiré, Alt + Tab pour passer à votre terminal, et démarrer le programme.