c - 如何在 X11 中获取系统比例因子

标签 c linux gtk x11

我想让我的纯 X11 应用程序具有高 DPI 感知能力。为此,我需要一种方法来找出在显示设置中配置的系统比例因子。有什么方法可以从 X11 应用程序中获取此系统比例因子,而无需诉诸 GTK 等更高级别的 API?

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

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

最佳答案

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

  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;
}

这对我有用。

关于c - 如何在 X11 中获取系统比例因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49071914/

相关文章:

c - 分页代码片段

c - 如何更新变量代表的地址?

linux - 读取并解析 perf.data

c - 带有 exec 的单进程树

c - GTK 文本输入以编程方式更新

c++ - 无模式、无父 wxDialog 仍然总是在 z 顺序的 wxFrame 窗口上方?

c++ - C或C++新手应该知道哪些库?

c - pop函数解释

linux - Bash 用字符串替换部分输出

gtk 中的困惑阶段无法处理阶段鼠标按下事件