我怎样才能在C程序从X11更新的系统DPI信息?

问题描述 投票:1回答:2

我试图创建一个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价值?

c x11 sdl-2 highdpi
2个回答
0
投票

你可以尝试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。它没有工作:仍然是相同的输出。不过,可能是你使用方法(?),而不是作品...


0
投票

我找到了一种方法做正是我想要的,即使它是相当的hackish。

(使用XLib)的解决方案是创建使用XOpenDisplayXCloseDisplay X服务器新的临时连接,并轮询来自新连接的资源信息。

这是需要的原因是因为X每个新的连接只有一次获取资源信息,并且永远不会更新它。因此,通过打开一个新的连接,X将得到更新xresource数据,然后可以使用旧的主连接。

要留意的是不断地打开和关闭新的X连接可能不会很大的性能,所以只有做它时,你绝对需要。在我的情况下,由于窗口有边界的,我只检查DPI变化的时候,标题高度已经改变,作为一个DPI的变化将您的标题边框的大小变化,由于字体大小的差异。

© www.soinside.com 2019 - 2024. All rights reserved.