Comment ouvrir une fenêtre sur un autre moniteur?


9

Avec plusieurs moniteurs, j'ai jusqu'à présent fait glisser manuellement les fenêtres. Existe-t-il un moyen d'ouvrir une fenêtre sur un écran spécifique dans une configuration à double tête? (À ne pas confondre avec plusieurs écrans de serveur X.)

Quelque chose comme: SCREEN=2 firefoxou open-in-screen 2 firefox.

Si cela est important, mon environnement est KDE utilisant le gestionnaire de fenêtres KWin. Les règles de fenêtre KWin ne peuvent correspondre qu'à certaines propriétés comme le titre, mais je n'ai pas pu trouver de variable d'environnement comme filtre.

L'affichage secondaire étend l'écran principal:

$ xrandr -q
Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 32767 x 32767
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
   1600x900       60.1*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+1600+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)

2
Habituellement, je suggère de l'utiliser kstartpour cela, mais il kstartne semble que prendre en charge la définition d'un bureau spécifique, mais pas un écran sur lequel l'application doit être lancée. Vaut probablement un rapport de bogue WISHLIST sur bugs.kde.org .
Elias Probst

Très bon conseil kstart, je voulais aussi le savoir. La commande est: kstart --desktop $N firefox$Nest un nombre compris entre 1 et le nombre total de bureaux virtuels .
Lekensteyn

Concernant kstart, il y a aussi un rapport de bug sur bugs.kde.org demandant cette fonctionnalité.
Elias Probst

Comme c'est étrange, j'ai vu un article sur wmctrl plus tôt dans la journée, mais je n'ai pas eu l'occasion de le tester. Pourquoi a-t-il été supprimé?
Lekensteyn

Aucune idée du post wmctrl, je ne l'ai pas vu.
Elias Probst

Réponses:


5

Non, vous ne pouvez pas faire ça directement. Dans l'architecture X, les deux moniteurs physiques que vous voyez ne sont pas discernables par les applications. Vous ne pouvez contourner cette abstraction qu'en déterminant quelles zones de l'espace de travail visible correspondent à quel moniteur, puis placez les fenêtres avec le décalage correct.

Des boîtes à outils sensibles prennent en charge une -geometryoption, qui permet à votre application de demander à être placée à une position spécifique. Si vous ne disposez pas de cette option, vous pouvez utiliser wmctrlsi vous avez un gestionnaire de fenêtres X compatible EWMH / NetWM pour déplacer et redimensionner les fenêtres déjà existantes (voir wmctrl (1), vous avez besoin des options -ret -e). J'utilise devilspiepour forcer le placement de certaines fenêtres et bien sûr, votre gestionnaire de fenêtres de choix peut avoir sa propre fonction pour forcer le placement des fenêtres.

devilspiepermet d'appliquer certaines actions sur X windows et peut utiliser les propriétés de X window pour discerner différentes fenêtres et applications. La règle clé pour vous serait geometry "<width>x<height>+<xoffset>+<yoffset>".

Pourtant, vous devez toujours faire les calculs de quand et où un autre moniteur physique commence vous-même. Mais ce n'est pas trop difficile et xrandrvous indique comment et où il utilise des moniteurs sous la forme de "<width>x<height>+<xoffset>+<yoffset>chaque ligne avec un nom de sortie.

Il n'y a pas de méthode infaillible, cela fonctionnera simplement, car les implémentations peuvent (et changent!) Varier. wmctrlfonctionne généralement sur le titre de la fenêtre pour identifier la cible. devilspiepeut également faire référence à sa classe, mais je ne connais aucune boîte à outils qui vous permette de spécifier une classe X windows mais pas sa géométrie.

Bien sûr, vous pouvez toujours démarrer deux xephyrinstances et en faire une remplir votre écran de gauche et l'autre votre écran de droite, puis adresser les écrans via la DISPLAYvariable d'environnement, mais cette solution a d'autres inconvénients.

En théorie, l'autorité de gouverner le placement des fenêtres est le gestionnaire de fenêtres. Par conséquent, si vous voulez que votre gestionnaire de fenêtres ne puisse pas le faire, ce sera hacky et c'est aussi la raison pour laquelle il n'y a pas de moyen générique pour y parvenir.

Pourtant, si votre cas d'utilisation concret est votre émulateur Android ... ce qui est très différent de demander l'option à spécifier SCREEN=n fooappsur le shell, alors c'est devilspiepeut-être ce que vous recherchez. Astuce: j'ai trouvé qu'il était préférable d'identifier les applications par leur classe de fenêtre.


Merci d'avoir expliqué pourquoi ce n'est pas une fonction facile. KWin a également des règles de fenêtre qui forcent le placement sur un écran différent (c'est ce que j'utilise maintenant). Bien qu'il n'y ait pas de fonctionnalité par défaut pour SCREEN=x app, est-il possible d'ajouter une propriété de fenêtre de cette manière afin qu'elle puisse être filtrée par KWin?
Lekensteyn

En théorie oui, mais je ne connais aucune solution existante pour cela. Je pense que vous ne pouvez pas ajouter de propriétés mais vous pouvez modifier les propriétés existantes, vous pouvez donc simplement ajouter une chaîne à la classe de fenêtre que kwin pourrait détecter.
Bananguin

Je vous ai attribué la prime parce que SE l'attribuerait autrement à la réponse la plus votée tandis que votre réponse décrit mieux les problèmes. Les réponses actuelles ne sont cependant pas encore satisfaisantes.
Lekensteyn

4

Il s'agit d'une solution spécifique au gestionnaire de fenêtres. Voici comment le faire avec kwin qui est le gestionnaire de fenêtres par défaut de KDE.

