Wie kann ich ein Fenster auf einem anderen Monitor öffnen?

9

Bei mehreren Monitoren habe ich bisher Fenster manuell verschoben. Gibt es eine Möglichkeit, ein Fenster auf einem bestimmten Bildschirm in einem Dual-Head-Setup zu öffnen? (Nicht zu verwechseln mit mehreren X-Server-Anzeigen.)

So etwas wie: SCREEN=2 firefoxoder open-in-screen 2 firefox.

Wenn es darauf ankommt, ist meine Umgebung KDE mit dem KWin-Fenstermanager. KWin-Fensterregeln können nur mit einigen Eigenschaften wie title übereinstimmen, aber ich konnte keine Umgebungsvariable als Filter finden.

Die sekundäre Anzeige erweitert den primären Bildschirm:

$ 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)
Lekensteyn
quelle
2
Normalerweise würde ich vorschlagen, kstartdies zu verwenden, aber es scheint kstartnur die Definition eines bestimmten Desktops zu unterstützen, nicht jedoch einen Bildschirm, auf dem die Anwendung gestartet werden soll. Wahrscheinlich einen WISHLIST-Bugreport auf bugs.kde.org wert .
Elias Probst
Toller Tipp dazu kstart, das wollte ich auch wissen. Der Befehl lautet: kstart --desktop $N firefoxDabei $Nsteht eine Zahl zwischen 1 und der Gesamtzahl der virtuellen Desktops.
Lekensteyn
In Bezug auf kstart gibt es auch einen Bugreport auf bugs.kde.org, der nach dieser Funktion fragt.
Elias Probst
Wie seltsam, ich habe heute früher einen Beitrag über wmctrl gesehen, aber keine Gelegenheit gehabt, ihn zu testen. Warum wurde es gelöscht?
Lekensteyn
Keine Ahnung von dem wmctrl-Beitrag, habe ihn nicht gesehen.
Elias Probst

Antworten:

5

Nein, das kannst du nicht direkt machen. In der X-Architektur sind die beiden angezeigten physischen Monitore für Anwendungen nicht erkennbar. Sie können sich nur um diese Abstraktion herumarbeiten, indem Sie bestimmen, welche Bereiche des sichtbaren Arbeitsbereichs welchem ​​Monitor entsprechen, und dann die Fenster im richtigen Versatz platzieren.

Sinnvolle Toolkits unterstützen eine -geometryOption, mit der Ihre Anwendung die Platzierung an einer bestimmten Position anfordern kann. Wenn Sie diese Option nicht zur Verfügung haben, können Sie sie verwenden, wmctrlwenn Sie über einen EWMH / NetWM-kompatiblen X Window Manager verfügen, um bereits vorhandene Fenster zu verschieben und ihre Größe zu ändern (siehe wmctrl (1), Sie benötigen Optionen -rund -e). Ich devilspieerzwinge das Platzieren einiger Fenster, und natürlich kann Ihr bevorzugter Fenstermanager über eine eigene Funktion verfügen, um das Platzieren von Fenstern zu erzwingen.

devilspieErmöglicht das Anwenden bestimmter Aktionen auf X-Fenster und das Verwenden von X-Fenstereigenschaften, um verschiedene Fenster und Anwendungen zu erkennen. Die Schlüsselregel für Sie wäre geometry "<width>x<height>+<xoffset>+<yoffset>".

Sie müssen jedoch immer berechnen, wann und wo ein anderer physischer Monitor selbst beginnt. Dies ist jedoch nicht allzu schwierig und xrandrzeigt Ihnen, wie und wo Monitore in Form von "<width>x<height>+<xoffset>+<yoffset>Zeilen verwendet werden, die mit einem Ausgabenamen versehen sind.

Es gibt keine narrensichere Methode, da die Implementierungen variieren können (und funktionieren!). wmctrlArbeitet normalerweise am Fenstertitel, um das Ziel zu identifizieren. devilspiekann sich auch auf seine Klasse beziehen, mir ist jedoch kein Toolkit bekannt, mit dem Sie eine X-Windows-Klasse angeben können, jedoch nicht deren Geometrie.

