Jak podświetlić bieżący ekran (lub okno)?

11

Używam dwóch ustawień ekranu w pracy i chociaż zwykle pomaga to bardziej niż boli, mam z tym pewne problemy.

Jednym z nich jest problem z końcowym ustawianiem ostrości - czasami popełniam błąd, pisząc na niewłaściwym ekranie (fokus przesuwa się po moim kursorze, ale nie zawsze łatwo zauważyć, że kursor znajduje się na innym ekranie, gdy robisz coś w pośpiechu). Jest to bardzo denerwujące, gdy zamiast pisania powoduję mnóstwo różnych działań (skróty jednym klawiszem w thunderbirdzie).

Czy istnieje sposób na lepsze podkreślenie aktywnego ekranu lub okna (na przykład za pomocą dobrze widocznej ramki - nawet w przypadku zmaksymalizowanych okien)?

EDYTOWAĆ:

Myślę, że fajnym rozwiązaniem będzie krótka animacja, gdy okno zostanie zogniskowane.

korda
źródło
Który DE? W gnome-shell możesz użyć extensions.gnome.org/extension/891/windows-blur-effects
Rmano
1
@Rmano tag sais Unity :)
Jacob Vlijm
1
@JacobVlijm oops --- true. Zostaw komentarz, może może być przydatny dla kogoś, kto
googluje

Odpowiedzi:

13

Podświetl zogniskowany ekran (lub przyciemnij przy zmianie ostrości, patrz EDYCJA dalej poniżej)

W konfiguracji dwóch monitorów side-by-side (lewy-prawy) poniższy skrypt ustawi jasność monitora z zogniskowanym oknem na „normalny” (100%), podczas gdy drugi jest przyciemniony do 60%.

Jeśli ostrość zmieni się, jasność podąży za nią:

skup się na (oknie) na prawym ekranie wprowadź opis zdjęcia tutaj

skup się na (oknie) na lewym ekranie wprowadź opis zdjęcia tutaj

Scenariusz

#!/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

Jak używać

  1. Skrypt potrzebuje wmctrl:

    sudo apt-get install wmctrl
  2. Skopiuj skrypt do pustego pliku i zapisz go jako highlight_focus.py

  3. Przetestuj - uruchom komendę:

    python3 /path/to/highlight_focus.py

    Po podłączeniu drugiego monitora sprawdź , czy skrypt działa zgodnie z oczekiwaniami.

  4. Jeśli wszystko działa poprawnie, dodaj go do aplikacji startowych: Dash> Aplikacje startowe> Dodaj polecenie:

    /bin/bash -c "sleep 15 && python3 /path/to/highlight_focus.py"

Notatki

  • Skrypt ma bardzo mało zasobów. Aby „oszczędzać paliwo”, ustawienia ekranu; rozdzielczości, rozpiętość zakresu itp. są odczytywane tylko raz, podczas uruchamiania skryptu (nie wchodzi w skład pętli). Oznacza to, że musisz ponownie uruchomić skrypt, jeśli podłączysz / odłączysz drugi monitor.

  • Jeśli dodałeś go do aplikacji startowych, oznacza to, że musisz się wylogować / zalogować po zmianach w konfiguracji monitora.

  • Jeśli wolisz inny procent jasności dla przyciemnionego ekranu, zmień wartość w wierszu:

    action2 = "xrandr", "--output", scr2, "--brightness", "0.6"

Wartość może zawierać się pomiędzy 0,0(czarny ekran) a 1.0(100%).

Wyjaśnienie

wprowadź opis zdjęcia tutaj

Po uruchomieniu skryptu określa:

  • rozdzielczość obejmująca oba ekrany
  • rozdzielczość x lewego ekranu
  • nazwy obu ekranów

Następnie w pętli (raz na sekundę):

  • sprawdza pozycję aktywnego okna za pomocą poleceń:

    • wmctrl -lG (aby uzyskać listę okien i ich pozycji)
    • xprop -root _NET_ACTIVE_WINDOW (aby uzyskać identyfikator okna z przodu)

Jeśli pozycja okna (x-) jest większa niż rozdzielczość x lewego ekranu, okno najwyraźniej znajduje się na prawym ekranie, chyba że jest ono większe niż rozpiętość dwóch ekranów (wtedy byłby w obszarze roboczym na prawo). w związku z tym:

if limit < pos < span:

określa, czy okno znajduje się na prawym ekranie (gdzie limitjest x-res lewego ekranu, posjest pozycją x okna i spanjest połączoną x-res obu ekranów).

Jeśli nastąpi zmiana położenia okna z przodu (na lewym lub prawym ekranie), skrypt ustawia jasność obu ekranów za pomocą xrandrpolecenia:

xrandr --output <screen_name> --brightness <value>

EDYTOWAĆ

Przyciemnij zogniskowany ekran zamiast stałego przyciemnionego „nieostrego” ekranu

Zgodnie z prośbą w komentarzu i na czacie, poniżej wersji skryptu, która zamiast tego krótko przyciemnia błysk na nowo ustawionym ekranie:

#!/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
źródło
+1. Zawsze uwielbiam twoje odpowiedzi, Jakubie. Dobra robota.
Parto
Musiałem się zmienić, limit < pos < spanżeby limit <= pos < spanto działało. W każdym razie jest to naprawdę miłe. Nie jestem jednak pewien, czy chcę, aby działał w ten sposób (ściemnianie drugiego ekranu). Spróbuję go zmodyfikować, aby tworzył pojedynczy jasny „puls”, gdy zmienia się aktywny ekran.
korda
Dodałem również moduł obsługi wyjścia, resetuje jasność ekranu do normalnej wartości. (więc nie pozostanie przyciemniony, kiedy zabiję skrypt podczas testowania). Nie jestem pewien, czy powinienem go tutaj dodać - nie
przepadam za pythonem
Zredagowałem twoją odpowiedź i dodałem ją.
korda
1
@JacobVlijm Wow! rock
dhiya
1

Znalazłem też inne rozwiązanie, które nieco różni się od tego, czego chciałem, ale działa również dobrze.

  1. zainstalować compizconfig-settings-manager compiz-plugins
  2. Uruchom ccsm
  3. W Effectssekcji włącz Animationswtyczkę
  4. W Focus Animationedycji i wybierz żądaną animację.

Działał tylko efekt fali ... Więc jeśli ci się nie spodoba, będziesz miał twarz tak smutną jak moja.

korda
źródło
Dodge również działa dla mnie, ale tylko wtedy, gdy okno do podnoszenia było ukryte lub częściowo ukryte za drugim. Fade daje dziwny, nieprzyjemny błysk.
Paddy Landau