Як увімкнути режим очікування монітора за допомогою xset у налаштуваннях кількох моніторів?


10

Хоча два або більше монітора працюють разом, чи є спосіб перевести один з них у режим очікування / призупинення, видавши команду типу xset dpms force suspend:? або встановлений час для цієї мети, наприклад: xset dpms 100 0 0який працює на цих моніторах окремо?

У мене два монітора, які працюють один за одним, eDP1 (Мій ноутбук) та VGA1 (Зовнішній монітор).

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

Мені не цікаво використовувати, xrandor --off --output eDP1тому що це не досить швидко, щоб працювати.

Я хочу, щоб мій монітор був готовий до роботи простим рухом миші, щоб я міг швидко перемикатися між ними.

  • Запуск: Ubuntu 18.04
  • Менеджер вікон: OpenBox

Це з енергетичних причин чи візуальне рішення зробить?
Яків Влійм

Запитання @Ravexina, як далеко йде підсвічування eDP1? Це повністю вимикає яскравість? Якщо так, чи можете ви перевірити дві команди, відповіді на відповідь askubuntu.com/a/814043/295286 ? Заздалегідь дякую за відповідь
Сергій Колодяжний

1
@Ravexina зроблено, здається, працює бездоганно, але триматиме його протягом дня, опублікує його пізно сьогодні ввечері. Він буде вести запис про активність на одному екрані, але ніколи не тьмяний / вимикається екран, якщо миша зараз є, правда?
Яків Влійм

1
Гаразд, добре, я, мабуть, спробую реалізувати відстеження Window у вихідні. На жаль, у мене зараз не так багато часу, щоб займатися цими речами.
Сергій Колодяжний

1
@Ravexina, спасибі Я, швидше за все, незабаром опублікую ще одну (vala) версію, викликану або активним вікном, або (якщо немає дійсного вікна) дією миші. Також побачимо, чи зможемо ми щось зробити з підсвічуванням, що, ймовірно, також заощадить трохи енергії. Час під час бонусу просто занадто короткий, але питання достатньо інтерстирує, щоб грати трохи далі. Далі буде. Ще раз дякую
Яків Влійм

Відповіді:


5

Керування окремими моніторами неможливо за допомогою xset (а фактично X11)

Як видно з назви, це не представляється можливим з причин , як xset будуються і з - за функції X11 він використовує. Якщо ми подивимось на вихідний код, xsetдзвінки DPMSForceLevel(dpy,DPMSModeSuspend)( рядок 557 ) та змінна відображення dpyпоходить від XOpenDisplay()функції ( рядок 203 ), і це за визначенням :

Сервер разом із його екранами та пристроями введення називається дисплеєм.

Іншими словами, xsetзастосовує налаштування глобально до всього екрана, а не до окремих екранів. Це потрібно було б змінитиxset вихідний код для того, щоб він працював. Самі розширення DPMS, схоже, викликають лише весь дисплей, а не окремі екрани, тому неможливо навіть записати спеціальний код з бібліотеки X11.

Ручне управління цим параметром через /sysпідсистему також не працює

$ sudo bash -c 'echo Off > /sys/class/drm/card0-VGA-1/dpms'
[sudo] password for admin: 
bash: /sys/class/drm/card0-VGA-1/dpms: Permission denied

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

Альтернативні шляхи вирішення

Найкраща альтернатива (і фактично фізично працююче рішення) xrandr- це може бути використане для контролю окремих «результатів». Зокрема,

xrandr --output VGA-1 -off

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

  • несприйнятливий до ключових і мишачих подій
  • незалежно контролює відхід на відміну від xset

xrandr --output VGA-1 --brightness 0.1Буде розфарбувати екран таким чином , що він з'являється геть, навіть якщо --brightnessце програмне рішення, так що дисплей не власне недоступний на апаратному рівні, і він вимкнений на апаратному рівні. Однак він виконує роботу з вимивання екрану, а також стійкий до подій клавіш / миші.

Я переглянув вихідний код заставки Mate і Budgie, які є обома вилками заставки GNOME, однак в будь-якому випадку вони здаються програмним рішенням, оскільки DPMS у вихідному коді не згадуються.


Мені подобаються альтернативи ... +1
Fabby

1
@Fabby Спасибі :) Поки що це найкращі варіанти
Сергій Колодяжний,

Я думаю, що менеджери вікон роблять певні хитрощі і можуть створити гачки. Існує сайт обміну стеками під назвою "Дизайн програмного забезпечення", і це може бути непоганим місцем для думки про те, що коли в головному вікні (наприклад, веб-браузер, але не Конкі чи верхній панелі, на якому відображається час) не змінюється піксель за 10 хвилин, весь монітор (лише один) починає тьмяніти протягом 30 секунд, поки не стане повністю чорним. Потім навігація миші над цим монітором (я зазвичай використовую 3 монітори) відновлює яскравість протягом періоду від 1 до 5 секунд.
WinEunuuchs2Unix

