Переключение между мониторами и аудиовыходами в openbox

Небольшая заметка для тех, кто, возможно, в будущем столкнется с теми же проблемами, что и я.

1. Зачем это надо?
У меня есть ноутбук, которым я пользуюсь и дома, и вне дома. При этом дома также имеется большой и удобный (23.6'') монитор, беспроводные клавиатура и мышь. Естественно, в домашних условиях я подключаю к ноуту все это добро для комфортной работы. Плюс ко всему иногда вместо монитора использую телевизор, чтобы завалиться на диван и посмотреть кино/сериал/выбрать свой вариант с качественной картинкой. И монитор, и телевизор подключаются по hdmi.
В итоге, когда я начал использовать openbox, появилась очевидная проблема:
  1. Если к ноуту ничего не подключено, надо оставить включенным его монитор
  2. Если подключен внешний монитор, надо выключить внутренний и отправить изображение на внешний, а звук - на колонки, подключенные через jack
  3. Если подключен телевизор, надо выключить внутренний монитор, а изображение и звук направить в порт hdmi

2. Решение
2.1 Видео
Ставим пакет xrandr. Выполняем:
[~]» xrandr
Screen 0: minimum 8 x 8, current 1366 x 768, maximum 32767 x 32767
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 309mm x 173mm
   1366x768      60.07*+
   1024x768      60.00
   800x600       60.32    56.25
   640x480       59.94
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
В выводе этой команды нас интересуют позиции LVDS1 и HDMI1: это соответствующие порты для экрана ноутбука и кабеля hdmi. Создаем скрипт:
#!/bin/bash

#Переключение мониторов
if (xrandr | grep "HDMI1 disconnected"); then
    xrandr --output HDMI1 --off --output LVDS1 --auto
else
    xrandr --output LVDS1 --off --output HDMI1 --auto
fi

#Исправление обоев
feh --bg-fill /home/kycok/data/Dropbox/comp/wall.jpg

#Перемещение коньков
killall conky
conky &
Первая часть проверяет, подключен ли hdmi, и в зависимости от этого оставляет включенным только один монитор. Вторая исправляет обои, а третья - коньки: это нужно, поскольку они съезжают из-за различных разрешений экранов. Вешаем это дело на хоткей, и наслаждаемся мгновенным (почти) переключением. Естественно, поведение мониторов в скрипте можно изменить, как требуется вам.

UPD. Забыл сказать: лучше всего добавить этот скрипт еще и в автозапуск, дабы не жать хоткеи после включения.

2.2 Звук
Видимо, мне повезло: втыкание/вытыкание внешних колонок в разъем jack приводит к тому, что в Arch звук автоматически (что удивительно:)) переключается между внешними/внутренними колонками. Мучиться мне пришлось с hdmi, но в конечном итоге я пришел к вот такому решению.
Выполняем:
[~]» aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: CX20590 Analog [CX20590 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
Как видно из вывода, одна карта (card 0), два девайса (device 0 и device 3), причем hdmi - это device 3. Создаем в любом месте, где не потеряется, файл .asoundrc:
defaults.pcm.card 0
defaults.pcm.device 3
defaults.ctl.card 0
В нем пишем номер девайса hdmi, в моем случае это цифра 3. Вешаем на хоткеи две команды:
cp /бла/бла/бла/путь/к/файлу/.asoundrc ~/
rm ~/.asoundrc
После первой звук пойдет в порт hdmi, после второй - обратно, на колонки. В принципе, можно даже объединить обе команды в один скрипт с проверкой.

3. Итог
Я более чем уверен, что есть решение получше. Отзовитесь, кто знает) Остальным, надеюсь, пригодится
GitHub, ArchWiki, AUR
А разрешение у внешнего монитора и телевизора определяется автоматически? В противном случае я бы сделал, например, следующее:
$ cvt 1680 1050 60
...
"1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
$ xrandr --newmode "1680x1050_60.00"  146.25  1680 1784 1960 2240  1050 1053 1059 1089 -hsync +vsync
$ xrandr --addmode DVI-I-2 1680x1050_60.00
$ xrandr --output DVI-I-2 --mode 1680x1050_60.00
Частота кадров - опционально.
Aivar, да, определяется (спасибо hdmi), иначе прописал бы конкретные цифры
GitHub, ArchWiki, AUR
вот это всё собираем в один скрипт(лучше через сервис) и стартуем udevом... так получше будет))
Ошибки в тексте-неповторимый стиль автора©
 
Зарегистрироваться или войдите чтобы оставить сообщение.