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:
Untuk membaca (ingat) pengaturan jendela saat ini dan aplikasinya, jalankan skrip dengan opsi:
<script> -read
Kemudian tutup semua jendela:
Kemudian untuk mengatur pengaturan jendela yang terakhir diingat, jalankan dengan opsi:
<script> -run
dan pengaturan jendela yang terakhir diingat akan dipulihkan:
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
wmctrl
untuk 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 bantuan
wmctrl
Script tidak mengingat file yang mungkin dibuka di windows, atau (misalnya) situs web yang dibuka di jendela browser.
Masalah
Kombinasi wmctrl
dan Unity
memiliki beberapa bug, beberapa contoh:
- Koordinat jendela, seperti yang dibaca oleh
wmctrl
sedikit 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
wmctrl
perintah bekerja sedikit tak terduga jika tepi jendela sangat dekat baik Unity Launcher
atau panel.
- Jendela "ingat" harus benar-benar di dalam batas ruang kerja agar
wmctrl
perintah 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 wmctrl
sudah terpasang:
sudo apt-get install wmctrl
Kemudian:
- Salin skrip ke file kosong, simpan seperti
recall_windows
dalam ~/bin
. Buat direktori jika perlu. Jika direktori belum ada, jalankan salah satu source ~/.profile
atau keluar / masuk setelah Anda membuat direktori. Sekarang akan masuk$PATH
- Jadikan skrip dapat dieksekusi (!).
Sekarang buka beberapa jendela, gedit
, firefox
atau apa pun, dan uji-menjalankan script di terminal dengan menjalankan perintah (ada jalan awalan diperlukan):
recall_windows -read
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