xlib - 如何找到在 linux 中放置特定窗口的监视器的 dpi?

标签 xlib xorg xrandr

当我的应用程序窗口从一台显示器移动到另一台显示器时,我想根据目标显示器的基础 dpi 更改字体大小。

我玩过 xrandr、xdpyinfo 和 xlib。我查看了源代码,但找不到关联放置窗口(窗口 ID)的监视器的方法。

Qt 有 QDesktopWidget,它提供 physicalDpiX/Y 但仅(看起来)用于主监视器。

xrandr.h 包含提供 mm_width 和 mm_height 的 XRROutputInfo,但我如何才能连接到窗口 ID?

既然这个问题得到了一些关注,我想分享一下我的研究。我还没有找到完美的解决方案。看起来这是不可能的。

但使用以下代码片段可能会对您有所帮助。这个想法是通过比较窗口位置来计算底层显示。如果位置大于第一个屏幕的分辨率,则必须是第二个显示器。非常简单。

#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#include <stdio.h>
#include <stdlib.h>

// compile: g++ screen_dimension.cpp -lX11 -lXrandr

int main()
{
  int wid = atoi( getenv( "WINDOWID" ) );

  printf("window id: %i\n", wid);

  Display * dpy = XOpenDisplay(NULL);
  int screen  = DefaultScreen(dpy);
  Window root = DefaultRootWindow(dpy);
  
  XRRScreenResources * res = XRRGetScreenResourcesCurrent(dpy, root);
  
  XRROutputInfo * output_info;

  for (int i = 0; i < res->noutput; i++)
  {
      output_info = XRRGetOutputInfo (dpy, res, res->outputs[i]);
 
      if( output_info->connection ) continue; // No connection no crtcs
          printf(" (%lu %lu) mm Name: %s connection: %i ncrtc: %i \n",  output_info->mm_width
            , output_info->mm_height
            , output_info->name
            , output_info->connection
            , output_info->ncrtc
          );
  }
 
   printf("crtcs:\n");
  for( int j = 0; j < output_info->ncrtc; j++ ) {
    XRRCrtcInfo * crtc_info = XRRGetCrtcInfo( dpy, res, res->crtcs[ j ] );
    if( not crtc_info->noutput ) continue;
    printf("%i w: %5i   h: %5i     x: %5i    y: %i\n", j
    , crtc_info->width
    , crtc_info->height
    , crtc_info->x
    , crtc_info->y
    );
  }
}

查询屏幕资源实际上有2个函数: XRRGetScreenResourcesCurrent 和 XRRGetScreenResources。第一个返回一些缓存的值,而后者询问可能引入轮询的服务器。描述(搜索 RRGetScreenResources): https://www.x.org/releases/X11R7.6/doc/randrproto/randrproto.txt

有人在计时时遇到了麻烦: https://github.com/glfw/glfw/issues/347

XRRGetScreenResourcesCurrent:通常为 20 到 100 us。 H XRRGetScreenResources:通常为 13600 到 13700 us。

最佳答案

好的,因为这里没有进一步的讨论,而且我确信我的小程序(见上文)有效,我现在声明它:已回答!

编译指令是

g++ screen_dimension.cpp -lX11 -lXrandr

(也添加为上面的评论)

关于xlib - 如何找到在 linux 中放置特定窗口的监视器的 dpi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29625442/

相关文章:

nvidia - xrandr 根本不显示 HDMI

c++ - 没有标题栏的简单窗口

c - Xlib:如何检查特定窗口是否最小化?

c - 缩放 MandelBrot 集

linux - 如何在 Linux 的帧缓冲区中定义不支持的屏幕分辨率?

linux - Xinerama 是否导致我的代码出现问题?

c++ - 使用 XFT 库绘制彩色字符串的更快方法是什么?

java - 如何为虚拟屏幕运行我的 Java 应用程序?

ubuntu - 在 Linux 上禁用特定屏幕的用户交互