X11/DualScreen: различия между версиями

Материал из ALT Linux Wiki
(Новая страница: «В этойстатье описано, как создать ''одно'' рабочее место с ''двумя'' независимыми экранами. * Описание двух полностью независимых рабочих мест — X11/DualSeat * Несколько экранов, которые воспринимаются, как один большой дисплей, поддерживаются Xorg «из коробки» (...»)
 
(typo)
Строка 1: Строка 1:
В этойстатье описано, как создать ''одно'' рабочее место с ''двумя'' независимыми экранами.
В этойстатье описано, как создать ''одно'' рабочее место с ''двумя'' независимыми экранами.


* Описание двух полностью независимых рабочих мест — X11/DualSeat
* Описание двух полностью независимых рабочих мест — [[X11/DualSeat]]
* Несколько экранов, которые воспринимаются, как один большой дисплей, поддерживаются Xorg «из коробки» (xinerama)
* Несколько экранов, которые воспринимаются, как один большой дисплей, поддерживаются Xorg «из коробки» (xinerama)


Строка 54: Строка 54:
Одна и та же карта (у меня Intel) здесь объявлена ''дважды'' — это особый трюк, который и позвляет добиться двух независимых экранов. Если карт несколько (например, дискрентая и интегрированная на ноутбуке), указываются обе.
Одна и та же карта (у меня Intel) здесь объявлена ''дважды'' — это особый трюк, который и позвляет добиться двух независимых экранов. Если карт несколько (например, дискрентая и интегрированная на ноутбуке), указываются обе.


После запуска Xorg получится два различных валидных значения апеременной {{term|DISPLAY}}:
После запуска Xorg получится два различных валидных значения переменной {{term|DISPLAY}}:
* {{cmd|:0.0}} — для нулевого монитора/экрана; команда вида {{cmd|DISPLAY=:0.0 xterm}} запустит {{cmd|xterm}} на правом экране
* {{cmd|:0.0}} — для нулевого монитора/экрана; команда вида <code>DISPLAY=:0.0 xterm</code> запустит {{cmd|xterm}} на правом экране
* {{cmd|:0.1}} — для первого монитора/экрана; команда вида {{cmd|DISPLAY=:0.1 firefox}} запустит {{cmd|firefox}} на правом экране
* {{cmd|:0.1}} — для первого монитора/экрана; команда вида <code>DISPLAY=:0.1 firefox</code> запустит {{cmd|firefox}} на правом экране
=== Primary Display ===
=== Primary Display ===
В принципе, это го уже достаточно, за одним исключением.
В принципе, этого уже достаточно, за одним исключением.


В Qt есть такой метод — [https://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop QGuiApplication::primaryScreen()]. Этот метод возвращает ''первый попавшийся'' монитор, помеченный протоколом XRandr как первычный. Если у вас все мониторы объадинены в один {{term|DISPLAY=:0}}, то среди них только один должен быть первичный — имено на нём, например, появится панель запуска вашего Window MAnager / DE.
В Qt есть такой метод — [https://doc.qt.io/qt-5/qguiapplication.html#primaryScreen-prop QGuiApplication::primaryScreen()]. Этот метод возвращает ''первый попавшийся'' монитор, помеченный протоколом XRandr как первичный. Если у вас все мониторы объединены в один <code>DISPLAY=:0</code>, то среди них только один должен быть первичный — именно на нём, например, появится панель запуска вашего Window Manager/DE.


В нашем случае задано два экрана — и значит, ''два'' первичных монитора по умолчанию. По какой-то неведомой мне причине Xorg отказывается воспринимать параметр {{term|Options "Primary" "off"}} в случае, когда монитор на экране один, и пишет в логах, что она «not used». может, я что-то делаю не так.
В нашем случае задано два экрана — и значит, ''два'' первичных монитора по умолчанию. По какой-то неведомой мне причине Xorg отказывается воспринимать параметр {{term|Options "Primary" "off"}} в случае, когда монитор на экране один, и пишет в логах, что она «not used». может, я что-то делаю не так.


При этом у меня при старте Qt-приложений (например, последнего Telegram) они запускают на этом самом primaryScreen ''независимо от значение переменной DISPLAY''!
При этом у меня при старте Qt-приложений (например, последнего Telegram) они запускаются на этом самом primaryScreen ''независимо от значение переменной DISPLAY'' (если она валидна)!


Поэтому перед запуском таких прилоений я делаю
Поэтому перед запуском таких прилоений я делаю

Версия от 18:01, 26 апреля 2022

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

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