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

时间:2015-04-14 10:49:22

标签: xlib xorg xrandr

我希望在应用程序窗口从一台显示器移动到另一台显示器时更改字体大小,具体取决于目标显示器的底层dpi。

我玩过xrandr,xdpyinfo和xlib。我看了一下源代码,但是我找不到一种方法来关联放置窗口(窗口id)的监视器。

Qt有QDesktopWidget,它为主监视器提供physicalDpiX / Y但只是(看起来似乎如此)。

xrandr.h包含XRROutputInfo,它提供mm_width和mm_height,但是如何连接到窗口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 个答案:

答案 0 :(得分:0)

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

编译说明

  

g ++ screen_dimension.cpp -lX11 -lXrandr

(也作为上述评论添加)

答案 1 :(得分:0)

为什么这么复杂?只需从窗口所在的屏幕上获取信息即可。

double dDisplayDPI_H,dDisplayDPI_V;

dDisplayDPI_H   = ((double)DisplayWidth( dpy, scr ))/(((double)DisplayWidthMM( dpy, scr ))/25.4);
dDisplayDPI_V   = ((double)DisplayHeight( dpy, scr ))/(((double)DisplayHeightMM( dpy, scr ))/25.4);