Geçerli ekranı (veya pencereyi) nasıl vurgulayabilirim?


11

İş yerinde iki ekran kurulumu kullanıyorum ve genellikle acıdan daha fazla yardımcı olurken, bazı sorunlarım var.

Bunlardan biri takip eden odaklama ile ilgili sorun - bazen yanlış ekrana yazarken hata yapıyorum (odak imlecimi takip ediyor, ancak bir acele yaptığınızda imlecin diğer ekranda olduğunu fark etmek her zaman kolay değildir). Yazmak yerine tonlarca farklı eyleme (yıldırım kuşundaki tek tuşlu kısayollar) neden olduğumda bu çok can sıkıcı.

Aktif ekranı veya pencereyi daha iyi vurgulamanın bir yolu var mı (örneğin, maksimum görünür pencereler için bile kolayca görülebilir kenarlık kullanmak)?

DÜZENLE:

Pencere odaklandığında güzel bir çözümün kısa animasyon olacağını düşünüyorum.



1
@Rmano tag Unity :)
Jacob Vlijm

1
@JacobVlijm ayy --- doğru. Yorum bırakacak, belki googling birisi için yararlı olabilir ...
Rmano

Yanıtlar:


13

Odaklanan ekranı vurgulayın (veya odak değişikliğinde karartıldığında, aşağıdaki DÜZENLEME bölümüne bakın)

Yan yana çift monitör kurulumunda (sol-sağ), aşağıdaki komut dosyası, odaklanılan pencereli monitörün parlaklığını "normal" (% 100) olarak ayarlarken, diğeri% 60'a kısılır.

Odak değişirse, parlaklık odağı izler:

sağ ekranda odaklan (pencere) resim açıklamasını buraya girin

sol ekranda odaklan (pencere) resim açıklamasını buraya girin

Senaryo

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

Nasıl kullanılır

  1. Betiğin ihtiyacı wmctrl:

    sudo apt-get install wmctrl
  2. Komut dosyasını boş bir dosyaya kopyalayın, highlight_focus.py

  3. Komut ile test edin:

    python3 /path/to/highlight_focus.py

    İkinci monitör bağlıyken , komut dosyasının beklendiği gibi çalışıp çalışmadığını test edin.

  4. Her şey yolunda giderse, başlangıç ​​uygulamalarına ekleyin: Dash> Startup Applications> Komut ekle:

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

notlar

  • Komut dosyası kaynakları son derece düşük. "Yakıt tasarrufu" yapmak için ekran kurulumu; çözünürlükler, aralık boyutu vb. komut dosyasının başlatılması sırasında yalnızca bir kez okunur (döngüye dahil değildir). Bu, ikinci monitörü bağlar / bağlantısını keserseniz komut dosyasını yeniden başlatmanız gerektiğini gösterir.

  • Başlangıç ​​uygulamalarına eklediyseniz, monitör yapılandırmasındaki değişikliklerden sonra oturumu kapatıp oturtmanız gerektiği anlamına gelir.

  • Soluk ekran için başka bir parlaklık yüzdesi tercih ederseniz, satırdaki değeri değiştirin:

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

Değer 0,0(siyah ekran) ile 1.0(% 100 ) arasında olabilir .

açıklama

resim açıklamasını buraya girin

Komut dosyasının başlangıcında şunları belirler:

  • her iki ekranın da yayılma çözünürlüğü
  • sol ekranın x çözünürlüğü
  • her iki ekranın adları

Sonra, bir döngüde (saniyede bir kez):

  • etkin pencerenin konumunu komutlarla kontrol eder:

    • wmctrl -lG (pencerelerin listesini ve konumlarını almak için)
    • xprop -root _NET_ACTIVE_WINDOW (en öndeki pencerenin kimliğini almak için)

Pencerenin (x-) konumu sol ekranın x-çözünürlüğünden daha büyükse, iki ekranın yayılma boyutundan daha büyük olmadığı sürece , pencere görünüşe göre sağ ekrandadır (o zaman çalışma alanında olacaktır. doğru). dolayısıyla:

if limit < pos < span:

pencerenin sağ ekranda olup olmadığını belirler ( limitsol ekranın x-res'i pos, pencerenin x-konumu ve spanher iki ekranın birleşik x-res'i).

En öndeki pencerenin konumunda (sol ekranda veya sağ ekranda) bir değişiklik varsa , komut dosyası her iki ekranın parlaklığını şu xrandrkomutla ayarlar :

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

DÜZENLE

Kalıcı soluk "odaklanmamış" ekran yerine odaklanmış ekranı kısın flaş

Bir yorumda ve sohbette istendiği gibi, komut dosyasının yeni odaklanmış ekranda kısa bir loş yanıp sönen sürümünün altında:

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

+1. Cevaplarını her zaman seviyorum Jacob. İyi iş.
Parto

Ben değiştirmek zorunda limit < pos < spaniçin limit <= pos < spanÇalıştırmak için. Her neyse, bu gerçekten güzel. Ancak bu şekilde çalışmasını isteyip istemediğimden emin değilim (diğer ekranı karartmak). Aktif ekran değiştiğinde tek bir parlak 'darbe' yapmak için değiştirmeye çalışacağım.
korda

Ayrıca çıkış işleyicisi ekledim, ekran parlaklığını normal değere sıfırlar. (test sırasında senaryoyu öldürdüğümde soluk kalmayacak). Buraya eklemem gerekip gerekmediğinden emin değilim
Python'a

Cevabınızı düzenledim ve ekledim.
korda

1
@JacobVlijm Vay canına! you rock
dhiya

1

Ayrıca, ilk başta istediğimden biraz farklı olan başka bir çözüm buldum, ancak çok iyi çalışıyor.

  1. Yüklemek compizconfig-settings-manager compiz-plugins
  2. Ccsm'yi çalıştır
  3. In Effectsbölümünde etkinleştirmek Animationseklentisi
  4. Gelen Focus Animationdüzenlemek basıp istenilen animasyon.

Sadece dalga etkisi işe yaradı ... Eğer hoşunuza gitmezse, benimki kadar üzgün olacaksınız.


Dodge de benim için çalışıyor, ancak sadece yükseltme penceresi gizlendiğinde veya kısmen diğerinin arkasında gizlendiğinde. Solmaya garip, hoş olmayan bir flaş verir.
Paddy Landau
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.