Linux平台上的多屏幕支持一直不像Windows和Mac那么友好。近日在配置多屏幕不同DPI,实现不同比例缩放时碰到了麻烦。本博记录一下解决的思路和解决方案,供日后参考。虽说并不完美,但不影响使用。

环境信息

系统环境:

Ubuntu 18.04 LTS (未启用Wayland)

X.Org X Server 1.19.6

Gnome 3.28.2

计算机型号:华为MateBook 13 2018

显示设备:

屏幕1:内置显示器 (奇美CMN8201面板)13寸 分辨率:2160×1440 DPI 200

屏幕2:飞利浦246E 23寸 分辨率:1920×1080 DPI 96

笔记本居左,外置显示器居右。

# xrandr信息

# 内置显示器为eDP-1,外置显示器为DP-1

Screen 0: minimum 320 x 200, current 4080 x 1440, maximum 8192 x 8192

eDP-1 connected primary 2160x1440+0+0 (normal left inverted right x axis y axis) 275mm x 183mm

2160x1440 60.00*+

(下略)

DP-1 connected 1920x1080+2160+0 (normal left inverted right x axis y axis) 521mm x 293mm

1920x1080 60.00*+ 50.00 59.94

(下略)

两屏幕均使用核显输出。在添加第二显示器之前,gnome使用1.25缩放比例,系统全局使用100%缩放比例。添加第二显示器后,由于内置显示器的高DPI,外置显示器的内容均被放大两倍,浏览网页还能将就,但在写程序时候需要来回调整字体,很不方便。

xrandr 配置思路

xrandr是Xorg官方对于randr的配置工具。底层原理也是将两块屏幕的显示内容按照给定参数拼接到一块“画布 ”上,再进行输出。画布的大小等于两块屏幕的物理分辨率*缩放系数的和。当不进行任何配置的时候,Xorg默认使用1.0的缩放倍数对两显示器进行配置。因此出现了同样200DPI的情况下,外置显示器显示偏大的问题。

为优先确保内置屏幕的显示质量,我们采用统一DPI=200进行配置。因此,配置思路是把这块“画布”上内置显示器的区域不变,把外接显示器的画布扩展,实现同物理显示区域内显示内容增加来达到缩小的目的。

配置过程

根据HiDPI官方给出的公式,命令如下:

xrandr --output eDP-1 --auto --output HDMI-1 --auto --panning [C*E]x[D*F]+[A]+0 --scale [E]x[F] --right-of eDP-1

# Generically if your HiDPI monitor is AxB pixels and your regular monitor is CxD and you are scaling by [ExF], the commandline for right-of is:

以本文为例:

xrandr --output eDP-1 --auto --output DP-1 --auto --panning 2880x1620+2160+0 --scale 1.5x1.5 --right-of eDP-1

两显示器均配置为auto模式,–panning参数设置鼠标可取范围。一定要注意这个参数的设置,否则鼠标可能无法正常移动。命令执行后,Ubuntu将全局的缩放比例自动调节到了200%,手动调节回100%后,出现了两屏幕显示区域重叠、鼠标位置不正常的问题。此外,在内置显示器上还存在鼠标闪烁的问题。好消息是在200%缩放比例下,两屏幕的显示比例一致,没有出现一边大一边小的问题,证明整体思路是可行的。接下来,就是填坑了。

全局缩放比例调整带来的异常

在这一块,Gnome做得确实要比原来的Ubuntu Desktop差着不少,没想到会有这么多的麻烦。猜想可能是 xrandr 中 –auto参数导致的问题,在缩放比例进行调整后xrandr无法正确识别并应用配置文件。遂对需要的参数进行一一指定:

xrandr --dpi 200 --fb 5040x1620 --output eDP-1 --mode 2160x1440 --pos 0x0 --output DP-1 --scale 1.5x1.5 --pos 2160x0 --panning 2880x1620+2160+0

–dpi: 强制全局使用200% dpi

–fb: 指定画布大小。双显示器横向并列防止,故:长边 = 2160 + 1920 * 1.5 = 5040;短边取1620(1440 和 1080*1.5的较大值)。

–pos: 指定显示器的位置,笔记本在左侧,pos=0x0;第二显示器在右侧,pos=2160×0

经过设置后,显示效果恢复正常,但鼠标闪烁的问题仍未解决。

解决鼠标闪烁:玄学参数

将内置显示器的显示比例调整为:–scale 0.9999×0.9999。

完整命令:

(仅限Intel核显用户)除此解决方法外,也有帖子指出修改Xorg的配置文件才是根本解决方案。方法为:在 /etc/X11/xorg.conf.d/ 下新建20-intel.conf文件,内容为:

Section "Device"

Identifier "Intel Graphics"

Driver "intel"

Option "AccelMethod" "sna"

Option "TearFree" "true"

EndSection

以上内容可能适用于稍老型号的Intel核显。我在UHD620(8代i5)上实测并未解决鼠标闪烁,反而增加了水波纹、斜纹等问题。写在这里仅供参考。

最终效果

还是会有点小毛病,首先是在移除第二显示器之后无法自动恢复,还需再次执行xrandr –auto。在快速拖动窗口时候仍旧可见一点斜纹和水波纹,不过终究不是什么大问题,不影响使用。

xrandr 只有一个显示屏_xrandr – 多屏幕不同DPI配置踩坑记相关推荐

  1. i3wm 屏幕配置踩坑

    i3wm 屏幕配置踩坑 前言 踩坑 前言 自从18-19年开始正式使用linux作为我的开发系统就一直没有换回windows,从一开始的 ubuntu 到后来的manjaro 感觉越来越有意思可玩性很 ...

  2. 总结!一个产品新手的踩坑记

    本文讲的是总结!一个产品新手的踩坑记, 加入产品大家庭正好三个月了,在大佬们面前不敢造次,于是,觉得可以拿出来分享的,便是在这段春夏交替之光里,亲脚踩的一些坑,以及在坑里获得的一些小发现.所幸的是,在 ...

  3. xrandr 只有一个显示屏_给大家介绍一种命令行模式下的多屏分屏工具xrandr

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 archlinux WIKI上的介绍是这样的: "xrandr" 是一款官方的 RandR Wikipedia:X Window Sy ...

  4. ts踩坑记|指定一个object类型

    声明一个object类型的变量需要把这个对象里面键值对都声明出来,比较偷懒的方法就是像下面一样 private userData : { [key: string]: any }

  5. 使用C# winform 制作一个按钮可自适应屏幕大小的 简易加减乘除计算器

    一:成果物     不多展示,,,我们开始吧.. 二: 窗体包含内容 2.1 显示屏部分组成 显示屏部分由两个组件组成,一个是方便操作的panel控件位于顶部,且为了使其显示屏在改变窗体大小时一直位于 ...

  6. 一个抓取电脑屏幕的小控件台程序

    一个抓取电脑屏幕的小控件台程序 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  7. android屏幕适配:一个很棒的屏幕适配文章

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入 ...

  8. 独立开发变现周刊(第81期):开发一个应用来减少屏幕使用时间,月收入2万美元...

    分享独立开发.产品变现相关内容,每周五发布. (合集:https://ezindie.com/weekly ) 目录 1.组件世界 WidgetStore:一个丰富.强大的嵌入式小组件库 2.Dist ...

  9. 笔记本软件页面分辨率低_我卸载错了一个软件,电脑屏幕分辨率就变得很差

    满意答案 farmerlife 2013.10.25 采纳率:45%    等级:12 已帮助:2596人 我卸载错了一个软件,电脑屏幕分辨率就变得很差 来回答你的问题,我是专做电脑维修的 1:有时候 ...

最新文章

  1. python学习07
  2. 秒懂机器学习---朴素贝叶斯
  3. matlab多项式相乘的法则_卷积计算与多项式乘法
  4. web页面 float定位导致“溢出现象”处理
  5. docker查询占用端口号服务命令
  6. MySql分表、分库、分片和分区知识(转载)
  7. MySQL高级 - 案例 - 需求及环境准备
  8. ASP.NET Core 2.0 : 二. 开发环境
  9. ZOJ1221 Risk 图形的遍历
  10. 【LeetCode笔记】338. 比特位计数(Java、位运算、动态规划)
  11. vue报错Invalid Host header
  12. 工厂方法(FactoryMethod)模式
  13. php接收vb post数据,VB Post方式提取网页数据
  14. 微信公众号-自定义菜单的创建
  15. Android 蓝牙扫描
  16. 逃出你的肖申克(五):看不见的牢笼(上)
  17. 【FinE】债券久期和凸性
  18. OpenWrt network 启动过程
  19. 净资产收益率与市盈率的关系
  20. eot文件html,html – 为什么IE8没有加载我的eot文件?

热门文章

  1. C语言结构体中指针指向数组,指向结构体类型数组的指针的使用
  2. 办公室一族喝茶养生:黄芪泡茶使精力旺盛
  3. Excel基础篇(一):绝对引用、相对引用
  4. Max做履带,简单方法一则
  5. 洛谷P3047 附近的牛 树形dp
  6. 隐马尔可夫模型(二):模型详解
  7. 特朗普“口中”的苹果,是“福”还是“祸”?
  8. Copy-on-Wirte
  9. 使用一个统一的窗体样式风格
  10. 使用summernote富文本编辑器没显示图标【已解决】