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?
8 Answers
Check out display macros and screen macros from the Xlib manual.
Specifically:
- From the first link:
ScreenCount()
,ScreenOfDisplay()
- From the second link:
WidthOfScreen()
,HeightOfScreen()

- 39,039
- 2
- 53
- 68
This might be helpfull for cli and scripting
xwininfo -root
But xRandR might be more accurate, especially, when there is multiple monitor environment:
xrandr

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

- 43,532
- 6
- 101
- 124
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.

- 4,102
- 21
- 24
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:
-
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
Clean xrandr
output for imagemagick use
$ xrandr |grep \* |awk '{print $1}'
Results here in:
1920x1080

- 1
- 1

- 28,495
- 9
- 107
- 102
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'}

- 85
- 1
- 1
- 9