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


29

To, co chcę, aby móc zapisać bieżące pozycje moich aplikacji, więc kiedy zamierzam otworzyć te same i uruchomić coś, zmieniają układ tak, jak były.

Na przykład, jeśli mam otworzyć wysublimowane i trzy okna terminala, chciałbym móc jakoś to zapisać.

wprowadź opis zdjęcia tutaj

Nie obchodzi mnie, czy jest to aplikacja czy narzędzie wiersza poleceń, o ile mogę łatwo zapisać pozycje moich aplikacji.

Jestem wielkim fanem Mooma , ale niestety działa tylko na MacOS i naprawdę tęsknię za nim na Ubuntu. Obsługuje więcej funkcji, a jeśli wiesz coś zbliżonego do mojego głównego problemu, to również dobrze.


@VitaliusKuchalskis Czy zrobiłby to układ okna , czy powinien dokładnie odpowiadać otwieranym plikom? A jaki jest twój menedżer okien? (Jedność?)
Jacob Vlijm,

Nie wiem o jakim układzie okna mówisz? Myślę, że istnieje lub będzie narzędzie do zapisywania i ładowania pozycji i rozmiaru okien na obszar roboczy. Do tej pory znalazłem [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ). Aby jednak ta funkcja była możliwa, konieczne byłoby pisanie skryptów lub zmiana konfiguracji. Zastanawiam się, czy ktoś już to zrobił i był na tyle uprzejmy, aby się tym podzielić.
Qualphey,

@VitaliusKuchalskis czy mógłbyś rzucić okiem na ten: askubuntu.com/questions/631392/... Zakłada się, że okna pozostają otwarte, ale zakładam, że chcesz wyłączyć komputer i przywrócić pozycje okien po przywróceniu rozmiar i pozycja (układ). Ważnym pytaniem jest zatem, czy chodzi tylko o okna aplikacji , czy też pliki, które zostały otwarte w tych oknach.
Jacob Vlijm,

Oczywiście tylko okna aplikacji.
Qualphey,

Na zrzucie ekranu widać, że lubisz / używasz formacji kafelkowych w swoich oknach. Zdecydowanie powinieneś spróbować WM do układania płytek, na przykład i3.
nixpower

Odpowiedzi:


26

Uwaga

Skrypt został załatany / naprawiony 16 stycznia 2017 r., Naprawiając kilka aplikacji, których nazwa procesu różni się od polecenia uruchomienia aplikacji . Być może zdarza się to czasami w aplikacjach. Jeśli ktoś je znajdzie, zostaw komentarz.


Skrypt do zapamiętywania i przywracania układu okien i odpowiadających im aplikacji.

Poniższy skrypt można uruchomić z dwiema opcjami. Powiedzmy, że masz układ okien, jak poniżej:

wprowadź opis zdjęcia tutaj

Aby odczytać (zapamiętać) bieżący układ okien i ich aplikacje, uruchom skrypt z opcją:

<script> -read

Następnie zamknij wszystkie okna:

wprowadź opis zdjęcia tutaj

Następnie, aby skonfigurować ostatni zapamiętany układ okien, uruchom go z opcją:

<script> -run

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

wprowadź opis zdjęcia tutaj

Będzie to również działać po ponownym uruchomieniu.

Umieszczając dwa polecenia pod dwoma różnymi klawiszami skrótów, możesz „nagrać” układ okien, zamknąć komputer i przywołać ten sam układ okien (np.) Po ponownym uruchomieniu.

Co robi skrypt, a czego nie

Uruchom z opcją -read

  • Skrypt używa wmctrldo wyświetlania listy wszystkich okien, we wszystkich obszarach roboczych, ich pozycjach, rozmiarach, aplikacjach, do których należą
  • Skrypt następnie „konwertuje” pozycje okna z względnych (do bieżącego obszaru roboczego, jak w danych wyjściowych wmctrl) na pozycje bezwzględne w twoich obejmujących obszarach roboczych. Dlatego nie ma znaczenia, czy okna, które chcesz zapamiętać, znajdują się tylko w jednym obszarze roboczym lub w różnych obszarach roboczych.
  • Następnie skrypt „zapamiętuje” obecny układ okna, zapisując go w niewidocznym pliku w katalogu domowym.

