Linux上的HiDPI,特别是KDE

分辨率为4K的显示器已不再被视为资产阶级的重头戏,它们正逐渐进入普通人的生活。 以及其他高分辨率的显示器。 几年前,我谈到Linux上对此类监视器的支持时说,“而不是”。 似乎有支持,但是故障的数量使整个过程变得毫无意义,我真的想将显示器切换到较低的分辨率。 到目前为止,某些4K显示器在Linux中还不具备这些功能。 事实是,NVidia驱动程序通过DisplayPort连接时,天真地相信监视器的EDID,并且如果只在其中写入一个最大分辨率,则不允许设置其他任何分辨率。 您必须回滚到Nouveau或配置HiDPI。 我们将定制! (本文面向的读者是了解Linux的基础知识以及什么是X服务器的人)。

关于DPI,尤其是HiDPI


DPI (每英寸点数)是一个值,表示屏幕的多少像素是其面积的物理厘米。 如果显示器以非本机分辨率工作,那么我们正在谈论的是虚拟分辨率像素。 从远古时代到最近,一直以96 DPI为标准-也就是说,如果与普通显示器有所不同,那么它可以忽略不计。 120 DPI曾经是经常测试的最大值。

毫不奇怪,多年来,软件开发人员一直将此价值视为不可动摇的常数。 突然出现160-192 DPI的显示器,它开始了。 界面中至少具有一定大小的所有程序都以像素为单位进行设置,它们会相互重叠,并有第一个字母的签名和按钮,您必须为成功按下这些按钮提供现金奖励。

HiDPI一词是指DPI> 160的监视器上的情况。 操作系统的DPI不一定等于屏幕的DPI。 相反,DPI系统可以扭曲以使接口越来越大。 此外,系统区分所有内容的DPI,字体的DPI和提供给全屏应用程序的DPI。

别人呢?


Makos帮助了她的专制统治。 由于几乎所有程序都通过相同的API创建其接口,因此只需对其进行修复即可立即解决。 单独的坚不可摧的门柱仅仅强调了整体的整体水平。

Android诞生于DPI分布较广的系统上,因此它能够从尿布做起所有事情,因此面向程序员的教科书考虑了这一点。

Windows始终允许扭曲DPI字体。 这只是DPI图形,因此没有改变。 各个元素更改了它们的大小,因为它们与字体或屏幕的大小有关。 但是以像素为单位指定的大小并没有因此改变。 最后,在Win 10中,有正常的HiDPI支持,但仅针对为Win 10编写的程序。其余部分,编写了一个拐杖,简单地通过点击位置的转换在程序窗口中增加了图形。 缩放会使窗口模糊,并且广播效果不佳。 最糟糕的是,这种增加也试图在全屏应用程序中开始,因此要播放,您需要先将其关闭,然后再将其打开。

那Linux呢?


在Linux上,一如既往。 我们有两个主要的GUI集合(Qt和GTK),每个集合都相对较新,可以从头开始重写,因此旧版本和新版本仍在使用中。 加上一些较小的集合(EFL,wxWidgets)。 加上几种使用其工具的语言,例如Java。 再加上一些没人写的古老图书馆,但仍然有必要的软件。 (GTK 1,Motif)即使X服务器和窗口管理器正确处理了DPI,也不是所有的Zoo都会接受此信息并且可以正常工作。

关于使用Unity的Ubuntu,您可能不喜欢很多,但是我不得不说一件事。 我不知道如何在Unity中配置HiDPI,因为一切总是可以立即使用的。 所有其他DE:Cinnamon,KDE,XFCE也都有相应的标志。 该标志设置DE本身,在其主库中编写的应用程序(仅新版本)以及Qt / GTK的几个标志。 其余的都是侧身。 结果,例如在播放器中,“播放”按钮仍然很小。 托盘图标很小,但不是全部。 使用这样的系统一年后,《守望先锋》中的人只为麦克莱克(McCrack)效力,因为该人在鼠标上具有逐像素的准确性,并且他讨厌所有人。

我将讨论如何配置KDE。 并非按照指示进行,而是使一切正常。 Deadbeef,Yakuake,Blender。 我主要在Arch中检查过它。 在其他发行版中,可能我所描述的某些内容已经完成或以其他方式完成。 用脑袋思考或写评论-我们会解决的。

X设定


首先要检查的是X是否知道我们有HiDPI? 为此,我们需要xdpyinfo xdpyinfo -它在萝卜中。 设置显示器的本机分辨率(如果未安装)(然后重新启动X。) 在X内的控制台中运行(即,不按Ctrl-Alt-F *)。

 xdpyinfo | grep -B 2 resolution screen #0: dimensions: 3840x2160 pixels (621x341 millimeters) resolution: 157x161 dots per inch 

