เน้นหน้าจอที่เน้น (หรือหรี่แสงจากการเปลี่ยนโฟกัสดูที่ 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
เมื่อเชื่อมต่อจอภาพที่สองให้ทดสอบว่าสคริปต์ทำงานตามที่คาดไว้หรือไม่
หากทำงานได้ดีให้เพิ่มลงในแอปพลิเคชันเริ่มต้น: Dash> แอปพลิเคชันเริ่มต้น> เพิ่มคำสั่ง:
/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