Uruchom z opcją -run

  • skrypt odczytuje ostatnio zapamiętany układ okien; uruchamia odpowiednie aplikacje, przenosi okna do zapamiętanych pozycji, również za pomocąwmctrl

Skrypt nie zapamiętuje plików, które mogą zostać otwarte w oknach, ani (np.) Stron internetowych, które zostały otwarte w oknie przeglądarki.

Zagadnienia

Połączenie wmctrli Unityma kilka błędów, kilka przykładów:

  • współrzędne okna, czytane przez, wmctrlróżnią się nieznacznie od polecenia pozycjonowania okien, jak wspomniano tutaj . Dlatego przywołane pozycje okien mogą nieznacznie różnić się od pierwotnej pozycji.
  • Te wmctrlpolecenia działa nieco nieprzewidywalny jeśli krawędź okna jest bardzo blisko albo Unity Launcherlub panel.
  • „Zapamiętane” okna muszą znajdować się całkowicie wewnątrz granic obszaru roboczego, aby wmctrlpolecenie umieszczania działało poprawnie.

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

Scenariusz

#!/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 wmctrljest zainstalowany:

sudo apt-get install wmctrl

Następnie:

  1. Skopiuj skrypt do pustego pliku, zapisać go jako recall_windowsw ~/bin. Utwórz katalog, jeśli to konieczne. Jeśli katalog jeszcze nie istniał, uruchom albo source ~/.profilewyloguj się / zaloguj po utworzeniu katalogu. Teraz będzie$PATH
  2. Ustaw skrypt jako wykonywalny (!).
  3. Teraz otworzyć kilka okien, gedit, firefoxczy coś, a test-uruchomić skrypt w terminalu za pomocą komendy (bez prefiksu ścieżka potrzebne):

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

    recall_windows -run
    

Ustawienia okna powinny zostać przywrócone

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

recall_windows -read

i

recall_windows -run

do dwóch różnych klawiszy skrótu


2
Hah! Właśnie przeczytałem pierwszy akapit i wiedziałem, że to jeden z twoich! (przegłosowano)
Fabby,

@Fabby i świętuje moje wakacje :)
Jacob Vlijm

Wygląda świetnie! Teraz można łatwo dodać drugi parametr nazwy ustawienia, a następnie przechowywać / przywracać różne środowiska, clientA, clientB, home, .. cool!
Bachi

różne wersje byłyby fajne, świetnie, gdyby mógł zamknąć program. Myśląc, czy jest coś na ekranie, kiedy pojawia się żona, mogę z łatwością sprawić, że wyglądam, jakbym pracował!
Jamie Hutber,

Czy mógłbyś rzucić okiem na ten problem związany z obszarem roboczym ? Dzięki!!
orzechowy o natty

4

Napisałem małe narzędzie biblioteki / wiersza poleceń, które pozwala zapisywać i przywracać sesje oraz obsługuje różne konfiguracje monitorów, a także wirtualne komputery stacjonarne.

Instalacja

npm install -g linux-window-session-manager

Stosowanie

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   

Z wdziękiem zamknij wszystkie uruchomione aplikacje przed rozpoczęciem sesji

lwsm restore --closeAllOpenWindows

Sprawdź to: https://github.com/johannesjo/linux-window-session-manager


1
Działa świetnie! To powinna być najlepsza odpowiedź.
user3751385,

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 instrukcjami

compiz jest najbardziej zaawansowanym narzędziem komputerowym dla Unity / GNOME


1

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

Jednak rzadko potrzebuję tego z bardzo prostego powodu: zawiesić. Zawieszenie i hibernacja to twoi przyjaciele. Zapisujesz nie tylko pozycje okien, ale także cały stan systemu. Rzadko całkowicie wyłączam komputer, z wyjątkiem przeładowania nowej wersji jądra.


Cóż, nie przełączam go ani nic takiego ... ale otwieram, znasz nowe terminale, inny projekt, przeglądarki się zamykają, czy coś, itp. Zrzut ekranu był tylko przykładem ..
Lipis

No tak. Mam komputery, których nie dotknąłem od tygodni, i które zawierają kilka okien terminali, okien przeglądarki, okien graficznych R, które odnoszą się do konkretnego projektu.
stycznia

Zawieszenie to rozwiązanie, którego używam do mojego notebooka, jednak na komputer stacjonarny jest nieco bardziej skomplikowane, ponieważ konieczne jest posiadanie nobreaka.
Cantoni
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.