X11/DualScreen

Материал из ALT Linux Wiki

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

  • Описание двух полностью независимых рабочих мест — 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-приложения начинают запускаться на правом.