Odaklanan ekranı vurgulayın (veya odak değişikliğinde karartıldığında, aşağıdaki DÜZENLEME bölümüne bakın)
Yan yana çift monitör kurulumunda (sol-sağ), aşağıdaki komut dosyası, odaklanılan pencereli monitörün parlaklığını "normal" (% 100) olarak ayarlarken, diğeri% 60'a kısılır.
Odak değişirse, parlaklık odağı izler:
sağ ekranda odaklan (pencere)
sol ekranda odaklan (pencere)
Senaryo
#!/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
Nasıl kullanılır
Betiğin ihtiyacı wmctrl
:
sudo apt-get install wmctrl
Komut dosyasını boş bir dosyaya kopyalayın, highlight_focus.py
Komut ile test edin:
python3 /path/to/highlight_focus.py
İkinci monitör bağlıyken , komut dosyasının beklendiği gibi çalışıp çalışmadığını test edin.
Her şey yolunda giderse, başlangıç uygulamalarına ekleyin: Dash> Startup Applications> Komut ekle:
/bin/bash -c "sleep 15 && python3 /path/to/highlight_focus.py"
notlar
Komut dosyası kaynakları son derece düşük. "Yakıt tasarrufu" yapmak için ekran kurulumu; çözünürlükler, aralık boyutu vb. komut dosyasının başlatılması sırasında yalnızca bir kez okunur (döngüye dahil değildir). Bu, ikinci monitörü bağlar / bağlantısını keserseniz komut dosyasını yeniden başlatmanız gerektiğini gösterir.
Başlangıç uygulamalarına eklediyseniz, monitör yapılandırmasındaki değişikliklerden sonra oturumu kapatıp oturtmanız gerektiği anlamına gelir.
Soluk ekran için başka bir parlaklık yüzdesi tercih ederseniz, satırdaki değeri değiştirin:
action2 = "xrandr", "--output", scr2, "--brightness", "0.6"
Değer 0,0
(siyah ekran) ile 1.0
(% 100 ) arasında olabilir .
açıklama
Komut dosyasının başlangıcında şunları belirler:
- her iki ekranın da yayılma çözünürlüğü
- sol ekranın x çözünürlüğü
- her iki ekranın adları
Sonra, bir döngüde (saniyede bir kez):
Pencerenin (x-) konumu sol ekranın x-çözünürlüğünden daha büyükse, iki ekranın yayılma boyutundan daha büyük olmadığı sürece , pencere görünüşe göre sağ ekrandadır (o zaman çalışma alanında olacaktır. doğru). dolayısıyla:
if limit < pos < span:
pencerenin sağ ekranda olup olmadığını belirler ( limit
sol ekranın x-res'i pos
, pencerenin x-konumu ve span
her iki ekranın birleşik x-res'i).
En öndeki pencerenin konumunda (sol ekranda veya sağ ekranda) bir değişiklik varsa , komut dosyası her iki ekranın parlaklığını şu xrandr
komutla ayarlar :
xrandr --output <screen_name> --brightness <value>
DÜZENLE
Kalıcı soluk "odaklanmamış" ekran yerine odaklanmış ekranı kısın flaş
Bir yorumda ve sohbette istendiği gibi, komut dosyasının yeni odaklanmış ekranda kısa bir loş yanıp sönen sürümünün altında:
#!/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