如何在X11中获得系统比例因子

时间:2018-03-02 15:10:28

标签: c linux gtk x11

我想创建我的应用程序,它纯粹是在X11中,具有高DPI感知能力。为此,我需要一种方法来找出在显示设置中配置的系统比例因子。有没有办法从X11应用程序获得这个系统比例因子,而无需使用像GTK这样的更高级别的API?

FWIW,我查看了GTK源代码,了解gdk_window_get_scale_factor()是如何做到的,它似乎读取了一个名为GDK_SCALE的环境变量。然而,这个环境变量在我的系统上根本不存在,即使我已经在4K显示器上设置为1.75。

那么如何以编程方式检索系统缩放因子?

1 个答案:

答案 0 :(得分:0)

为了回答我自己的问题,我现在尝试了三种方法:

  1. XRandR
  2. X11' DisplayWidth/HeightDisplayWidthMM/HeightMM
  3. 查看xdpyinfo输出
  4. 都不会返回正确的DPI。相反,Xft.dpi Xresource似乎是这个问题的关键。 Xft.dpi似乎总是带有正确的DPI,因此我们只需读取它即可获得系统比例因子。

    这里的一些来源取自here

    #include <X11/Xlib.h>
    #include <X11/Xatom.h>
    #include <X11/Xresource.h>
    
    double _glfwPlatformGetMonitorDPI(_GLFWmonitor* monitor)
    {
        char *resourceString = XResourceManagerString(_glfw.x11.display);
        XrmDatabase db;
        XrmValue value;
        char *type = NULL;
        double dpi = 0.0;
    
        XrmInitialize(); /* Need to initialize the DB before calling Xrm* functions */
    
        db = XrmGetStringDatabase(resourceString);
    
        if (resourceString) {
            printf("Entire DB:\n%s\n", resourceString);
            if (XrmGetResource(db, "Xft.dpi", "String", &type, &value) == True) {
                if (value.addr) {
                    dpi = atof(value.addr);
                }
            }
        }
    
        printf("DPI: %f\n", dpi);
        return dpi;
    }
    

    这对我有用。