Como destacar a tela atual (ou janela)?

11

Estou usando duas configurações de tela no trabalho e, embora geralmente ajude mais do que dói, tenho alguns problemas.

Um deles é o problema de rastrear o foco - às vezes eu erro ao digitar na tela errada (o foco está arrastando meu cursor, mas nem sempre é fácil perceber que o cursor está em outra tela quando você faz as coisas com pressa). Isso é muito chato quando, em vez de digitar, eu faço várias ações diferentes (atalhos de uma tecla no thunderbird).

Existe uma maneira de realçar melhor a tela ou janela ativa (por exemplo, usando borda facilmente visível - mesmo para janelas maximizadas)?

EDITAR:

Eu acho que uma boa solução seria algum tipo de animação curta quando a janela receber o foco.

korda
fonte
Qual DE? No gnome-shell, você pode usar extensions.gnome.org/extension/891/windows-blur-effects
Rmano
1
@Rmano a tag sais Unidade :)
Jacob Vlijm
1
@JacobVlijm oops --- true. Vai deixar o comentário, talvez pode ser útil para alguém googling ...
Rmano

Respostas:

13

Destaque a tela focada (ou ofuscante na mudança de foco, veja EDITAR mais abaixo)

Em uma configuração de monitor duplo lado a lado (esquerda-direita), o script abaixo definirá o brilho do monitor com a janela focada como "normal" (100%), enquanto o outro é esmaecido para 60%.

Se o foco mudar, o brilho seguirá o foco:

focalize (uma janela) na tela direita insira a descrição da imagem aqui

focalize (uma janela) na tela esquerda insira a descrição da imagem aqui

O script

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

Como usar

  1. O script precisa wmctrl:

    sudo apt-get install wmctrl
  2. Copie o script em um arquivo vazio, salve-o como highlight_focus.py

  3. Teste-execute pelo comando:

    python3 /path/to/highlight_focus.py

    Com o segundo monitor conectado , teste se o script funciona conforme o esperado.

  4. Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash> Startup Applications> Add the command:

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

Notas

  • O script é extremamente baixo em recursos. Para "economizar combustível", a configuração da tela; resoluções, tamanho do intervalo etc. é lido apenas uma vez, durante a inicialização do script (não incluído no loop). Isso implica que você precisará reiniciar o script se conectar / desconectar o segundo monitor.

  • Se você o adicionou aos aplicativos de inicialização, significa que você deve efetuar logout / logon após alterações na configuração do monitor.

  • Se você preferir outra porcentagem de brilho para a tela esmaecida, altere o valor na linha:

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

O valor pode estar entre 0,0(tela preta) e 1.0(100%).

Explicação

insira a descrição da imagem aqui

Na inicialização do script, ele determina:

  • a resolução de amplitude de ambas as telas
  • a resolução x da tela esquerda
  • os nomes das duas telas

Então, em um loop (uma vez por segundo), ele:

  • verifica a posição da janela ativa com os comandos:

    • wmctrl -lG (para obter a lista de janelas e suas posições)
    • xprop -root _NET_ACTIVE_WINDOW (para obter o ID da janela mais à frente)

Se a posição (x-) da janela for maior que a resolução x da tela esquerda, a janela aparentemente estará na tela direita, a menos que seja maior que o tamanho de abrangência das duas telas (estaria na área de trabalho em o certo). Portanto:

if limit < pos < span:

determina se a janela está na tela direita (onde limitx-res da tela esquerda, posé a posição x da janela e spanos x-res combinados das duas telas).

Se houver uma alteração na posição da janela mais à frente (na tela esquerda ou tela direita), o script definirá o brilho das duas telas com o xrandrcomando:

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

EDITAR

Escureça a tela focalizada em vez de uma tela "desfocada" permanente esmaecida

Conforme solicitado em um comentário e no bate-papo, abaixo de uma versão do script que fornece um breve flash na tela recém-focada:

#!/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
fonte
+1. Eu sempre amo suas respostas Jacob. Bom trabalho.
Parto
Eu tive que mudar limit < pos < spanpara limit <= pos < spanfazê-lo funcionar. Enfim, isso é muito bom. No entanto, não tenho certeza se quero fazê-lo funcionar dessa maneira (escurecendo a outra tela). Vou tentar modificá-lo para criar um único pulso brilhante quando a tela ativa mudar.
korda
Também adicionei o manipulador de saída, ele redefine o brilho da tela para o valor normal. (para não ficar esmaecido quando matei o script durante o teste). Não tenho certeza se eu deveria adicioná-lo aqui - eu não sou muito em python, então eu não tenho certeza se eu fiz isso direito (mas funciona)
korda
Editei sua resposta e a adicionei.
korda
1
@JacobVlijm Wow! você
balança
1

Eu também encontrei outra solução, que é um pouco diferente do que eu queria em primeiro lugar, mas também funciona bem.

  1. Instalar compizconfig-settings-manager compiz-plugins
  2. Executar ccsm
  3. Na Effectsseção, habilite o Animationsplug-in
  4. Em Focus Animationeditar e selecionar a animação desejada.

Apenas efeito de onda funcionou ... Então, se você não gostar, terá um rosto tão triste quanto o meu.

korda
fonte
Dodge também funciona para mim, mas apenas quando a janela de elevação estava escondida ou parcialmente escondida atrás de outra. O desbotamento dá um flash estranho e desagradável.
Paddy Landau