Jak zdobyć inny Unity Launcher z różnymi ikonami w każdym obszarze roboczym?

20

Czytam różne odpowiedzi na temat posiadania osobnych folderów na pulpicie w każdym obszarze roboczym za pomocą Screenletów, devilspie lub CCSM ... ale to nie jest odpowiedź na moje pytanie. Kilka dni temu zainstalowałem 14.04 LTS i odniosłem duży sukces, uruchamiając większość moich aplikacji i kilka nowych. Chciałbym mieć 4 oddzielne obszary robocze, każde z kilkoma różnymi ikonami dla środowisk, które prowadzę. Na przykład,

  • Workspace 1 - dedykowany aplikacjom naukowym i matematycznym
  • Workspace 2 - dedykowany narzędziom muzycznym
  • Obszar roboczy 3 - do układów elektronicznych i symulacji
  • Workspace 4 - do przeglądania stron internetowych i ogólnego przetwarzania

Pomyśl o tablecie z Androidem, na którym każdy ekran może zawierać osobne ikony.

To musi być oczywiste, jak to zrobić, ale nie mogę znaleźć odpowiedzi. Mam 4 dni na Ubuntu, więc proszę nie zakładać, że wiem, co robię!

Dennis J
źródło
Masz na myśli inny zestaw ikon programu uruchamiającego dla każdego obszaru roboczego? Pyszne Podoba mi się to, ale muszę biec, jutro nad tym popracuję, jeśli o to ci chodzi. Proszę daj mi znać.
Jacob Vlijm,
Tak, to wszystko Jacob. Istnieją specjalne narzędzia (takie jak LTspice) do symulacji obwodów, które nie mają znaczenia dla muzyki.
Dennis J
Można to zrobić bez wątpienia. Prawdopodobnie jutro lub niedziela :).
Jacob Vlijm,
Dziękuję Jacob. Właśnie zaczynam dzień, więc spróbuję. Brzmi dokładnie tak, jak prosiłem !!! Zajmę się tym i złożę raport.
Dennis J
Jakubie, jeszcze tego nie zacząłem. Zanim zacznę, chcę zrobić obraz zapasowy. Nie jestem pewien, czy Kopie zapasowe w Ustawieniach systemu przywrócą całą partycję. Badałem Clonezilla, wygląda na dobre narzędzie do tworzenia / przywracania obrazu. W ten sposób, jeśli coś pójdzie nie tak, mogę wrócić do tego, zanim to pomieszałem. W tym tygodniu pojawi się nowy dysk 1 TB. Będę musiał użyć Clonezilli, aby przenieść do niego system. Skrypty wyglądają, jakbym mógł je śledzić i poinformuję o tym, jak tylko zacznę. Dzięki za kontynuację, założę się, że inni docenią to, co zrobiłeś.
Dennis J

Odpowiedzi:

24

Ustawianie innego programu uruchamiającego Unity dla obszaru roboczego:


1. wprowadź opis zdjęcia tutaj 2. wprowadź opis zdjęcia tutaj 3. wprowadź opis zdjęcia tutaj 4. wprowadź opis zdjęcia tutaj

Poniższe rozwiązanie umożliwia łatwe ustawienie innego zestawu ikon programu uruchamiającego dla każdego obszaru roboczego, bez względu na to, ile masz obszarów roboczych.

Konfiguracja składa się z dwóch części:

  1. (Jedna) kombinacja klawiszy skrótu do „zapamiętania” zestawu ikon programu uruchamiającego dla bieżącego obszaru roboczego.

  2. Skrypt do uruchomienia w tle, śledzący bieżący obszar roboczy i ustawiający odpowiedni Unity Launcher. Działa, gdy użytkownik zmienia przestrzeń roboczą.

Jak to działa

W grę wchodzą dwa małe skrypty:

Pierwszy skrypt robi jedną prostą rzecz: to zapisuje zawartość bieżącego wyrzutni do pliku (ukryty) w swoim katalogu domowym, o nazwie (numerowane) po bieżącym obszarze roboczym.

Drugi scenariusz pilnuje co jest obecny obszar roboczy. Jeśli nastąpi zmiana obszaru roboczego , skrypt sprawdza, czy istnieje odpowiedni plik danych (uruchamiający) (utworzony przez pierwszy skrypt). Jeśli tak, to czyta plik i zmienia Unity Launcher, jak zapamiętano w pliku.

Otóż ​​to.

