एक प्रमुख सुविधा उन्नयन एक पृष्ठभूमि स्क्रिप्ट का उपयोग करना होगा, स्वचालित रूप से प्रति एप्लिकेशन रिज़ॉल्यूशन सेट करना , जबकि आप एक ही बार में विभिन्न (एकाधिक) अनुप्रयोगों के लिए विभिन्न रिज़ॉल्यूशन सेट कर सकते हैं।
ठीक यही स्क्रिप्ट नीचे दी गई है।
का एक डिफ़ॉल्ट संकल्प का एक उदाहरण 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>
किसी भी सूचीबद्ध एप्लिकेशन के लिए आउटपुट का उत्पादन नहीं होता है, तो यह रिज़ॉल्यूशन को "डिफ़ॉल्ट" पर सेट करता है।
संपादित करें:
"डायनामिक" संस्करण (अनुरोध के अनुसार)
जबकि ऊपर का संस्करण कई सूचीबद्ध अनुप्रयोगों के साथ काम करता है, यह केवल एक समय में एक आवेदन के लिए रिज़ॉल्यूशन सेट करता है ।
नीचे दिया गया संस्करण एक ही समय में चल रहे (आवश्यक) रिज़ॉल्यूशन के साथ विभिन्न अनुप्रयोगों को संभाल सकता है। बैकग्राउंड स्क्रिप्ट क्या सबसे सामने वाला एप्लीकेशन है, इस पर नज़र रखेगी और उसी के अनुसार रिज़ॉल्यूशन सेट करेगी। यह Alt+ के साथ भी ठीक काम करता है Tab।
ध्यान दें कि यदि आप डेस्कटॉप और सूचीबद्ध अनुप्रयोगों के बीच बहुत अधिक स्विच करते हैं तो यह व्यवहार कष्टप्रद हो सकता है; लगातार रिज़ॉल्यूशन स्विच बहुत अधिक हो सकता है।
सेटअप करने के तरीके में अंतर
सेटअप बहुत अधिक है, इस तथ्य से है कि यह एक का उपयोग करता है 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
टिप्पणियाँ
- हालांकि मेरे पास अब एक त्रुटि के बिना कई घंटों तक चल रहा है, कृपया इसे अच्छी तरह से परखें। यदि कोई त्रुटि हो सकती है, तो कृपया एक टिप्पणी छोड़ दें।
- स्क्रिप्ट -as यह है- सिंगल मॉनिटर सेटअप पर काम करता है।