Як виділити поточний екран (або вікно)?


11

Я використовую два налаштування екрана на роботі, і хоча це зазвичай допомагає більше, ніж шкодить, у мене є деякі проблеми з цим.

Один з них є проблемою із заднім фокусом - іноді я помиляюся набравши неправильний екран (фокус тримає курсор, але не завжди легко помітити, що курсор знаходиться на іншому екрані, коли ви робите речі в поспіху). Це дуже дратує, коли замість того, щоб вводити, я спричиняю безліч різноманітних дій (клавіші швидкого доступу в клавіші).

Чи є спосіб краще виділити активний екран або вікно (наприклад, використовуючи легко видимі рамки - навіть для максимальних вікон)?

Редагувати:

Я думаю, що гарним рішенням буде якась коротка анімація, коли вікно отримає фокус.


Який ДЕ? У gnome-shell ви можете використовувати extensions.gnome.org/extension/891/windows-blur-effects
Rmano

1
@Rmano the tag sais Unity :)
Яків Влійм

1
@JacobVlijm oops --- вірно. Залиште коментар, може бути корисним для когось
гуглінгу

Відповіді:


13

Виділіть сфокусований екран (або затемнення при зміні фокусу, див. EDIT далі)

У налаштуваннях подвійного монітора (ліворуч-праворуч) сценарій нижче встановить яскравість монітора з фокусованим вікном на «нормальну» (100%), а інший - на 60%.

Якщо фокус зміниться, яскравість піде за фокусом:

зосередити увагу (вікно) правого екрана введіть тут опис зображення

фокус на (вікно) на лівому екрані введіть тут опис зображення

Сценарій

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

Як використовувати

  1. Сценарій потребує wmctrl:

    sudo apt-get install wmctrl
  2. Скопіюйте скрипт у порожній файл, збережіть його як highlight_focus.py

  3. Тест - запустіть його командою:

    python3 /path/to/highlight_focus.py

    З підключеним другим монітором перевірте, чи працює сценарій так, як очікувалося.

  4. Якщо все працює нормально, додайте його до запуску програм: Dash> Applications for Startup> Add the command:

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

Примітки

  • Сценарій надзвичайно мало ресурсів. Для "економії палива" налаштування екрана; роздільну здатність, розмір прольоту тощо читається лише один раз під час запуску сценарію (не входить до циклу). Це означає, що вам доведеться перезапустити скрипт, якщо підключити / відключити другий монітор.

  • Якщо ви додали його до запуску програм, це означає, що вам доведеться вийти / увійти після змін у конфігурації монітора.

  • Якщо ви бажаєте інший відсоток яскравості для затемненого екрана, змініть значення у рядку:

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

Значення може бути між 0,0(чорний екран) і 1.0(100%).

Пояснення

введіть тут опис зображення

При запуску сценарію він визначає:

  • роздільна здатність обох екранів
  • роздільна здатність x лівого екрана
  • назви обох екранів

Потім у циклі (раз на секунду):

  • перевіряє положення активного вікна за допомогою команд:

    • wmctrl -lG (щоб отримати список вікон та їхні позиції)
    • xprop -root _NET_ACTIVE_WINDOW (щоб отримати ідентифікатор переднього вікна)

Якщо позиція вікна (x-) більша, ніж роздільна здатність лівого екрана, вікно, мабуть, знаходиться на правому екрані, якщо тільки воно не перевищує розмір обох екранів (тоді це було б у робочій області на право). отже:

if limit < pos < span:

визначає, чи є вікно на правому екрані (де limitє x-res у лівому екрані, posце x-позиція вікна і чи spanє комбінований x-res обох екранів).

Якщо є зміна положення переднього вікна (на лівому або правому екрані), скрипт встановлює яскравість обох екранів xrandrкомандою:

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

EDIT

Затемнення екранованого екрану замість постійного затемненого "нефокусованого" екрана

Як вимагається в коментарі та в чаті, нижче версії сценарію, яка дає короткий тьмяний спалах на щойно сфокусованому екрані:

#!/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. Я завжди люблю твої відповіді Якова. Хороша робота.
Парто

Мені довелося змінитись, limit < pos < spanщоб limit <= pos < spanвін працював. У будь-якому випадку це дійсно приємно. Однак я не впевнений, чи хочу я працювати так (затемнення іншого екрана). Я спробую змінити його, щоб зробити єдиний яскравий 'імпульс', коли зміниться активний екран.
korda

Я також додав обробник виходу, він скидає яскравість екрана до нормального значення. (тому він не залишатиметься затемненим, коли я вбив сценарій під час тестування). Не впевнений, чи варто додати його сюди - я не дуже в python, тому я не впевнений, чи правильно я це зробив (але це працює)
korda

Я відредагував це вашу відповідь і додав її.
Корда

1
@JacobVlijm Нічого собі! you rock
dhiya

1

Я також знайшов інше рішення, яке дещо відрізняється від того, що я хотів, в першу чергу, але працює також чудово.

  1. Встановити compizconfig-settings-manager compiz-plugins
  2. Виконати куб.м.
  3. У Effectsрозділі увімкніть Animationsплагін
  4. У Focus Animationредагуванні виберіть потрібну анімацію.

Працював лише хвильовий ефект ... Тож якщо вам це не сподобається, у вас буде обличчя таке ж сумне, як і моє.


Dodge також працює для мене, але лише тоді, коли піднімається вікно було сховано або частково приховано за іншим. Fade видає дивний, неприємний спалах.
Падді Ландау
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.