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:
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:
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:
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
wmctrl
tü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ıca
wmctrl
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 wmctrl
ve Unity
bazı hatalar vardır, birkaç örnek:
- pencere koordinatları, okunduğu gibi, burada belirtildiği gibi pencereleri konumlandırma
wmctrl
komutunu hafifçe farklılaştırır . Bu nedenle, hatırlanan pencere konumları orijinal konumdan biraz farklı olabilir.
wmctrl
Pencerenin kenar çok yakın ise ya komutlar biraz öngörülemeyen çalışır Unity Launcher
veya panel.
- "Hatırlanan" pencerelerin,
wmctrl
yerleş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:
- Boş bir dosya içine komut dosyasını kopyalayın, olarak kaydedin
recall_windows
içinde ~/bin
. Gerekirse dizini oluşturun. Dizin henüz mevcut değilse, dizini source ~/.profile
oluşturduktan sonra çalıştırın veya oturumu kapatın / oturumu açın. Şimdi olacak$PATH
- Komut dosyasını çalıştırılabilir duruma getirin (!).
Şimdi birkaç pencere açın gedit
, firefox
ya da her neyse, komut dosyasını çalıştırarak komut dosyasını bir terminalde sınayın (yol öneki gerekmez):
recall_windows -read
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