Peningkatan kenyamanan utama adalah dengan menggunakan skrip latar belakang, yang secara otomatis mengatur resolusi per aplikasi , sementara Anda dapat mengatur resolusi yang berbeda untuk berbagai aplikasi (beberapa) sekaligus.
Itulah yang dilakukan oleh naskah di bawah ini.
Contoh resolusi default1680x1050
:
Berjalan gedit
, secara otomatis berubah ke 640x480
:
Berjalan gnome-terminal
, secara otomatis berubah ke 1280x1024
:
Ketika aplikasi ditutup, resolusi secara otomatis diatur kembali ke 1680x1050
Bagaimana cara menggunakan
- Salin skrip di bawah ini ke file kosong, simpan sebagai
set_resolution.py
Di kepala skrip, setel resolusi default Anda, di baris:
#--- set the default resolution below
default = "1680x1050"
#---
Dalam direktori yang sama (folder), membuat textfile, tepatnya bernama: procsdata.txt
. Dalam file teks ini, atur aplikasi atau proses yang diinginkan, diikuti oleh spasi, diikuti oleh resolusi yang diinginkan. Satu aplikasi atau skrip per baris, terlihat seperti:
gedit 640x480
gnome-terminal 1280x1024
java 1280x1024
Jalankan skrip dengan perintah:
python3 /path/to/set_resolution.py
Catatan
Penggunaan skrip pgrep -f <process>
, yang menangkap semua kecocokan, termasuk skrip. Kelemahan yang mungkin adalah bahwa hal itu dapat menyebabkan bentrokan nama saat membuka file dengan nama yang sama dengan proses.
Jika Anda mengalami masalah seperti itu, ubah:
matches.append([p, subprocess.check_output(["pgrep", "-f", p]).decode("utf-8")])
ke:
matches.append([p, subprocess.check_output(["pgrep", p]).decode("utf-8")])
Naskah
#!/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)
Penjelasan
Ketika skrip dimulai, itu membaca file di mana Anda mendefinisikan aplikasi Anda dan resolusi layar yang diinginkan yang sesuai.
Itu kemudian mengawasi proses yang berjalan (berjalan pgrep -f <process>
untuk masing-masing aplikasi) dan menetapkan resolusi jika aplikasi dijalankan.
Ketika pgrep -f <process>
tidak menghasilkan output untuk salah satu aplikasi yang terdaftar, itu menetapkan resolusi ke "default".
Edit:
Versi "Dinamis" (seperti yang diminta)
Sementara versi di atas berfungsi dengan beberapa aplikasi yang terdaftar, itu hanya menetapkan resolusi untuk satu aplikasi pada satu waktu .
Versi di bawah ini dapat menangani berbagai aplikasi dengan resolusi yang berbeda (diperlukan), berjalan pada saat yang sama. Skrip latar belakang akan melacak aplikasi apa yang paling depan, dan akan mengatur resolusi yang sesuai. Ini juga berfungsi baik dengan Alt+ Tab.
Perhatikan bahwa perilaku ini mungkin mengganggu jika Anda sering berpindah antara desktop dan aplikasi yang terdaftar; sakelar resolusi sering mungkin terlalu banyak.
perbedaan cara pengaturan
Pengaturannya hampir sama, mulai dari kenyataan bahwa yang satu ini menggunakan wmctrl
dan xdotool
:
sudo apt-get install wmctrl
sudo apt-get install xdotool
Naskah
#!/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
Catatan
- Meskipun saya menjalankannya selama beberapa jam tanpa kesalahan sekarang, silakan mengujinya secara menyeluruh. Jika kesalahan mungkin terjadi, silakan tinggalkan komentar.
- Script -seperti itu- bekerja pada satu pengaturan monitor.