20

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?

Robert Harvey
  • 178,213
  • 47
  • 333
  • 501
dicroce
  • 45,396
  • 28
  • 101
  • 140

8 Answers8

14

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

Specifically:

  • From the first link: ScreenCount(), ScreenOfDisplay()
  • From the second link: WidthOfScreen(), HeightOfScreen()
asveikau
  • 39,039
  • 2
  • 53
  • 68
13

This might be helpfull for cli and scripting

xwininfo -root

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

xrandr
Grzegorz Wierzowiecki
  • 10,545
  • 9
  • 50
  • 88
  • It seem `xrandr` compared to `xwininfo -root` doesn't tell you about the monitor that is currently active though. However it's telling you about the monitor by proxy of the active root window. – CMCDragonkai Mar 02 '16 at 09:10
  • `xprop -root` is also an alternative to `xwininfo`, but every `-root` option requires a root window. During `.xinitrc` you can not rely on the existence of the root window. – ceving Jan 27 '23 at 08:15
5

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.)

Nicholas Riley
  • 43,532
  • 6
  • 101
  • 124
4

For modern X servers, there's also the XRandR extension, which provides the most up-to-date model of multi screen layout information, including overlapping screens and dynamic screen changes.

Documentation of it is available in the XRandR 1.3.1 Protocol spec and the libXrandr man page.

alanc
  • 4,102
  • 21
  • 24
4

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
Community
  • 1
  • 1
PADYMKO
  • 4,217
  • 2
  • 36
  • 41
  • Thank you for providing the code. Do you know the answer to my question: http://stackoverflow.com/questions/42987932/is-a-monitor-in-gtk3-the-same-as-a-screen-in-x11. I am asking if the screens you are finding in this code is the same as what Gtk3 3.22 calls monitors. – Colin Keenan Mar 23 '17 at 23:02
  • Any opinion/experience on Cygwin/Xming/etc.? X11 might not be portable, but if it's ported/adapted, it's as good as portable, no? Not my area of expertise - I'm used to using libraries like SDL2 that sweep this stuff under the rug. – John P Jul 31 '18 at 19:56
  • This doesn't work with multiple monitors, at least on my Ubuntu setup. The question used the word "monitors", with an "s". The results this code gives me: ```Total count screens: 1 Screen 1: 3520X1200 ``` I'm using two "Join Displays", as denoted by the Display GUI settings. The first is 1920x1200. The second is a smaller, laptop display. The code results give you the total area covered by the two displays side-by-side. I want to programmatically determine the resolution of the primary display. – Pulseczar Jan 20 '22 at 22:19
3

Clean xrandr output for imagemagick use

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

Results here in:

1920x1080
Community
  • 1
  • 1
Serge Stroobandt
  • 28,495
  • 9
  • 107
  • 102
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'}
Antoine Boucher
  • 85
  • 1
  • 1
  • 9
0

The program xdpyinfo tells you almost everything about your X11 server.

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

For ffmpeg:

$ xdpyinfo | sed -n '/^screen #0/{n;s/^[ a-z:]*//;s/ .*//p}'
3840x2160
ceving
  • 21,900
  • 13
  • 104
  • 178