Mevcut masaüstü düzenini saklamanın bir yolu var mı?


29

Uygulamalarımın şu anki pozisyonlarını kurtarabilmek için, aynı olanları açıp bir şeyleri çalıştırdığımda olduğu gibi yeniden düzenlenecekler.

Mesela bir yüce ve üç terminal penceresi açacaksam, bir şekilde bunu kurtarabilmeyi isterdim.

görüntü tanımını buraya girin

Uygulamalarımın konumunu kolayca kaydedebildiğim sürece, bunun bir uygulama veya komut satırı aracı olması umrumda değil.

Moom'un büyük bir hayranıyım , ama ne yazık ki sadece MacOS'ta çalışıyor ve Ubuntu'dayken çok özlüyorum. Daha fazla özelliği destekliyor ve ana sorunumun üstünde buna yakın bir şey biliyorsanız, bu da iyi.


@VitaliusKuchalskis Pencere düzeni yapar mı ya da tam olarak eşleşen açılan dosyalar mı olmalı? Peki pencere yöneticiniz nedir? (Birlik?)
Jacob Vlijm

Hangi pencere düzeninden bahsediyorsun bilmiyorum ? Çalışma alanı başına pencere konumunu ve boyutunu kaydetmek ve yüklemek için bir araç olduğunu veya olacağını düşünüyorum. Şimdiye kadar buldum [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ). Ancak bu özelliği yapmak için komut dosyaları yazmanız veya yapılandırmaları değiştirmeniz gerekir. Bu yüzden, bunu zaten birisinin yaptığını ve paylaşacak kadar kibar olup olmadığını merak ediyorum.
Qualphey

@VitaliusKuchalskis şuna bir göz atabilir misin: askubuntu.com/questions/631392/… Bu, pencerelerin açık kaldığını varsayar, ancak bilgisayarı kapatıp geri yükledikten sonra pencerenin konumlarını yeniden açmak istediğinizi varsayıyorum boyut ve konum (düzen). O zaman önemli bir soru, sadece uygulama pencerelerine mi , yoksa pencerelerin içinde açılan dosyalara mı atıfta bulunacağınızdır.
Jacob Vlijm,

Tabii ki sadece uygulama pencereleri.
Qualphey

Ekran resminizden, pencereleriniz için döşeme formasyonlarını seviyor / kullanıyorsunuz. Döşeme WM'ini kesinlikle denemelisiniz, örneğin i3.
nixpower

Yanıtlar:


26

Not

Komut dosyası, işlem adının uygulamayı çalıştırmak için komuttan farklı olduğu birkaç uygulamayı sabitleyerek 16 Ocak 2017'de düzeltildi . Muhtemelen, bu bazen uygulamalarda gerçekleşir. Biri bir tane bulursa, lütfen bir yorum bırakın.


Pencere düzenini ve bunlara ait uygulamaları hatırlamak ve geri yüklemek için komut dosyası.

Aşağıdaki komut iki seçenekle çalıştırılabilir. Diyelim ki aşağıdaki pencere düzenlemesine sahipsin:

görüntü tanımını buraya girin

To okumak geçerli pencere düzenlemesi ve uygulamaları, seçeneğiyle komut dosyasını çalıştırın (hatırlayın):

<script> -read

Sonra tüm pencereleri kapatın:

görüntü tanımını buraya girin

Sonra üzere kurulmuş , son hatırlanan pencere düzenlemesi seçeneği ile çalıştırın:

<script> -run

ve hatırlanan son pencere düzenlemesi geri yüklenecektir:

görüntü tanımını buraya girin

Bu, yeniden başlatmanın ardından da işe yarayacaktır.

İki komutu iki farklı kısayol tuşunun altına koyarak, pencere düzenlemenizi "kaydedebilir", bilgisayarınızı kapatabilir ve (örneğin) yeniden başlattıktan sonra aynı pencere düzenlemesini hatırlayabilirsiniz.

Komut yapar ve ne yaptığını ne değil

Seçeneği ile çalıştır -read

  • Komut wmctrltüm pencereleri, tüm çalışma alanlarını, konumlarını, boyutlarını, ait oldukları uygulamaları listelemek için kullanır
  • Komut dosyası daha sonra yayılan çalışma alanlarınızdaki pencere konumlarını göreceli (geçerli çalışma alanına, çıktısında olduğu gibi wmctrl) mutlak konumlara "dönüştürür" . Bu nedenle, hatırlamak istediğiniz pencerelerin yalnızca bir çalışma alanında olması veya farklı çalışma alanlarına yayılması önemli değildir.
  • Komut dosyası daha sonra geçerli pencere düzenlemesini "hatırlar" ve ana dizininizdeki görünmez bir dosyaya yazar.

Seçeneği ile çalıştır -run

  • senaryo en son hatırlanan pencere düzenlemesini okur; ilgili uygulamaları başlatır, pencereleri de hatırlanan konumlara taşır, ayrıcawmctrl

Senaryo yok değil belki pencereler açılabilir olabilir dosyaları hatırlamak, ne de (örneğin) bir tarayıcı penceresinde açılmıştır web siteleri.

Sorunlar

