Масштабирование приложения по-разному на разных мониторах - Ubuntu 16.04
Я нашел много очень твердых статей / ответов по этой теме:
- /questions/602924/vozmozhno-li-imet-raznyie-konfiguratsii-dpi-dlya-dvuh-raznyih-ekranov/602937#602937
- https://unix.stackexchange.com/a/213984
- /questions/80913/konfig-dvuh-monitorov-s-sovershenno-drugim-razresheniem/80915#80915
И конечно:
Тем не менее, я все еще борюсь. Мой ноутбук Dell XPS15. Его дисплей 3840x2160. Я пробовал разные внешние мониторы, но на данный момент я использую также Dell с разрешением 1920x1080.
Когда я подключаю внешний монитор, некоторые панели сразу становятся очень маленькими на экране 3840x2160. Когда я пытаюсь увеличить масштаб встроенного дисплея, хром масштабируется, моя IDE масштабируется, но окно дисплея вместе с другими окнами, такими как настройки NVIDIA X Server, остаются очень маленькими. Я попытался поиграть с Масштабировать все содержимое окна, чтобы соответствовать на дисплее, но безрезультатно. Он либо слишком велик на внешнем экране, либо слишком мал на встроенном. Я также пробовал xrandr с параметром scale, но он дает мне:
xrandr --output HDMI-1 --scale 2x2
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 140 (RANDR)
Minor opcode of failed request: 26 (RRSetCrtcTransform)
Value in failed request: 0x40
Serial number of failed request: 38
Current serial number in output stream: 39
В идеале я хочу, чтобы несколько окон одного и того же приложения (скажем, Chrome или Intellij Idea были открыты на разных экранах и масштабировались независимо от них).
РЕДАКТИРОВАТЬ
Я не ищу Scale для меню и строки заголовка, мне нравится, как бары. Я хочу, чтобы содержимое окон масштабировалось независимо. Пользовательский интерфейс дисплеев заставляет меня масштабировать все окна в соответствии со встроенным идентификатором или внешним дисплеем. В следствии:
Масштабируйте все содержимое окна в соответствии со встроенным дисплеем:
Встроенный дисплей - все выглядит идеально; Внешний дисплей - все огромно.
Масштабируйте все содержимое окна в соответствии с внешним отображением:
Встроенный дисплей - очень маленький; Внешний дисплей - все выглядит отлично.
2 ответа
У меня есть драйвер nvidia 340.98
с GT218M [NVS 3100M], Xubuntu 16.04, любые результаты, приведенные ниже, получены из этой среды, если я не упомяну иначе. Вот информация о моей тестовой среде, вывод:
sudo apt-get install pastebinit; \
sudo sh -c "lsb_release -sd; \
dmidecode -s system-product-name; echo ==; \
lshw -c display; echo ==; \
xrandr --verbose; echo ==; \
cat /etx/X11/xorg.conf" \
| tee ~/Desktop/ubuntu-graphic-info.txt \
| pastebinit
Странный и сложный стек для отладки специально с использованием проприетарных драйверов. В большинстве случаев я получаю неожиданное поведение, возможно, из-за недостатка знаний о текущей настройке графического стека Linux.
- Я написал этот ответ раньше, который может ввести некоторые инструменты отладки, такие как
xtrace
- Избегайте запуска нескольких / последовательных
xrandr
команды, только после сброса X-сервера. Одна и та же команда может иметь различный результат в зависимости от предыдущих команд. Я заметил, что с--scale
(см. контрольный пример из моего ответа, ссылка выше)--transform
&--fb
, Все еще не знаю простой способ только по выходу из системы / авторизации. Так что всегда выходите из системы, прежде чем делать еще одну пробную версию. - Снимки экрана снимают только изображение размером с пиксель от FB, поэтому я добавлю фотографии с камеры, чтобы показать реальные результаты.
Способ 1: xrandr --output .. --scale HCoefxVCoef
или же --scale-from WxH
Обратите внимание, у меня отлично работает. --scale
это ярлык для --transform
см. method3
(VGA-0 ниже DP-3)
xrandr \
--output DP-3 --mode 1280x800 --scale 1x1 --pos 0x0 --fb 2880x2600 \
--output VGA-0 --mode 1440x900 --scale 2x2 --pos 0x800
или же:
xrandr \
--output DP-3 --mode 1280x800 --pos 0x0 --fb 2880x2600 \
--output VGA-0 --mode 1440x900 --scale-from 2880x1800 --pos 0x800
Расчет размера FrameBuffer:
width = max(1280,1440*2) = 2880
height = 800+900*2 = 2600
Результаты:
Скриншот масштаба nvidia xrandr
https://ask-ubuntu.ru/images/e8116bed261c48b82e4d8873e8bc2e2e5dd3d 191.jpg
nvidia xrandr фото в масштабе
Способ 2: nvidia-settings
Просмотр порта вход / выход
Обратите внимание, не работает хорошо. nvidia-settings
не изменяет фрейм-буфер до необходимого размера, как в xrandr
команда. Кажется, ошибка (вид, nvidia
имеет свой собственный FB), нужно больше исследований.
Пытался повторить xrandr
настроить непосредственно с помощью nvidia-settings
(Я использовал xrandr из method 1, отметил настройки nvidia, сбросил настройки, затем использовал nvidia-settings напрямую):
gksu nvidia-settings
→ Настройка X Server Display- Выберите внешний монитор → расширенный...
- Сделайте ViewPortIn & Panning двойным из ViewPortOut (что соответствует исходному разрешению)
- Оставьте внутренний монитор без изменений, затем нажмите Применить.
Пример:
Настройки внутреннего монитора nvidia
Position: +0+0 ViewPortIn: 1280x800 ViewPortOut: 1280x800+0+0 Panning: 1280x800
Настройки внешнего монитора nvidia
Position: +1280+0 (rightof) or +0+800 (below) ViewPortIn: 2880x1800 ViewPortOut: 1440x900+0+0 Panning: 2880x1800
Результаты: обратите внимание на указатель мыши, он может достичь всех краев 2-го монитора, даже если он рисует только верхнюю левую четверть.
nvidia-settings viewportin скриншот
https://ask-ubuntu.ru/images/4ed 1c314c6fae24c828eaa5e10122e836b69ea08.jpg
nvidia-настройки viewportin фото
Обновление: Ну, я мог бы, наконец, получить обходной прием. Добавьте 1px к ширине или высоте панорамирования (Panning
)
Panning: 2881x1800 or 2880x1801
Новые результаты: я не могу объяснить это, просто фон поврежден, если я использую ниже, в противном случае все кажется в порядке.
NVIDIA-настройки ViewPortin с скриншот трюк панорамирования
https://ask-ubuntu.ru/images/281d0451ac2f8480109bea0b331b97d 1cf19d78b.png понизил качество цвета на изображении выше, чтобы сделать лимит менее 2 МБ
nvidia - настройки viewportin с трюком панорамирования фото
https://ask-ubuntu.ru/images/95c9fd524eb15aae796632b5cbac37bdc8247d 1d.jpg
Способ 3: xrandr --output .. --transform "H,0,0,0,V,0,0,0,1"
Обратите внимание, у меня работает нормально, так же, как method 1
(VGA-0 справа от DP-3)
xrandr \
--output DP-3 -primary --mode 1280x800 --pos 0x0 --transform "1,0,0,0,1,0,0,0,1" --fb 4160x1800 \
--output VGA-0 --mode 1440x900 --transform "2,0,0,0,2,0,0,0,1" --right-of DP-3
Расчет размера FrameBuffer:
width = 1280+1440*2 = 4160
height = max(800,900*2) = 1800
Результаты:
скриншот nvidia xrandr transform
https://ask-ubuntu.ru/images/555aed 164a007bbf2b4ee474b99311e0e7b4f38e.jpg
nvidia xrandr преобразовать фото
Я нашел простое решение. Я использую Ubuntu 18.04. Это мой вывод xrandr:
light@light:~$ xrandr
Screen 0: minimum 8 x 8, current 5760 x 2160, maximum 32767 x 32767
HDMI-0 connected 1920x1080+3840+92 (normal left inverted right x axis y axis) 476mm x 268mm
1920x1080 60.00*+ 59.94 50.00
1680x1050 59.95
1600x900 60.00
1440x900 59.89
1280x1024 60.02
1280x800 59.81
1280x720 60.00 59.94 50.00
1024x768 60.00
800x600 60.32
720x576 50.00
720x480 59.94
640x480 59.94 59.93
DP-0 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
3840x2160 60.02*+ 48.02
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-1-1 disconnected (normal left inverted right x axis y axis)
HDMI-1-1 disconnected (normal left inverted right x axis y axis)
DP-1-2 disconnected (normal left inverted right x axis y axis)
HDMI-1-2 disconnected (normal left inverted right x axis y axis)
light@light:~$
Я просто запустил приведенную ниже команду, и она отлично работала:
light@light:~$ xrandr --output HDMI-0 --scale 2x2 --mode 1920x1080
light@light:~$
--scale 2x2
подразумевает сделать все на внешнем экране вдвое меньше.
--mode
это разрешение, которое вы хотите.
это оно