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

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

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

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

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

c linux gtk x11
1个回答
0
投票

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

  1. XRandR
  2. X11的DisplayWidth/HeightDisplayWidthMM/HeightMM
  3. 看着xdpyinfo输出

都没有返回正确的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;
}

这对我有用。

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