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

Linux 如何查询X11显示分辨率?,linux,x11,Linux,X11,这似乎是一个简单的问题,但我找不到答案:如何查询(通过X11)存在哪些监视器及其分辨率?请从中查看 具体而言: 从:ScreenCount(),ScreenOfDisplay() 从:WidthOfScreen(),HeightOfScreen() 如果Xinerama正在使用,请尝试。否则,您可以使用单个屏幕并使用(X)屏幕宽度/(X)屏幕高度。 (另请参阅另一个答案。可能有人正在使用旧的X屏幕型号,您的屏幕是:X.0,:X.1,等等)。对于现代X服务器,还有XRandR扩展,它提供了最新的

这似乎是一个简单的问题,但我找不到答案:如何查询(通过X11)存在哪些监视器及其分辨率?

请从中查看

具体而言:

  • 从:
    ScreenCount()
    ScreenOfDisplay()
  • 从:
    WidthOfScreen()
    HeightOfScreen()

如果Xinerama正在使用,请尝试。否则,您可以使用单个屏幕并使用
(X)屏幕宽度
/
(X)屏幕高度。


(另请参阅另一个答案。可能有人正在使用旧的X屏幕型号,您的屏幕是
:X.0
:X.1
,等等)。

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


它的文档可在和中找到。

这可能对cli和脚本编写有帮助

xwininfo -root
但xRandR可能更准确,尤其是在有多个监视器环境的情况下:

xrandr
清洁
xrandr
输出以供imagemagick使用 结果如下:

1920x1080

库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;
}
结果(实际适用于我的计算机)

基于:


  • Python

    gcc -o setup setup.c -std=c11 `pkg-config --cflags --libs x11`
    
    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'}
    

    xwininfo-root
    相比,
    xrandr
    似乎没有告诉您当前处于活动状态的监视器。但是,它告诉您有关活动根窗口的代理监视器。它与X11无关?感谢您提供代码。你知道我的问题的答案吗。我想问一下,您在这段代码中找到的屏幕是否与Gtk3 3.22所称的监视器相同。您对Cygwin/Xming/etc有何看法/经验。?X11可能不是可移植的,但如果经过移植/改编,它就和可移植的一样好,不是吗?不是我的专业领域——我习惯于使用SDL2之类的库来掩盖这些东西。
    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))
    
    $ xrandr --listmonitors
    $ xrandr
    $ xrandr | grep '*' | awk {'print $1'}