Gibt es eine Möglichkeit, das aktuelle Desktop-Layout zu speichern?

29

Was ich möchte, um in der Lage zu sein, die aktuellen Positionen meiner Anwendungen zu speichern. Wenn ich also dieselben öffne und etwas ausführe, werden sie sich neu anordnen, wie sie waren.

Wenn ich zum Beispiel ein erhabenes und drei Terminalfenster öffne, möchte ich das irgendwie speichern können.

Bildbeschreibung hier eingeben

Es ist mir egal, ob es sich um eine App oder ein Befehlszeilentool handelt, solange ich die Positionen meiner Apps problemlos speichern kann.

Ich bin ein großer Fan von Moom , aber leider funktioniert es nur unter MacOS und ich vermisse es wirklich, wenn es unter Ubuntu läuft . Es unterstützt mehr Funktionen und wenn Sie über mein Hauptproblem hinaus etwas in der Nähe wissen, ist das auch in Ordnung.

Lipis
quelle
@VitaliusKuchalskis Würde das Fensterlayout passen oder sollte es genau die entsprechenden geöffneten Dateien sein? Und was ist Ihr Fenstermanager? (Einheit?)
Jacob Vlijm
Ich weiß nicht, von welcher Fensteranordnung du sprichst? Ich denke, es gibt oder wird ein Tool zum Speichern und Laden von Position und Größe von Fenstern pro Arbeitsbereich geben. Bisher habe ich [wmctrl] gefunden ( en.wikipedia.org/wiki/Wmctrl ). Sie müssen jedoch Skripte schreiben oder Konfigurationen ändern, um diese Funktion nutzen zu können. Ich frage mich, ob das schon jemand gemacht hat und war so nett, es zu teilen.
Qualphey
@VitaliusKuchalskis können Sie sich das hier ansehen: askubuntu.com/questions/631392/… Dies setzt voraus, dass die Fenster geöffnet bleiben, aber ich gehe davon aus, dass Sie den Computer herunterfahren und die Fensterpositionen nach einer Wiederherstellung wiederherstellen möchten Größe und Position (Layout). Eine wichtige Frage ist dann , wenn Sie nur auf die Anwendung beziehen , werden Fenster , oder auch die Dateien , die in den Fenstern geöffnet wurden.
Jacob Vlijm
Nur die Anwendungsfenster natürlich.
Qualphey
Auf Ihrem Screenshot scheinen Sie Kachelformationen für Ihre Fenster zu mögen / zu verwenden. Sie sollten auf jeden Fall eine Kachel-WM ausprobieren, zum Beispiel i3.
Nixpower

Antworten:

26

Hinweis

Das Skript wurde am 16. Januar 2017 gepatcht / repariert, und zwar für einige Anwendungen, deren Prozessname vom Befehl zum Ausführen der Anwendung abweicht . Möglicherweise tritt dies gelegentlich bei Anwendungen auf. Wenn jemand einen findet, hinterlasse bitte einen Kommentar.


Skript zum Speichern und Wiederherstellen der Fensteranordnung und der entsprechenden Anwendungen.

Das folgende Skript kann mit zwei Optionen ausgeführt werden. Angenommen, Sie haben die Fensteranordnung wie folgt:

Bildbeschreibung hier eingeben

Führen Sie das Skript mit der folgenden Option aus, um die aktuelle Fensteranordnung und ihre Anwendungen zu lesen (zu speichern):

<script> -read

Dann schließen Sie alle Fenster:

Bildbeschreibung hier eingeben

Führen Sie dann zum Einrichten der zuletzt gespeicherten Fensteranordnung die folgende Option aus:

<script> -run

und die zuletzt gespeicherte Fensteranordnung wird wiederhergestellt:

Bildbeschreibung hier eingeben

Dies funktioniert auch nach einem Neustart.

Wenn Sie die beiden Befehle unter zwei verschiedenen Tastenkombinationen platzieren, können Sie Ihre Fensteranordnung "aufzeichnen", Ihren Computer herunterfahren und nach (z. B.) einem Neustart dieselbe Fensteranordnung aufrufen.

Was das Skript macht und was nicht

Mit der Option ausführen -read

  • Das Skript wmctrllistet alle Fenster auf, über alle Arbeitsbereiche hinweg, ihre Positionen, ihre Größen und die Anwendungen, zu denen sie gehören
  • Das Skript "konvertiert" dann die Fensterpositionen von relativen (zum aktuellen Arbeitsbereich, wie in der Ausgabe von wmctrl) zu absoluten Positionen in Ihren übergreifenden Arbeitsbereichen. Daher spielt es keine Rolle, ob sich die Fenster, an die Sie sich erinnern möchten, nur in einem Arbeitsbereich befinden oder auf verschiedene Arbeitsbereiche verteilt sind.
  • Das Skript "merkt" sich dann die aktuelle Fensteranordnung und schreibt sie in eine unsichtbare Datei in Ihrem Home-Verzeichnis.

Mit der Option ausführen -run

  • das Skript liest die zuletzt gespeicherte Fensteranordnung; es startet die entsprechenden anwendungen, verschiebt die fenster an die gespeicherten positionen, auch mit hilfe vonwmctrl

Das Skript speichert weder die Dateien, die möglicherweise in den Fenstern geöffnet wurden, noch (z. B.) die Websites, die in einem Browserfenster geöffnet wurden.

Probleme

