Apakah ada cara untuk menyimpan tata letak desktop saat ini?


29

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

Sebagai contoh jika saya akan membuka jendela terminal yang luhur dan tiga saya ingin menyimpannya entah bagaimana.

masukkan deskripsi gambar di sini

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

Saya penggemar berat Moom , tetapi sayangnya ini hanya berfungsi pada MacOS dan saya sangat merindukannya saat 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.


@VitaliusKuchalskis Apakah tata letak jendela bisa , atau haruskah itu adalah file yang dibuka dengan benar? Dan apa window manager Anda? (Kesatuan?)
Jacob Vlijm

Saya tidak tahu tata letak jendela apa yang Anda 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 baik untuk membagikannya.
Qualphey

@VitaliusKuchalskis dapat Anda lihat yang ini: askubuntu.com/questions/631392/... Ini mengasumsikan jendela tetap terbuka, tapi saya berasumsi Anda ingin mematikan komputer dan mengembalikan posisi jendela setelah pemulihan ukuran dan posisi (tata letak). Pertanyaan penting kemudian adalah apakah Anda hanya merujuk ke jendela aplikasi , atau juga file yang dibuka di dalam jendela.
Jacob Vlijm

Hanya aplikasi windows saja.
Qualphey

Dari tangkapan layar Anda, Anda tampaknya menyukai / menggunakan formasi ubin untuk windows Anda. Anda pasti harus mencoba WM ubin, misalnya i3.
nixpower

Jawaban:


26

Catatan

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


Script untuk mengingat dan mengembalikan pengaturan jendela dan aplikasi yang sesuai.

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

masukkan deskripsi gambar di sini

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

<script> -read

Kemudian tutup semua jendela:

masukkan deskripsi gambar di sini

Kemudian untuk mengatur pengaturan jendela yang terakhir diingat, jalankan dengan opsi:

<script> -run

dan pengaturan jendela yang terakhir diingat akan dipulihkan:

masukkan deskripsi gambar di sini

Ini juga akan berfungsi setelah restart.

Menempatkan dua perintah di bawah dua tombol cara pintas yang berbeda, Anda dapat "merekam" pengaturan jendela Anda, matikan komputer Anda dan memanggil kembali pengaturan jendela yang sama setelah (misalnya) restart.

Apa yang dilakukan skrip, dan apa yang tidak

Jalankan dengan opsi -read

  • Script digunakan wmctrluntuk membuat daftar semua jendela, di semua ruang kerja, posisi mereka, ukurannya, aplikasi milik mereka
  • Script kemudian "mengubah" posisi jendela dari relatif (ke ruang kerja saat ini, seperti pada output wmctrl) ke posisi absolut , pada ruang kerja spanning Anda. Oleh karena itu tidak masalah jika jendela yang ingin Anda ingat hanya di satu ruang kerja atau tersebar di ruang kerja yang berbeda.
  • Script kemudian "mengingat" pengaturan jendela saat ini, menulisnya menjadi file yang tidak terlihat di direktori home Anda.

Jalankan dengan opsi -run

  • script membaca pengaturan jendela yang terakhir diingat; mulai aplikasi yang sesuai, memindahkan windows ke posisi yang diingat, juga dengan bantuanwmctrl

Script tidak mengingat file yang mungkin dibuka di windows, atau (misalnya) situs web yang dibuka di jendela browser.

Masalah

Kombinasi wmctrldan Unitymemiliki beberapa bug, beberapa contoh:

  • Koordinat jendela, seperti yang dibaca oleh wmctrlsedikit berbeda membentuk perintah untuk memposisikan windows, seperti yang disebutkan di sini . Oleh karena itu posisi jendela yang ditarik mungkin sedikit berbeda dari posisi semula.
  • The wmctrlperintah bekerja sedikit tak terduga jika tepi jendela sangat dekat baik Unity Launcheratau panel.
  • Jendela "ingat" harus benar-benar di dalam batas ruang kerja agar wmctrlperintah penempatan berfungsi dengan baik.

Beberapa aplikasi membuka jendela baru secara default di jendela yang sama di tab baru (seperti gedit). Saya memperbaikinya gedit, tetapi 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()

Cara mengatur

Sebelum Anda mulai, pastikan wmctrlsudah terpasang:

sudo apt-get install wmctrl

Kemudian:

  1. Salin skrip ke file kosong, simpan seperti recall_windowsdalam ~/bin. Buat direktori jika perlu. Jika direktori belum ada, jalankan salah satu source ~/.profileatau keluar / masuk setelah Anda membuat direktori. Sekarang akan masuk$PATH
  2. Jadikan skrip dapat dieksekusi (!).
  3. Sekarang buka beberapa jendela, gedit, firefoxatau apa pun, dan uji-menjalankan script di terminal dengan menjalankan perintah (ada jalan awalan diperlukan):

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

    recall_windows -run
    

Pengaturan jendela Anda sekarang harus dikembalikan

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

recall_windows -read

dan

recall_windows -run

ke dua tombol cara pintas yang berbeda


2
Hah! Hanya membaca paragraf pertama dan saya tahu itu salah satu dari Anda! (Terpilih)
Fabby

@Fabby dan rayakan 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 lebih keren, lebih bagus jika bisa menutup program. Berpikir jika ada sesuatu di layar ketika istri masuk saya dapat dengan mudah membuatnya tampak seperti sedang bekerja!
Jamie Hutber

Bisakah Anda melihat masalah terkait ruang kerja ini ? Terima kasih!!
gila tentang rapi

4

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

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 anggun sebelum memulai sesi

lwsm restore --closeAllOpenWindows

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


1
Bagus sekali! Ini harus menjadi jawaban teratas.
user3751385

2

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

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

dan ikuti cara-caranya

compiz adalah alat desktop paling canggih untuk unity / gnome


1

Saya tidak tahu cara sederhana untuk mencapai ini.

Namun, saya jarang membutuhkannya karena alasan yang sangat sederhana: menunda. Tangguhkan dan hibernasi adalah teman Anda. Anda tidak hanya menyimpan posisi jendela, tetapi Anda juga menyimpan seluruh kondisi sistem Anda. Saya jarang mematikan komputer sepenuhnya, kecuali untuk memuat ulang versi kernel baru.


Yah saya tidak beralih itu atau apa pun .. tapi saya membuka Anda tahu terminal baru, proyek lain, browser semakin ditutup atau sesuatu, dll. Tangkapan layar itu hanya contoh ..
Lipis

Baiklah. Saya memiliki desktop yang belum saya sentuh selama berminggu-minggu sekarang yang berisi beberapa jendela terminal, jendela browser, jendela tampilan grafis R yang semuanya berhubungan dengan proyek tertentu.
Januari

Menunda adalah solusi yang saya gunakan untuk notebook saya, bagaimanapun, untuk PC Desktop sedikit lebih rumit, karena itu perlu untuk memiliki yang mulia.
cantoni
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.