Mettez en surbrillance l'écran focalisé (ou un flash faible sur le changement de mise au point, voir MODIFIER plus loin ci-dessous)
Dans une configuration double moniteur côte à côte (gauche-droite), le script ci-dessous règle la luminosité du moniteur avec la fenêtre focalisée sur "normal" (100%), tandis que l'autre est atténuée à 60%.
Si la mise au point change, la luminosité suivra la mise au point:
se concentrer sur (une fenêtre) sur l'écran de droite
se concentrer sur (une fenêtre) sur l'écran de gauche
Le scénario
#!/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
Comment utiliser
Le script a besoin de wmctrl
:
sudo apt-get install wmctrl
Copiez le script dans un fichier vide, enregistrez-le sous highlight_focus.py
Testez-le par la commande:
python3 /path/to/highlight_focus.py
Avec le deuxième moniteur connecté , testez si le script fonctionne comme prévu.
Si tout fonctionne bien, ajoutez-le aux applications de démarrage: Dash> Startup Applications> Add the command:
/bin/bash -c "sleep 15 && python3 /path/to/highlight_focus.py"
Remarques
Le script est extrêmement faible en ressources. Pour "économiser du carburant", la configuration de l'écran; les résolutions, la taille de la plage, etc. ne sont lues qu'une seule fois, lors du démarrage du script (non incluses dans la boucle). Cela implique que vous devez redémarrer le script si vous connectez / déconnectez le deuxième moniteur.
Si vous l'avez ajouté aux applications de démarrage, cela signifie que vous devez vous déconnecter / vous connecter après les modifications de la configuration du moniteur.
Si vous préférez un autre pourcentage de luminosité pour l'écran grisé, modifiez la valeur dans la ligne:
action2 = "xrandr", "--output", scr2, "--brightness", "0.6"
La valeur peut être comprise entre 0,0
(écran noir) et 1.0
(100%).
Explication
Au démarrage du script, il détermine:
- la résolution s'étendant des deux écrans
- la résolution x de l'écran gauche
- les noms des deux écrans
Ensuite, en boucle (une fois par seconde), il:
Si la position (x-) de la fenêtre est supérieure à la résolution x de l'écran de gauche, la fenêtre est apparemment sur l'écran de droite, à moins qu'elle ne soit supérieure à la taille s'étendant sur les deux écrans (alors ce serait sur l'espace de travail sur la droite). par conséquent:
if limit < pos < span:
détermine si la fenêtre est sur l'écran de droite (où limit
est la résolution x de l'écran gauche, pos
la position x de la fenêtre et span
la résolution x combinée des deux écrans).
S'il y a un changement dans la position de la fenêtre la plus en avant (sur l'écran gauche ou l'écran droit), le script définit la luminosité des deux écrans avec la xrandr
commande:
xrandr --output <screen_name> --brightness <value>
ÉDITER
Dim-flash l'écran focalisé au lieu d'un écran permanent "non focalisé" estompé
Comme demandé dans un commentaire et dans le chat, ci-dessous une version du script qui donne à la place un bref flash faible sur l'écran nouvellement focalisé:
#!/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