上下文:编写一个应该是跨平台的绘图程序.所以我有多个前端负责提供对Cairo上下文的后端类访问,基本事件处理和窗口小部件大小信息.我最近决定将当前的UI比例(用于高DPI显示)添加到最后一位,主要是因为我想将图形切换为渲染到图块缓存,所以我需要知道显示器可以支持的最高级别的细节.
在我的小跨平台世界中,我希望后端类的前端适配器我正在谈论正确配置Cairo上下文以便在将其交给我之前在虚拟化像素中工作.我只需要比例来限制我在瓷砖上使用的缩放比例.
在AppKit上,这很容易:要求NSView将1个虚拟像素的NSSize缩放为"后备存储坐标",并将其交给后端类.Apple也非常聪明,可以提供预先扩展的CoreGraphics上下文,因此我所要做的就是请求翻转坐标并将CGContext推送到Cairo.
在GTK上我有点困惑.似乎有太多方法可以做到这一点.GtkWidget有一个" get scale factor "调用,gint gtk_widget_get_scale_factor (GtkWidget *widget)它返回一个整数值.这似乎有点过于严格,因为你无法处理这种情况之间的屏幕.即我所关注的28"3840x2160显示器应该是1.5倍显示器,但在GTK下,一切都会太小或太大.
Ubuntu也投入了自己的扳手,因为它有自己的DPI比例因子,似乎与其他一切不同.只有少数应用程序似乎真正支持它.我把它调到了1.5; Firefox和Brackets没有扩展,Nautilus和终端确实扩展,Empathy做了这个奇怪的事情,除了会话文本之外的所有内容.所以它显然不是全系统的,甚至不是内置于GTK ...... blarrgh.
另外,X11有自己获取DPI信息的方式,我听说这是非常不准确的,无论如何都不值得考虑,因为Mir和Wayland无论如何都要替换它.
但是,我无法找到有关这个超级特殊的Unity API的任何信息,以获取用户指定的UI比例.所以我现在要抓住GTK自己的整数刻度,我认为这不足以满足要求.我真的很想知道如何获取Unity scale参数,或任何其他桌面环境自己的专有UI比例参数,但我有一种感觉,我可能还需要发送自定义首选项来为此特定前端手动配置UI缩放.
(对于那些好奇的人:我的代码在这里可用- 我正在讨论的后端类是在src/canvasview.cpp中,前端"视图适配器"的例子在frontends/gtk/src/CanvasWidget.cpp和frontends /中分别是appkit/src/ICAKCanvasView.m.请记住,当我忙于调试基于tile的渲染时,代码当前处于损坏状态.)