Làm nổi bật màn hình tập trung (hoặc mờ khi thay đổi tiêu cự, xem EDIT bên dưới)
Trong thiết lập màn hình kép song song (trái phải), tập lệnh bên dưới sẽ đặt độ sáng của màn hình với cửa sổ tập trung thành "bình thường" (100%), trong khi một đoạn khác bị mờ đến 60%.
Nếu tiêu cự thay đổi, độ sáng sẽ theo tiêu điểm:
tập trung vào (một cửa sổ) trên màn hình bên phải
tập trung vào (một cửa sổ) trên màn hình bên trái
Kịch bản
#!/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
Cách sử dụng
Kịch bản cần wmctrl
:
sudo apt-get install wmctrl
Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng highlight_focus.py
Kiểm tra- chạy nó bằng lệnh:
python3 /path/to/highlight_focus.py
Với màn hình thứ hai được kết nối , kiểm tra xem tập lệnh có hoạt động như mong đợi không.
Nếu tất cả đều hoạt động tốt, hãy thêm nó vào các ứng dụng khởi động: Dash> Ứng dụng khởi động> Thêm lệnh:
/bin/bash -c "sleep 15 && python3 /path/to/highlight_focus.py"
Ghi chú
Kịch bản cực kỳ thấp về tài nguyên. Để "tiết kiệm nhiên liệu", thiết lập màn hình; độ phân giải, kích thước nhịp, vv chỉ được đọc một lần, trong khi khởi động tập lệnh (không bao gồm trong vòng lặp). Điều đó có nghĩa là bạn phải khởi động lại tập lệnh nếu bạn kết nối / ngắt kết nối màn hình thứ hai.
Nếu bạn đã thêm nó vào các ứng dụng khởi động, điều đó có nghĩa là bạn phải đăng xuất / đăng nhập sau khi thay đổi cấu hình màn hình.
Nếu bạn thích phần trăm độ sáng khác cho màn hình mờ, hãy thay đổi giá trị trong dòng:
action2 = "xrandr", "--output", scr2, "--brightness", "0.6"
Giá trị có thể nằm giữa 0,0
(màn hình đen) và 1.0
(100%).
Giải trình
Khi khởi động tập lệnh, nó xác định:
- độ phân giải kéo dài của cả hai màn hình
- độ phân giải x của màn hình bên trái
- tên của cả hai màn hình
Sau đó, trong một vòng lặp (một lần mỗi giây), nó:
Nếu vị trí (x-) của cửa sổ lớn hơn độ phân giải x của màn hình bên trái, thì cửa sổ rõ ràng nằm ở màn hình bên phải, trừ khi nó lớn hơn kích thước kéo dài của hai màn hình (thì nó sẽ ở trên không gian làm việc trên bên phải). vì thế:
if limit < pos < span:
xác định xem cửa sổ nằm ở màn hình bên phải (trong đó limit
x-res của màn hình bên trái, pos
là vị trí x của cửa sổ và span
là x-res kết hợp của cả hai màn hình).
Nếu có sự thay đổi vị trí của cửa sổ ngoài cùng (trên màn hình bên trái hoặc màn hình bên phải), tập lệnh sẽ đặt độ sáng của cả hai màn hình bằng xrandr
lệnh:
xrandr --output <screen_name> --brightness <value>
BIÊN TẬP
Làm mờ màn hình tập trung thay vì màn hình "không tập trung" bị mờ vĩnh viễn
Như được yêu cầu trong một bình luận và trong trò chuyện, bên dưới một phiên bản của tập lệnh cung cấp một đèn flash mờ ngắn trên màn hình mới tập trung thay vào đó:
#!/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