Skip to content

Instantly share code, notes, and snippets.

@jcayzac
Created January 15, 2012 05:38
Show Gist options
  • Save jcayzac/1614516 to your computer and use it in GitHub Desktop.
Save jcayzac/1614516 to your computer and use it in GitHub Desktop.
#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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment