X11/DualScreen: различия между версиями
(Новая страница: «В этойстатье описано, как создать ''одно'' рабочее место с ''двумя'' независимыми экранами. * Описание двух полностью независимых рабочих мест — X11/DualSeat * Несколько экранов, которые воспринимаются, как один большой дисплей, поддерживаются Xorg «из коробки» (...») |
м (typo) |
||
(не показано 5 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
В этойстатье описано, как создать ''одно'' рабочее место с ''двумя'' независимыми экранами. | В этойстатье описано, как создать ''одно'' рабочее место с ''двумя'' независимыми экранами. | ||
* Описание двух полностью независимых рабочих мест — X11/DualSeat | * Описание двух полностью независимых рабочих мест — [[X11/DualSeat]] | ||
* Несколько экранов, которые воспринимаются, как один большой дисплей, поддерживаются Xorg «из коробки» (xinerama) | * Несколько экранов, которые воспринимаются, как один большой дисплей, поддерживаются Xorg «из коробки» (xinerama) | ||
Я привык в Xorg использовать два монитора, на одном из | Я привык в Xorg использовать два монитора, на одном из которых — мой рабочий стол с моим Window Manager-ом (у меня CTWM, но это дела не меняет), а на другом — несколько FullScreen окон, переключаться между которыми можно, например, с помощью функции «scale» композитного менеджера Compiz или паре утилит {{pkg|skippy-xd}}/{{pkg|brightside}}. Конкретные названия не имеют значения, суть одна: | ||
* Одно рабочее место с одной клавиатурой и мышью | * Одно рабочее место с одной клавиатурой и мышью | ||
Строка 16: | Строка 16: | ||
Section "ServerLayout" | Section "ServerLayout" | ||
Identifier "Layout0" | Identifier "Layout0" | ||
Screen | Screen 0 "Screen0" | ||
Screen 1 "Screen1" LeftOf "Screen0" | Screen 1 "Screen1" LeftOf "Screen0" | ||
EndSection | EndSection | ||
Строка 52: | Строка 52: | ||
EndSection | EndSection | ||
Одна и та же карта (у меня Intel) здесь объявлена ''дважды'' — это особый трюк, который и позвляет добиться двух независимых экранов. Если карт несколько (например, дискрентая и интегрированная на ноутбуке), указываются | Одна и та же карта (у меня Intel) здесь объявлена ''дважды'' — это особый трюк, который и позвляет добиться двух независимых экранов. Если карт несколько (например, дискрентая и интегрированная на ноутбуке), указываются все по разу. | ||
После запуска Xorg получится два различных валидных значения | После запуска Xorg получится два различных валидных значения переменной {{term|DISPLAY}}: | ||
* {{cmd|:0.0}} — для нулевого монитора/экрана; команда вида | * {{cmd|:0.0}} — для нулевого монитора/экрана; команда вида <code>DISPLAY=:0.0 xterm</code> запустит {{cmd|xterm}} на правом экране | ||
* {{cmd|:0.1}} — для первого монитора/экрана; команда вида | * {{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 как | В 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) они | При этом у меня при старте Qt-приложений (например, последнего Telegram) они запускаются на этом самом primaryScreen ''независимо от значение переменной DISPLAY'' (если она валидна)! | ||
Поэтому перед запуском таких | Поэтому перед запуском таких приложений я делаю | ||
DISPLAY=:0.1 xrandr --noprimary | DISPLAY=:0.1 xrandr --noprimary |
Текущая версия от 15:34, 16 августа 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 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-приложения начинают запускаться на правом.