फोकस्ड स्क्रीन को हाइलाइट करें (या फोकस में बदलाव पर फ्लैश करें, नीचे EDIT देखें)
साइड-बाय-साइड ड्यूल मॉनिटर सेटअप (बाएं-दाएं) में, नीचे दी गई स्क्रिप्ट मॉनिटर की चमक को "सामान्य" (100%) विंडो के साथ सेट करेगी, जबकि अन्य एक 60% तक मंद है।
यदि फ़ोकस बदलता है, तो ब्राइटनेस फ़ोकस का अनुसरण करेगी:
सही स्क्रीन पर फोकस (एक विंडो)
बाईं स्क्रीन पर (एक विंडो) पर ध्यान केंद्रित करें
लिपी
#!/usr/bin/env python3
"""
In a side-by-side dual monitor setup (left-right), the script below will set
the brightness of the monitor with the focussed window to "normal" (100%),
while other one is dimmed to 60%. If the focus changes, the brightness will
follow the focus
"""
import subprocess
import time
def get_wposition():
# get the position of the currently frontmost window
try:
w_data = subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()
frontmost = subprocess.check_output(["xprop", "-root", "_NET_ACTIVE_WINDOW"]).decode("utf-8").split()[-1].strip()
z = 10-len(frontmost); frontmost = frontmost[:2]+z*"0"+frontmost[2:]
return [int(l.split()[2]) for l in w_data if frontmost in l][0]
except subprocess.CalledProcessError:
pass
def get_onscreen():
# get the size of the desktop, the names of both screens and the x-resolution of the left screen
resdata = subprocess.check_output(["xrandr"]).decode("utf-8")
if resdata.count(" connected") == 2:
resdata = resdata.splitlines()
r = resdata[0].split(); span = int(r[r.index("current")+1])
screens = [l for l in resdata if " connected" in l]
lr = [[(l.split()[0], int([s.split("x")[0] for s in l.split() if "+0+0" in s][0])) for l in screens if "+0+0" in l][0],
[l.split()[0] for l in screens if not "+0+0" in l][0]]
return [span, lr]
else:
print("no second screen seems to be connected")
def scr_position(span, limit, pos):
# determine if the frontmost window is on the left- or right screen
if limit < pos < span:
return [right_scr, left_scr]
else:
return [left_scr, right_scr]
def highlight(scr1, scr2):
# highlight the "active" window, dim the other one
action1 = "xrandr", "--output", scr1, "--brightness", "1.0"
action2 = "xrandr", "--output", scr2, "--brightness", "0.6"
for action in [action1, action2]:
subprocess.Popen(action)
# determine the screen setup
screendata = get_onscreen()
left_scr = screendata[1][0][0]; right_scr = screendata[1][1]
limit = screendata[1][0][1]; span = screendata[0]
# set initial highlight
oncurrent1 = scr_position(span, limit, get_wposition())
highlight(oncurrent1[0], oncurrent1[1])
while True:
time.sleep(0.5)
pos = get_wposition()
# bypass possible incidental failures of the wmctrl command
if pos != None:
oncurrent2 = scr_position(span, limit, pos)
# only set highlight if there is a change in active window
if oncurrent2 != oncurrent1:
highlight(oncurrent1[1], oncurrent1[0])
oncurrent1 = oncurrent2
कैसे इस्तेमाल करे
स्क्रिप्ट की जरूरत है wmctrl
:
sudo apt-get install wmctrl
स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे इस रूप में सहेजें highlight_focus.py
टेस्ट- कमांड द्वारा इसे चलाएं:
python3 /path/to/highlight_focus.py
दूसरे मॉनिटर से जुड़े होने के साथ , यदि स्क्रिप्ट अपेक्षित रूप से काम करती है तो परीक्षण करें।
यदि सब ठीक काम करता है, तो इसे स्टार्टअप एप्लिकेशन में जोड़ें: डैश> स्टार्टअप एप्लिकेशन> कमांड जोड़ें:
/bin/bash -c "sleep 15 && python3 /path/to/highlight_focus.py"
टिप्पणियाँ
संसाधनों पर स्क्रिप्ट बेहद कम है। "ईंधन बचाने के लिए", स्क्रीन सेटअप; स्क्रिप्ट के स्टार्टअप के दौरान (लूप में शामिल नहीं) रिज़ॉल्यूशन, स्पैन साइज़ आदि को केवल एक बार पढ़ा जाता है। इसका तात्पर्य है कि यदि आप दूसरे मॉनिटर को कनेक्ट / डिस्कनेक्ट करते हैं तो आपको स्क्रिप्ट को पुनरारंभ करना होगा।
यदि आपने इसे स्टार्टअप एप्लिकेशन में जोड़ा है, तो इसका मतलब है कि आपको मॉनिटर कॉन्फ़िगरेशन में बदलाव के बाद लॉग आउट करना होगा।
यदि आप मंद स्क्रीन के लिए एक और चमक प्रतिशत पसंद करते हैं, तो पंक्ति में मान बदलें:
action2 = "xrandr", "--output", scr2, "--brightness", "0.6"
मान 0,0
(काली स्क्रीन) और 1.0
(100%) के बीच हो सकता है ।
व्याख्या
स्क्रिप्ट के स्टार्टअप पर, यह निर्धारित करता है:
- दोनों स्क्रीन के फैले हुए रिज़ॉल्यूशन
- बाईं स्क्रीन का x- रिज़ॉल्यूशन
- दोनों स्क्रीन के नाम
फिर, एक लूप में (एक बार प्रति सेकंड), यह:
यदि विंडो की (x-) स्थिति अधिक है, तो बाईं स्क्रीन का x- रिज़ॉल्यूशन, विंडो स्पष्ट रूप से दाईं स्क्रीन पर है, जब तक यह अधिक नहीं होती है , तब दो स्क्रीन का फैले आकार (तब यह कार्यक्षेत्र पर होगा) सही)। इसलिए:
if limit < pos < span:
यह निर्धारित करता है कि विंडो दाईं स्क्रीन पर है (जहां बाईं स्क्रीन limit
का x-res pos
है, विंडो की x-स्थिति है और span
दोनों स्क्रीन का संयुक्त x-res है)।
यदि सबसे सामने वाली खिड़की (बाएं स्क्रीन या दाईं स्क्रीन पर) की स्थिति में कोई बदलाव होता है, तो स्क्रिप्ट xrandr
कमांड के साथ दोनों स्क्रीन की चमक सेट करती है :
xrandr --output <screen_name> --brightness <value>
संपादित करें
डिम-फ्लैश फ़ोकस की गई स्क्रीन के बजाय एक स्थायी मंद "अप्रकाशित" स्क्रीन
जैसा कि टिप्पणी में और चैट में अनुरोध किया गया है, स्क्रिप्ट के एक संस्करण के नीचे, जो नए फ़ोकस किए गए स्क्रीन पर एक छोटा सा धुंधला फ्लैश देता है:
#!/usr/bin/env python3
"""
In a side-by-side dual monitor setup (left-right), the script below will give
a short dim- flash on the newly focussed screen if the focussed screen changes
"""
import subprocess
import time
def get_wposition():
# get the position of the currently frontmost window
try:
w_data = subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()
frontmost = subprocess.check_output(["xprop", "-root", "_NET_ACTIVE_WINDOW"]).decode("utf-8").split()[-1].strip()
z = 10-len(frontmost); frontmost = frontmost[:2]+z*"0"+frontmost[2:]
return [int(l.split()[2]) for l in w_data if frontmost in l][0]
except subprocess.CalledProcessError:
pass
def get_onscreen():
# get the size of the desktop, the names of both screens and the x-resolution of the left screen
resdata = subprocess.check_output(["xrandr"]).decode("utf-8")
if resdata.count(" connected") == 2:
resdata = resdata.splitlines()
r = resdata[0].split(); span = int(r[r.index("current")+1])
screens = [l for l in resdata if " connected" in l]
lr = [[(l.split()[0], int([s.split("x")[0] for s in l.split() if "+0+0" in s][0])) for l in screens if "+0+0" in l][0],
[l.split()[0] for l in screens if not "+0+0" in l][0]]
return [span, lr]
else:
print("no second screen seems to be connected")
def scr_position(span, limit, pos):
# determine if the frontmost window is on the left- or right screen
if limit < pos < span:
return [right_scr, left_scr]
else:
return [left_scr, right_scr]
def highlight(scr1):
# highlight the "active" window, dim the other one
subprocess.Popen([ "xrandr", "--output", scr1, "--brightness", "0.3"])
time.sleep(0.1)
subprocess.Popen([ "xrandr", "--output", scr1, "--brightness", "1.0"])
# determine the screen setup
screendata = get_onscreen()
left_scr = screendata[1][0][0]; right_scr = screendata[1][1]
limit = screendata[1][0][1]; span = screendata[0]
# set initial highlight
oncurrent1 = []
while True:
time.sleep(0.5)
pos = get_wposition()
# bypass possible incidental failures of the wmctrl command
if pos != None:
oncurrent2 = scr_position(span, limit, pos)
# only set highlight if there is a change in active window
if oncurrent2 != oncurrent1:
highlight(oncurrent2[0])
oncurrent1 = oncurrent2