/* Use X11 Xvid extension to implement fullscreen mode */ #include #include #include #include #include #include static Display *dpy; static XF86VidModeModeInfo **mode_list; static XF86VidModeModeInfo * modeinfo; static int count; int fullscreen_init(void) { int event, error, dotclock; XF86VidModeModeLine * modeline; /* load up X display and make sure we have the Xvid extention */ dpy = XOpenDisplay(""); /* FIXME: make this the one that Gtk uses */ if (dpy == NULL) return 0; if (!XF86VidModeQueryExtension(dpy, &event, &error)) return 0; /* get list of all modes */ XF86VidModeGetAllModeLines(dpy, XDefaultScreen(dpy), &count, &mode_list); /* get current modeline */ modeline = (XF86VidModeModeLine *)malloc(sizeof(XF86VidModeModeLine)); XF86VidModeGetModeLine(dpy, XDefaultScreen(dpy), &dotclock, modeline); /* convert to ModeInfo structure */ modeinfo = (XF86VidModeModeInfo *)malloc(sizeof(XF86VidModeModeInfo)); modeinfo->dotclock = dotclock; modeinfo->hdisplay = modeline->hdisplay; modeinfo->hsyncstart = modeline->hsyncstart; modeinfo->hsyncend = modeline->hsyncend; modeinfo->htotal = modeline->htotal; modeinfo->vdisplay = modeline->vdisplay; modeinfo->vsyncstart = modeline->vsyncstart; modeinfo->vsyncend = modeline->vsyncend; modeinfo->vtotal = modeline->vtotal; modeinfo->flags = modeline->flags; modeinfo->privsize = modeline->privsize; modeinfo->private = modeline->private; free(modeline); return 1; } int fullscreen_switch(int x, int y, int w, int h) { int i; for (i = 0; i < count; i++) { if (w == mode_list[i]->hdisplay) if (h == mode_list[i]->vdisplay) { XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy), mode_list[i]); XF86VidModeSetViewPort(dpy, XDefaultScreen(dpy), x, y); XFlush(dpy); return 1; } } return 0; } int fullscreen_reset(void) { XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy), modeinfo); XFlush(dpy); return 1; } void fullscreen_cleanup(void) { int i; if (modeinfo->privsize != 0) free(modeinfo->private); free(modeinfo); for (i = 0; i < count; i++) { if (mode_list[i]->privsize != 0) free(mode_list[i]->private); free(mode_list[i]); } free(mode_list); }