How to query X11 display resolution?

前端 未结 7 867
一整个雨季
一整个雨季 2021-02-05 09:24

It seems like an simple problem, but I can\'t find the answer: How do you query (via X11) what monitors exist and their resolutions?

相关标签:
7条回答
  • 2021-02-05 09:57

    If Xinerama is in use, try XineramaQueryScreens. Otherwise, you may be able to assume a single screen and use (X)WidthOfScreen/(X)HeightOfScreen.

    (Also see the other answer. It's remotely possible someone is using the old X screen model where your screens are :x.0, :x.1, etc.)

    0 讨论(0)
  • 2021-02-05 10:00

    The library X11 working only with unix-like OS, so it is a not cross-platform solution.

    A full code

    #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;
    }
    

    A compilation

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

    A result (actual for my computer)

    Total count screens: 1
        Screen 1: 1366X768
    

    Based on:

    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://stackoverflow.com/a/1829747/6003870
    0 讨论(0)
  • 2021-02-05 10:05

    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'}
    
    0 讨论(0)
  • Clean xrandr output for imagemagick use

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

    Results here in:

    1920x1080
    
    0 讨论(0)
  • 2021-02-05 10:16

    Check out display macros and screen macros from the Xlib manual.

    Specifically:

    • From the first link: ScreenCount(), ScreenOfDisplay()
    • From the second link: WidthOfScreen(), HeightOfScreen()
    0 讨论(0)
  • 2021-02-05 10:17

    This might be helpfull for cli and scripting

    xwininfo -root
    

    But xRandR might be more accurate, especially, when there is multiple monitor environment:

    xrandr
    
    0 讨论(0)
提交回复
热议问题