Changing the screen resolution under Linux/XFree86
This is a simple example on how to change screen resolution under Linux/XFree86 (no error checking performed). Applications must be linked with libX11, libXxf86vm and libXext.
#include <cstdio> #include <unistd.h> #include <cstdlib> #include <X11/Xlib.h> #include <X11/extensions/xf86vmode.h> #include <iostream> using ::std::cerr; using ::std::endl; int main(void) { // catch the current display and open it Display* d = XOpenDisplay(0L); if (d==0L) exit(1); // *UGLY* XF86VidModeModeInfo is equivalent to the struct below // "mode" declaration, but it might change someday... union { XF86VidModeModeInfo mode; struct { int dotclock; XF86VidModeModeLine line; } line_info; } old; // save the current mode into "old". XF86VidModeGetModeLine(d, DefaultScreen(d), &old.line_info.dotclock, &old.line_info.line); cerr << "Mode saved: "; cerr << old.mode.hdisplay << "x" << old.mode.vdisplay << endl; // get a list of all available video modes XF86VidModeModeInfo** my_modes = 0L; int mode_count = 0; XF86VidModeGetAllModeLines(d, DefaultScreen(d), &mode_count, &my_modes); cerr << mode_count << " available modes:" << endl; for (int i=0; i<mode_count; ++i) { cerr << "\t" << my_modes[i]->hdisplay << "x" << my_modes[i]->vdisplay << endl; } // set mode to the last available one (typically the lowest // resolution available) XF86VidModeSwitchToMode(d, DefaultScreen(d), my_modes[mode_count-1]); XF86VidModeSetViewPort(d,DefaultScreen(d),0,0); // IMPORTANT, as screen's resolution might not be changed otherwise. XFlush(d); // sleep for ten seconds, so we can see the mode change. sleep(10); // switch back to old mode... XF86VidModeSwitchToMode(d, DefaultScreen(d), &old.mode); XF86VidModeSetViewPort(d,DefaultScreen(d),0,0); XFlush(d); // All done XCloseDisplay(d); return 0; }
Leave a Comment