Как найти dpi монитора, на котором определенное окно находится в Linux?

Я хочу изменить размер шрифта, когда окно моего приложения перемещается с одного монитора на другой, в зависимости от базового разрешения на целевом мониторе.

Я играл с xrandr, xdpyinfo и xlib. Я посмотрел на исходный код, но не смог найти способ связать монитор, на котором размещено окно (идентификатор окна).

У Qt есть QDesktopWidget, который предоставляет физический DpiX/Y, но только (так кажется) для основного монитора.

xrandr.h содержит XRROutputInfo, который обеспечивает mm_width и mm_height, но как мне установить соединение с идентификатором окна?

Поскольку этот вопрос привлек к себе внимание, я хочу поделиться своими исследованиями. Я не нашел идеального решения. Похоже, это невозможно.

Но игра со следующим фрагментом кода, вероятно, поможет вам. Идея состоит в том, чтобы вычислить базовый дисплей, сравнивая положение окна. Если позиция больше, чем разрешение первого экрана, и должен быть второй монитор. Довольно прямо вперед.

#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 ответа

Решение

Хорошо, так как здесь нет дальнейшего обсуждения, и я убежден, что моя маленькая программа (см. Выше) работает, я объявляю ее теперь как: Ответил!

Инструкция по компиляции

g ++ screen_dimension.cpp -lX11 -lXrandr

(также добавлено как комментарий выше)

Почему так сложно?! Просто получите информацию с экрана, к которому прикреплено ваше окно.

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);
Другие вопросы по тегам