X11/DualScreen
В этойстатье описано, как создать одно рабочее место с двумя независимыми экранами.
- Описание двух полностью независимых рабочих мест — X11/DualSeat
- Несколько экранов, которые воспринимаются, как один большой дисплей, поддерживаются Xorg «из коробки» (xinerama)
Я привык в Xorg использовать два монитора, на одном из которых — мой рабочий стол с моим Window Manager-ом (у меня CTWM, но это дела не меняет), а на другом — несколько FullScreen окон, переключаться между которыми можно, например, с помощью функции «scale» композитного менеджера Compiz или паре утилит skippy-xd/brightside. Конкретные названия не имеют значения, суть одна:
- Одно рабочее место с одной клавиатурой и мышью
- Два независимых монитора, каждый управляется по-своему
- Минус — нельзя перетаскивать окна с монитора на монитор
- А вот копировать, как через clipboard (Ctrl+C/Ctrl+V), так и через cutbuffer (средняя кнопка мыши) можно
Для этого Xorg-у надо объяснить, что у него есть два т. н. SCREEN — экрана, к каждому из которых приписано по монитору.
Вот содержимое файла /etc/X11/xorg.conf.d/20-monitor.conf , который эту конфигурацию задаёт:
Section "ServerLayout" Identifier "Layout0" Screen 0 "Screen0" Screen 1 "Screen1" LeftOf "Screen0" EndSection
Section "Monitor" Identifier "Monitor0" EndSection
Section "Monitor" Identifier "Monitor1" EndSection
Section "Device" Identifier "Card0" Driver "modesetting" Screen 0 EndSection
Section "Device" Identifier "Card1" Driver "modesetting" Screen 1 EndSection
Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" EndSection
Section "Screen" Identifier "Screen1" Device "Card1" Monitor "Monitor1" EndSection
Одна и та же карта (у меня Intel) здесь объявлена дважды — это особый трюк, который и позвляет добиться двух независимых экранов. Если карт несколько (например, дискрентая и интегрированная на ноутбуке), указываются все по разу.
После запуска Xorg получится два различных валидных значения переменной DISPLAY:
- :0.0 — для нулевого монитора/экрана; команда вида
DISPLAY=:0.0 xterm
запустит xterm на правом экране - :0.1 — для первого монитора/экрана; команда вида
DISPLAY=:0.1 firefox
запустит firefox на правом экране
Primary Display
В принципе, этого уже достаточно, за одним исключением.
В Qt есть такой метод — QGuiApplication::primaryScreen(). Этот метод возвращает первый попавшийся монитор, помеченный протоколом XRandr как первичный. Если у вас все мониторы объединены в один DISPLAY=:0
, то среди них только один должен быть первичный — именно на нём, например, появится панель запуска вашего Window Manager/DE.
В нашем случае задано два экрана — и значит, два первичных монитора по умолчанию. По какой-то неведомой мне причине Xorg отказывается воспринимать параметр Options "Primary" "off" в случае, когда монитор на экране один, и пишет в логах, что она «not used». может, я что-то делаю не так.
При этом у меня при старте Qt-приложений (например, последнего Telegram) они запускаются на этом самом primaryScreen независимо от значение переменной DISPLAY (если она валидна)!
Поэтому перед запуском таких приложений я делаю
DISPLAY=:0.1 xrandr --noprimary
Это снимает флаг primary с левого монитора, и Qt-приложения начинают запускаться на правом.