Kombinasyonu wmctrlve Unitybazı hatalar vardır, birkaç örnek:

  • pencere koordinatları, okunduğu gibi, burada belirtildiği gibi pencereleri konumlandırmawmctrl komutunu hafifçe farklılaştırır . Bu nedenle, hatırlanan pencere konumları orijinal konumdan biraz farklı olabilir.
  • wmctrlPencerenin kenar çok yakın ise ya komutlar biraz öngörülemeyen çalışır Unity Launcherveya panel.
  • "Hatırlanan" pencerelerin, wmctrlyerleştirme komutunun iyi çalışması için tamamen bir çalışma alanı sınırları içinde olması gerekir .

Bazı uygulamalar varsayılan olarak yeni pencerelerde aynı pencerede yeni pencereler açar (gibi gedit). Bunun için düzelttim gedit, ancak daha fazla istisna bulursanız lütfen belirtin.

Senaryo

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

Nasıl kurulur

Başlamadan önce wmctrl, yüklendiğinden emin olun :

sudo apt-get install wmctrl

Sonra:

  1. Boş bir dosya içine komut dosyasını kopyalayın, olarak kaydedin recall_windowsiçinde ~/bin. Gerekirse dizini oluşturun. Dizin henüz mevcut değilse, dizini source ~/.profileoluşturduktan sonra çalıştırın veya oturumu kapatın / oturumu açın. Şimdi olacak$PATH
  2. Komut dosyasını çalıştırılabilir duruma getirin (!).
  3. Şimdi birkaç pencere açın gedit, firefoxya da her neyse, komut dosyasını çalıştırarak komut dosyasını bir terminalde sınayın (yol öneki gerekmez):

    recall_windows -read
    
  4. pencereleri kapat. Şimdi bir terminalde çalıştırın:

    recall_windows -run
    

Pencere kurulumunuz şimdi geri yüklenmeli

Her şey yolunda giderse, kısayol tuşlarına iki komut ekleyin: Seçin: Sistem Ayarları> "Klavye"> "Kısayollar"> "Özel Kısayollar". "+" İşaretini tıklayın ve komutları ekleyin:

recall_windows -read

ve

recall_windows -run

iki farklı kısayol tuşuna


2
Hah! Sadece ilk paragrafı okudum ve senin de olduğunu biliyordum! (oy verildi)
Fabby

@Fabby ve tatilimi kutluyoruz :)
Jacob Vlijm

Harika görünüyor! Şimdi kolayca bir ayar adı için ikinci bir param eklemek ve daha sonra farklı ortamları saklamak / geri yüklemek, clientA, clientB, ev, .. cool!
Bachi

Farklı sürümler harika olurdu, programı kapatabilirse harika olur. Karısı içeri girdiğinde ekranda bir şey olup olmadığını düşünerek kolayca çalışıyormuşum gibi görünmesini sağlayabilirim!
Jamie Hutber

Bu çalışma alanıyla ilgili soruna bir göz atabilir misiniz ? Teşekkürler!!
Natty

4

Oturumları kaydetme ve geri yükleme olanağı sağlayan ve sanal monitörlerin yanı sıra farklı monitör kurulumlarını da destekleyen küçük bir kütüphane / komut satırı aracı yazdım.

Kurulum

npm install -g linux-window-session-manager

kullanım

Geçerli oturumu ~ / .lwsm / sessionData / DEFAULT.json dizinine kaydedin.

lwsm save

Geçerli oturumu ~ / .lwsm / sessionData / my-session.json dizinine kaydedin.

lwsm save my-session   

~ / .Lwsm / sessionData / DEFAULT.json dizininden oturumu geri yükle

lwsm restore

~ / .Lwsm / sessionData / my-session.json dizinini geri yükleyin

lwsm restore my-session   

Oturuma başlamadan önce çalışan tüm uygulamaları dikkatlice kapatın

lwsm restore --closeAllOpenWindows

Çıkış: https://github.com/johannesjo/linux-window-session-manager


1
Harika çalışıyor! Bu en iyi cevap olmalı.
user3751385

2

böyle bir program yok. Compiz cub'u yükleyebilirsiniz:

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

ve bu nasıl yapılır izleyin

compiz, birlik / gnome için en gelişmiş masaüstü aracıdır.


1

Bunu başarmanın basit bir yolunu bilmiyorum.

Ancak, nadiren buna çok basit bir nedenden dolayı ihtiyacım var: askıya alın. Askıya alma ve hazırda bekletme modları arkadaşlarınızdır. Sadece pencere konumlarını kaydetmekle kalmaz, aynı zamanda sisteminizin durumunu da kaydedersiniz. Yeni bir çekirdek sürümünü yeniden yüklemek dışında, bilgisayarı nadiren kapatıyorum.


Eh ekran görüntüsü sadece bir örnekti vb .., tarayıcılar, kapalı ya da bir şey oluyor ben ya da bir şey onu anahtarlama değilim .. ama, yeni terminaller biliyorum başka proje açıyorum ..
Lipis

İyi evet. Birkaç yıldır dokunmadığım, birkaç terminal penceresi, tarayıcı penceresi, hepsi belirli bir projeyle ilgili R grafik ekran pencereleri içeren masaüstlerim var.
Ocak

Suspend, dizüstü bilgisayarım için kullandığım çözüm. Ancak, Masaüstü Bilgisayar için biraz daha karmaşık bir işlem.
kanton
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.