Si vous faites un clic droit sur la barre de titre de l'application et sélectionnez plus de paramètres -> paramètres d'application spéciaux.

Accédez à l'onglet Correspondance de fenêtre. Cliquez sur le bouton Détecter les propriétés de la fenêtre. Ensuite, avec le curseur de la souris, cliquez sur la fenêtre principale de l'application. Il sélectionnera la classe de fenêtre, etc. et obtiendra également des informations de positionnement de fenêtre, etc.

Cliquez ensuite sur l'onglet Taille et position. Cliquez sur la position de la boîte et la taille de la boîte et la liste déroulante à droite des deux et définissez-la pour vous en souvenir.

Cliquez ensuite sur OK.

La prochaine fois que vous exécutez l'application, elle doit être de la même taille et sur le même moniteur.

J'utilise cela dans KDE pour ouvrir mon terminal uRxvt sur mon moniteur gauche sur une configuration à 3 moniteurs et cela fonctionne à chaque fois.

Bonne chance.


C'est comme ça que je le fais en ce moment, j'espérais qu'il y aurait une manière plus simple d'utiliser les envvars.
Lekensteyn

C'est la bonne réponse pour un utilisateur KDE KWin.
iLikeDirt

3

Cela dépend de la configuration de vos deux moniteurs.

Si vous utilisez XINERAMA pour que les deux écrans ressemblent à un à X, vous utiliseriez l' -geometryoption pour demander aux applications d'apparaître à un emplacement spécifique. Si les écrans sont configurés en différents écrans, vous utiliserez le DISPLAYpour y parvenir.

Essayez-les:

$ DISPLAY=0.0 xterm &
$ DISPLAY=0.1 xterm &

Si vos moniteurs sont les écrans 0 et 1, cela devrait engendrer un xterm sur chaque moniteur.


2
J'ai déjà essayé cela, mais cette configuration ne s'applique pas à moi, un écran est positionné à gauche d'un autre. Je mettrai à jour ma question.
Lekensteyn

1
Avez-vous essayé d'utiliser l'option de géométrie pour les applications qui la prennent en charge? Donner une coordonnée x> 1600 devrait positionner l'application dans le deuxième espace des moniteurs. Vous pouvez également essayer cela en dehors de kwin (juste pour voir si cela fonctionne) comme dans mon expérience kwin et -geometryne fonctionne pas toujours correctement.
casey

Casey, l'application que j'essaye de positionner ne supporte pas une telle option (android emulator, basée sur QEMU). Le programme s'ouvre là où se trouve le curseur de ma souris.
Lekensteyn

2

Je n'ai rencontré cette méthode qui utilise xdotool, xprop, & wmctrl.

Voici ce que fera le script ci-dessous:

  1. Trouver la fenêtre active
  2. Obtenez son état maximisé et rappelez-vous
  3. Supprimer la maximisation
  4. Obtenez sa géométrie
  5. Calculez la nouvelle position
  6. Déplacez-le
  7. Agrandir en fonction de l'état précédent
  8. Lève-le
  9. Voici un script qui fait ça:

scénario

Cela déplacera la fenêtre active vers l'autre moniteur. Il ne peut gérer qu'un côte à côte, alias. horizontal, configuration des moniteurs.

wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`

wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`

new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
  new_x=0
fi

xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
  wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi

xdotool windowraise $wid

Source: Xubuntu - déplacement des fenêtres entre les moniteurs


Cela ne fonctionne qu'après l'ouverture d'une application, pas vraiment ce que je recherche (un raccourci clavier pourrait cependant être ajouté pour cela). Si je ne me trompe pas, cela positionne toujours une fenêtre sur le côté gauche d'un moniteur?
Lekensteyn

@Lekensteyn - Oui, le but de cette solution est de lancer appX, puis d'exécuter cette cmd pour la déplacer. Je n'ai pas de double moniteur 8- (donc je n'ai aucun moyen de le tester, je l'ai simplement trouvé et fourni les détails ici pour que vous puissiez évaluer. C'est une option et pourrait probablement être adaptée mais c'est une solution "brute" dans son forme actuelle
slm

@Lekensteyn - cette solution n'est pas très différente de votre SCREEN=2 appXconcept, sauf qu'elle l'est appX; sleep 1; moveWindow.sh.
slm

@Lekensteyn - j'ai aussi utilisé devilspie, xdotool, etc. pour faire exactement les mêmes choses (dans une seule fenêtre), ce A complimente l'autre, en ce qu'il montre les détails, où l'autre explique seulement les approches possibles mais n'affiche pas les détails réels de l'implémentation.
slm

Ce sera plus comme app & sleep 1; moveWindow.shsi les programmes ne se détachent pas. Je ne considère pas cela comme une amélioration par rapport à l'utilisation des règles de fenêtre KWin. +1 pour vos efforts.
Lekensteyn

0

Eu un problème similaire. Trouvé ce qui suit:

  1. Faites un clic droit sur la barre de titre de la fenêtre et sélectionnez "Plus d'actions" -> "Paramètres du gestionnaire de fenêtres".
  2. Là, choisissez "Focus" dans la colonne de gauche.
  3. Basculez l'option "L'écran actif suit la souris".

Si aucun autre paramètre par défaut n'est spécifié, des fenêtres apparaissent sur l'écran actuellement actif. Avec la procédure décrite ci-dessus, la position de la souris définit cet écran actif.


C'est vrai, mais cela ne fonctionne pas si je veux garder le curseur dans l'écran actuel. Je pense que c'est même l'option par défaut, mais tous les programmes ne la respectent pas.
Lekensteyn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.