Jak skonfigurować

  1. Skrypt musi wmctrlzostać zainstalowany:

    sudo apt-get install wmctrl
    
  2. Utwórz katalog, w którym będą przechowywane oba skrypty . Ważne jest, aby oba skrypty były przechowywane razem w jednym katalogu, ponieważ mają wspólną funkcjonalność, a jeden importuje z drugiego. Z tego samego powodu ważne jest, aby nazwać je dokładnie tak, jak wskazano poniżej.

  3. Skopiuj każdy z poniższych skryptów do (innego) pustego pliku, zapisz je w katalogu (utworzonym w 2.) o nazwie dokładnie :

    set_workspace.py

    #!/usr/bin/env python3
    import subprocess    
    import os
    
    workspace_data = os.environ["HOME"]+"/.launcher_data_"
    key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"]
    
    def get_res():
        # get resolution
        xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
        pos = xr.index("current")
        return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    
    def current():
        # get the current viewport
        res = get_res()
        vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        dt = [int(n) for n in vp_data[3].split("x")]
        cols = int(dt[0]/res[0])
        curr_vpdata = [int(n) for n in vp_data[5].split(",")]
        curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
        return str(curr_col+curr_row*cols)
    
    def remember_current():  
        currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip()
        f = workspace_data+current()
        open(f, "w").write(currlauncher)
    
    if __name__ == "__main__":
        remember_current()

    launcher_perworkspace.py

    #!/usr/bin/env python3
    import subprocess
    import set_workspace
    import time
    
    workspace_data = set_workspace.workspace_data
    key = set_workspace.key
    
    def check_datafile(desktop):
        f = workspace_data+str(desktop)
        try:
            new_launcher = open(f).read()
            command = key[1]+key[2]+' "'+str(new_launcher)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
        except FileNotFoundError:
            pass
    
    curr_dt1 = set_workspace.current()
    check_datafile(curr_dt1)
    
    while True:
        time.sleep(1)
        curr_dt2 = set_workspace.current()
        if curr_dt2 != curr_dt1:
            check_datafile(curr_dt2)
        curr_dt1 = curr_dt2
  4. Dodaj pierwszy skrypt ( set_workspace.py) do wybranej kombinacji klawiszy skrótu: Ustawienia systemowe> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie:

    python3 /path/to/set_workspace.py
    
  5. Uruchom kombinację klawiszy i sprawdź, czy plik taki jak: .launcher_data_3jest tworzony w twoim katalogu domowym. Prawdopodobnie będziesz musiał nacisnąć Ctrl+, Haby plik był widoczny (pliki zaczynające się od a .są domyślnie niewidoczne).

    Poruszaj się po obszarach roboczych i powtórz procedurę: ustaw kombinację ikon programu uruchamiającego i naciśnij kombinację klawiszy, aby „zapamiętać” zestaw dla tego konkretnego obszaru roboczego.

  6. Już praktycznie skończyłeś. Uruchom skrypt w tle za pomocą polecenia (z poziomu okna terminala, uruchom go):

    python3 /path/to/launcher_perworkspace.py
    

    Jeśli wszystko działa poprawnie, a program uruchamiający przełącza się na obszar roboczy, dodaj następujące polecenie do aplikacji Autostart: Dash> Aplikacje Autostart> Dodaj:

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

Uwagi

  1. Jeśli chcesz zmienić zestaw ikon programu uruchamiającego dla określonego obszaru roboczego, po prostu przejdź do tego obszaru roboczego, dodaj / usuń ikony według własnego uznania i naciśnij kombinację klawiszy (nie trzeba ponownie uruchamiać skryptu w tle).
  2. Na podstawie komentarzy mam wrażenie, że skrót nie pamięta o bieżącym programie uruchamiającym dla bieżącego obszaru roboczego. Potrzebujesz tylko jednego skrótu klawiaturowego, aby „zapisać” bieżący program uruchamiający dla bieżącego obszaru roboczego. Będzie działać dokładnie tak samo, bez względu na to, na jakim obszarze roboczym się znajdujesz. Skrypt sam ustalić, co jest prąd roboczy.

Edytować

Z twojego komentarza rozumiem, że nie jesteś pewien, aby uruchomić skrypt (y) i boisz się, że zepsujesz swój obecny program uruchamiający.

Jestem pewien, że to za dużo (lub za mało :) szacunku dla tego, co robi skrypt. Możesz jednak po prostu wykonać kopię zapasową bieżącego Unity Launcher za pomocą polecenia:

printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output

Spowoduje to utworzenie pliku ~/launcher_outputzawierającego pełne polecenie, aby przywrócić Unity Launcher do początkowej sytuacji. W nagłych wypadkach wystarczy skopiować zawartość pliku i wkleić go w terminalu.

Ale znowu jest bardzo mało prawdopodobne, że zepsujesz program uruchamiający, chyba że ręcznie zmienisz skrypt.


WAŻNA EDYCJA (2)

Zgodnie z wnioskiem w komentarzu, niniejszym wersji, która działa bez konieczności korzystania z jakichkolwiek kombinacji skrótów; po prostu uruchom skrypt i zacznij konfigurować programy uruchamiające w określonych obszarach roboczych. Skrypt utworzy (niewidoczne) pliki w katalogu domowym, aby zapamiętać zestaw programów uruchamiających (Unity-) w różnych obszarach roboczych.

