Pertanyaan Apakah ada cara untuk menyimpan tata letak desktop saat ini?


Apa yang saya ingin dapat menyimpan posisi aplikasi saya saat ini, jadi ketika saya akan membuka yang sama dan menjalankan sesuatu yang akan mereka atur ulang seperti semula.

Misalnya, jika saya akan membuka jendela sublim dan tiga terminal, saya ingin dapat menyimpannya.

enter image description here

Saya tidak peduli apakah itu aplikasi atau alat baris perintah, selama saya dapat dengan mudah menyimpan posisi aplikasi saya.

Saya penggemar berat Moom, tapi sayangnya itu hanya bekerja di MacOS dan saya sangat merindukannya ketika di Ubuntu. Ini mendukung lebih banyak fitur dan jika Anda tahu sesuatu yang dekat dengannya di atas masalah utama saya itu juga baik-baik saja.


24
2017-09-27 10:02


asal


@VitaliusKuchalskis Akankah tata letak jendela lakukan, atau seharusnya tepat file yang dibuka korespondensi? Dan apa window manager Anda? (Kesatuan?) - Jacob Vlijm
Aku tidak tahu apa tata letak jendela apa yang kau bicarakan? Saya pikir ada atau akan menjadi alat untuk menyimpan dan memuat posisi dan ukuran windows per ruang kerja. Sejauh ini saya menemukan [wmctrl] (en.wikipedia.org/wiki/Wmctrl). Tetapi perlu menulis skrip atau mengubah konfigurasi untuk membuat fitur ini. Jadi saya, bertanya-tanya apakah ada yang sudah membuat ini, dan cukup berbaik hati untuk membagikannya. - Qualphey
@VitaliusKuchalskis dapatkah Anda melihat yang satu ini: askubuntu.com/questions/631392/… Ini mengasumsikan jendela (s) tetap terbuka, tapi saya berasumsi Anda ingin mematikan komputer dan resore posisi jendela setelah mengembalikan ukuran dan posisi (tata letak). Pertanyaan penting adalah jika Anda hanya mengacu pada aplikasi windows, atau juga file yang dibuka di dalam jendela. - Jacob Vlijm
Hanya jendela aplikasi saja. - Qualphey
Dari tangkapan layar Anda, Anda tampak suka / menggunakan susunan ubin untuk jendela Anda. Anda pasti harus memberikan WM yang sulit, misalnya i3. - nixpower


Jawaban:


Catatan

Script itu ditambal / diperbaiki pada 16 Januari 2017, diperbaiki untuk beberapa aplikasi yang mana nama proses berbeda dari perintah untuk menjalankan aplikasi. Mungkin, ini kadang-kadang terjadi pada aplikasi. Jika seseorang menemukan satu, silakan tinggalkan komentar.


Skrip untuk mengingat dan memulihkan pengaturan jendela dan aplikasi yang sesuai.

Skrip di bawah ini dapat dijalankan dengan dua opsi. Katakanlah Anda memiliki pengaturan jendela seperti di bawah ini:

enter image description here

Untuk Baca baca (ingat) pengaturan jendela saat ini dan aplikasinya, jalankan skrip dengan opsi:

<script> -read

Kemudian tutup semua jendela:

enter image description here

Lalu ke mempersiapkan pengaturan jendela yang terakhir diingat, jalankan dengan opsi:

<script> -run

dan susunan jendela yang terakhir diingat akan dipulihkan:

enter image description here

Ini juga akan berfungsi setelah restart.

Menempatkan dua perintah di bawah dua tombol pintas yang berbeda, Anda dapat "merekam" pengaturan jendela Anda, mematikan komputer Anda dan memanggil kembali pengaturan jendela yang sama setelah (mis.) Memulai ulang.

Apa yang dilakukan skrip, dan apa yang dilakukannya tidak

Jalankan dengan opsi -read

  • Skrip ini menggunakan wmctrl untuk mendaftar semua jendela, di semua ruang kerja, posisi mereka, ukuran mereka, aplikasi tempat mereka berada
  • Script kemudian "mengubah" posisi jendela dari relatif (ke ruang kerja saat ini, seperti pada output wmctrl) ke mutlak posisi, di ruang kerja yang mencakup Anda. Oleh karena itu tidak masalah jika jendela yang ingin Anda ingat hanya berada di satu ruang kerja atau tersebar di berbagai ruang kerja.
  • Script kemudian "mengingat" pengaturan jendela saat ini, menulisnya ke dalam file tak terlihat di direktori home Anda.

Jalankan dengan opsi -run

  • skrip membaca pengaturan jendela yang terakhir diingat; memulai aplikasi yang sesuai, memindahkan jendela ke posisi yang diingat, juga dengan bantuan wmctrl

Skrip tidak tidak ingat file yang mungkin dapat dibuka di windows, atau (mis.) situs web yang dibuka di jendela browser.

Masalah

