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?
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.)
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:
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'}
xrandr
output for imagemagick use$ xrandr |grep \* |awk '{print $1}'
Results here in:
1920x1080
Check out display macros and screen macros from the Xlib manual.
Specifically:
ScreenCount()
, ScreenOfDisplay()
WidthOfScreen()
, HeightOfScreen()
This might be helpfull for cli and scripting
xwininfo -root
But xRandR might be more accurate, especially, when there is multiple monitor environment:
xrandr