Próbowałem tego w „wersji 1” skryptu, ale zawsze „osadzanie” dwóch kontroli uruchamiania między dwiema kontrolami przestrzeni roboczej okazało się sztuczką, aby zapobiec niepożądanemu zachowaniu (zapisywaniu niepoprawnych danych) podczas szybkiego przemieszczania się po obszarach roboczych.

Jak używać

  1. Podobnie jak pierwsza wersja, ten skrypt używa wmctrl:

    sudo apt-get install wmctrl

  2. Skopiuj skrypt do pustego pliku i zapisz go jako launcher_toworkspace.py

  3. Uruchom go za pomocą polecenia:

    python3 /path/to/launcher_toworkspace.py
    
  4. Jeśli działa zgodnie z oczekiwaniami, dodaj następujące polecenie do aplikacji startowych:

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

Scenariusz

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

datadir = os.environ["HOME"]+"/.config/lswitcher"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/launcher_data_"

key = [
    "gsettings get ",
    "gsettings set ",
    "com.canonical.Unity.Launcher favorites",
    ]

def get_launcher():
    return subprocess.check_output(
        ["/bin/bash", "-c", key[0]+key[2]]
        ).decode("utf-8").strip()

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def current():
    # get the current viewport
    res = get_res()
    vp_data = subprocess.check_output(
        ["wmctrl", "-d"]
        ).decode("utf-8").split()
    dt = [int(n) for n in vp_data[3].split("x")]
    cols = int(dt[0]/res[0])
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    curr_col = int(curr_vpdata[0]/res[0])+1
    curr_row = int(curr_vpdata[1]/res[1])
    return str(curr_col+curr_row*cols)

curr_ws1 = current()
currlauncher1 = get_launcher()

while True:
    time.sleep(1)
    currlauncher2 = get_launcher()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if currlauncher2 != currlauncher1:
            open(datafile, "wt").write(currlauncher2)
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(currlauncher2)
        else:
            curr_set = open(datafile).read()
            command = key[1]+key[2]+' "'+str(curr_set)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
    curr_ws1 = curr_ws2
    currlauncher1 = get_launcher()

Uwaga

Jeśli skonfigurujesz obszary robocze z poprzednią wersją skryptu, powinny one również działać dla tej wersji.

PPA

Zgodnie z 23.04.2015 ładne pytanie Dennisa J i zachęty ze strony Parto doprowadziły do ​​stworzenia ppaskryptu przeznaczonego dla skryptu, opisanego na webupd8 , zawierającego GUI do zarządzania nim.

ppa:vlijm/lswitcher

Aby go zainstalować, uruchom:

sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher

wprowadź opis zdjęcia tutaj

Odtąd jest on pakowany do wersji Trusty & Utopic. Dodam innych po testach. Dodam również .debinstalator, ale sugeruję użycie ppa, ponieważ zwykle tego rodzaju rzeczy są aktualizowane co jakiś czas.

Ponieważ lokalizacja danych rzutni zmieniła się z ~/na ~/.config/lswitcher, będziesz musiał ponownie skonfigurować Unity Launcher, jeśli używałeś poprzedniego skryptu.

Jacob Vlijm
źródło
Czy jest to możliwe bez użycia skrótów klawiaturowych? Jak to wizualizuję, jak pokazano poniżej: W pierwszym obszarze roboczym wyświetlany jest tylko zestaw ikon; po przejściu do drugiego obszaru roboczego program uruchamiający jest pusty, z wyjątkiem ikon myślnika i kosza - a następnie dodaję ikony, które chcę, które są zapisywane automatycznie. Powtórz dla innych obszarów roboczych. Być może możesz nawet stworzyć dla niego GUI - da ci +500, jeśli go uruchomisz. GUI jest opcjonalny.
Parto
1
@Parto WOW, wiesz, jak zwrócić czyjąś uwagę :) Jest to z pewnością możliwe, ale zajęłoby wiele wątków, aby działało bezproblemowo (wypróbowałem to w „mono” skrypcie śledzenia). Spodziewaj się odpowiedzi w ciągu kilku najbliższych dni :).
Jacob Vlijm
1
Niesamowite. Będę czekał ... fajne pytanie, zastanawiam się, jak o tym nie pomyślałem.
Parto
1
@Parto Muszę powiedzieć, że jestem pod wrażeniem twojej hojności. Planuję dalej nad tym pracować i może stworzyć ppaGUI do uruchamiania / zatrzymywania, preferencje itp. Dzięki za push! Nawiasem mówiąc, Twój pulpit wygląda świetnie!
Jacob Vlijm
1
W dowolnym momencie Każdy potrzebuje odtąd od razu. Ponadto już wcześniej mi pomogłeś - po prostu uważaj to za podziękowanie. Jeśli chodzi o ten „projekt”, ppa byłoby fajne, ponieważ nie każdy jest specjalistą.
Parto