Nâng cấp tiện lợi chính sẽ là sử dụng tập lệnh nền, tự động đặt độ phân giải cho mỗi ứng dụng , trong khi bạn có thể đặt các độ phân giải khác nhau cho các ứng dụng (nhiều) khác nhau cùng một lúc.
Đó chính xác là những gì kịch bản dưới đây làm.
Một ví dụ về độ phân giải mặc định là 1680x1050
:
Đang chạy gedit
, tự động thay đổi thành 640x480
:
Đang chạy gnome-terminal
, tự động thay đổi thành 1280x1024
:
Khi ứng dụng được đóng, độ phân giải sẽ tự động được đặt lại 1680x1050
Cách sử dụng
- Sao chép tập lệnh bên dưới vào một tập tin trống, lưu nó dưới dạng
set_resolution.py
Trong phần đầu của tập lệnh, đặt độ phân giải mặc định của bạn, trong dòng:
#--- set the default resolution below
default = "1680x1050"
#---
Trong cùng một thư mục (thư mục), tạo một tệp văn bản, được đặt tên chính xác : procsdata.txt
. Trong tệp văn bản này, đặt ứng dụng hoặc quy trình mong muốn, theo sau là khoảng trắng, theo sau là độ phân giải mong muốn. Một ứng dụng hoặc tập lệnh trên mỗi dòng, trông giống như:
gedit 640x480
gnome-terminal 1280x1024
java 1280x1024
Chạy tập lệnh bằng lệnh:
python3 /path/to/set_resolution.py
Ghi chú
Việc sử dụng tập lệnh pgrep -f <process>
, bắt tất cả các kết quả khớp, bao gồm cả tập lệnh. Nhược điểm có thể là nó có thể gây ra xung đột tên khi mở tệp có cùng tên với quy trình.
Nếu bạn gặp phải vấn đề như vậy, hãy thay đổi:
matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])
vào:
matches.append([p, subprocess.check_output(["pgrep", p]).decode("utf-8")])
Kịch bản
#!/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)
Giải trình
Khi tập lệnh bắt đầu, nó sẽ đọc tệp mà bạn đã xác định các ứng dụng của mình và độ phân giải màn hình mong muốn tương ứng của chúng.
Sau đó, nó sẽ theo dõi các quy trình đang chạy (chạy pgrep -f <process>
cho từng ứng dụng) và đặt độ phân giải nếu ứng dụng khởi động.
Khi pgrep -f <process>
không tạo đầu ra cho bất kỳ ứng dụng nào được liệt kê, nó sẽ đặt độ phân giải thành "mặc định".
Biên tập:
Phiên bản "Động" (theo yêu cầu)
Mặc dù phiên bản trên hoạt động với nhiều ứng dụng được liệt kê, nhưng nó chỉ đặt độ phân giải cho một ứng dụng tại một thời điểm .
Phiên bản dưới đây có thể xử lý các ứng dụng khác nhau với độ phân giải (bắt buộc) khác nhau, chạy cùng một lúc. Kịch bản nền sẽ theo dõi phần lớn ứng dụng nhất và sẽ đặt độ phân giải tương ứng. Nó cũng hoạt động tốt với Alt+ Tab.
Lưu ý rằng hành vi này có thể gây phiền nhiễu nếu bạn chuyển đổi nhiều giữa máy tính để bàn và các ứng dụng được liệt kê; việc chuyển đổi độ phân giải thường xuyên có thể là quá nhiều.
sự khác biệt trong cách thiết lập
Các thiết lập khá giống nhau, xuất phát từ thực tế là cái này sử dụng wmctrl
và xdotool
:
sudo apt-get install wmctrl
sudo apt-get install xdotool
Kịch bản
#!/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
Ghi chú
- Mặc dù tôi có nó chạy trong vài giờ mà không có lỗi bây giờ, xin vui lòng kiểm tra kỹ lưỡng. Nếu một lỗi có thể xảy ra, xin vui lòng để lại nhận xét.
- Kịch bản - như nó - hoạt động trên một thiết lập màn hình.