@ WinEunuuchs2Unix У мене є ідея, і є кілька речей, на які слід дивитися, але це складно, і так, залежить від питання, про який йдеться у менеджері вікон. Проблема - DPMS. З DPMS це або все тьмяне, або нічого. Найкраще, що ми можемо зробити, це xrandr --offзараз
Сергій Колодяжний,

Мої знання DPMS обмежені. Я думаю, що це економія електроенергії для очікування / сну. Також є HDMI-CEC, який може дати ті самі результати, але це ще більше чорна діра для мене. Я не знаю, чи xrandr -offнавіть вимикає монітор. Це може бути те саме, що brightnessвстановлено в нуль? Інша проблема - у мене програма, яка працює 24/7, яка встановлює яскравість і гамму індивідуально для 3 моніторів, які навіть Windows не може зробити. Не впевнений, чи це роблять нічне світло, червоний зсув або флюс. У будь-якому разі ці програми можуть зіпсуватися xrandr. Вибачте за викрадення вашої відповіді спекуляцією :)
WinEunuuchs2Unix

4

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

З вашої причини, коли ви хочете переглянути відео протягом 90 хвилин на зовнішньому моніторі та мати екран порожнього ноутбука, я змінив опцію закриття кришки на "Не робити нічого":

  • Перевага: Коли я закриваю кришку ноутбука, усі вікна ноутбука переходять нижче повного екрану.
  • Перевага: Коли я відкриваю, кришки ноутбука відновлюються і більше не перебувають під повноекранним відео.
  • Недолік: Я повинен зробити відео не повним екраном, щоб отримати доступ до меню верхнього рядка, щоб вибрати пункт "Призупинити" з меню передач.
  • Перевага: Коли система призупинена меню на зовнішньому моніторі, відкриття кришки ноутбука все одно відновить систему.

Я не використовую DPMS для зовнішніх моніторів, але ви можете перевірити свої настройки за допомогою xset qкоманди:

$ xset q
Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000002
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    on     02: Scroll Lock: off
    03: Compose:     off    04: Kana:        off    05: Sleep:       off
    06: Suspend:     off    07: Mute:        off    08: Misc:        off
    09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
    12: Group 2:     off    13: Mouse Keys:  off
  auto repeat delay:  500    repeat rate:  33
  auto repeating keys:  00ffffffdffffbbf
                        fadfffefffedffff
                        9fffffffffffffff
                        fff7ffffffffffff
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  5/1    threshold:  5
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  0    cycle:  0
Colors:
  default colormap:  0xb3    BlackPixel:  0x0    WhitePixel:  0xffffff
Font Path:
  /usr/share/fonts/X11/misc,/usr/share/fonts/X11/Type1,built-ins
DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled

Помітьте ці рядки:

Screen Saver:
  prefer blanking:  yes
  • Ви, швидше за все, захочете prefer blanking: no

Також зверніть увагу на ці рядки:

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • Ви, ймовірно, захочете DPMS is enabledвстановити монітор, Standbyколи бажаєте.

Сподіваємось, інші користувачі використали ці параметри та опублікували детальну відповідь для вас.


4

Як щодо просто закрити ноутбук?

Чому?

Ці два монітори є однією областю дисплея, тому вимкнення одного сигналу створить ряд питань, таких як перемальовування екрана, програми, що переміщуються на головний монітор, ...

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

Просто переконайтеся, що ви встановили ці параметри живлення за допомогою gsettings set:

org.gnome.settings-daemon.plugins.power lid-close-suspend-with-external-monitor false
org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'

Власне, це приємне рішення. Апаратне забезпечення, плюс це можна прописати. Однак ОП використовує Openbox, що дозволяє припустити, що гетті можуть не набути чинності. Для гарної альтернативи ви можете включити unix.stackexchange.com/a/52645/85039
Сергій Колодяжний

4

Тимчасовий коментар

  1. На прохання ОП я зробив сценарій нижче, щоб вимкнути екран за допомогою xrandr. На більш тривалому тесті це вийшло досить погано. Не стільки відключення не вдалося, але при повторному включенні екрана макет екрана був повністю зіпсований. Я б радий опублікувати його, щоб побачити, чи працює він у вашому випадку, але моя рада не використовувати його.
    У сценарії я повернувся до встановлення яскравості замість нуля.
  2. Була певна дискусія про те, як ми повинні визначити активний монітор за місцем розташування миші або за місцем розташування активного вікна . Останній не працюватиме, якщо не існує вікна. У нас може взагалі не бути вікна (крім самого робочого столу), і в такому випадку вибір вікна для затемнення буде випадковим (або зламаним, якщо ми не включимо виняток). Єдиний варіант, який має сенс - і він би працював передбачувано у всіх випадках - це визначити активний екран за положенням миші. Крім того, саме так менеджер вікон вирішує, де мають з’являтися нові вікна.

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


Автоматично тьмяний неактивний екран

За словами моїх співвітчизників, вимкнення екранів із кліпу окремо - це проблема в кращому випадку, і я також не знайшов варіанту.

Що я знайшов, це спосіб автоматичного затемнення всіх екранів, крім того, де знаходиться миша, через x час.

Ось і ми