Die Kombination von wmctrlund Unityhat einige Bugs, ein paar Beispiele:

  • Die von gelesenen Fensterkoordinaten wmctrlunterscheiden sich geringfügig vom Befehl zum Positionieren der Fenster, wie hier erwähnt . Daher können die abgerufenen Fensterpositionen geringfügig von der ursprünglichen Position abweichen.
  • Die wmctrlBefehle funktionieren etwas unvorhersehbar, wenn sich der Rand des Fensters sehr nahe am Unity Launcheroder am Bedienfeld befindet.
  • Die "erinnerten" Fenster müssen sich vollständig innerhalb eines Arbeitsbereichs befinden, damit der wmctrlPlatzierungsbefehl ordnungsgemäß funktioniert.

Einige Anwendungen öffnen neue Fenster standardmäßig im selben Fenster auf einer neuen Registerkarte (z. B. gedit). Ich habe es für behoben gedit, aber bitte erwähnen Sie es, wenn Sie weitere Ausnahmen finden.

Das Drehbuch

#!/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()

Wie stellt man das ein

Bevor Sie beginnen, stellen Sie sicher, dass Folgendes wmctrlinstalliert ist:

sudo apt-get install wmctrl

Dann:

  1. Kopieren Sie das Skript in eine leere Datei, speichern Sie es als recall_windowsin ~/bin. Erstellen Sie ggf. das Verzeichnis. Wenn das Verzeichnis noch nicht existiert hat, führen Sie entweder aus source ~/.profileoder melden Sie sich ab, nachdem Sie das Verzeichnis erstellt haben. Es wird jetzt in sein$PATH
  2. Machen Sie das Skript ausführbar (!).
  3. Öffnen Sie nun ein paar Fenster, gedit, firefoxoder was auch immer, und das Skript in einem Terminal - Testlauf mit dem Befehl ausgeführt wird (kein Pfadpräfix erforderlich):

    recall_windows -read
    
  4. Schließe die Fenster. Jetzt in einem Terminal ausführen:

    recall_windows -run
    

Ihr Fenster-Setup sollte jetzt wiederhergestellt sein

Wenn alles funktioniert, fügen Sie den Tastenkombinationen zwei Befehle hinzu: Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie die Befehle hinzu:

recall_windows -read

und

recall_windows -run

auf zwei verschiedene Tastenkombinationen

Jacob Vlijm
quelle
2
Hah! Ich habe gerade den ersten Absatz gelesen und wusste, dass es einer von Ihnen war! (upvoted)
Fabby
@ Fabby und feiert meinen Urlaub :)
Jacob Vlijm
Sieht großartig aus! Jetzt könnte man einfach einen zweiten Parameter für einen Einstellungsnamen hinzufügen und dann verschiedene Umgebungen speichern / wiederherstellen, clientA, clientB, home, .. cool!
Bachi
verschiedene versionen wären cool, wäre toll wenn es das programm schließen könnte. Wenn ich darüber nachdenke, ob irgendetwas auf dem Bildschirm zu sehen ist, wenn die Frau hereinkommt, könnte es so aussehen, als würde ich arbeiten!
Jamie Hutber
Könnten Sie vielleicht einen Blick auf dieses arbeitsplatzbezogene Problem werfen ? Vielen Dank!!
verrückt nach natty
4

Ich habe ein kleines Bibliotheks- / Befehlszeilentool geschrieben, das das Speichern und Wiederherstellen von Sitzungen ermöglicht und Unterstützung für verschiedene Monitor-Setups sowie virtuelle Desktops bietet.

Installation

npm install -g linux-window-session-manager

Verwendung

Speichern Sie die aktuelle Sitzung in ~ / .lwsm / sessionData / DEFAULT.json

lwsm save

Speichern Sie die aktuelle Sitzung in ~ / .lwsm / sessionData / my-session.json

lwsm save my-session   

Stellen Sie die Sitzung aus ~ / .lwsm / sessionData / DEFAULT.json wieder her

lwsm restore

Stellen Sie die Sitzung aus ~ / .lwsm / sessionData / my-session.json wieder her

lwsm restore my-session   

Schließen Sie alle laufenden Apps ordnungsgemäß, bevor Sie die Sitzung starten

lwsm restore --closeAllOpenWindows

Probieren Sie es aus: https://github.com/johannesjo/linux-window-session-manager

hugo der hungrige
quelle
1
Funktioniert super! Dies sollte die beste Antwort sein.
user3751385
2

Es gibt kein solches Programm. Sie können compiz cub installieren:

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

und folgen Sie dieser Anleitung

Das Compiz ist das fortschrittlichste Desktop-Tool für Unity / Gnome


quelle
1

Ich kenne keinen einfachen Weg, um dies zu erreichen.

Ich brauche das jedoch selten aus einem ganz einfachen Grund: Suspend. Ruhezustand und Ruhezustand sind Ihre Freunde. Sie speichern nicht nur Fensterpositionen, sondern auch den gesamten Zustand Ihres Systems. Ich schalte den Computer selten komplett aus, außer um eine neue Kernelversion zu laden.

Januar
quelle
Nun, ich schalte es nicht aus oder so, aber ich öffne, du weißt, neue Terminals, ein anderes Projekt, die Browser werden geschlossen oder so, usw. Der Screenshot war nur ein Beispiel.
Lipis
Nun ja. Ich habe Desktops, die ich seit Wochen nicht mehr berührt habe und die mehrere Terminalfenster, Browserfenster und R-Grafikfenster enthalten, die sich alle auf ein bestimmtes Projekt beziehen.
Januar
Suspend ist die Lösung, die ich für mein Notebook verwende, für einen Desktop-PC ist es jedoch etwas komplizierter, da es notwendig ist, einen Nobreak zu haben.
cantoni