我们看到三对值-屏幕分辨率,实际屏幕尺寸和DPI(分别在垂直和水平方向)。如果这三对值均与真相相似,则不要使用显示器,而是要对您选择的最高实体表示赞赏。 如果xdpyinfo返回废话并且DPI = 96,那么更高的存在会给您带来麻烦。

错误DPI的最常见原因是视频卡上的EDID曲线和木柴烙印。 我不会谈论ATi视频卡,因为我会避免使用它们。 并不是说它们很糟糕,而是ATi + Linux =不必要的问题。 使用英特尔,一切都会正常。 直到最近NVidia顽固地腐烂了DPI。 首先,在nvidia-settings关闭G-sync,无论如何,没有复合管理器是它的朋友。 如果这样做没有帮助,请启用KMS。 内核模式设置是Linux内核(而不是X)管理屏幕分辨率的方法。 除了直接使用之外,这还使您可以在20年前使用X解决许多错误代码。 不幸的是,在专有Nvidia驱动程序上启用KMS的过程取决于发行版,因此我将仅以一般性术语进行描述。 您需要在initramfs中添加模块nvidia, nvidia_modeset, nvidia_uvm, nvidia_drm ,重建它,然后将参数nvidia-drm.modeset=1到内核​​。 谷歌

如果在上一段中您什么都不懂,那么您可以简单地放弃NVidia品牌的柴火,现在使用Nouveau-KMS开箱即用。 在Kubunt中,这是通过管理驱动程序的程序完成的。

如果以上所有方法均无济于事,并且xdpyinfo仍在写入垃圾,则可能是视频驱动程序,但是监视器的EDID曲线应归咎于此。 首先,在同一控制台中运行xrandr --dpi 192 。 并运行一些程序。 如果变得更大,则该方法有效。 将此命令粘贴到.xprofile然后重新启动.xprofile 将来,我将谈论很多有关.xprofile 。 这是每个用户主文件夹中的文件,用于配置图形应用程序的操作。 如果没有,只需创建它: touch ~/.xprofile 。 如果一切正常-万岁! 如果不是,请首先检查您的发行版是否没有从KDE中.xprofile支持。 为什么要在其中添加诸如touch ~/net_ne_vyrezali然后再次重新启动。

还是不行? 让我们在X中手动注册DPI。 创建文件/etc/X11/xorg.conf.d/90-monitor.conf (如果尚未创建)并写入:

 Section "Monitor" Identifier "Prikolny monitor" DisplaySize 286 179 #   EndSection 

对于Nvidia品牌的柴火

 Section "Monitor" Identifier "Prikolny monitor" Option "DPI" "192 x 192" EndSection 

请注意,在所有地方,我都将强制DPI值设置为192,或更确切地说,将其设置为96的倍数。由于它是唐蒲,因此它比实际DPI更加准确。 设计师的悖论在这里起作用:

  • 如果DPI是96的倍数,则可以在使用文本的应用程序中更好地呈现字体。 特别是在开罗应用程序中。
  • 如果DPI等于监视器的实际DPI,则屏幕上的1:1比例将与纸上的比例相同。

我写了监视器的愚蠢名称,以便在所有图形实用程序中都可以看到我们的设置已被读取并尝试应用。

保存,重新启动X并高兴。 或喝点苦酒,然后等待Wayland完成。

在KDE中进行配置


因此,最后,我们在KDE中正确配置了HiDPI。 在菜单→系统设置→显示和监控的最底部,有一个大的“ 比例显示”按钮。 按下它,将弹出带有单个“ 缩放”滑块的窗口。 现在注意! 如果仍然无法在Xs中配置DPI,请关闭本文,将滑块的值设置为“品味”,然后享受可行的方法。 和什么不起作用-调和(通常是Chrome,Skype,QtCreator,Yakuake和GTK)。

如果Xs中的DPI正确,则请勿触摸此滑块! 理想情况下,甚至不要来回扭曲,因为似乎他在某处写东西。 关闭此窗口nafig。 根据此滑块的创建者博客文章 (注释中的盐),他覆盖了系统DPI并设置了更多变量。 问题在于,并非所有程序都可以看到此重新定义,而且事实证明这是一团糟。 因此,我们不会触摸滑块,但是会手动配置所有内容。

通常,在此阶段,如果DPI正确,则所有内容都应该已经足够大。 进入系统设置→字体 。 默认情况下,字体大小为11。如果10-14足以使您实现和谐-放它,应用程序将迎头赶上。 如果或多或少-尝试使用如上所述的子系统DPI是有意义的。 以下是“强制字体DPI”字段。 您可以根据需要扭曲它,但是请记住,并非所有应用程序都读取该值。 甚至没有。 某些应用程序并未全部读取该值。 因此,如果您尝试在此处将系统DPI修复为96,则会出现混乱。 但是您可以将显示器的DPI 167提高到理想值192。