Natürlich können Sie immer zwei xephyrInstanzen starten und eine Ihren linken und die andere Ihren rechten Bildschirm ausfüllen und dann die Bildschirme über die DISPLAYUmgebungsvariable adressieren , aber diese Lösung hat andere Nachteile.

Theoretisch ist der Fenstermanager die Autorität zur Steuerung der Fensterplatzierung. Wenn Sie also Dinge möchten, die Ihr Fenstermanager nicht kann, wird dies hackig und es ist auch der Grund, warum es keinen generischen Weg gibt, dies zu erreichen.

Wenn Ihr konkreter Anwendungsfall jedoch Ihr Android-Emulator ist ... was sich stark von der Frage nach der Option unterscheidet, die SCREEN=n fooappauf der Shell angegeben werden soll, ist dies devilspiemöglicherweise das, wonach Sie suchen. Hinweis: Ich fand es am besten, Anwendungen anhand ihrer Fensterklasse zu identifizieren.

Bananguin
quelle
Vielen Dank für die Erklärung, warum dies keine einfache Funktion ist. KWin hat auch Fensterregeln, die die Platzierung auf einem anderen Bildschirm erzwingen (was ich jetzt verwende). Obwohl es keine Standardfunktion für gibt SCREEN=x app, ist es möglich, eine Fenstereigenschaft auf diese Weise hinzuzufügen, damit sie von KWin gefiltert werden kann?
Lekensteyn
Theoretisch ja, aber mir ist keine Lösung dafür bekannt. Ich denke, Sie können keine Eigenschaften hinzufügen, aber Sie können vorhandene Eigenschaften ändern, sodass Sie der Fensterklasse, die kwin erkennen kann, einfach eine Zeichenfolge hinzufügen können.
Bananguin
Ich habe Ihnen das Kopfgeld zugesprochen, weil SE es ansonsten der am besten bewerteten Antwort gewähren würde, während Ihre Antwort die Probleme besser beschreibt. Die aktuellen Antworten sind jedoch immer noch nicht zufriedenstellend.
Lekensteyn
4

Dies ist eine Fenstermanager-spezifische Lösung. So geht's mit kwin, dem Standard-Fenstermanager von KDE.

Wenn Sie mit der rechten Maustaste auf die Titelleiste der Anwendung klicken und weitere Einstellungen auswählen -> spezielle Anwendungseinstellungen.

Gehen Sie zur Registerkarte Fensteranpassung. Klicken Sie auf die Schaltfläche Fenstereigenschaften erkennen. Klicken Sie dann mit dem Mauszeiger auf das Hauptfenster der Anwendung. Es wählt die Fensterklasse usw. aus und erhält auch Informationen zur Fensterpositionierung usw.

Klicken Sie dann auf die Registerkarte Größe und Position. Klicken Sie auf das Feld und die Größe des Felds und das Dropdown-Feld rechts neben beiden und legen Sie fest, dass es gespeichert werden soll.

Klicken Sie dann auf OK.

Wenn Sie die App das nächste Mal ausführen, sollte sie dieselbe Größe und denselben Monitor haben.

Ich verwende dies in KDE, um mein uRxvt-Terminal auf meinem linken Monitor in einem 3-Monitor-Setup zu öffnen, und es funktioniert jedes Mal.

Viel Glück.

rking
quelle
So mache ich es jetzt, ich hatte gehofft, dass es einen einfacheren Weg gibt, Envvars zu verwenden.
Lekensteyn
Dies ist die richtige Antwort für einen KDE KWin-Benutzer.
iLikeDirt
3

Dies hängt davon ab, wie Ihre Dual-Monitore eingerichtet sind.

Wenn Sie XINERAMA verwenden, um beide Anzeigen für X wie eins anzuzeigen, können Sie die -geometryOption verwenden, um Anwendungen aufzufordern, an einem bestimmten Ort angezeigt zu werden . Wenn Sie die Anzeigen als unterschiedliche Bildschirme eingerichtet haben, verwenden Sie die DISPLAY, um dies zu erreichen.

Probieren Sie diese aus:

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

Wenn Ihre Monitore Bildschirm 0 und 1 sind, sollte dies auf jedem Monitor ein xterm erzeugen.