Kombinasi dari wmctrl dan Unity memiliki beberapa bug, beberapa contoh:

  • jendela koordinat, seperti yang dibaca oleh wmctrl sedikit berbeda membentuk perintah untuk posisi jendela, seperti yang disebutkan sini. Oleh karena itu, posisi jendela yang ditarik mungkin sedikit berbeda dari posisi semula.
  • Itu wmctrl perintah bekerja agak tidak dapat diprediksi jika tepi jendela sangat dekat baik Unity Launcher atau panel.
  • Jendela "diingat" harus benar-benar di dalam batas ruang kerja untuk wmctrl perintah penempatan berfungsi dengan baik.

Beberapa aplikasi membuka jendela baru secara default di jendela yang sama di tab baru (seperti gedit). Saya memperbaikinya untuk gedit, tapi tolong sebutkan jika Anda menemukan lebih banyak pengecualian.

Naskah

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

Bagaimana cara mengaturnya

Sebelum memulai, pastikan wmctrl diinstal:

sudo apt-get install wmctrl

Kemudian:

  1. Salin skrip ke dalam file kosong, simpan sebagai recall_windows di ~/bin. Buat direktori jika perlu. Jika direktori belum ada, jalankan juga source ~/.profile atau keluar / masuk setelah Anda membuat direktori. Sekarang akan masuk $PATH
  2. Buat skrip dieksekusi (!).
  3. Sekarang buka beberapa jendela, gedit, firefox atau apa pun, dan uji-jalankan skrip di terminal dengan menjalankan perintah (tidak ada awalan jalur yang diperlukan):

    recall_windows -read
    
  4. tutup jendelanya. Sekarang jalankan di terminal:

    recall_windows -run
    

Setup jendela Anda sekarang harus dipulihkan

Jika semuanya berfungsi dengan baik, tambahkan dua perintah ke tombol pintas: Pilih: Pengaturan Sistem> "Keyboard"> "Pintasan"> "Pintasan Kustom". Klik "+" dan tambahkan perintah:

recall_windows -read

dan

recall_windows -run

ke dua tombol pintas yang berbeda


23
2017-07-07 17:25



Hah! Hanya membaca paragraf pertama dan saya tahu itu adalah salah satu dari Anda! (upvoted) - Fabby
@Fabby dan merayakan liburan saya :) - Jacob Vlijm
Tampak hebat! Sekarang orang dapat dengan mudah menambahkan param kedua untuk nama pengaturan dan kemudian menyimpan / mengembalikan lingkungan yang berbeda, clientA, clientB, rumah, .. keren! - Bachi
versi yang berbeda akan keren, bagus jika bisa menutup program. Berpikir jika ada sesuatu di layar saat istri masuk, saya bisa membuatnya terlihat seperti sedang bekerja! - Jamie Hutber
Bisakah Anda melihatnya? masalah terkait ruang kerja ini ? Terima kasih!! - nutty about natty


tidak ada program semacam itu. Anda dapat menginstal cub compiz:

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

dan ikuti ini bagaimana caranya

compiz adalah alat desktop paling canggih untuk kesatuan / gnome


2
2017-09-27 10:52





Saya tidak tahu cara sederhana untuk mencapai ini.

Namun, saya jarang membutuhkan itu untuk alasan yang sangat sederhana: menangguhkan. Menangguhkan dan hibernasi adalah temanmu. Anda tidak hanya menyimpan posisi jendela, tetapi Anda juga menyimpan seluruh status sistem Anda. Saya jarang mematikan komputer sepenuhnya, kecuali untuk memuat ulang versi kernel baru.


1
2017-09-27 10:23



Yah aku tidak beralih dari atau apa pun .. tapi aku membuka Anda tahu terminal baru, proyek lain, browser semakin tertutup atau sesuatu, dll. Screenshot hanyalah sebuah contoh .. - Lipis
Baiklah. Saya memiliki desktop yang belum saya sentuh selama berminggu-minggu sekarang yang berisi beberapa jendela terminal, jendela peramban, jendela tampilan grafis R yang semuanya berhubungan dengan proyek tertentu. - January
Tangguhkan adalah solusi yang saya gunakan untuk notebook saya, namun, untuk PC Desktop sedikit lebih rumit, karena itu perlu memiliki nobreak. - cantoni


Saya menulis sedikit alat perpustakaan / baris perintah yang memungkinkan menyimpan dan memulihkan sesi dan memiliki dukungan untuk pengaturan monitor yang berbeda serta virtual desktop.

Instalasi

npm install -g linux-window-session-manager

Pemakaian

Simpan sesi saat ini ke ~ / .lwsm / sessionData / DEFAULT.json

lwsm save

Simpan sesi saat ini ke ~ / .lwsm / sessionData / my-session.json

lwsm save my-session   

Pulihkan sesi dari ~ / .lwsm / sessionData / DEFAULT.json

lwsm restore

Pulihkan sesi dari ~ / .lwsm / sessionData / my-session.json

lwsm restore my-session   

Tutup semua aplikasi yang berjalan dengan penuh sukacita sebelum memulai sesi

lwsm restore --closeAllOpenWindows

Coba lihat: https://github.com/johannesjo/linux-window-session-manager


0
2018-04-25 15:34