1fe8aea9eSmrg#include <stdlib.h>
2fe8aea9eSmrg#include <stdio.h>
3fe8aea9eSmrg#include <string.h>
4fe8aea9eSmrg#include <X11/Xlib.h>
5fe8aea9eSmrg#include <X11/extensions/xf86vmode.h>
6fe8aea9eSmrg
7fe8aea9eSmrgint main(void)
8fe8aea9eSmrg{
9fe8aea9eSmrg	Display *dpy;
10fe8aea9eSmrg	XF86VidModeModeLine current;
11fe8aea9eSmrg	XF86VidModeModeInfo **modes;
12fe8aea9eSmrg	int num_modes, i;
13fe8aea9eSmrg	int saved_mode = -1;
14fe8aea9eSmrg	int dotclock;
15fe8aea9eSmrg
16fe8aea9eSmrg	dpy = XOpenDisplay(NULL);
17fe8aea9eSmrg	if (dpy == NULL)
18fe8aea9eSmrg		dpy = XOpenDisplay(":0");
19fe8aea9eSmrg
20fe8aea9eSmrg	XF86VidModeGetModeLine(dpy, DefaultScreen(dpy), &dotclock, &current);
21fe8aea9eSmrg	XF86VidModeGetAllModeLines(dpy, XDefaultScreen(dpy),
22fe8aea9eSmrg				   &num_modes, &modes);
23fe8aea9eSmrg	for (i = 0; i < num_modes; i++) {
24fe8aea9eSmrg		int this;
25fe8aea9eSmrg
26fe8aea9eSmrg		this = (current.hdisplay == modes[i]->hdisplay &&
27fe8aea9eSmrg			current.vdisplay == modes[i]->vdisplay &&
28fe8aea9eSmrg			dotclock == modes[i]->dotclock);
29fe8aea9eSmrg		if (this && saved_mode == -1)
30fe8aea9eSmrg			saved_mode = i;
31fe8aea9eSmrg
32fe8aea9eSmrg		printf("[%d] %dx%d%s\n",
33fe8aea9eSmrg		       i,
34fe8aea9eSmrg		       modes[i]->hdisplay,
35fe8aea9eSmrg		       modes[i]->vdisplay,
36fe8aea9eSmrg		       this ? "*" : "");
37fe8aea9eSmrg	}
38fe8aea9eSmrg
39fe8aea9eSmrg	for (i = 0; i < num_modes; i++) {
40fe8aea9eSmrg		printf("Switching to mode %dx%d\n",
41fe8aea9eSmrg		       modes[i]->hdisplay,
42fe8aea9eSmrg		       modes[i]->vdisplay);
43fe8aea9eSmrg		XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy), modes[i]);
44fe8aea9eSmrg		XSync(dpy, True);
45fe8aea9eSmrg	}
46fe8aea9eSmrg
47fe8aea9eSmrg	if (saved_mode != -1) {
48fe8aea9eSmrg		XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy),
49fe8aea9eSmrg					modes[saved_mode]);
50fe8aea9eSmrg		XFlush(dpy);
51fe8aea9eSmrg	}
52fe8aea9eSmrg
53fe8aea9eSmrg	return 0;
54fe8aea9eSmrg}
55