Öffnen Sie das Anwendungsfenster auf demselben Bildschirm wie auf dem Startort

8

Ich verwende ein Dual-Screen-Setup. Ubuntu 14.10 / Unity. Jeder Bildschirm hat einen eigenen Launcher / Dash. Standardanwendungen wie Firefox, Nautilus, Terminal und Thunderbird werden auf dem Bildschirm angezeigt, auf dem ich den Launcher verwendet habe. Wenn ich den Launcher für Firefox auf dem rechten Bildschirm verwende, wird der Browser auf dem rechten Bildschirm geöffnet. So wie es sein sollte.

Ich möchte dieses Verhalten mit anderen Anwendungen wie Google Chrome. Ich kann anscheinend keine richtige Lösung finden.

Digiplace
quelle

Antworten:

5

Umleiten des Befehls zum Ausführen einer Anwendung

Die meisten Anwendungen öffnen ihr Fenster auf dem Bildschirm, von dem aus sie initiiert wurden (entweder von Dash oder vom Launcher). Einige Anwendungen tun dies jedoch nicht, können jedoch dazu gezwungen werden, indem der Befehl zum Ausführen der Anwendung über das folgende Skript umgeleitet wird. Dazu müssen Sie die entsprechende .desktopDatei (Launcher) bearbeiten .

Das Setup scheint etwas kompliziert zu sein, aber wenn das Verfahren befolgt wird ("How to use"), sollte es überhaupt nicht zu schwierig sein.

Wie es funktioniert

  • Das Skript liest die Mausposition in dem Moment, in dem Sie auf den Starter klicken oder die Anwendung aus Dash auswählen, und bestimmt, auf welchem ​​Bildschirm sich das befindet (links / rechts).
  • Anschließend wird darauf gewartet, dass das neue Fenster angezeigt wird, das der von Ihnen gestarteten Anwendung (pid) gehört.
  • Sobald das Fenster angezeigt wird, wird überprüft, ob die Position des Fensters (Bildschirm) mit der Ausgangsposition der Maus (Bildschirm) übereinstimmt.
  • Wenn nicht, wird das Fenster auf den Bildschirm verschoben, von dem aus Sie die Anwendung gestartet haben. In den meisten Fällen befindet sich die Aktion in einem (sehr) frühen Stadium der Existenz des Fensters, sodass Sie sie nicht einmal bemerken.

Problem / Lösung

Es gibt einen Nachteil: Wenn Sie den Hauptbefehl der .desktopDatei durch den Befehl zum Aufrufen dieses Skripts ersetzen, funktioniert der Rechtsklick auf "Öffnen mit" nicht ordnungsgemäß. Bei einem Webbrowser wie Google Chrome ist das kein allzu großes Problem. Bei anderen Anwendungen besteht eine einfache Lösung darin, die Option zum Öffnen eines neuen Fensters auf dem aktuellen Bildschirm als Verknüpfung hinzuzufügen (siehe weiter unten).

<Bild>

Wie benutzt man:

  • Das Skript verwendet beide wmctrlund xautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • Erstellen Sie ein Verzeichnis, ~/binfalls es noch nicht vorhanden ist.

  • Kopieren Sie das Skript in eine leere Datei und speichern Sie es als open_oncurrent(keine Erweiterung) in~/bin

  • Mach es ausführbar (!)
  • Kopieren Sie die entsprechende .desktopDatei von /usr/share/applicationsnach ~/.local/share/applications:

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
    
  • Öffnen Sie die lokale Kopie in ~/.local/share/applications:

    gedit ~/.local/share/applications/google-chrome.desktop
    
  • Bearbeiten Sie die Datei (zwei Optionen):

    1. So ändern Sie den Hauptbefehl des Launchers:

      • finde die Zeile:

        Exec=/usr/bin/google-chrome-stable %U
        
      • ändere es auf

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. So fügen Sie die Option als Verknüpfung hinzu (wie im obigen Bild):

      • finde die Zeile:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
        
      • Ersetzen Sie es durch:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
        
      • Fügen Sie dann den folgenden Abschnitt ganz am Ende der Datei hinzu:

        [New window on this screen Shortcut Group]
        Name=New window on this screen
        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        TargetEnvironment=Unity
        

Verwendung mit anderen Anwendungen:

Ebenso können Sie die Lösung auf andere Anwendungen anwenden. Die Syntax des in der .desktopDatei zu verwendenden Befehls lautet wie im Beispiel:

Exec=/bin/bash -c "open_oncurrent <command>"

Eine kleine zusätzliche Erklärung zum Umgang mit Ausnahmen finden Sie im Skript.

Das Skript

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

t = 0; user = getpass.getuser(); application = sys.argv[1]
"""
In most cases, the command to run an application is the same as the process
name. There are however exceptions, to be listed below, if you use these appli-
cations i.c.w. this script. Just add an item to the list in the format:
["<command>", "<process_name>"],
"""
exceptions = [
    ["/usr/bin/google-chrome-stable", "chrome"],
    ]
try:
    procname = [app[1] for app in exceptions if app[0] == application][0]
except IndexError:
    procname = application

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
# initial position of the mouse (click position)
start_pos = int(get("xmousepos").strip().split()[0])
# x- position of right side of the screen  
x_res = [int(s.split("x")[0]) for s in get("xrandr").split() if s.endswith("+0+0")][0]
# current windows
start_windows = get("wmctrl -l")
# open application
subprocess.call(["/bin/bash", "-c", application+"&"])
while t < 30:
    procs = get("ps -u "+user).splitlines()
    new = [w for w in get("wmctrl -lpG").splitlines() if not w.split()[0] in start_windows]
    match = sum([[line for line in procs if w.split()[2] in line and procname[:15] in line] for w in new], [])
    if len(match) == 1:
        data = new[0].split(); curr_pos = int(data[3]); compare = (start_pos > x_res, curr_pos > x_res)
        if compare[0] == compare[1]:
            pass
        else:
            if compare[0] == True:
                data[3] = str(int(data[3])+x_res)
            else:
                data[3] = str(int(data[3])-x_res)
            cmd1 = "wmctrl -r "+data[0]+" -b remove,maximized_vert,maximized_horz"
            cmd2 = "wmctrl -ir "+data[0]+" -e 0,"+(",").join(data[3:7])
            for cmd in [cmd1, cmd2]:
                subprocess.Popen(["/bin/bash", "-c", cmd])
        break
    t = t + 1
    time.sleep(0.5)
Jacob Vlijm
quelle
Danke, das funktioniert. Beim Öffnen wird ein zweites Symbol von Google Chrome auf dem Launcher angezeigt.
Digiplace
6

Unity verwendet Compiz als Composing Manager, und das hat alle möglichen Plugins für diese Art von Sachen. Installieren Sie den Compiz Config Settings Manager (mit sudo apt-get install compizconfig-settings-manageroder über das Software Center) und Place Windowsstellen Sie sicher, dass er aktiviert ist

Geben Sie hier die Bildbeschreibung ein

Unter diesem Plugin gibt es mehrere Optionen für Multi Output Mode. Was du willst ist Use output device of focused window. Somit wird das geöffnete Dateifenster überall dort platziert, wo sich Ihr Dateimanager befindet Geben Sie hier die Bildbeschreibung ein

Sergiy Kolodyazhnyy
quelle