Czy istnieje sposób na zapisanie bieżącego układu pulpitu?

25

Co chcę, aby móc zapisać bieżące pozycje moich aplikacji, więc kiedy mam zamiar otworzyć te same i uruchomić coś, przestawią się tak, jak były.

Na przykład, jeśli mam zamiar otworzyć podniosłe i trzy terminalne okna, chciałbym móc to jakoś zapisać.

Nieobchodzimnie,czyjesttoaplikacjalubnarzędziewierszapoleceń,oilemogęłatwozapisaćpozycjemoichaplikacji.

Jestemwielkimfanem Moom , ale niestety działa tylko na MacOS i naprawdę tęsknię za nim w Ubuntu. Obsługuje więcej funkcji i jeśli wiesz o czymś zbliżonym do mojego głównego problemu, to też jest w porządku.

    
zadawane Lipis 27.09.2012, 12:02
źródło

4 odpowiedzi

23

Uwaga

Skrypt został załatany / naprawiony 16 stycznia 2017 r. Naprawiono kilka aplikacji, których nazwa procesu różni się od komendy w celu uruchomienia aplikacji . Możliwe, że zdarza się to sporadycznie w aplikacjach. Jeśli ktoś go znajdzie, zostaw komentarz.

Skrypt do zapamiętania i przywrócenia układu okna i odpowiadających im aplikacji.

Poniższy skrypt można uruchomić za pomocą dwóch opcji. Załóżmy, że masz układ okien jak poniżej:

Abyprzeczytać(zapamiętaj)bieżącyukładokieniichaplikacje,uruchomskryptzapomocąopcji:

<script>-read

Następniezamknijwszystkieokna:

Następnie skonfiguruj ostatnią zapamiętaną aranżację okna, uruchom ją z opcją:

<script> -run

i ostatnio zapamiętany układ okien zostanie przywrócony:

Torównieżdziałaporestarcie.

Umieszczającdwapoleceniapoddwomaróżnymiklawiszamiskrótów,można"nagrać" układ okien, zamknąć komputer i przywołać to samo okno po (np.) ponownym uruchomieniu.

Co robi skrypt i co robi nie

Uruchom z opcją -read

  • Skrypt używa wmctrl do wyświetlenia wszystkich okien, wszystkich obszarów roboczych, ich pozycji, ich rozmiarów, aplikacji, do których należą
  • Skrypt następnie "konwertuje" pozycje okien z względnego (do bieżącego obszaru roboczego, jak w danych wyjściowych z wmctrl ) na pozycje bezwzględne na spanningowych obszarach roboczych. Dlatego nie ma znaczenia, czy okna, które chcesz zapamiętać, znajdują się tylko w jednym obszarze roboczym, czy też w różnych obszarach roboczych.
  • Następnie skrypt "zapamiętuje" bieżącą aranżację okna, zapisując ją w niewidocznym pliku w twoim katalogu domowym.

Uruchom z opcją -run

  • skrypt odczytuje ostatnią zapamiętaną aranżację okna; uruchamia odpowiednie aplikacje, przenosi okna do zapamiętanych pozycji, także za pomocą wmctrl

Skrypt nie zapamiętuje pliki, które mogą być otwierane w oknach, ani (np.) stron, które zostały otwarte w oknie przeglądarki.

Problemy

Kombinacja wmctrl i Unity zawiera kilka błędów, kilka przykładów:

  • współrzędne okna, odczytywane przez wmctrl , różnią się nieznacznie od polecenia do położenia okien, jak wspomniano tutaj . Dlatego wycofane pozycje okien mogą nieznacznie różnić się od pierwotnej pozycji.
  • Komendy wmctrl działają trochę nieprzewidywalnie, jeśli krawędź okna jest bardzo blisko albo Unity Launcher , albo panelu.
  • "Zapamiętane" okna muszą znajdować się całkowicie wewnątrz granic obszaru roboczego, aby polecenie wmctrl działało poprawnie.

Niektóre aplikacje domyślnie otwierają nowe okna w tym samym oknie na nowej karcie (np. gedit ). Naprawiłem to dla gedit , ale proszę wspomnieć o tym, jeśli znajdziesz więcej wyjątków.

Skrypt

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

wfile = os.environ["HOME"]+"/.windowlist"
arg = sys.argv[1]

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def check_window(w_id):
    w_type = get("xprop -id "+w_id)
    if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
        return True
    else:
        return False