关闭字体窗口。 通常,现在是重新启动X并查看发生了什么的时候。 它们应该工作,并具有方便的KDE大小,所有设置和应用程序。 顺便提一下,等离子面板本身不会增长。 但是它是矢量的,您可以随时拉伸它-单击左侧的三明治,将出现按钮。 另外,必须手动设置“海豚”中的尺寸。 如果在KDE应用程序中的其他地方按钮和面板太小,则需要在系统设置→图标中调整图标大小。

我们配置其他应用程序


Chrome,Atom等


这些应用程序直接从DPI的来源读取DPI,并像骑士的代码一样跟随它。 如果他们读错了什么,那么他们看起来会有些不对。 通常,他们会忽略“系统设置”中的设置,并遵循xdpyinfo返回的DPI。 如果有96,那么对于Chrome,您可以使用参数--force-device-scale-factor=2 ;对于Atom,官方萝卜中有一个hidpi曲线插件,而对于其他程序则是拐杖。

QtCreator,Yakuake和其他Qt5应用程序


通常,它们应该起作用 。 但是QtCreator有时无法缩放工具栏,而Yakuake没有选项卡栏。 原因在于错误和环境变量QT_AUTO_SCREEN_SCALE_FACTOR 。 当它等于1 ,Qt5会尝试查找DPI值本身,而当它为0 -它期望此值将在其他变量中提供给它。 错误是KDE传递了垃圾。

简而言之,这些应用程序需要将变量QT_AUTO_SCREEN_SCALE_FACTOR=1设置为QT_AUTO_SCREEN_SCALE_FACTOR=1 ,一切都会正常。 这可以有选择地或全局地完成。 在菜单编辑器中选择。 只需记住将应用程序添加到面板中并在以后自动运行即可。 这是因为.desktop条目是复制的,而不是链接的。 第二个选项是在.xprofile甚至/ etc /环境中 ,或在您的发行版中写入变量的位置,在系统范围内设置此变量。 有两个细微差别。 首先,KDE在/ usr / bin / startkde脚本中强制将此变量重置为0。 您必须打开它并通过#export QT_AUTO_SCREEN_SCALE_FACTOR=0行来对其进行编辑。 之后,记住每次更新KDE时都要重复此补丁。 第二个警告是KDE开发人员在注释中发出警告:全局设置此变量可能导致某些Qt5应用程序被双重放大。 但是,这对我而言并非如此。 此外,如果系统DPI不正确,则需要在.xprofile中设置变量QT_SCALE_FACTOR=2

请记住,不建议使用QT_DEVICE_PIXEL_RATIO变量。 如果将其放在某个位置,则需要将其删除。

Qt4应用


通常,这些应用程序不适合HiDPI。 但是,并非一切都丢失了。 Qt4创建了一个非常灵活的界面。 运行qtconfig-qt4 。 首先,查看字体并设置一个方便的大小。 然后,在“接口”选项卡上,找到一个名为“ Global strut ”的拐杖(翻译为-全局拐杖。)此设置意味着QWidget及其后代的实例无论大小如何都不能小于此大小(以像素为单位)。 使用最小宽度,您可以设置滚动条的宽度,并使用最小高度 -工具栏的高度。

GTK3应用


这里的一切都很简单。 您需要在.xprofile中设置两个变量:

GDK_SCALE=2命令GTK将所有内容增加2倍。 该值必须是整数。 GDK_DPI_SCALE调整字体放大。 如果在GDK_SCALE之后字体很大,则需要设置GDK_DPI_SCALE=0.5

GTK2应用


这里的一切都很复杂。 GTK2不知道如何使用HiDPI。 但是有一个hack。 称为Oomox的Softina是GTK主题(皮肤)的生成器。 包括在它的帮助下,您可以在GTK2下收集这样的主题,该主题将模仿 HiDPI。 或者找到一个准备好的话题。

在Qt3,Gtk1,Motif上的应用


这里的一切都很复杂。 有两种可能的破解方法。 首先,您可以利用Kwin的功能来放大整个屏幕。 系统设置→桌面效果→桌面效果→缩放 。 左侧的中间按钮是设置,包括用于打开和关闭的键。 第二种方法是在远程桌面服务器上运行该应用程序并在本地连接到它。 我将仅插入指向脚本链接 ,因为对其进行设置是另一篇文章的问题。

Java应用程序


更酷,更商业化的Java程序的行为类似于Chrome:它们从X读取DPI并遵循它。 可以使用以下两个参数之一来修复-Dsun.java2d.uiScale=2程序: -Dsun.java2d.uiScale=2将接口增加2倍,并且-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel告诉她使用GTK中的尺寸进行绘制。 让我提醒您,您可以在.xprofile中创建export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'变量export _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel' 。 此示例包括字体和GTK中的抗锯齿。

好吧,莫名其妙。

Source: https://habr.com/ru/post/zh-CN403165/


All Articles