Состоялся релиз randrctl 1.2 (http://github.com/edio/randrctl), менеджера настроек экрана для мульти-мониторных конфигураций. В рамках проекта randrctl развивается утилита, написанная на языке Python, которая позволяет сохранить текущие настройки экрана в файл с тем чтобы применить их позже (вручную либо автоматически), когда к компьютеру будет подключен тот же или подобный набор мониторов.Для определения момента подключения мониторов, а также для считывания текущих настроек и применения настроек из профилей в randrctl используются функции udev и xrandr. С момента релиза 1.0 добавлена поддержка конфигураций HiDPI (опции scale), исправлена обработка XDG_CONFIG_HOME, обновлено описание проекта на Github и проведена чистка кода и исправление мелких ошибок.
URL: http://github.com/edio/randrctl
Новость: http://www.opennet.ru/opennews/art.shtml?num=45116
Так а в чём собственно отличие от xrandr?
А он умеет сохранять в файл (и восстанвливать)?
> Так а в чём собственно отличие от xrandr?Это обвязка. Внутри используется xrandr. Задумка в автоматизации – настроил один раз, сохранил в файл и можешь в следующий раз загрузить готовое.
Ваш Кэп.
> настроил один раз, сохранил в файл и можешь в следующий раз загрузить готовое.Вот ты сейчас описал работу randr..
Настроил 1 раз
Записал в файл (.sh)
Следующий раз просто запускаешь файл (.sh)
Со скриптов все и началось. Но когда их стало >3, и когда я начал забывать, где и какой надо запустить, понял, что это не очень удобно.randrctl умеет автоматически выбирать среди сохраненных профилей тот, который больше всего подходит (умеет по edid и по разрешению). А использование udev позволяет вообще ничего не запускать: раз сохранил профиль, дальше при подключении он активируется автоматически.
Ну это нужно вручную опознавать нужный .shА тут оно смотрит на мониторы и подгружает соответствующий конфиг
Один фиг иксы не умеют в идентификатор монитора. Оперируют выходами. Выходы перепутал и вся конфигурация по *** пошла.Обвязка нужна, чтобы из кучки утилит и гуя сделать простую настройку.
>> настроил один раз, сохранил в файл и можешь в следующий раз загрузить готовое.
> Вот ты сейчас описал работу randr..
> Настроил 1 раз
> Записал в файл (.sh)
> Следующий раз просто запускаешь файл (.sh)Под это описание подходит и обвязка arandr, которая с графикой и записью настроек в шелл-скрипт. Признаю сразу свое неосиляторство и недостаточную крутизну, но настраивать позицию экранов относительно друг друга мышевозя и имея "картинку" мне как-то проще и удобнее, чем методом тыка с подбором подходящих значений.
А вот зачем эту системную утилитку нужно было писать на питоне?
Затем, что _обвязку_ к системной утилитке xrandr вполне разумно писать на каком-нибудь скриптовом языке.
Если кому надо подобное на bash, https://github.com/Vladimir-csp/rerandr3
> Если кому надо подобное на bash, https://github.com/Vladimir-csp/rerandr3Спасибо!
> _обвязку_ к системной утилитке xrandrТак всё таки обвязку. Вот так бы в новости прямо и написали. Тогда бы и вопроса не было.
Вроде, именно так и написано> Для определения момента подключения мониторов, а также для считывания текущих настроек и применения настроек из профилей в randrctl используются функции udev и xrandr
Кто-то не осилил конфигурацию иксов?
Кто-то юзает иксы? лично мы используем радугу на OSX
Ага а ещё Metal вместо OpenGL и Swift вместо С\С++. Велосипедисты ненужны.
Поддержка wayland планируется?
Очень не хватает утилиты вроде xrandr для него, которая работала бы в разных композиторах.
Нет и не будет в силу его убогой негибкой архитектуры.
> Очень не хватает утилиты вроде xrandr для него, которая работала бы в разных композиторах.Вы не тех пинаете, это невозможно в дефолтном протоколе wayland.
а systemd-randrctld обещают?
Обещают systemd-opennet-anonymous-commentd.
Вот уж по-настоящему большое ненужно. Мало того, что это просто обвязка вокруг xrandr(1) и оно не умеет RandR 1.2 в Wayland, так и то, что оно делает, решается использованием xrandr(1) + правилами udev.P.S. Код поражает воображение своей серьёзностью, с которой написан.
> решается использованием xrandr(1) + правилами udev.Это и есть решение с использованием xrandr и udev. Готовое, легкое в использовании решение.
>> решается использованием xrandr(1) + правилами udev.
> Это и есть решение с использованием xrandr и udev. Готовое, легкое в
> использовании решение.Готовое — возможно, лёгкое в использовании — сомнительно. Но возникает вопрос: кто им будет пользоваться? Пользователи DE используют средства настройки экрана своей DE. А у пользователей маленьких оконных менеджеров, если им это надо, уже всё давно настроено. Или скриптик написан в несколько строчек, или правила udev'а.
Тем более, для такой простой утилиты код написан чересчур сложновато на мой взгляд.
> А у пользователей маленьких оконных менеджеров, если им это надо, уже всё давно настроено.Я, как раз, пользователь маленького оконного менеджера. Мне было надо, настроил себе — предлагаю свое решение другим.
И мне кажется, что решение, таки, легкое в использовании: мне было бы гораздо сложнее переносить какой-то набор своих скриптов с машины на машину, не забывая при этом править названия аутпутов и пр.. Хотелось сразу чего-то более-менее универсального и, кажется, получилось.
По поводу кода: почувствовал сам, что написан не лучшим образом, когда захотел добавить HiDPI после того, как почти год не смотрел на код. Начиналось все как хелловорлд на питоне...
> позволяет сохранить текущие настройки экрана в файл с тем чтобы применить их позже (вручную либо автоматически), когда к компьютеру будет подключен тот же или подобный набор мониторов.Интересно. Гипотетическая ситуация: я сохранил настройку для двух мониторов, но потом решил переключить один из мониторов с VGA на DVI. Настройки всё равно подхватятся?
Нет, только на том же аутпуте.Мог бы заняться тем, чтоб подхватывало для конкретных дисплеев, но только если функция действительно востребована, это не будет быстрофикс.
А что если настроил, а потом внешний моник отключил? А потом снова подключил? А потом перезагрузился без моника и подключил его позже? Или загрузился сразу с ним? Мне вот сейчас каждый раз приходится с помощью xrandr вручную добавлять (что вызывает ошибку если он не подключен в этот момент, на сколько я помню) полноценное разрешение 1280x1024 для внешнего монитора (автоматом система его распознаёт только на 1024x768). ОС Ubuntu 16.04 (в прочем, проблеме больше 5 лет точно), моник подключен через D-Sub, видеокарта Intel.
> А что если настроил, а потом внешний моник отключил? А потом снова
> подключил? А потом перезагрузился без моника и подключил его позже? Или
> загрузился сразу с ним? Мне вот сейчас каждый раз приходится с
> помощью xrandr вручную добавлять (что вызывает ошибку если он не подключен
> в этот момент, на сколько я помню) полноценное разрешение 1280x1024 для
> внешнего монитора (автоматом система его распознаёт только на 1024x768). ОС Ubuntu
> 16.04 (в прочем, проблеме больше 5 лет точно), моник подключен через
> D-Sub, видеокарта Intel.все зависит от udev. Если он триггерит для d-sub выхода событие (по идее, должен), то будет работать.
в prior-switch hook надо будет добавлять к монитору разрешение. Правда, на данном этапе, в prior-switch надо будет самому проверять edid монитора.
Я мог бы передавать в prior-switch md5 от edid (если вам эта опция подходит, заведите issue, пожалуйста, займусь в ближайший свободный вечер), тогда проверка была бы простая:
.config/randrct/config.ini
prior_switch = /path/to/add_resolution.sh/path/to/add_resolution.sh
if [ "$edid" -eq "$my_monitor_edid" ]; then xrandr ... ; fi
Пример по поводу udev и отключений/подключений.У меня есть профиль default без внешних мониторов, и, например office.
В офисе я могу снять работающий ноут с докстанции, и тогда сразу активируется default.
А могу сначала усыпить ноут, а потом снять с докстанции. Тогда default активируется при пробуждении.
> Нет, только на том же аутпуте.Тогда Вы меня окончательно запутали. В сообщении №23 Вы написали, что:
> мне было бы гораздо сложнее переносить какой-то набор своих скриптов с машины на машину, не забывая при этом править названия аутпутов и пр..
Значит, при смене output-а всё равно конфигурация мониторов не подхватится? Тогда я не очень уяснил, в чём суть. Если для каждой конфигурации мониторов на каждом месте мне придётся настраивать всё это дело заново, так не легче ли сразу xrandr?
Вот у меня, например, в настройках lightdm.conf прописано следующее:
display-setup-script=/etc/lightdm/monitor-setup.shА monitor-setup.sh - скрипт в две строчки:
xrandr --auto --output VGA-1 --mode 1680x1050 --primary
xrandr --auto --output DVI-I-1 --mode 1680x1050 --left-of VGA-1Ну допустим, что основной монитор - это монитор от ноутбука, а левый - подключаемый. Если вместо моего скрипта использовать Ваш, то я правильно понял, что он автоматически проверит наличие левого монитора и выберет соответствующую конфигурацию?
С другой стороны, для подобной проверки лично мне бы, конечно, было бы проще написать обвязку одной строчкой, наподобие:
if xrandr | grep -q 'DVI-I-1 connected' ; then <DVI-I-1 command> ; fi
UPD:
Да и касательно udev, можно ведь вышеописанный трёхстрочник скормить ему примерно так:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/path/to/monitor-setup.sh"В общем, я пока всё никак по-видимому не пойму use-case Вашего скрипта, извините.
юзкейз такой: у меня один ноутбук, но 4 "рабочих" места: мониторы через докстанцию в офисе, телевизор в офисе, монитор дома, проектор дома. А, и еще просто лептоп, без мониторов, итого — 5.randrctl позволяет не вызывать 5 скриптов вручную.
> if xrandr | grep -q 'DVI-I-1 connected' ; then <DVI-I-1 command> ; fi
К displayport я подключаю и проектор, и монитор, два разных устройства и два разных конфига.
randrctl проверяет edid устройства, подключенного к аутпуту, и выбирает нужный конфиг.К слову, мне сценарий, когда один и тот же монитор подключается то к одному, то к другому аутпуту кажется надуманным. Это бы означало, что из монитора торчит несколько шнурков, но использую я попеременно только один из них.
> юзкейз такой: у меня один ноутбук, но 4 "рабочих" места: мониторы через докстанцию в офисе, телевизор в офисе, монитор дома, проектор дома. А, и еще просто лептоп, без мониторов, итого — 5.Вооооот. Вот об этом и *нужно* было писать в новости, edio.
> randrctl позволяет не вызывать 5 скриптов вручную.
Ну зачем же 5 скриптов, да к тому же вручную...
Можно же в shell проверять содержимое /sys, например так:% find /sys/devices/ -name edid
/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-HDMI-A-1/edid
/sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-VGA-1/edidНа эти файлы можно натравить base64, и запомнить edid в текстовом формате.
Ну а дальше - применение настроек тем же самым xrandr, и правило в udev. :)Возьмите этот метод на заметку, кстати. Всяко лучше, нежели вывод xrandr --verbose парсить. ;)
> randrctl проверяет edid устройства, подключенного к аутпуту, и выбирает нужный конфиг.
По-моему лучше было бы применять настройки к соответствующему output исходя из edid монитора, который к нему подключён.
Резюмируя, скажу, что идея у скрипта хорошая. Я бы наваял на bash, имхо надёжней было. Вашей тулзе желаю успеха. Нужный инструмент всегда найдёт своего пользователя.
в самом начале рассматривал вариант использования /sys, но почему-то тогда от него отказался. Возможно, amd не умели тогда в /sys.Но вообще, да, идея хорошая, надо будет подумать над ней, спасибо!