def get_res():
    # get resolution and the workspace correction (vector)
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    res = [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    return [res, curr_vpdata]

app = lambda pid: subprocess.check_output(["ps", "-p",  pid, "-o", "comm="]).decode("utf-8").strip()

def read_windows():
    res = get_res()
    w_list =  [l.split() for l in get("wmctrl -lpG").splitlines()]
    relevant = [[w[2],[int(n) for n in w[3:7]]] for w in w_list if check_window(w[0]) == True]
    for i, r in enumerate(relevant):      
        relevant[i] = app(r[0])+" "+str((" ").join([str(n) for n in r[1]]))
    with open(wfile, "wt") as out:
        for l in relevant:
            out.write(l+"\n")

def open_appwindow(app, x, y, w, h):
    ws1 = get("wmctrl -lp"); t = 0
    # fix command for certain apps that open in new tab by default
    if app == "gedit":
        option = " --new-window"
    else:
        option = ""
    # fix command if process name and command to run are different
    if "gnome-terminal" in app:
        app = "gnome-terminal"
    elif "chrome" in app:
        app = "/usr/bin/google-chrome-stable"


    subprocess.Popen(["/bin/bash", "-c", app+option])
    # fix exception for Chrome (command = google-chrome-stable, but processname = chrome)
    app = "chrome" if "chrome" in app else app
    while t < 30:      
        ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
        procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
                  if app in p and w[2] in p] for w in ws2]
        if len(procs) > 0:
            time.sleep(0.5)
            w_id = procs[0][0][1]
            cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
            cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
            cmd3 = "wmctrl -ir "+procs[0][0][1]+" -e 0,"+x+","+y+","+w+","+h
            for cmd in [cmd1, cmd2, cmd3]:   
                subprocess.call(["/bin/bash", "-c", cmd])
            break
        time.sleep(0.5)
        t = t+1

def run_remembered():
    res = get_res()[1]
    try:
        lines = [l.split() for l in open(wfile).read().splitlines()]
        for l in lines:          
            l[1] = str(int(l[1]) - res[0]); l[2] = str(int(l[2]) - res[1] - 24)
            open_appwindow(l[0], l[1], l[2], l[3], l[4])   
    except FileNotFoundError:
        pass

if arg == "-run":
    run_remembered()
elif arg == "-read":
    read_windows()

Jak skonfigurować

Przed rozpoczęciem upewnij się, że wmctrl jest zainstalowany:

sudo apt-get install wmctrl

Następnie:

  1. Skopiuj skrypt do pustego pliku, zapisz go jako recall_windows w ~/bin . W razie potrzeby utwórz katalog. Jeśli katalog jeszcze nie istniał, uruchom program source ~/.profile lub wyloguj / po utworzeniu katalogu. Będzie teraz w $PATH
  2. Spraw, aby skrypt był wykonywalny (!).
  3. Teraz otwórz kilka okien, gedit , firefox lub cokolwiek, i przetestuj skrypt w terminalu, uruchamiając polecenie (nie jest wymagany prefiks ścieżki):

    recall_windows -read
    
  4. Zamknij okna. Teraz uruchom w terminalu:

    recall_windows -run
    

Twoja konfiguracja okna powinna teraz zostać przywrócona

Jeśli wszystko działa poprawnie, dodaj dwa polecenia do klawiszy skrótów: Wybierz: Ustawienia systemu > "Klawiatura" > "Skróty" > "Skróty niestandardowe". Kliknij "+" i dodaj polecenia:

recall_windows -read

i

recall_windows -run

na dwa różne klawisze skrótów

    
odpowiedział Jacob Vlijm 07.07.2015, 19:25
źródło
2

nie ma takiego programu. Możesz zainstalować compiz cub:

sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins

i postępuj zgodnie z tym poradnikiem

compiz to najbardziej zaawansowane narzędzie desktopowe dla jedności / gnoma

    
odpowiedział user91632 27.09.2012, 12:52
źródło
1

Nie znam prostego sposobu na osiągnięcie tego.

Jednak rzadko potrzebuję tego z bardzo prostego powodu: zawiesić. Wstrzymaj i hibernację to Twoi znajomi. Nie tylko oszczędzasz pozycje okien, ale także zapisujesz cały stan systemu. Rzadko wyłączam komputer całkowicie, z wyjątkiem ponownego załadowania nowej wersji jądra.

    
odpowiedział January 27.09.2012, 12:23
źródło
0

Napisałem małe narzędzie do biblioteki / wiersza poleceń, które umożliwia zapisywanie i przywracanie sesji oraz obsługę różnych konfiguracji monitorów, a także wirtualnych pulpitów.

Instalacja

npm install -g linux-window-session-manager

Wykorzystanie

Zapisz bieżącą sesję do ~ / .lwsm / sessionData / DEFAULT.json

lwsm save

Zapisz bieżącą sesję do ~ / .lwsm / sessionData / my-session.json

lwsm save my-session   

Przywróć sesję z ~ / .lwsm / sessionData / DEFAULT.json

lwsm restore

Przywróć sesję z ~ / .lwsm / sessionData / my-session.json

lwsm restore my-session   

Zwalniaj wszystkie uruchomione aplikacje przed rozpoczęciem sesji

lwsm restore --closeAllOpenWindows

Sprawdź: link

    
odpowiedział hugo der hungrige 25.04.2017, 17:34
źródło

Przeczytaj inne pytania na temat tagów