如何查询X11显示器分辨率?

20

这似乎是一个简单的问题,但我找不到答案:如何通过 X11 查询存在哪些显示器以及它们的分辨率?

8个回答

14

13

这可能对命令行和脚本很有帮助。

xwininfo -root

但在多显示器环境下,xRandR可能更准确:

xrandr

似乎与xwininfo -root相比,xrandr并不告诉你当前活动的显示器。但是,它通过活动根窗口的代理告诉你有关显示器的信息。 - CMCDragonkai
xprop -rootxwininfo 的另一种选择,但每个 -root 选项都需要一个 root 窗口。在 .xinitrc 中,您不能依赖于根窗口的存在。 - ceving

5
如果正在使用Xinerama,请尝试XineramaQueryScreens。否则,您可以假设只有一个屏幕,并使用(X)WidthOfScreen/(X)HeightOfScreen
(另请参阅其他答案。有可能有人正在使用旧的X屏幕模型,其中屏幕为:x.0:x.1等。)

4

对于现代的X服务器,还有XRandR扩展,它提供了最新的多屏幕布局信息模型,包括重叠屏幕和动态屏幕更改。

相关文档可在XRandR 1.3.1协议规范libXrandr手册页中找到。


4

X11库仅适用于类Unix操作系统,因此它不是跨平台的解决方案。

完整代码

#include <stdio.h>

#include <X11/Xlib.h>

int
main(const int argc, const char *argv[])
{

    Display *display;
    Screen *screen;

    // open a display
    display = XOpenDisplay(NULL);

    // return the number of available screens
    int count_screens = ScreenCount(display);

    printf("Total count screens: %d\n", count_screens);


    for (int i = 0; i < count_screens; ++i) {
        screen = ScreenOfDisplay(display, i);
        printf("\tScreen %d: %dX%d\n", i + 1, screen->width, screen->height);
    }

    // close the display
    XCloseDisplay(display);

   return 0;
}

编译过程

gcc -o setup setup.c -std=c11 `pkg-config --cflags --libs x11`

一个结果(适用于我的计算机)

Total count screens: 1
    Screen 1: 1366X768

基于:

  1. https://tronche.com/gui/x/xlib/display/opening.html(打开显示器)
  2. https://tronche.com/gui/x/xlib/display/display-macros.html(显示器宏定义)
  3. https://tronche.com/gui/x/xlib/display/screen-information.html(屏幕信息)
  4. https://dev59.com/lXI-5IYBdhLWcg3wfoW1#1829747(StackOverflow问题解答)

感谢您提供代码。您知道我的问题的答案吗:http://stackoverflow.com/questions/42987932/is-a-monitor-in-gtk3-the-same-as-a-screen-in-x11。我想知道在这个代码中找到的屏幕是否与Gtk3 3.22中所称的监视器相同。 - Colin Keenan
你对Cygwin/Xming等有什么看法或经验?X11可能不是可移植的,但如果它被移植/适应了,它就像可移植一样好,不是吗?这不是我的专业领域 - 我习惯于使用像SDL2这样的库,可以将这些东西隐藏起来。 - John P
这在我的Ubuntu设置中无法使用多个监视器,至少是这样的。问题使用了单词“monitors”,带有“s”。此代码给出的结果为: 屏幕1:3520X1200我正在使用两个“加入显示器”,如显示GUI设置所示。第一个是1920x1200。第二个是较小的笔记本电脑显示器。代码结果给出了两个显示器并排覆盖的总区域。我想以编程方式确定主显示器的分辨率。 - Pulseczar

3

Python

import os
from Xlib import X, display
d = display.Display()
s = d.screen().root
output = os.popen("xrandr --listmonitors | grep '*' | awk {'print $4'}").read().splitlines()
num_sc = s.xinerama_get_screen_count().screen_count
width = s.get_geometry().width
height = s.get_geometry().height
print("Total count screens: %s" % num_sc)
for i in range(num_sc):
    print("\tScreen %s(%s): %sX%s" % (i, output[i], width, height))

Bash

$ xrandr --listmonitors
$ xrandr
$ xrandr | grep '*' | awk {'print $1'}

3

清理 xrandr 输出供 ImageMagick 使用

$ xrandr |grep \* |awk '{print $1}'

以下是结果:

1920x1080

1
这与X11无关吗? - PADYMKO

0

程序xdpyinfo几乎可以告诉你有关X11服务器的所有信息。

$ xdpyinfo | sed -n '/^screen #0/{n;p}'
  dimensions:    3840x2160 pixels (696x391 millimeters)

对于ffmpeg

$ xdpyinfo | sed -n '/^screen #0/{n;s/^[ a-z:]*//;s/ .*//p}'
3840x2160

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接