#!/usr/bin/env python3
import subprocess
import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk
import time
import sys


def get_idle():
    try:
        return int(subprocess.check_output("xprintidle")) / 1000
    except subprocess.CalledProcessError:
        return 0


def get_monitors():
    screen = Gdk.Screen.get_default()
    n_mons = display.get_n_monitors()
    mons = [screen.get_monitor_plug_name(i) for i in range(n_mons)]
    return mons


def set_mon_dimmed(mon, dim):
    print(mon, dim)
    val = "0.0" if dim else "1"
    try:
        subprocess.Popen(["xrandr", "--output", mon, "--brightness", val])
    except subprocess.CalledProcessError:
        print("oops")


def mousepos():
    # find out mouse location
    return Gdk.get_default_root_window().get_pointer()[1:3]


def get_currmonitor_atpos(x, y, display=None):
    """
    fetch the current monitor (obj) at position. display is optional to save
    fuel if it is already fetched elsewhere
    """
    if not display:
        display = Gdk.Display.get_default()
    return display.get_monitor_at_point(x, y)


display = Gdk.Display.get_default()
wait = int(sys.argv[1])
elapsed = 0
# set intervals to check
res = 2
monitors = [m for m in get_monitors()]
for m in monitors:
    set_mon_dimmed(m, False)

monrecord = {}
for m in monitors:
    monrecord[m] = {"idle": 0, "dimmed": False}

display = Gdk.Display.get_default()
idle1 = 0


while True:
    time.sleep(res)
    curr_mousepos = mousepos()
    activemon = get_currmonitor_atpos(
        curr_mousepos[0], curr_mousepos[1]
    ).get_model()
    idle2 = get_idle()
    if idle2 < idle1:
        monrecord[activemon]["idle"] = 0
        if monrecord[activemon]["dimmed"]:
            set_mon_dimmed(activemon, False)
            monrecord[activemon]["dimmed"] = False

    for m in monrecord.keys():
        curr_idle = monrecord[m]["idle"]
        print(m, curr_idle)
        if all([
            curr_idle > wait,
            monrecord[m]["dimmed"] is not True,
            m != activemon
        ]):
            set_mon_dimmed(m, True)
            monrecord[m]["dimmed"] = True         
        else:
            if m != activemon:
                monrecord[m]["idle"] = curr_idle + res

    idle1 = idle2

Як налаштувати

Налаштування просте:

  1. Переконайтеся, що у вас є python3-giі xprintidleвстановлені

    sudo apt install python3-gi xprintidle
    
  2. Скопіюйте сценарій вище в порожній файл, збережіть його як dim_inactiveі зробіть його виконуваним

  3. Виконайте команду:

    /path/to/dim_inactive <idle_time_in_seconds>
    

    приклад:

    /path/to/dim_inactive 120
    

    затьмарить усі екрани, де миша не проходить через дві хвилини

Додаткова інформація / пояснення

  • Сценарій перераховує всі екрани при запуску
  • Він зберігає запис, якщо час простою на моніторі (можливо, більше 2). Якщо до монітора немає доступу протягом x секунд, він вимкнено, окрім монітора, де знаходиться миша .
  • Згідно з хорошою (але поганою) традицією, Gnome продовжує ламати речі та продовжує змінювати API. Як результат, запустивши цей сценарій 19.04 і вище, ви отримаєте кілька застарілих попереджень. У той же час вона не порушується на PEP8. Тим не менш, оновиться до останніх API.

Дуже приємно, майже спокусилося написати щось подібне. Але я здогадуюсь, що тут повторюється тема - поки що немає нічого кращого, ніж затемнення іншого дисплея за допомогою програмних рішень, нічого апаратного іш
Сергій Колодяжний

@SergiyKolodyazhnyy Nah, лише підсвітка додала б щось, але це все, наскільки я зараз бачу. Подумайте, щось має бути можливо, але, мабуть, буде холодний старт, як xrandr --offя гадаю.
Яків Влійм

@JacobVlijm Так, xrandr --offя б вважав за краще в цьому випадку. Тим більше, що підсвічування VGA не може контролюватися програмним забезпеченням.
Сергій Колодяжний

Дякую за всі ваші зусилля, але я отримую найсмішніші форми поведінки ... Наприклад: це затьмарює монітори, але не повертає яскравість ні 1за яких обставин. Коли я взаємодію із зовнішнім дисплеєм за допомогою клавіатури, і коли миша знаходиться на головному дисплеї, зовнішній дисплей стає чорним після простою. Коли я не маю жодної взаємодії з основним дисплеєм, але миша є, вона там нічого не робить, і коли я переміщую мишу на інший головний дисплей, миттєво стає чорним.
Равексіна

@Ravex (1) відображаються ваші монітори? Якщо ні, то, можливо, ви зупинили сценарій із другим екраном. Виправлено це зараз. (2) Чому визначений активний екран мого миші пояснюється в [2] тимчасового коментаря (3) Також слід виправити зміни в (1) (та сама причина) Так, ні, не потрібно скидати час простою, зробимо що пізніше сьогодні.
Яків Влійм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.