我试图创建一个DPI感知应用程序,它通过调整窗口响应用户请求的DPI变化事件。
有问题的程序是用C创建和使用SDL2,但是找回我用的xlib直接,如X11的SDL DPI支持缺乏系统DPI信息。
我发现了两种方式来获得在程序启动正确的DPI信息,既包括来自Xresource获得Xft.dpi信息:一个是使用XGetDefault(显示“的Xft”,“DPI”),而另一种是使用XResourceManagerString,XrmGetStringDatabase和XrmGetResource。它们都返回正确的DPI值,在创建程序时。
问题是,如果用户改变了程序运行时的系统规模,无论是XGetDefault ABD XrmGetResource还是回到甚至当我运行虽然旧的DPI值“xrdb - 查询| grep的Xft.dpi”的价值确实变了。
有谁知道一种方式来获得更新的Xft.dpi价值?
你可以尝试xdpyinfo(1)使用;我的系统上它输出,有很多其他的事情之中:
dimensions: 1280x1024 pixels (332x250 millimeters)
resolution: 98x104 dots per inch
depths (7): 24, 1, 4, 8, 15, 16, 32
我不知道它是否能帮助你,因为我不知道你如何改变你的屏幕的DPI,但机会是它的工作原理。祝好运!
---更新后评论---从OP下面留言,有人说“有改变DPI设置” ......可是我还是不知道。无论如何,我想按Ctrl + Alt +加号和Ctrl + Alt +减号来动态更改X服务器的分辨率。在已经改变了分辨率,看到的一切比以前更大,我又跑xdpyinfo。它没有工作:仍然是相同的输出。不过,可能是你使用方法(?),而不是作品...
我找到了一种方法做正是我想要的,即使它是相当的hackish。
(使用XLib
)的解决方案是创建使用XOpenDisplay
和XCloseDisplay
X服务器新的临时连接,并轮询来自新连接的资源信息。
这是需要的原因是因为X每个新的连接只有一次获取资源信息,并且永远不会更新它。因此,通过打开一个新的连接,X将得到更新xresource
数据,然后可以使用旧的主连接。
要留意的是不断地打开和关闭新的X连接可能不会很大的性能,所以只有做它时,你绝对需要。在我的情况下,由于窗口有边界的,我只检查DPI变化的时候,标题高度已经改变,作为一个DPI的变化将您的标题边框的大小变化,由于字体大小的差异。