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 com ela.

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

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

EDITAR:

Acho que uma boa solução seria algum tipo de animação curta quando a janela recebe foco.

    
por korda 24.08.2015 / 12:06

2 respostas

13

Realce a tela focalizada (ou o brilho fraco na mudança de foco, consulte EDITAR 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 para "normal" (100%), enquanto outro é reduzido a 60%.

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

concentre-se em (uma janela) na tela da direita

concentre-seem(umajanela)natelaesquerda

Oscript

#!/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 de wmctrl :

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

  3. Teste - execute-o pelo comando:

    python3 /path/to/highlight_focus.py
    

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

  4. Se tudo funcionar bem, adicione-o aos aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicione o comando:

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

Notas

  • O script possui recursos extremamente baixos. Para "economizar combustível", a configuração da tela; resoluções, tamanho de span etc. são lidos apenas uma vez, durante a inicialização do script (não incluído no loop). Isso implica que você precisa reiniciar o script se conectar / desconectar o segundo monitor.

  • Se você adicionou aos aplicativos de inicialização, isso significa que você precisa fazer logout / in após as 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

Nainicializaçãodoscript,eledetermina:

  • aresoluçãodeabrangênciadeambasastelas
  • aresoluçãoxdatelaesquerda
  • osnomesdasduastelas

Então,emumloop(umavezporsegundo):

  • verificaaposiçãodajanelaativacomoscomandos:

    • wmctrl-lG(paraobteralistadejanelasesuasposições)
    • xprop-root_NET_ACTIVE_WINDOW(paraobteroiddaprimeirajanela)

Seaposiçãodajanela(x-)formaiorquearesoluçãoxdateladaesquerda,ajanelaaparentementeestaránateladadireita,amenosquesejamaiorqueotamanhodosdoistelas(emseguida,serianoespaçodetrabalhoàdireita).portanto:

iflimit<pos<span:

determinaseajanelaestánateladadireita(ondelimitéx-resdatelaesquerda,poséaposiçãoxdajanelaespansãoasx-rescombinadasdasduastelas).

Sehouverumamudançanaposiçãodajanelafrontal(natelaesquerdaoudireita),oscriptdefineobrilhodeambasastelascomocomandoxrandr:

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

EDITAR

Diminuiobrilhodatelafocalizadaemvezdeumatela"sem foco" escurecida permanente

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-focalizada:

#!/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
    
por Jacob Vlijm 24.08.2015 / 22:59
1

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

  1. Instale compizconfig-settings-manager compiz-plugins
  2. Executar ccsm
  3. Em Effects section enable Animations plugin
  4. Em Focus Animation edit e selecione 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.

    
por korda 27.08.2015 / 14:37