Как я могу автоматически попробовать определенное разрешение, если я подключаю (любой) внешний монитор?

Есть ли способ настроить Ubuntu для установки разрешения монитора «первой попытки» по умолчанию всякий раз, когда подключен (или два) монитор. Независимо от того, какие графические карты или графический драйвер используются.

Например, когда я подключаю монитор HDMI, поддерживающий 1920x1080, Ubuntu хорошо воспроизводится, автоматически устанавливая разрешение экрана FullHD. Это хорошо.

Но мне нужно простое разрешение 1024x768 по HDMI. Чтобы решить эту проблему, я могу легко перейти к настройкам системы - отобразить и настроить ее, ubuntu также запомнит мои настройки. Или с помощью команды xrandr.

Но каждый раз, когда я меняю монитор, мне нужно переходить к настройкам системы (или снова запускать другую команду xrandr).

Итак, есть ли способ сообщить ubuntu, что-то вроде

«для каждого подключенного монитора, независимо от того, подключен ли он через D-SUB или HDMI или что-то еще, попробуйте проверить, поддерживает ли он 1024x768, и если это так, используйте это разрешение "

Я имею в виду

  1. Создать что-то вроде универсального monitors.xml для всех поставщиков мониторов и моделей
  2. Запуск пользовательских Сценарий xrandr каждый раз, когда монитор подключен / отключен, но это может вызвать мерцание экрана.

Но я до сих пор не знаю, как их реализовать.

В качестве информации система настроена на использование lightdm, если это имеет значение. Я читал о xrandr, monitors.xml, но все еще не могу найти решения. Заранее спасибо.

2
задан 24 May 2016 в 15:33

3 ответа

Фоновый сценарий для проверки на новые экраны

Однажды в 5 секунд, фоновый сценарий ниже ищет новые экраны, которые будут соединены.
Если это происходит, это пытается установить разрешение на то, что Вы устанавливаете в главном разделе сценария (см.: Как использовать).

Уведомление показывает, был ли creen успешно установлен:

enter image description here

Если команда для установки сбоев разрешения это показывает уведомление:

enter image description here

Сценарий

#!/usr/bin/env python3
import subprocess
import time

# --- set your main screen below, since you probably want to set it differently
main_screen = "DVI-I-1"
# --- set the tried resolution below
res = "200x300"
#---

screens1 = [main_screen]

def screeens():
    [l.split()[0] for l in subprocess.check_output("xrandr")\
     .decode("utf-8").splitlines() if " connected" in l]

while True:
    time.sleep(5)
    screens2 = [l.split()[0] for l in subprocess.check_output("xrandr").decode("utf-8")\
               .splitlines() if " connected" in l]
    new = [scr for scr in screens2 if not scr in screens1]
    for scr in new:
        try:
            subprocess.check_call(["xrandr", "--auto", "--output", scr, "--mode", res])
            # small break to give the screens time to adapt
            time.sleep(5)
            subprocess.Popen(["notify-send", "successfully set "+scr+" to "+res])
        except subprocess.CalledProcessError:
            subprocess.Popen(["notify-send", "failed to set resolution of "+scr+" to "+res])
    screens1 = screens2

Как использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как set_screens.py
  2. Набор в главном разделе сценария:

    • название Вашего экрана по умолчанию, так как Вы, вероятно, хотите исключить его из автоматического разрешения - набор.
    • разрешение Вы хотите судиться на новых экранах.

      # --- set your main screen below, since you probably want to set it differently
      main_screen = "DVI-I-1"
      # --- set the tried resolution below
      res = "200X300"
      #---
      
  3. Тестовый прогон сценарий командой (от терминала):

    python /path/to/set_screens.py
    

Если все хорошо работает, добавьте его для Запущения Приложений:

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

Примечания

  • sleep 15 важно в команде запуска, особенно если экраны secundary возможно присоединяются. Сценарий повредится, если рабочий стол еще не будет полностью загружен, если он начинает работать.

    Если сценарий хорошо работает от терминала, но повреждается как команда sartup, играйте немного с sleep 15.

  • Если Вы не хотите исключать свой основной экран из попытки установить разрешение, изменить строку:

    screens1 = [main_screen]
    

    в:

    screens1 = []
    

Запущение фонового скрипта

Если Вы не должны запускать фоновый скрипт, то не делайте. Если это добавляет важную функциональность и/или экономит Вам время, я не вижу оснований не к однако, если:

  • Нет никого другого, 100%-е чистое и легкое доступное решение, с той же функциональностью.

и

  • Сценарий правильно написан и не добавляет значимой загрузки ЦП

В этом случае, проверка xrandr однажды в пять секунд ничего не значит для Вашей системы.

2
ответ дан 2 December 2019 в 02:18

Я создал несколько настольных ярлыков для достижения этого вида вещи на моем ноутбуке. Они

Кошка $ LowRes.desktop

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[en_GB]=gnome-panel-launcher
Name[en_GB]=LowRes
Exec=xrandr -s 8
Comment[en_GB]=1368x768
Name=LowResDisplay
Comment=1368x768
Icon=gnome-panel-launcher

и

кошка HighRes.desktop

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Icon[en_GB]=gnome-panel-launcher
Name[en_GB]=HighRes
Exec=xrandr -s 4
Comment[en_GB]=1600x900
Name=HighResDisplay
Comment=1600x900
Icon=gnome-panel-launcher

Возможно, что-то подобное могло бы быть полезно для Вас.

1
ответ дан 2 December 2019 в 02:18

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

#!/bin/bash
sudo xrandr --addmode VGA-0 1440x900_60.00
sudo xrandr --newmode  Modeline "1440x900_60.00"  106.47  1440 1520   1672 1904  900 901 904 932  -HSync +Vsync

Создайте свой Modeline для Вашего монитора со следующим

cvt 1440x900 60

горизонтальные пиксели x вертикальный pixesl refreshrate

1
ответ дан 2 December 2019 в 02:18

Другие вопросы по тегам:

Похожие вопросы: