Wie öffne ich eine Datei auf demselben Bildschirm, auf dem ich daran arbeite?

Wie öffne ich eine Datei auf demselben Bildschirm, auf dem ich daran arbeite?

Ich habe ein LCD an meinen Laptop angeschlossen. Wenn ich versuche, eine Datei in Nautilus zu öffnen, wird die Zielanwendung auf meinem Laptop-Display geöffnet und nicht auf dem zweiten Display (auf dem das Nautilus-Fenster geöffnet ist).

Ich möchte die Standardanzeige nicht ändern. Ich möchte Fenster auf der Anzeige öffnen, auf der ich arbeite. Wenn sich mein Dateimanager auf der Laptop-Anzeige befindet, möchte ich, dass die Apps auf der Laptop-Anzeige geöffnet werden. Wenn sich mein Dateimanager auf einer externen Anzeige befindet, erwarte ich, dass ich dort Dateien öffnen kann.

Die Ausgabe vonxrandr

Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
eDP1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 256mm x 144mm
   1366x768       60.1*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+1366+0 (normal left inverted right x axis y axis) 527mm x 296mm
   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  
   1280x800       59.9  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1440x576i      50.1  
   1024x768       75.1     70.1     60.0  
   1440x480i      60.1     60.1  
   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)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Antwort1

Das von Ihnen beschriebene Verhalten (Öffnen des Fensters auf dem aktuellen Bildschirm)sollendas Standardverhalten sein, bei meinem 14.04 ist es so.

Aufgrund kleinerer Inkompatibilitäten mit einigen Grafiktreiber/GPU-Kombinationen können in einigen Fällen „Eigenheiten“ auftreten. Wenn keine „Clean“-Option (Fix) verfügbar ist, können Sie den unten stehenden Workaround verwenden.
Er besteht aus einem Hintergrundskript, das nach neuen Fenstern sucht. Falls ein neues Fenster vorhanden ist, vergleicht das Skript die Fensterposition mit der aktuellen Mausposition. Wenn sich Maus und neues Fenster nicht auf demselben Bildschirm befinden, wird das Fenster mit dem xdotoolBefehl windowmove verschoben.

Ist ein Hintergrundskript eine schlechte Idee?

Wenn Sie kein Hintergrundskript benötigen, verwenden Sie es nicht.
Gleichzeitig gilt: Wenn es wichtige Funktionen hinzufügt und/oder Ihnen Zeit spart, wäre es dumm, es nicht zu verwenden.Wenndas Skript ist gut organisiert und daher „sparsam im Verbrauch“.

Als Referenz: Sowohl auf meinem Laptop als auch auf meinem Desktop verwende ich ständigmindestens5 Hintergrundskripte + gelegentlich einige zusätzliche zu Testzwecken, ohnebeliebigbeachten.

Was wird getan, um Kraftstoff zu sparen:

  1. Das Skript hat einen variablen Schleifenzyklus
    Alle 10 Sekunden prüft das Skript, ob der zweite Bildschirm angeschlossen ist. Wenn nicht, überspringt das Skript die gesamte Fensterprüfung und prüft nach 10 Sekunden erneut. Das bedeutet, dass das Skriptnurwirkt, wenn ein zweiter Bildschirm angeschlossen ist. Sobald ein zweiter Bildschirm angeschlossen ist, wird innerhalb von 10 Sekunden die Schleife auf eine Periode von 2 Sekunden geändert.
  2. Alle (nächsten) Aktionen des Skripts sind bedingt
    zB die Mausposition istnurgeprüftWennes gibt neue Fenster etc.

Alles in allem konnte ich auf meinem System weder feststellen noch messen,beliebigzusätzliche Belastung, durch das Skript.

Das Drehbuch

#!/usr/bin/env python3
import subprocess
import time

def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def screen_limit():
    screendata = [s for s in get("xrandr").split() if s.count("+") == 2]
    if len(screendata) == 2:
        return int([s.split("x")[0] for s in screendata if "+0+0" in s][0])

wd1 = get(["wmctrl", "-lG"])

t = 0
while True:
    time.sleep(2)
    # once per 10 seconds, check for a second screen
    if t == 0: 
        while True:
            rightside = screen_limit()
            # if no second screen, skip the procedure
            if rightside == None:
                time.sleep(10)
            else:
                break
    wd2 = get(["wmctrl", "-lG"])
    # check for buggy wmctrl
    if all([wd2 != None, wd1 != None]):
        wins = [w.split() for w in wd2.splitlines()]
        # check for new windows
        relevant = [w for w in wins if not w[0] in wd1]
        if relevant:
            # if new windows appeared, see if they match the mouse pos
            mousepos = int(get([
                "xdotool", "getmouselocation"
                ]).split()[0].split(":")[1])
            for w in relevant:
                check = [mousepos < rightside, int(w[2]) < rightside]
                if check[0] != check[1]:
                    # if mouse and window are not on the same screen > move
                    if check[0] == False:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) + rightside), w[3]]                    
                    else:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) - rightside), w[3]]
                    subprocess.Popen(cmd)
    wd1 = wd2
    t = 0 if t == 10 else t
    t += 1

Wie benutzt man

  1. Das Skript benötigt sowohl wmctrlals auch xdotool. Führen Sie es in einem Terminal aus:

    sudo apt-get install xdotool wmctrl
    
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es untermove_windows.py
  3. Testen Sie das Skript mit dem folgenden Befehl:

    python3 /path/to/move_windows.py
    
  4. Wenn alles wie erwartet funktioniert, fügen Sie es zu den Startanwendungen hinzu: Dash > Startanwendungen > Hinzufügen. Fügen Sie den Befehl hinzu:

    /bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"
    

verwandte Informationen