How on earth do you set your screen res after a crash??

Glynn Clements glynn at gclements.plus.com
Mon Oct 19 06:04:05 PDT 2009


Adam Nielsen wrote:

> Please let me know if anyone knows how to change X11 screen resolutions
> without closing down everything and restarting.

The following uses XFree86-VidModeExtension:

/* make xvidmode CFLAGS='-Wall' LDFLAGS='-L/usr/X11R6/lib' LDLIBS='-lX11 -lXxf86vm -lXext' */

#include <X11/Xlib.h>
#include <X11/extensions/xf86vmode.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
	Display *dpy;
	int num_modes;
	XF86VidModeModeInfo **modes;
	int width, height;
	int i;
	XF86VidModeModeInfo *best_mode = NULL;

	if (argc != 3) {
		fprintf(stderr, "Usage: %s <width> <height>\n", argv[0]);
		return 1;
	}

	width  = atoi(argv[1]);
	height = atoi(argv[2]);

	dpy = XOpenDisplay(NULL);
	if (!dpy) {
		fprintf(stderr, "Unable to open display\n");
		return 1;
	}

	if (!XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &num_modes, &modes)) {
		fprintf(stderr, "Unable to query modes\n");
		return 1;
	}

	for (i = 0; i < num_modes; i++) {
		XF86VidModeModeInfo *mode = modes[i];
		if (mode->hdisplay < width || mode->vdisplay < height)
			continue;
		if (best_mode && (mode->hdisplay > best_mode->hdisplay || mode->vdisplay > best_mode->vdisplay))
			continue;
		best_mode = mode;
	}
	
	if (!best_mode) {
		fprintf(stderr, "Unable to find a suitable mode\n");
		return 1;
	}

	XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, 0, 0);
	XF86VidModeSwitchToMode(dpy, DefaultScreen(dpy), best_mode);
	XF86VidModeSetViewPort(dpy, DefaultScreen(dpy), 0, 0);
	XFree(modes);
	XCloseDisplay(dpy);

	return 0;
}

-- 
Glynn Clements <glynn at gclements.plus.com>



More information about the xorg mailing list