2 * DirectDraw XVidMode interface
4 * Copyright 2001 TransGaming Technologies, Inc.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #ifdef HAVE_LIBXXF86VM
30 #include <X11/extensions/xf86vmode.h>
31 #endif /* HAVE_LIBXXF86VM */
40 #include "wine/debug.h"
42 WINE_DEFAULT_DEBUG_CHANNEL(x11drv
);
44 #ifdef HAVE_LIBXXF86VM
46 extern int usexvidmode
;
48 static int xf86vm_event
, xf86vm_error
, xf86vm_major
, xf86vm_minor
;
50 #ifdef X_XF86VidModeSetGammaRamp
51 static int xf86vm_gammaramp_size
;
52 static BOOL xf86vm_use_gammaramp
;
55 static LPDDHALMODEINFO dd_modes
;
56 static unsigned int dd_mode_count
;
57 static XF86VidModeModeInfo
** real_xf86vm_modes
;
58 static unsigned int real_xf86vm_mode_count
;
59 static unsigned int xf86vm_initial_mode
;
61 static void convert_modeinfo( const XF86VidModeModeInfo
*mode
, LPDDHALMODEINFO info
, unsigned int bpp
)
63 info
->dwWidth
= mode
->hdisplay
;
64 info
->dwHeight
= mode
->vdisplay
;
65 if (mode
->htotal
!=0 && mode
->vtotal
!=0)
66 info
->wRefreshRate
= mode
->dotclock
* 1000 / (mode
->htotal
* mode
->vtotal
);
68 info
->wRefreshRate
= 0;
69 TRACE(" width=%ld, height=%ld, refresh=%d\n",
70 info
->dwWidth
, info
->dwHeight
, info
->wRefreshRate
);
77 info
->dwAlphaBitMask
= 0;
80 static void convert_modeline(int dotclock
, const XF86VidModeModeLine
*mode
, LPDDHALMODEINFO info
, unsigned int bpp
)
82 info
->dwWidth
= mode
->hdisplay
;
83 info
->dwHeight
= mode
->vdisplay
;
84 if (mode
->htotal
!=0 && mode
->vtotal
!=0)
85 info
->wRefreshRate
= dotclock
* 1000 / (mode
->htotal
* mode
->vtotal
);
87 info
->wRefreshRate
= 0;
88 TRACE(" width=%ld, height=%ld, refresh=%d\n",
89 info
->dwWidth
, info
->dwHeight
, info
->wRefreshRate
);
96 info
->dwAlphaBitMask
= 0;
99 static int XVidModeErrorHandler(Display
*dpy
, XErrorEvent
*event
, void *arg
)
104 static Bool in_desktop_mode
;
105 static const unsigned int depths
[] = {8, 16, 32};
107 void X11DRV_XF86VM_Init(void)
112 DWORD dwBpp
= screen_depth
;
113 if (dwBpp
== 24) dwBpp
= 32;
115 in_desktop_mode
= (root_window
!= DefaultRootWindow(gdi_display
));
117 if (xf86vm_major
) return; /* already initialized? */
119 if (!usexvidmode
) return;
121 /* see if XVidMode is available */
123 ok
= XF86VidModeQueryExtension(gdi_display
, &xf86vm_event
, &xf86vm_error
);
126 X11DRV_expect_error(gdi_display
, XVidModeErrorHandler
, NULL
);
127 ok
= XF86VidModeQueryVersion(gdi_display
, &xf86vm_major
, &xf86vm_minor
);
128 if (X11DRV_check_error()) ok
= FALSE
;
132 #ifdef X_XF86VidModeSetGammaRamp
133 if (xf86vm_major
> 2 || (xf86vm_major
== 2 && xf86vm_minor
>= 1))
135 XF86VidModeGetGammaRampSize(gdi_display
, DefaultScreen(gdi_display
),
136 &xf86vm_gammaramp_size
);
137 if (xf86vm_gammaramp_size
== 256)
138 xf86vm_use_gammaramp
= TRUE
;
143 if (!in_desktop_mode
) ok
= XF86VidModeGetAllModeLines(gdi_display
, DefaultScreen(gdi_display
), &nmodes
, &real_xf86vm_modes
);
148 /* In desktop mode, do not switch resolution... But still use the Gamma ramp stuff */
149 if (in_desktop_mode
) return;
151 TRACE("XVidMode modes: count=%d\n", nmodes
);
153 real_xf86vm_mode_count
= nmodes
;
154 max_modes
= (3+1)*(nmodes
);
156 dd_modes
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(DDHALMODEINFO
) * max_modes
);
158 /* convert modes to DDHALMODEINFO format */
159 for (i
=0; i
<real_xf86vm_mode_count
; i
++)
161 convert_modeinfo(real_xf86vm_modes
[i
], &dd_modes
[dd_mode_count
++], dwBpp
);
163 /* add modes for different color depths */
166 if (depths
[j
] != dwBpp
)
168 for (i
=0; i
< real_xf86vm_mode_count
; i
++)
170 convert_modeinfo(real_xf86vm_modes
[i
], &dd_modes
[dd_mode_count
++], depths
[j
]);
175 TRACE("Available DD modes: count=%d\n", dd_mode_count
);
177 /* store the current mode at the time we started */
178 xf86vm_initial_mode
= X11DRV_XF86VM_GetCurrentMode();
180 TRACE("Enabling XVidMode\n");
183 void X11DRV_XF86VM_Cleanup(void)
185 if (real_xf86vm_modes
) TSXFree(real_xf86vm_modes
);
188 int X11DRV_XF86VM_GetCurrentMode(void)
190 XF86VidModeModeLine line
;
193 DWORD dwBpp
= screen_depth
;
194 if (dwBpp
== 24) dwBpp
= 32;
196 if (!dd_modes
) return 0; /* no XVidMode */
198 TRACE("Querying XVidMode current mode\n");
200 XF86VidModeGetModeLine(gdi_display
, DefaultScreen(gdi_display
), &dotclock
, &line
);
202 convert_modeline(dotclock
, &line
, &cmode
, dwBpp
);
203 for (i
=0; i
<dd_mode_count
; i
++)
204 if (memcmp(&dd_modes
[i
], &cmode
, sizeof(cmode
)) == 0) {
205 TRACE("mode=%d\n", i
);
208 ERR("unknown mode, shouldn't happen\n");
209 return 0; /* return first mode */
212 void X11DRV_XF86VM_SetCurrentMode(int mode
)
214 if (!dd_modes
) return; /* no XVidMode */
216 /* only set modes from the original color depth */
217 mode
= mode
% real_xf86vm_mode_count
;
220 TRACE("Resizing X display to %dx%d\n",
221 real_xf86vm_modes
[mode
]->hdisplay
, real_xf86vm_modes
[mode
]->vdisplay
);
222 XF86VidModeSwitchToMode(gdi_display
, DefaultScreen(gdi_display
), real_xf86vm_modes
[mode
]);
224 SYSMETRICS_Set( SM_CXSCREEN
, real_xf86vm_modes
[mode
]->hdisplay
);
225 SYSMETRICS_Set( SM_CYSCREEN
, real_xf86vm_modes
[mode
]->vdisplay
);
227 FIXME("Need to update SYSMETRICS after resizing display (now %dx%d)\n",
228 real_xf86vm_modes
[mode
]->hdisplay
, real_xf86vm_modes
[mode
]->vdisplay
);
230 #if 0 /* it is said that SetViewPort causes problems with some X servers */
231 XF86VidModeSetViewPort(gdi_display
, DefaultScreen(gdi_display
), 0, 0);
233 XWarpPointer(gdi_display
, None
, DefaultRootWindow(gdi_display
), 0, 0, 0, 0, 0, 0);
235 XSync(gdi_display
, False
);
239 void X11DRV_XF86VM_SetExclusiveMode(int lock
)
241 if (!dd_modes
) return; /* no XVidMode */
244 XF86VidModeLockModeSwitch(gdi_display
, DefaultScreen(gdi_display
), lock
);
248 /* actual DirectDraw HAL stuff */
250 static DWORD PASCAL
X11DRV_XF86VM_SetMode(LPDDHAL_SETMODEDATA data
)
252 TRACE("Mode %ld requested by DDHAL\n", data
->dwModeIndex
);
253 X11DRV_XF86VM_SetCurrentMode(data
->dwModeIndex
);
254 X11DRV_DDHAL_SwitchMode(data
->dwModeIndex
, NULL
, NULL
);
255 data
->ddRVal
= DD_OK
;
256 return DDHAL_DRIVER_HANDLED
;
259 int X11DRV_XF86VM_CreateDriver(LPDDHALINFO info
)
261 if (!dd_mode_count
) return 0; /* no XVidMode */
263 TRACE("Setting up XF86VM mode for DDRAW\n");
264 info
->dwNumModes
= dd_mode_count
;
265 info
->lpModeInfo
= dd_modes
;
266 X11DRV_DDHAL_SwitchMode(X11DRV_XF86VM_GetCurrentMode(), NULL
, NULL
);
267 info
->lpDDCallbacks
->SetMode
= X11DRV_XF86VM_SetMode
;
272 /***** GAMMA CONTROL *****/
273 /* (only available in XF86VidMode 2.x) */
275 #ifdef X_XF86VidModeSetGamma
277 static void GenerateRampFromGamma(WORD ramp
[256], float gamma
)
279 float r_gamma
= 1/gamma
;
281 TRACE("gamma is %f\n", r_gamma
);
282 for (i
=0; i
<256; i
++)
283 ramp
[i
] = pow(i
/255.0, r_gamma
) * 65535.0;
286 static BOOL
ComputeGammaFromRamp(WORD ramp
[256], float *gamma
)
288 float r_x
, r_y
, r_lx
, r_ly
, r_d
, r_v
, r_e
, g_avg
, g_min
, g_max
;
289 unsigned i
, f
, l
, g_n
, c
;
293 ERR("inverted or flat gamma ramp (%d->%d), rejected\n", f
, l
);
297 g_min
= g_max
= g_avg
= 0.0;
298 /* check gamma ramp entries to estimate the gamma */
299 TRACE("analyzing gamma ramp (%d->%d)\n", f
, l
);
300 for (i
=1, g_n
=0; i
<255; i
++) {
301 if (ramp
[i
] < f
|| ramp
[i
] > l
) {
302 ERR("strange gamma ramp ([%d]=%d for %d->%d), rejected\n", i
, ramp
[i
], f
, l
);
306 if (!c
) continue; /* avoid log(0) */
308 /* normalize entry values into 0..1 range */
309 r_x
= i
/255.0; r_y
= c
/ r_d
;
310 /* compute logarithms of values */
311 r_lx
= log(r_x
); r_ly
= log(r_y
);
312 /* compute gamma for this entry */
314 /* compute differential (error estimate) for this entry */
315 /* some games use table-based logarithms that magnifies the error by 128 */
316 r_e
= -r_lx
* 128 / (c
* r_lx
* r_lx
);
318 /* compute min & max while compensating for estimated error */
319 if (!g_n
|| g_min
> (r_v
+ r_e
)) g_min
= r_v
+ r_e
;
320 if (!g_n
|| g_max
< (r_v
- r_e
)) g_max
= r_v
- r_e
;
325 /* TRACE("[%d]=%d, gamma=%f, error=%f\n", i, ramp[i], r_v, r_e); */
328 ERR("no gamma data, shouldn't happen\n");
332 TRACE("low bias is %d, high is %d, gamma is %5.3f\n", f
, 65535-l
, g_avg
);
333 /* the bias could be because the app wanted something like a "red shift"
334 * like when you're hit in Quake, but XVidMode doesn't support it,
335 * so we have to reject a significant bias */
336 if (f
&& f
> (pow(1/255.0, g_avg
) * 65536.0)) {
337 ERR("low-biased gamma ramp (%d), rejected\n", f
);
340 /* check that the gamma is reasonably uniform across the ramp */
341 if (g_max
- g_min
> 0.1) {
342 ERR("ramp not uniform (max=%f, min=%f, avg=%f), rejected\n", g_max
, g_min
, g_avg
);
345 /* ok, now we're pretty sure we can set the desired gamma ramp,
351 #endif /* X_XF86VidModeSetGamma */
353 /* Hmm... should gamma control be available in desktop mode or not?
354 * I'll assume that it should */
356 BOOL
X11DRV_XF86VM_GetGammaRamp(LPDDGAMMARAMP ramp
)
358 #ifdef X_XF86VidModeSetGamma
359 XF86VidModeGamma gamma
;
362 if (xf86vm_major
< 2) return FALSE
; /* no gamma control */
363 #ifdef X_XF86VidModeSetGammaRamp
364 else if (xf86vm_use_gammaramp
)
368 ret
= XF86VidModeGetGammaRamp(gdi_display
, DefaultScreen(gdi_display
), 256,
369 ramp
->red
, ramp
->green
, ramp
->blue
);
377 ret
= XF86VidModeGetGamma(gdi_display
, DefaultScreen(gdi_display
), &gamma
);
380 GenerateRampFromGamma(ramp
->red
, gamma
.red
);
381 GenerateRampFromGamma(ramp
->green
, gamma
.green
);
382 GenerateRampFromGamma(ramp
->blue
, gamma
.blue
);
386 #endif /* X_XF86VidModeSetGamma */
390 BOOL
X11DRV_XF86VM_SetGammaRamp(LPDDGAMMARAMP ramp
)
392 #ifdef X_XF86VidModeSetGamma
393 XF86VidModeGamma gamma
;
395 if (xf86vm_major
< 2) return FALSE
; /* no gamma control */
396 #ifdef X_XF86VidModeSetGammaRamp
397 else if (xf86vm_use_gammaramp
)
401 ret
= XF86VidModeSetGammaRamp(gdi_display
, DefaultScreen(gdi_display
), 256,
402 ramp
->red
, ramp
->green
, ramp
->blue
);
409 if (ComputeGammaFromRamp(ramp
->red
, &gamma
.red
) &&
410 ComputeGammaFromRamp(ramp
->green
, &gamma
.green
) &&
411 ComputeGammaFromRamp(ramp
->blue
, &gamma
.blue
)) {
414 ret
= XF86VidModeSetGamma(gdi_display
, DefaultScreen(gdi_display
), &gamma
);
419 #endif /* X_XF86VidModeSetGamma */
423 #endif /* HAVE_LIBXXF86VM */
425 /***********************************************************************
426 * GetDeviceGammaRamp (X11DRV.@)
428 * FIXME: should move to somewhere appropriate, but probably not before
429 * the stuff in graphics/x11drv/ has been moved to dlls/x11drv, so that
430 * they can include xvidmode.h directly
432 BOOL
X11DRV_GetDeviceGammaRamp(X11DRV_PDEVICE
*physDev
, LPVOID ramp
)
434 #ifdef HAVE_LIBXXF86VM
435 return X11DRV_XF86VM_GetGammaRamp(ramp
);
441 /***********************************************************************
442 * SetDeviceGammaRamp (X11DRV.@)
444 * FIXME: should move to somewhere appropriate, but probably not before
445 * the stuff in graphics/x11drv/ has been moved to dlls/x11drv, so that
446 * they can include xvidmode.h directly
448 BOOL
X11DRV_SetDeviceGammaRamp(X11DRV_PDEVICE
*physDev
, LPVOID ramp
)
450 #ifdef HAVE_LIBXXF86VM
451 return X11DRV_XF86VM_SetGammaRamp(ramp
);
457 /* implementation of EnumDisplaySettings for XF86VM */
458 BOOL
X11DRV_XF86VM_EnumDisplaySettingsExW( LPCWSTR name
, DWORD n
, LPDEVMODEW devmode
, DWORD flags
)
460 DWORD dwBpp
= screen_depth
;
461 if (dwBpp
== 24) dwBpp
= 32;
462 devmode
->dmDisplayFlags
= 0;
463 devmode
->dmDisplayFrequency
= 85;
464 devmode
->dmSize
= sizeof(DEVMODEW
);
467 TRACE("mode %ld (current) -- getting current mode\n", n
);
468 n
= X11DRV_XF86VM_GetCurrentMode();
472 devmode
->dmBitsPerPel
= dwBpp
;
473 devmode
->dmPelsHeight
= GetSystemMetrics(SM_CYSCREEN
);
474 devmode
->dmPelsWidth
= GetSystemMetrics(SM_CXSCREEN
);
475 devmode
->dmFields
= (DM_PELSWIDTH
|DM_PELSHEIGHT
|DM_BITSPERPEL
);
476 TRACE("mode %ld (registry) -- returning default %ldx%ldx%ldbpp\n", n
,
477 devmode
->dmPelsWidth
, devmode
->dmPelsHeight
, devmode
->dmBitsPerPel
);
480 if (n
< dd_mode_count
)
482 devmode
->dmPelsWidth
= dd_modes
[n
].dwWidth
;
483 devmode
->dmPelsHeight
= dd_modes
[n
].dwHeight
;
484 devmode
->dmBitsPerPel
= dd_modes
[n
].dwBPP
;
485 devmode
->dmDisplayFrequency
= dd_modes
[n
].wRefreshRate
;
486 devmode
->dmFields
= (DM_PELSWIDTH
|DM_PELSHEIGHT
|DM_BITSPERPEL
|DM_DISPLAYFREQUENCY
);
487 TRACE("mode %ld -- %ldx%ldx%ldbpp %ld Hz\n", n
,
488 devmode
->dmPelsWidth
, devmode
->dmPelsHeight
, devmode
->dmBitsPerPel
,
489 devmode
->dmDisplayFrequency
);
492 TRACE("mode %ld -- not present\n", n
);
496 /* implementation of ChangeDisplaySettings for XF86VM */
497 LONG
X11DRV_XF86VM_ChangeDisplaySettingsExW( LPCWSTR devname
, LPDEVMODEW devmode
,
498 HWND hwnd
, DWORD flags
, LPVOID lpvoid
)
501 DWORD dwBpp
= screen_depth
;
502 if (dwBpp
== 24) dwBpp
= 32;
505 #ifdef HAVE_LIBXXF86VM
506 X11DRV_XF86VM_SetCurrentMode(xf86vm_initial_mode
);
508 return DISP_CHANGE_SUCCESSFUL
;
511 #if 0 /* FIXME: only works if we update SYSMETRICS */
512 if ((!(devmode
->dmFields
& DM_BITSPERPEL
) || devmode
->dmBitsPerPel
== dwBpp
) &&
513 (!(devmode
->dmFields
& DM_PELSWIDTH
) || devmode
->dmPelsWidth
== GetSystemMetrics(SM_CXSCREEN
)) &&
514 (!(devmode
->dmFields
& DM_PELSHEIGHT
) || devmode
->dmPelsHeight
== GetSystemMetrics(SM_CYSCREEN
)))
516 /* we have a valid mode */
517 TRACE("Requested mode matches current mode -- no change!\n");
518 return DISP_CHANGE_SUCCESSFUL
;
522 #ifdef HAVE_LIBXXF86VM
523 for (i
= 0; i
< dd_mode_count
; i
++)
525 if (devmode
->dmFields
& DM_BITSPERPEL
)
527 if (devmode
->dmBitsPerPel
!= dd_modes
[i
].dwBPP
)
530 if (devmode
->dmFields
& DM_PELSWIDTH
)
532 if (devmode
->dmPelsWidth
!= dd_modes
[i
].dwWidth
)
535 if (devmode
->dmFields
& DM_PELSHEIGHT
)
537 if (devmode
->dmPelsHeight
!= dd_modes
[i
].dwHeight
)
540 if (devmode
->dmFields
& DM_DISPLAYFREQUENCY
)
542 if (devmode
->dmDisplayFrequency
!= dd_modes
[i
].wRefreshRate
)
545 /* we have a valid mode */
546 TRACE("Requested display settings match mode %ld\n", i
);
547 X11DRV_XF86VM_SetCurrentMode(i
);
548 if (dwBpp
!= dd_modes
[i
].dwBPP
)
550 FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp
, dd_modes
[i
].dwBPP
);
552 return DISP_CHANGE_SUCCESSFUL
;
556 /* no valid modes found */
557 ERR("No matching mode found!\n");
558 return DISP_CHANGE_BADMODE
;
561 /* implementation of EnumDisplaySettings for nores */
562 BOOL
X11DRV_nores_EnumDisplaySettingsExW( LPCWSTR name
, DWORD n
, LPDEVMODEW devmode
, DWORD flags
)
564 DWORD dwBpp
= screen_depth
;
565 if (dwBpp
== 24) dwBpp
= 32;
566 devmode
->dmDisplayFlags
= 0;
567 devmode
->dmDisplayFrequency
= 85;
568 devmode
->dmSize
= sizeof(DEVMODEW
);
569 if (n
==0 || n
== (DWORD
)-1 || n
== (DWORD
)-2)
571 devmode
->dmBitsPerPel
= dwBpp
;
572 devmode
->dmPelsHeight
= GetSystemMetrics(SM_CYSCREEN
);
573 devmode
->dmPelsWidth
= GetSystemMetrics(SM_CXSCREEN
);
574 devmode
->dmFields
= (DM_PELSWIDTH
|DM_PELSHEIGHT
|DM_BITSPERPEL
);
575 TRACE("mode %ld -- returning default %ldx%ldx%ldbpp\n", n
,
576 devmode
->dmPelsWidth
, devmode
->dmPelsHeight
, devmode
->dmBitsPerPel
);
579 TRACE("mode %ld -- not present\n", n
);
583 /* implementation of ChangeDisplaySettings for nores */
584 LONG
X11DRV_nores_ChangeDisplaySettingsExW( LPCWSTR devname
, LPDEVMODEW devmode
,
585 HWND hwnd
, DWORD flags
, LPVOID lpvoid
)
587 DWORD dwBpp
= screen_depth
;
588 if (dwBpp
== 24) dwBpp
= 32;
591 return DISP_CHANGE_SUCCESSFUL
;
594 if ((!(devmode
->dmFields
& DM_BITSPERPEL
) || devmode
->dmBitsPerPel
== dwBpp
) &&
595 (!(devmode
->dmFields
& DM_PELSWIDTH
) || devmode
->dmPelsWidth
== GetSystemMetrics(SM_CXSCREEN
)) &&
596 (!(devmode
->dmFields
& DM_PELSHEIGHT
) || devmode
->dmPelsHeight
== GetSystemMetrics(SM_CYSCREEN
)))
598 /* we are in the desired mode */
599 TRACE("Requested mode matches current mode -- no change!\n");
600 return DISP_CHANGE_SUCCESSFUL
;
603 /* no valid modes found */
604 ERR("No matching mode found!\n");
605 return DISP_CHANGE_BADMODE
;
608 /***********************************************************************
609 * EnumDisplaySettingsExW (X11DRV.@)
611 * FIXME: should move to somewhere appropriate
613 BOOL
X11DRV_EnumDisplaySettingsExW( LPCWSTR name
, DWORD n
, LPDEVMODEW devmode
, DWORD flags
)
618 return X11DRV_XF86VM_EnumDisplaySettingsExW(name
, n
, devmode
, flags
);
620 else if (in_desktop_mode
)
623 return X11DRV_desktop_EnumDisplaySettingsExW(name
, n
, devmode
, flags
);
627 /* no resolution changing */
628 return X11DRV_nores_EnumDisplaySettingsExW(name
, n
, devmode
, flags
);
632 #define _X_FIELD(prefix, bits) if ((fields) & prefix##_##bits) {p+=sprintf(p, "%s%s", first ? "" : ",", #bits); first=FALSE;}
633 static const char * _CDS_flags(DWORD fields
)
638 _X_FIELD(CDS
,UPDATEREGISTRY
);_X_FIELD(CDS
,TEST
);_X_FIELD(CDS
,FULLSCREEN
);
639 _X_FIELD(CDS
,GLOBAL
);_X_FIELD(CDS
,SET_PRIMARY
);_X_FIELD(CDS
,RESET
);
640 _X_FIELD(CDS
,SETRECT
);_X_FIELD(CDS
,NORESET
);
642 return wine_dbg_sprintf("%s", buf
);
644 static const char * _DM_fields(DWORD fields
)
649 _X_FIELD(DM
,BITSPERPEL
);_X_FIELD(DM
,PELSWIDTH
);_X_FIELD(DM
,PELSHEIGHT
);
650 _X_FIELD(DM
,DISPLAYFLAGS
);_X_FIELD(DM
,DISPLAYFREQUENCY
);_X_FIELD(DM
,POSITION
);
652 return wine_dbg_sprintf("%s", buf
);
656 /***********************************************************************
657 * ChangeDisplaySettingsExW (X11DRV.@)
659 * FIXME: should move to somewhere appropriate
661 LONG
X11DRV_ChangeDisplaySettingsExW( LPCWSTR devname
, LPDEVMODEW devmode
,
662 HWND hwnd
, DWORD flags
, LPVOID lpvoid
)
664 TRACE("(%s,%p,%p,0x%08lx,%p\n",debugstr_w(devname
),devmode
,hwnd
,flags
,lpvoid
);
665 TRACE("flags=%s\n",_CDS_flags(flags
));
668 TRACE("DM_fields=%s\n",_DM_fields(devmode
->dmFields
));
669 TRACE("width=%ld height=%ld bpp=%ld freq=%ld\n",
670 devmode
->dmPelsWidth
,devmode
->dmPelsHeight
,
671 devmode
->dmBitsPerPel
,devmode
->dmDisplayFrequency
);
675 TRACE("Return to original display mode\n");
680 return X11DRV_XF86VM_ChangeDisplaySettingsExW( devname
, devmode
,
681 hwnd
, flags
, lpvoid
);
683 else if (in_desktop_mode
)
686 return X11DRV_desktop_ChangeDisplaySettingsExW( devname
, devmode
,
687 hwnd
, flags
, lpvoid
);
691 /* no resolution changing */
692 return X11DRV_nores_ChangeDisplaySettingsExW( devname
, devmode
,
693 hwnd
, flags
, lpvoid
);