Bagaimana cara menyorot layar saat ini (atau jendela)?

11

Saya menggunakan dua pengaturan layar di tempat kerja dan meskipun biasanya membantu lebih daripada itu menyakitkan, saya memiliki beberapa masalah dengannya.

Salah satunya adalah masalah dengan trailing fokus - kadang-kadang saya membuat kesalahan dengan mengetik di layar yang salah (fokus adalah trailing kursor saya, tetapi tidak selalu mudah untuk menyadari bahwa kursor ada di layar lain ketika Anda melakukan hal-hal terburu-buru). Ini sangat menjengkelkan ketika daripada mengetik saya menyebabkan banyak tindakan yang berbeda (one-key-shortcut di thunderbird).

Apakah ada cara untuk menyorot layar atau jendela aktif yang lebih baik (misalnya menggunakan perbatasan yang mudah terlihat - bahkan untuk jendela yang dimaksimalkan)?

EDIT:

Saya pikir solusi yang bagus akan menjadi semacam animasi pendek ketika jendela menerima fokus.

korda
sumber
DE yang mana? Dalam gnome-shell Anda dapat menggunakan extensions.gnome.org/extension/891/windows-blur-effects
Rmano
1
@Rmano the tag sais Unity :)
Jacob Vlijm
1
@ JacacVlijm oops --- benar Akan meninggalkan komentar, mungkin dapat bermanfaat bagi seseorang yang googling ...
Rmano

Jawaban:

13

Sorot layar yang difokuskan (atau dim-flash pada perubahan fokus, lihat EDIT lebih lanjut di bawah)

Dalam pengaturan monitor ganda berdampingan (kiri-kanan), skrip di bawah ini akan mengatur kecerahan monitor dengan jendela yang difokuskan ke "normal" (100%), sementara yang lain diredupkan menjadi 60%.

Jika fokus berubah, kecerahan akan mengikuti fokus:

fokus pada (jendela) di layar kanan masukkan deskripsi gambar di sini

fokus pada (jendela) di layar kiri masukkan deskripsi gambar di sini

Naskah

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

Cara Penggunaan

  1. Kebutuhan skrip wmctrl:

    sudo apt-get install wmctrl
  2. Salin skrip ke file kosong, simpan sebagai highlight_focus.py

  3. Uji-jalankan dengan perintah:

    python3 /path/to/highlight_focus.py

    Dengan monitor kedua terhubung , uji apakah skrip berfungsi seperti yang diharapkan.

  4. Jika semuanya berfungsi dengan baik, tambahkan ke aplikasi startup: Dash> Aplikasi Startup> Tambahkan perintah:

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

Catatan

  • Skrip sumber daya sangat rendah. Untuk "menghemat bahan bakar", pengaturan layar; resolusi, ukuran span, dll. hanya dibaca sekali, saat startup skrip (tidak termasuk dalam loop). Itu menyiratkan bahwa Anda harus memulai ulang skrip jika Anda menghubungkan / memutuskan sambungan monitor kedua.

  • Jika Anda menambahkannya ke aplikasi startup, itu berarti Anda harus keluar / masuk setelah perubahan dalam konfigurasi monitor.

  • Jika Anda lebih suka persentase kecerahan lain untuk layar redup, ubah nilainya di baris:

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

Nilainya bisa antara 0,0(layar hitam) dan 1.0(100%).

Penjelasan

masukkan deskripsi gambar di sini

Saat memulai skrip, ia menentukan:

  • resolusi rentang dari kedua layar
  • resolusi x layar kiri
  • nama kedua layar

Kemudian, dalam satu lingkaran (sekali per detik), itu:

  • memeriksa posisi jendela aktif dengan perintah:

    • wmctrl -lG (untuk mendapatkan daftar windows dan posisinya)
    • xprop -root _NET_ACTIVE_WINDOW (untuk mendapatkan id dari jendela paling depan)

Jika posisi (x-) jendela lebih besar daripada resolusi x layar kiri, maka jendela tersebut jelas berada di layar kanan, kecuali jika lebih besar dari ukuran rentang kedua layar (maka itu akan berada di area kerja di hak). karena itu:

if limit < pos < span:

menentukan apakah jendela berada di layar kanan (di mana limitx-res dari layar kiri, posadalah posisi-x jendela dan spanmerupakan gabungan x-res dari kedua layar).

Jika ada perubahan posisi jendela paling depan (di layar kiri atau kanan), skrip mengatur kecerahan kedua layar dengan xrandrperintah:

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

EDIT

Dim-flash layar yang difokuskan bukan layar redup permanen yang "tidak terfokus"

Seperti yang diminta dalam komentar dan obrolan, di bawah versi skrip yang memberikan flash redup pendek pada layar yang baru difokuskan:

#!/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
Yakub Vlijm
sumber
+1. Saya selalu menyukai jawaban Anda Yakub. Kerja bagus.
Parto
Saya harus berubah limit < pos < spanuntuk limit <= pos < spanmembuatnya berfungsi. Bagaimanapun ini sangat bagus. Namun saya tidak yakin apakah saya ingin membuatnya bekerja dengan cara ini (meredupkan layar lainnya). Saya akan mencoba memodifikasinya untuk membuat 'pulsa' terang tunggal ketika layar aktif berubah.
korda
Saya juga menambahkan exit handler, mengatur ulang kecerahan layar ke nilai normal. (jadi itu tidak akan tetap redup ketika saya membunuh skrip selama pengujian). Tidak yakin apakah saya harus menambahkannya di sini - saya tidak banyak ke dalam python, jadi saya tidak yakin apakah saya melakukannya dengan benar (tetapi berfungsi)
korda
Saya sudah mengedit jawaban Anda dan menambahkannya.
korda
1
@JacobVlijm Wow! you rock
dhiya
1

Saya juga menemukan solusi lain, yang agak berbeda dari yang saya inginkan sejak awal, tetapi berfungsi dengan baik juga.

  1. Install compizconfig-settings-manager compiz-plugins
  2. Jalankan ccsm
  3. Pada Effectsbagian aktifkan Animationsplugin
  4. Di Focus Animationedit dan pilih animasi yang diinginkan.

Hanya efek gelombang yang bekerja ... Jadi jika Anda tidak menyukainya, Anda akan memiliki wajah yang sedih seperti milik saya.

korda
sumber
Dodge juga bekerja untuk saya, tetapi hanya ketika jendela menaikkan tersembunyi atau sebagian tersembunyi di belakang yang lain. Fade memberikan flash aneh dan tidak menyenangkan.
Paddy Landau