chú thích
Tập lệnh đã được vá / sửa vào ngày 16 tháng 1 năm 2017, sửa một vài ứng dụng trong đó tên quy trình khác với lệnh để chạy ứng dụng . Có thể, điều này đôi khi xảy ra trên các ứng dụng. Nếu ai đó tìm thấy một, xin vui lòng để lại nhận xét.
Script để ghi nhớ và khôi phục sắp xếp cửa sổ và các ứng dụng tương ứng của chúng.
Kịch bản dưới đây có thể được chạy với hai tùy chọn. Giả sử bạn có cách sắp xếp cửa sổ như dưới đây:
Để đọc (ghi nhớ) cách sắp xếp cửa sổ hiện tại và các ứng dụng của chúng, hãy chạy tập lệnh với tùy chọn:
<script> -read
Sau đó đóng tất cả các cửa sổ:
Sau đó, để thiết lập sắp xếp cửa sổ ghi nhớ cuối cùng, hãy chạy nó với tùy chọn:
<script> -run
và sắp xếp cửa sổ ghi nhớ cuối cùng sẽ được khôi phục:
Điều này cũng sẽ làm việc sau khi khởi động lại.
Đặt hai lệnh dưới hai phím tắt khác nhau, bạn có thể "ghi lại" cách sắp xếp cửa sổ, tắt máy tính và gọi lại cách sắp xếp cửa sổ tương tự sau khi (ví dụ) khởi động lại.
Kịch bản làm gì, và cái gì không
Chạy với tùy chọn -read
- Kịch bản sử dụng
wmctrl
để liệt kê tất cả các cửa sổ, trên tất cả các không gian làm việc, vị trí của chúng, kích thước của chúng, các ứng dụng mà chúng thuộc về
- Tập lệnh sau đó "chuyển đổi" các vị trí cửa sổ từ vị trí tương đối (sang không gian làm việc hiện tại, như ở đầu ra của
wmctrl
) thành các vị trí tuyệt đối , trên các không gian làm việc kéo dài của bạn. Do đó, không có vấn đề gì nếu các cửa sổ bạn muốn nhớ chỉ nằm trên một không gian làm việc hoặc trải rộng trên các không gian làm việc khác nhau.
- Tập lệnh sau đó "ghi nhớ" cách sắp xếp cửa sổ hiện tại, ghi nó vào một tệp vô hình trong thư mục chính của bạn.
Chạy với tùy chọn -run
- kịch bản đọc sắp xếp cửa sổ ghi nhớ cuối cùng; nó khởi động các ứng dụng tương ứng, di chuyển các cửa sổ đến các vị trí đã nhớ, cũng với sự trợ giúp của
wmctrl
Tập lệnh không nhớ các tệp có thể được mở trong cửa sổ, cũng như (ví dụ) các trang web được mở trong cửa sổ trình duyệt.
Các vấn đề
Sự kết hợp wmctrl
và Unity
có một số lỗi, một vài ví dụ:
- tọa độ cửa sổ, như được đọc bởi
wmctrl
khác nhau một chút tạo thành lệnh để định vị các cửa sổ, như được đề cập ở đây . Do đó, các vị trí cửa sổ bị thu hồi có thể hơi khác với vị trí ban đầu.
- Các
wmctrl
lệnh hoạt động hơi khó đoán nếu cạnh của cửa sổ rất gần Unity Launcher
hoặc bảng điều khiển.
- Các cửa sổ "được nhớ" cần phải nằm hoàn toàn bên trong đường viền không gian làm việc để
wmctrl
lệnh vị trí hoạt động tốt.
Một số ứng dụng mở các cửa sổ mới theo mặc định trong cùng một cửa sổ trong một tab mới (như gedit
). Tôi đã sửa nó gedit
, nhưng vui lòng đề cập đến nó nếu bạn tìm thấy nhiều ngoại lệ hơn.
Kịch bản
#!/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()
Làm thế nào để thiết lập
Trước khi bạn bắt đầu, hãy chắc chắn rằng đã wmctrl
được cài đặt:
sudo apt-get install wmctrl
Sau đó:
- Sao chép tập lệnh vào một tập tin trống, lưu nó như
recall_windows
trong ~/bin
. Tạo thư mục nếu cần thiết. Nếu thư mục chưa tồn tại, hãy chạy source ~/.profile
hoặc đăng xuất / đăng nhập sau khi bạn tạo thư mục. Bây giờ nó sẽ ở trong$PATH
- Làm cho tập lệnh thực thi (!).
Bây giờ mở một vài cửa sổ, gedit
, firefox
hoặc bất cứ điều gì, và chạy thử kịch bản trong một thiết bị đầu cuối bằng cách chạy lệnh (không có con đường tiền tố cần thiết):
recall_windows -read
đóng những cái cửa sổ. Bây giờ chạy trong một thiết bị đầu cuối:
recall_windows -run
Thiết lập cửa sổ của bạn bây giờ sẽ được khôi phục
Nếu tất cả đều hoạt động tốt, hãy thêm hai lệnh vào các phím tắt: Chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm các lệnh:
recall_windows -read
và
recall_windows -run
đến hai phím tắt khác nhau