1 /* Use X11 Xvid extension to implement fullscreen mode */
6 #include <X11/keysym.h>
7 #include <X11/extensions/xf86dga.h>
8 #include <X11/extensions/xf86vmode.h>
10 static Display *dpy = NULL;
11 static XF86VidModeModeInfo **mode_list = NULL;
12 static XF86VidModeModeInfo * modeinfo = NULL;
15 int fullscreen_init(void)
17 int event, error, dotclock;
18 XF86VidModeModeLine * modeline;
20 /* load up X display and make sure we have the Xvid extention */
21 dpy = XOpenDisplay(""); /* FIXME: make this the one that Gtk uses */
24 if (!XF86VidModeQueryExtension(dpy, &event, &error))
27 /* get list of all modes */
28 XF86VidModeGetAllModeLines(dpy, XDefaultScreen(dpy), &count, &mode_list);
30 /* get current modeline */
31 modeline = (XF86VidModeModeLine *)malloc(sizeof(XF86VidModeModeLine));
32 XF86VidModeGetModeLine(dpy, XDefaultScreen(dpy), &dotclock, modeline);
34 /* convert to ModeInfo structure */
35 modeinfo = (XF86VidModeModeInfo *)malloc(sizeof(XF86VidModeModeInfo));
36 modeinfo->dotclock = dotclock;
37 modeinfo->hdisplay = modeline->hdisplay;
38 modeinfo->hsyncstart = modeline->hsyncstart;
39 modeinfo->hsyncend = modeline->hsyncend;
40 modeinfo->htotal = modeline->htotal;
41 modeinfo->vdisplay = modeline->vdisplay;
42 modeinfo->vsyncstart = modeline->vsyncstart;
43 modeinfo->vsyncend = modeline->vsyncend;
44 modeinfo->vtotal = modeline->vtotal;
45 modeinfo->flags = modeline->flags;
46 modeinfo->privsize = modeline->privsize;
47 modeinfo->private = modeline->private;
53 int fullscreen_switch(int x, int y, int w, int h)
56 for (i = 0; i < count; i++)
58 if (w == mode_list[i]->hdisplay)
59 if (h == mode_list[i]->vdisplay)
61 XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy), mode_list[i]);
62 XF86VidModeSetViewPort(dpy, XDefaultScreen(dpy), 0, 0);
70 int fullscreen_reset(void)
72 XF86VidModeSwitchToMode(dpy, XDefaultScreen(dpy), modeinfo);
77 void fullscreen_cleanup(void)
82 if (modeinfo->privsize != 0)
83 free(modeinfo->private);
88 for (i = 0; i < count; i++)
92 if (mode_list[i]->privsize != 0)
93 free(mode_list[i]->private);