Как найти 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);