บันทึก
สคริปต์ได้รับการแก้ไข / แก้ไขเมื่อวันที่ 16 มกราคม 2017 แก้ไขสำหรับแอปพลิเคชั่นบางตัวที่ชื่อกระบวนการแตกต่างจากคำสั่งเพื่อเรียกใช้แอปพลิเคชันคำสั่งเพื่อเรียกใช้โปรแกรมประยุกต์อาจเกิดขึ้นได้ในบางครั้งในแอปพลิเคชัน หากมีใครพบกรุณาแสดงความคิดเห็น
สคริปต์เพื่อจดจำและเรียกคืนการจัดเรียงหน้าต่างและแอปพลิเคชันที่เกี่ยวข้อง
สคริปต์ด้านล่างสามารถเรียกใช้ด้วยสองตัวเลือก สมมติว่าคุณมีการจัดเรียงหน้าต่างดังนี้:
หากต้องการอ่าน (จดจำ) การจัดเรียงหน้าต่างปัจจุบันและแอปพลิเคชันให้รันสคริปต์ด้วยตัวเลือก:
<script> -read
จากนั้นปิดหน้าต่างทั้งหมด:
จากนั้นเมื่อต้องการตั้งค่าการจัดเรียงหน้าต่างที่จำล่าสุดให้รันด้วยตัวเลือก:
<script> -run
และการจัดเรียงหน้าต่างที่จำครั้งสุดท้ายจะถูกกู้คืน:
สิ่งนี้จะทำงานหลังจากรีสตาร์ท
คุณสามารถ "บันทึก" การจัดเรียงหน้าต่างของคุณปิดเครื่องคอมพิวเตอร์และเรียกใช้การจัดเรียงหน้าต่างเดียวกันหลังจาก (เช่น) รีสตาร์ท
สิ่งที่สคริปต์ทำและสิ่งที่ไม่
เรียกใช้ด้วยตัวเลือก -read
- สคริปต์ใช้
wmctrl
เพื่อแสดงรายการหน้าต่างทั้งหมดทั่วทั้งเวิร์กสเปซตำแหน่งตำแหน่งขนาดแอปพลิเคชันที่เป็นของมัน
- จากนั้นสคริปต์จะ "แปลง" ตำแหน่งหน้าต่างจากสัมพัทธ์ (เป็นเวิร์กสเปซปัจจุบันเช่นเดียวกับผลลัพธ์
wmctrl
) เป็นตำแหน่งสัมบูรณ์บนพื้นที่ทำงานของคุณ ดังนั้นจึงไม่สำคัญว่า windows ที่คุณต้องการจดจำนั้นอยู่ในพื้นที่ทำงานเดียวหรือกระจายไปทั่วพื้นที่ทำงานที่แตกต่างกัน
- จากนั้นสคริปต์จะ "จดจำ" การจัดเรียงหน้าต่างปัจจุบันโดยเขียนเป็นไฟล์ที่มองไม่เห็นในโฮมไดเร็กตอรี่ของคุณ
เรียกใช้ด้วยตัวเลือก -run
- สคริปต์จะอ่านการจัดเรียงหน้าต่างที่จำได้ครั้งล่าสุด มันเริ่มต้นแอพพลิเคชั่นที่เกี่ยวข้องย้ายหน้าต่างไปยังตำแหน่งที่จำได้ด้วยความช่วยเหลือของ
wmctrl
สคริปต์ไม่ได้จดจำไฟล์ที่อาจเปิดในหน้าต่างและ (เช่น) เว็บไซต์ที่เปิดในหน้าต่างเบราว์เซอร์
ประเด็น
การรวมกันของwmctrl
และUnity
มีข้อบกพร่องบางตัวอย่าง:
- พิกัดหน้าต่างในขณะที่อ่านโดย
wmctrl
จะแตกต่างกันเล็กน้อยในรูปแบบคำสั่งที่จะวางตำแหน่งหน้าต่างเป็นที่กล่าวถึงที่นี่ ดังนั้นตำแหน่งหน้าต่างที่เรียกคืนอาจแตกต่างจากตำแหน่งเดิมเล็กน้อย
wmctrl
คำสั่งทำงานบิตคาดเดาไม่ได้ถ้าขอบของหน้าต่างอยู่ใกล้มากทั้งUnity Launcher
หรือแผง
- หน้าต่าง "ที่จำได้" นั้นจะต้องอยู่ภายในขอบเขตของพื้นที่ทำงานอย่างสมบูรณ์เพื่อให้
wmctrl
คำสั่งการจัดวางทำงานได้ดี
บางแอปพลิเคชันจะเปิดหน้าต่างใหม่ตามค่าเริ่มต้นในหน้าต่างเดียวกันในแท็บใหม่ (เช่นgedit
) ฉันแก้ไขให้gedit
แต่โปรดพูดถึงมันหากคุณพบข้อยกเว้นเพิ่มเติม
บท
#!/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()
วิธีการตั้งค่า
ก่อนที่จะเริ่มตรวจสอบให้แน่ใจว่าwmctrl
ได้ติดตั้งแล้ว:
sudo apt-get install wmctrl
แล้ว:
- คัดลอกสคริปต์ลงในไฟล์ที่ว่างเปล่าบันทึกเป็นใน
recall_windows
~/bin
สร้างไดเรกทอรีถ้าจำเป็น หากยังไม่มีไดเรกทอรีให้รันอย่างใดอย่างหนึ่งsource ~/.profile
หรือออกจากระบบหลังจากที่คุณสร้างไดเรกทอรี ตอนนี้มันจะเป็นมา$PATH
- ทำให้สคริปต์เรียกใช้งานได้ (!)
ตอนนี้เปิดไม่กี่หน้าต่างgedit
, firefox
หรืออะไรก็ตามและการทดสอบการเรียกใช้สคริปต์ในสถานีโดยใช้คำสั่ง (คำนำหน้าไม่มีเส้นทางจำเป็น):
recall_windows -read
ปิดหน้าต่าง ตอนนี้ทำงานใน terminal:
recall_windows -run
การตั้งค่าหน้าต่างของคุณควรได้รับการคืนค่าแล้ว
หากใช้งานได้ดีให้เพิ่มสองคำสั่งในปุ่มทางลัด: เลือก: การตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:
recall_windows -read
และ
recall_windows -run
ถึงสองปุ่มทางลัดที่แตกต่างกัน