Otwórz okno aplikacji na tym samym ekranie, na którym zostało uruchomione

8

Używam konfiguracji podwójnego ekranu. Ubuntu 14.10 / Unity. Każdy ekran ma własny program uruchamiający / Dash. Domyślne aplikacje, takie jak Firefox, nautilus, terminal i thunderbird, pojawiają się na ekranie, na którym użyłem programu uruchamiającego. Więc ... kiedy używam programu uruchamiającego Firefox na prawym ekranie, przeglądarka otwiera się na prawym ekranie bocznym. Tak jak powinno być.

Chciałbym takie zachowanie w przypadku innych aplikacji, takich jak Google Chrome. Nie mogę znaleźć odpowiedniego rozwiązania.

Digiplace
źródło

Odpowiedzi:

5

Przekierowanie polecenia w celu uruchomienia aplikacji

Większość aplikacji otwiera okno na ekranie, z którego zostały zainicjowane (z poziomu Dasha lub programu uruchamiającego). Niektóre aplikacje jednak tego nie robią, ale można to zrobić, przekierowując polecenie, aby uruchomić aplikację za pomocą poniższego skryptu. Aby to zrobić, musisz edytować odpowiedni .desktopplik (program uruchamiający).

Konfiguracja wydaje się nieco skomplikowana, ale jeśli zastosowana zostanie procedura („Jak korzystać”), nie powinno być wcale zbyt trudne.

Jak to działa

  • Skrypt odczytuje pozycję myszy w momencie kliknięcia programu uruchamiającego lub wybierania aplikacji z Dash i określa, na którym ekranie jest (lewy / prawy).
  • Kolejno czeka, aż pojawi się nowe okno, którego właścicielem jest uruchomiona aplikacja (pid).
  • Po wyświetleniu okna sprawdza, czy pozycja okna (ekranu) odpowiada pozycji początkowej myszy (ekranu).
  • Jeśli nie, przenosi okno do ekranu, z którego uruchomiono aplikację. W większości przypadków akcja będzie na (bardzo) wczesnym etapie istnienia okna, więc nawet tego nie zauważysz.

Problem / rozwiązanie

Jest jedna wada: jeśli zastąpisz główne polecenie .desktoppliku poleceniem wywołania tego skryptu, kliknięcie prawym przyciskiem myszy „otwórz za pomocą” nie będzie działać poprawnie. W przypadku przeglądarki internetowej takiej jak Google Chrome nie będzie to zbyt dużym problemem. W przypadku innych aplikacji prostym rozwiązaniem byłoby dodanie opcji otwarcia nowego okna na bieżącym ekranie jako skrótu (patrz dalej poniżej).

<image>

Jak używać:

  • Skrypt korzysta zarówno wmctrla xautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • Utwórz katalog, ~/binjeśli jeszcze nie istnieje.

  • Skopiuj skrypt do pustego pliku, zapisz go jako open_oncurrent(bez rozszerzenia) w~/bin

  • Spraw, by był wykonywalny (!)
  • Skopiuj odpowiedni .desktopplik z /usr/share/applicationsdo ~/.local/share/applications:

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
    
  • Otwórz lokalną kopię w ~/.local/share/applications:

    gedit ~/.local/share/applications/google-chrome.desktop
    
  • Edytuj plik (dwie opcje):

    1. Aby zmienić główne polecenie programu uruchamiającego:

      • znajdź linię:

        Exec=/usr/bin/google-chrome-stable %U
        
      • zmień na

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. Aby dodać opcję jako skrót (jak na powyższym obrazku):

      • znajdź linię:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
        
      • zastąp to:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
        
      • Następnie dodaj następującą sekcję na samym końcu pliku:

        [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
        

Jak korzystać z innych aplikacji:

Podobnie możesz zastosować rozwiązanie do innych aplikacji. Składnia polecenia do użycia w .desktoppliku jest jak w przykładzie:

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

Małe dodatkowe wyjaśnienie, jak radzić sobie z wyjątkami, znajduje się w skrypcie.

Scenariusz

#!/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
źródło
Dziękuję, to działa. Po otwarciu zauważam drugą ikonę Google Chrome w programie uruchamiającym.
Digiplace
6

Unity używa Compiz jako menedżera komponowania, który ma wiele wtyczek do tego rodzaju rzeczy. Aby było to łatwe i długie opowiadanie bez bałaganu w wierszu poleceń, zainstaluj Compiz Config Settings Manager (z sudo apt-get install compizconfig-settings-managerlub za pośrednictwem Centrum oprogramowania) i poszukaj Place Windows, upewnij się, że jest zaznaczone

wprowadź opis zdjęcia tutaj

Pod tą wtyczką będzie kilka opcji Multi Output Mode. To czego chcesz Use output device of focused window. W ten sposób otworzy otwarte okno pliku, gdziekolwiek jest twój menedżer plików wprowadź opis zdjęcia tutaj

Sergiy Kolodyazhnyy
źródło