12 #ifdef WITH_X11_XF86VMODE
13 # include <X11/Xlib.h>
14 # include <X11/extensions/xf86vmode.h>
35 #ifdef WITH_X11_XF86VMODE
36 int majorVersion, minorVersion;
37 XF86VidModeModeInfo **vidmodes;
40 GHOST_ASSERT(display < 1,
"Only single display systems are currently supported.\n");
46 majorVersion = minorVersion = 0;
47 if (!XF86VidModeQueryVersion(dpy, &majorVersion, &minorVersion)) {
48 fprintf(stderr,
"Error: XF86VidMode extension missing!\n");
52 if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numSettings, &vidmodes)) {
58 GHOST_ASSERT(display < 1,
"Only single display systems are currently supported.\n");
67 #ifdef WITH_X11_XF86VMODE
68 static int calculate_rate(XF86VidModeModeInfo *info)
70 return (info->htotal && info->vtotal) ? (1000 * info->dotclock / (info->htotal * info->vtotal)) :
87 #ifdef WITH_X11_XF86VMODE
88 int majorVersion, minorVersion;
90 GHOST_ASSERT(display < 1,
"Only single display systems are currently supported.\n");
92 majorVersion = minorVersion = 0;
93 if (XF86VidModeQueryVersion(dpy, &majorVersion, &minorVersion)) {
94 XF86VidModeModeInfo **vidmodes;
97 if (XF86VidModeGetAllModeLines(dpy, DefaultScreen(dpy), &numSettings, &vidmodes)) {
98 GHOST_ASSERT(index < numSettings,
"Requested setting outside of valid range.\n");
100 setting.
xPixels = vidmodes[index]->hdisplay;
101 setting.
yPixels = vidmodes[index]->vdisplay;
102 setting.
bpp = DefaultDepth(dpy, DefaultScreen(dpy));
103 setting.
frequency = calculate_rate(vidmodes[index]);
110 fprintf(stderr,
"Warning: XF86VidMode extension missing!\n");
115 GHOST_ASSERT(display < 1,
"Only single display systems are currently supported.\n");
116 GHOST_ASSERT(index < 1,
"Requested setting outside of valid range.\n");
119 setting.
xPixels = DisplayWidth(dpy, DefaultScreen(dpy));
120 setting.
yPixels = DisplayHeight(dpy, DefaultScreen(dpy));
121 setting.
bpp = DefaultDepth(dpy, DefaultScreen(dpy));
139 #ifdef WITH_X11_XF86VMODE
143 int majorVersion, minorVersion;
144 XF86VidModeModeInfo **vidmodes;
146 int scrnum, num_vidmodes;
148 if (dpy ==
nullptr) {
152 scrnum = DefaultScreen(dpy);
155 majorVersion = minorVersion = 0;
156 if (!XF86VidModeQueryVersion(dpy, &majorVersion, &minorVersion)) {
157 fprintf(stderr,
"Error: XF86VidMode extension missing!\n");
161 printf(
"Using XFree86-VidModeExtension Version %d.%d\n", majorVersion, minorVersion);
164 if (XF86VidModeGetAllModeLines(dpy, scrnum, &num_vidmodes, &vidmodes)) {
167 for (
int i = 0; i < num_vidmodes; i++) {
168 if (vidmodes[i]->hdisplay < setting.
xPixels || vidmodes[i]->vdisplay < setting.
yPixels) {
172 if (best_fit == -1 || (vidmodes[i]->hdisplay < vidmodes[best_fit]->hdisplay) ||
173 (vidmodes[i]->hdisplay == vidmodes[best_fit]->hdisplay &&
174 vidmodes[i]->vdisplay < vidmodes[best_fit]->vdisplay)) {
179 if ((vidmodes[i]->hdisplay == vidmodes[best_fit]->hdisplay) &&
180 (vidmodes[i]->vdisplay == vidmodes[best_fit]->vdisplay)) {
183 if (calculate_rate(vidmodes[i]) > calculate_rate(vidmodes[best_fit])) {
188 if (
abs(calculate_rate(vidmodes[i]) - (
int)setting.
frequency) <
189 abs(calculate_rate(vidmodes[best_fit]) - (
int)setting.
frequency)) {
196 if (best_fit != -1) {
198 printf(
"Switching to video mode %dx%d %dx%d %d\n",
199 vidmodes[best_fit]->hdisplay,
200 vidmodes[best_fit]->vdisplay,
201 vidmodes[best_fit]->htotal,
202 vidmodes[best_fit]->vtotal,
203 calculate_rate(vidmodes[best_fit]));
207 XF86VidModeSwitchToMode(dpy, scrnum, vidmodes[best_fit]);
210 XF86VidModeSetViewPort(dpy, scrnum, 0, 0);
#define GHOST_ASSERT(x, info)
GHOST_TSuccess getNumDisplaySettings(uint8_t display, int32_t &numSettings) const
GHOST_DisplayManagerX11(GHOST_SystemX11 *system)
GHOST_TSuccess getDisplaySetting(uint8_t display, int32_t index, GHOST_DisplaySetting &setting) const
GHOST_TSuccess getNumDisplays(uint8_t &numDisplays) const
GHOST_TSuccess setCurrentDisplaySetting(uint8_t display, const GHOST_DisplaySetting &setting)
GHOST_TSuccess getCurrentDisplaySetting(uint8_t display, GHOST_DisplaySetting &setting) const
uint8_t getNumDisplays() const
SyclQueue void void size_t num_bytes void