การอัพเกรดความสะดวกสบายที่สำคัญคือการใช้สคริปต์พื้นหลังการตั้งค่าความละเอียดต่อแอปพลิเคชันโดยอัตโนมัติในขณะที่คุณสามารถตั้งค่าความละเอียดที่แตกต่างกันสำหรับแอพพลิเคชั่นที่แตกต่างกัน
นั่นคือสิ่งที่สคริปต์ด้านล่างทำ
ตัวอย่างของการแก้ปัญหาเริ่มต้นของ1680x1050
:
วิ่งgedit
โดยอัตโนมัติเปลี่ยนเป็น640x480
:
วิ่งgnome-terminal
โดยอัตโนมัติเปลี่ยนเป็น1280x1024
:
เมื่อแอปพลิเคชั่นปิดความละเอียดจะถูกตั้งกลับเป็นอัตโนมัติ 1680x1050
วิธีใช้
- คัดลอกสคริปต์ด้านล่างลงในไฟล์ว่างแล้วบันทึกเป็น
set_resolution.py
ในส่วนหัวของสคริปต์ตั้งค่าความละเอียดเริ่มต้นของคุณในบรรทัด:
#--- set the default resolution below
default = "1680x1050"
#---
ในไดเรกทอรีเดียวกันมาก (โฟลเดอร์) สร้าง textfile ที่ตรงprocsdata.txt
ชื่อ: ในเท็กซ์ไฟล์นี้ให้ตั้งค่าแอปพลิเคชันหรือกระบวนการที่ต้องการตามด้วยช่องว่างตามด้วยความละเอียดที่ต้องการ แอปพลิเคชันหรือสคริปต์หนึ่งรายการต่อบรรทัดดูเหมือนว่า:
gedit 640x480
gnome-terminal 1280x1024
java 1280x1024
รันสคริปต์ด้วยคำสั่ง:
python3 /path/to/set_resolution.py
บันทึก
การใช้สคริปต์pgrep -f <process>
ซึ่งจับคู่การแข่งขันทั้งหมดรวมถึงสคริปต์ ข้อเสียที่เป็นไปได้คือมันสามารถทำให้เกิดการปะทะกันของชื่อเมื่อเปิดไฟล์ที่มีชื่อเดียวกันกับกระบวนการ
หากคุณพบปัญหาเช่นนั้นให้เปลี่ยน:
matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])
เป็น:
matches.append([p, subprocess.check_output(["pgrep", p]).decode("utf-8")])
บท
#!/usr/bin/env python3
import subprocess
import os
import time
#--- set the default resolution below
default = "1680x1050"
#---
# read the datafile
curr_dir = os.path.dirname(os.path.abspath(__file__))
datafile = curr_dir+"/procsdata.txt"
procs_data = [l.split() for l in open(datafile).read().splitlines() if not l == "\n"]
procs = [pdata[0] for pdata in procs_data]
def check_matches():
# function to find possible running (listed) applications
matches = []
for p in procs:
try:
matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])
except subprocess.CalledProcessError:
pass
match = matches[-1][0] if len(matches) != 0 else None
return match
matches1 = check_matches()
while True:
time.sleep(2)
matches2 = check_matches()
if matches2 == matches1:
pass
else:
if matches2 != None:
# a listed application started up since two seconds ago
resdata = [("x").join(item[1].split("x")) for item in \
procs_data if item[0] == matches2][0]
elif matches2 == None:
# none of the listed applications is running any more
resdata = default
subprocess.Popen(["xrandr", "-s", resdata])
matches1 = matches2
time.sleep(1)
คำอธิบาย
เมื่อสคริปต์เริ่มทำงานมันจะอ่านไฟล์ที่คุณกำหนดแอพพลิเคชั่นของคุณและความละเอียดหน้าจอที่ต้องการ
จากนั้นคอยตรวจสอบกระบวนการทำงาน (เรียกใช้pgrep -f <process>
สำหรับแต่ละแอปพลิเคชัน) และตั้งค่าความละเอียดหากแอปพลิเคชันเริ่มต้นขึ้น
เมื่อpgrep -f <process>
ไม่สร้างผลลัพธ์สำหรับแอปพลิเคชันใด ๆ ที่อยู่ในรายการจะตั้งค่าความละเอียดเป็น "ค่าเริ่มต้น"
แก้ไข:
รุ่น "ไดนามิก" (ตามที่ร้องขอ)
แม้ว่าเวอร์ชั่นด้านบนจะใช้งานได้กับแอพพลิเคชั่นหลายตัว แต่จะตั้งค่าความละเอียดของแอพพลิเคชั่นทีละตัวเท่านั้น
เวอร์ชั่นด้านล่างสามารถรองรับแอปพลิเคชั่นต่าง ๆ ที่มีความละเอียดต่างกัน (จำเป็น) ซึ่งทำงานพร้อมกัน สคริปต์พื้นหลังจะติดตามแอปพลิเคชันส่วนใหญ่ที่ด้านหน้าและจะตั้งค่าความละเอียดตามนั้น นอกจากนี้ยังทำงานได้ดีกับ+AltTab
โปรดทราบว่าพฤติกรรมนี้อาจน่ารำคาญหากคุณสลับไปมาระหว่างเดสก์ท็อปและแอปพลิเคชั่นที่ระบุ สวิตช์ความละเอียดที่ใช้บ่อยอาจมากเกินไป
ความแตกต่างในวิธีการตั้งค่า
การตั้งค่าค่อนข้างเหมือนกันโดยสิ้นเชิงจากความจริงที่ว่าอันนี้ใช้wmctrl
และxdotool
:
sudo apt-get install wmctrl
sudo apt-get install xdotool
บท
#!/usr/bin/env python3
import subprocess
import os
import sys
import time
#--- set default resolution below
resolution = "1680x1050"
#---
curr_dir = os.path.dirname(os.path.abspath(__file__))
datafile = curr_dir+"/procsdata.txt"
applist = [l.split() for l in open(datafile).read().splitlines()]
apps = [item[0] for item in applist]
def get(cmd):
try:
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
except subprocess.CalledProcessError:
pass
def get_pids():
# returns pids of listed applications; seems ok
runs = []
for item in apps:
pid = get("pgrep -f "+item)
if pid != None:
runs.append((item, pid.strip()))
return runs
def check_frontmost():
# returns data on the frontmost window; seems ok
frontmost = str(hex(int(get("xdotool getwindowfocus").strip())))
frontmost = frontmost[:2]+"0"+frontmost[2:]
try:
wlist = get("wmctrl -lpG").splitlines()
return [l for l in wlist if frontmost in l]
except subprocess.CalledProcessError:
pass
def front_pid():
# returns the frontmost pid, seems ok
return check_frontmost()[0].split()[2]
def matching():
# nakijken
running = get_pids(); frontmost = check_frontmost()
if all([frontmost != None, len(running) != 0]):
matches = [item[0] for item in running if item[1] == frontmost[0].split()[2]]
if len(matches) != 0:
return matches[0]
else:
pass
trigger1 = matching()
while True:
time.sleep(1)
trigger2 = matching()
if trigger2 != trigger1:
if trigger2 == None:
command = "xrandr -s "+resolution
else:
command = "xrandr -s "+[it[1] for it in applist if it[0] == trigger2][0]
subprocess.Popen(["/bin/bash", "-c", command])
print(trigger2, command)
trigger1 = trigger2
หมายเหตุ
- แม้ว่าฉันจะให้มันทำงานเป็นเวลาหลายชั่วโมงโดยไม่มีข้อผิดพลาดตอนนี้โปรดทดสอบอย่างละเอียด หากข้อผิดพลาดอาจเกิดขึ้นโปรดแสดงความคิดเห็น
- สคริปต์มันทำงานบนการตั้งค่าจอภาพเดียว