Comment mettre en surbrillance l'écran (ou la fenêtre) actuel?

11

J'utilise la configuration à deux écrans au travail et même si cela aide généralement plus que ça fait mal, j'ai quelques problèmes avec cela.

L'un d'eux est un problème avec le focus arrière - parfois je me trompe en tapant sur le mauvais écran (le focus suit mon curseur, mais il n'est pas toujours facile de remarquer que le curseur est sur un autre écran lorsque vous faites des choses à la hâte). C'est très ennuyeux quand au lieu de taper je cause des tonnes d'actions différentes (raccourcis à une touche dans Thunderbird).

Existe-t-il un moyen de mieux mettre en évidence l'écran ou la fenêtre active (par exemple en utilisant une bordure facilement visible - même pour des fenêtres maximisées)?

ÉDITER:

Je pense qu'une bonne solution serait une sorte d'animation courte lorsque la fenêtre reçoit le focus.

korda
la source
Quel DE? Dans gnome-shell, vous pouvez utiliser extensions.gnome.org/extension/891/windows-blur-effects
Rmano
1
@Rmano le tag sais Unity :)
Jacob Vlijm
1
@JacobVlijm oups --- vrai.
Laissera

Réponses:

13

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 entrez la description de l'image ici

se concentrer sur (une fenêtre) sur l'écran de gauche entrez la description de l'image ici

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

  1. Le script a besoin de wmctrl:

    sudo apt-get install wmctrl
  2. Copiez le script dans un fichier vide, enregistrez-le sous highlight_focus.py

  3. 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.

  4. 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

entrez la description de l'image ici

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:

  • vérifie la position de la fenêtre active avec les commandes:

    • wmctrl -lG (pour obtenir la liste des fenêtres et leurs positions)
    • xprop -root _NET_ACTIVE_WINDOW (pour obtenir l'identifiant de la fenêtre la plus en avant)

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ù limitest la résolution x de l'écran gauche, posla position x de la fenêtre et spanla 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 xrandrcommande:

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
Jacob Vlijm
la source
+1. J'aime toujours tes réponses Jacob. Bon travail.
Parto
J'ai dû changer limit < pos < spanpour limit <= pos < spanle faire fonctionner. Quoi qu'il en soit, c'est vraiment sympa. Cependant, je ne suis pas sûr de vouloir le faire fonctionner de cette façon (en atténuant l'autre écran). Je vais essayer de le modifier pour faire une seule "impulsion" lumineuse lorsque l'écran actif change.
korda
J'ai également ajouté un gestionnaire de sortie, il réinitialise la luminosité de l'écran à sa valeur normale. (donc il ne restera pas grisé quand j'ai tué le script pendant le test). Je ne sais pas si je devrais l'ajouter ici - je ne suis pas beaucoup dans le python, donc je ne suis pas sûr si je l'ai fait correctement (mais cela fonctionne)
korda
J'ai édité votre réponse et l'ai ajoutée.
korda
1
@JacobVlijm Wow! vous
basculez
1

J'ai également trouvé une autre solution, qui est un peu différente de ce que je voulais en premier lieu, mais qui fonctionne aussi très bien.

  1. Installer compizconfig-settings-manager compiz-plugins
  2. Exécutez ccsm
  3. Dans la Effectssection activer le Animationsplugin
  4. Dans l' Focus Animationédition et sélectionnez l'animation souhaitée.

Seul l'effet de vague a fonctionné ... Donc, si vous ne l'aimez pas, vous aurez un visage aussi triste que le mien.

korda
la source
Dodge fonctionne également pour moi, mais uniquement lorsque la fenêtre qui se lève était cachée ou partiellement cachée derrière une autre. Le fondu donne un flash étrange et désagréable.
Paddy Landau, le