Casey
quelle
2
Ich habe dies bereits versucht, aber diese Konfiguration gilt nicht für mich. Ein Bildschirm befindet sich links von einem anderen. Ich werde meine Frage aktualisieren.
Lekensteyn
1
Haben Sie versucht, die Geometrieoption für Apps zu verwenden, die sie unterstützen? Wenn Sie eine x-Koordinate> 1600 angeben, sollte die App im zweiten Überwachungsbereich positioniert werden. Sie können dies auch außerhalb von kwin versuchen (nur um zu sehen, ob es funktioniert), wie meiner Erfahrung nach kwin und -geometrynicht immer richtig funktioniert.
Casey
Casey, die Anwendung, die ich zu positionieren versuche, unterstützt eine solche Option nicht (Android emulator, basierend auf QEMU). Das Programm wird dort geöffnet, wo sich mein Mauszeiger befindet.
Lekensteyn
2

Ich habe über diese Methode kommen die Verwendung macht xdotool, xpropu wmctrl.

Das folgende Skript bewirkt Folgendes:

  1. Suchen Sie das aktive Fenster
  2. Holen Sie sich seinen maximierten Zustand und erinnern Sie sich daran
  3. Maximierung entfernen
  4. Holen Sie sich seine Geometrie
  5. Berechnen Sie die neue Position
  6. Bewege es
  7. Maximieren Sie basierend auf dem vorherigen Status
  8. Erhöhen Sie es
  9. Hier ist ein Skript, das das macht:

Skript

Dadurch wird das aktive Fenster auf den anderen Monitor verschoben. Es kann nur eine Seite an Seite behandeln, auch bekannt als. horizontal, Konfiguration von Monitoren.

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

Quelle: Xubuntu - Fenster zwischen Monitoren verschieben

slm
quelle
Dies funktioniert nur, nachdem eine Anwendung geöffnet wurde, nicht wirklich das, wonach ich suche (eine Schlüsselbindung könnte jedoch wahrscheinlich hinzugefügt werden). Wenn ich mich nicht irre, positioniert dies immer ein Fenster auf der linken Seite eines Monitors?
Lekensteyn
@Lekensteyn - Ja, die Absicht dieser Lösung ist, dass Sie appX starten und dann dieses cmd ausführen, um es zu verschieben. Ich habe keine Doppelmonitore 8- (daher habe ich keine Möglichkeit, dies zu testen. Ich habe es einfach gefunden und die Details hier zur Bewertung bereitgestellt. Es ist eine Option und könnte wahrscheinlich angepasst werden, aber es ist eine "rohe" Lösung aktuelle Form.
slm
@Lekensteyn - diese Lösung unterscheidet sich nicht wesentlich von Ihrem SCREEN=2 appXKonzept, außer es ist appX; sleep 1; moveWindow.sh.
slm
@Lekensteyn - auch ich habe devilspie, xdotool usw. verwendet, um genau die gleichen Dinge zu tun (innerhalb eines einzelnen Fensters). Dieses A ergänzt das andere, indem es die Besonderheiten zeigt, wobei das andere nur die möglichen Ansätze erklärt, aber zeigt keine tatsächlichen Implementierungsdetails an.
slm
Es wird eher so sein, app & sleep 1; moveWindow.shals würden sich die Programme nicht lösen. Ich halte dies jedoch nicht für eine Verbesserung gegenüber der Verwendung von KWin-Fensterregeln. +1 für deine Bemühungen.
Lekensteyn
0

Hatte ein ähnliches Problem. Folgendes gefunden:

  1. Klicken Sie mit der rechten Maustaste auf die Titelleiste des Fensters und wählen Sie "Weitere Aktionen" -> "Fenstermanager-Einstellungen".
  2. Dort wählen Sie "Fokus" in der Spalte links.
  3. Option "Aktiver Bildschirm folgt Maus" umschalten.

Wenn keine anderen Standardeinstellungen angegeben sind, werden Fenster auf dem aktuell aktiven Bildschirm angezeigt. Bei dem oben beschriebenen Verfahren definiert die Mausposition diesen aktiven Bildschirm.

BiberBb
quelle
Richtig, aber das funktioniert nicht, wenn ich den Cursor auf dem aktuellen Bildschirm halten möchte. Ich denke, dies ist sogar die Standardoption, aber nicht alle Programme respektieren sie.
Lekensteyn