PATCH: updated resolution changing
Alex Pasadyn
ajp at mail.utexas.edu
Mon Sep 29 14:11:07 CDT 2003
Greetings all,
This is an update to the resolution changing code for Wine desktop and
XVidmode modes. This should make a lot of apps happier. More logging
was added just in case, though!
ChangeLog:
- Add more logging to resolution changes and queries
- Always enumerate and allow 8, 16, and 32-bit modes
- Add more default choices to Wine desktop sizes
- Renamed some variables to make things easier to follow
-------------- next part --------------
Index: dlls/x11drv/desktop.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/desktop.c,v
retrieving revision 1.14
diff -u -r1.14 desktop.c
--- dlls/x11drv/desktop.c 26 Sep 2003 04:29:57 -0000 1.14
+++ dlls/x11drv/desktop.c 29 Sep 2003 19:01:09 -0000
@@ -120,43 +120,64 @@
static unsigned int max_width;
static unsigned int max_height;
-static const unsigned int widths[] = {320, 640, 800, 1024, 1280, 1600};
-static const unsigned int heights[] = {200, 480, 600, 768, 1024, 1200};
+static const unsigned int widths[] = {320, 512, 640, 800, 1024, 1152, 1280, 1600};
+static const unsigned int heights[] = {200, 384, 480, 600, 768, 864, 1024, 1200};
+static const unsigned int depths[] = {8, 16, 32};
/* fill in DD mode info for one mode*/
-static void make_one_mode (LPDDHALMODEINFO info, unsigned int width, unsigned int height)
+static void make_one_mode (LPDDHALMODEINFO info, unsigned int width, unsigned int height, unsigned int bpp)
{
info->dwWidth = width;
info->dwHeight = height;
info->wRefreshRate = 0;
info->lPitch = 0;
- info->dwBPP = 0;
+ info->dwBPP = bpp;
info->wFlags = 0;
info->dwRBitMask = 0;
info->dwGBitMask = 0;
info->dwBBitMask = 0;
info->dwAlphaBitMask = 0;
- TRACE("initialized mode %dx%d\n", width, height);
+ TRACE("initialized mode %d: %dx%dx%d\n", nmodes, width, height, bpp);
}
/* create the mode structures */
static void make_modes(void)
{
- int i;
- nmodes = 2;
- for (i=0; i<6; i++)
+ int i,j;
+ int max_modes = (3+1)*(8+2);
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
+ nmodes = 0;
+ dd_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * max_modes);
+ /* original specified desktop size */
+ make_one_mode(&dd_modes[nmodes++], screen_width, screen_height, dwBpp);
+ for (i=0; i<8; i++)
{
- if ( (widths[i] <= max_width) && (heights[i] <= max_height) ) nmodes++;
+ if ( (widths[i] <= max_width) && (heights[i] <= max_height) )
+ {
+ if ( ( (widths[i] != max_width) || (heights[i] != max_height) ) &&
+ ( (widths[i] != screen_width) || (heights[i] != screen_height) ) )
+ {
+ /* only add them if they are smaller than the root window and unique */
+ make_one_mode(&dd_modes[nmodes++], widths[i], heights[i], dwBpp);
+ }
+ }
}
- dd_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * nmodes);
- /* mode 0 is the original specified desktop size */
- make_one_mode(&dd_modes[0], screen_width, screen_height);
- /* mode 1 is the root window size */
- make_one_mode(&dd_modes[1], max_width, max_height);
- /* these modes are all the standard modes smaller than the root window */
- for (i=2; i<nmodes; i++)
+ if ((max_width != screen_width) && (max_height != screen_height))
{
- make_one_mode(&dd_modes[i], widths[i-2], heights[i-2]);
+ /* root window size (if different from desktop window) */
+ make_one_mode(&dd_modes[nmodes++], max_width, max_height, dwBpp);
+ }
+ max_modes = nmodes;
+ for (j=0; j<3; j++)
+ {
+ if (depths[j] != dwBpp)
+ {
+ for (i=0; i < max_modes; i++)
+ {
+ make_one_mode(&dd_modes[nmodes++], dd_modes[i].dwWidth, dd_modes[i].dwHeight, depths[j]);
+ }
+ }
}
}
@@ -191,6 +212,9 @@
#if 0 /* FIXME */
SYSMETRICS_Set( SM_CXSCREEN, width );
SYSMETRICS_Set( SM_CYSCREEN, height );
+#else
+ FIXME("Need to update SYSMETRICS after resizing display (now %dx%d)\n",
+ width, height);
#endif
/* clean up */
@@ -279,19 +303,29 @@
void X11DRV_desktop_SetCurrentMode(int mode)
{
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
if (mode < nmodes)
{
+ TRACE("Resizing Wine desktop window to %ldx%ld\n", dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
X11DRV_resize_desktop(dd_modes[mode].dwWidth, dd_modes[mode].dwHeight);
+ if (dwBpp != dd_modes[mode].dwBPP)
+ {
+ FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp, dd_modes[mode].dwBPP);
+ }
}
}
int X11DRV_desktop_GetCurrentMode(void)
{
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
int i;
for (i=0; i<nmodes; i++)
{
if ( (screen_width == dd_modes[i].dwWidth) &&
- (screen_height == dd_modes[i].dwHeight) )
+ (screen_height == dd_modes[i].dwHeight) &&
+ (dwBpp == dd_modes[i].dwBPP))
return i;
}
ERR("In unknown mode, returning default\n");
@@ -308,21 +342,31 @@
devmode->dmDisplayFlags = 0;
devmode->dmDisplayFrequency = 85;
devmode->dmSize = sizeof(DEVMODEW);
- if (n==0 || n == (DWORD)-1 || n == (DWORD)-2)
+ if (n==(DWORD)-1)
+ {
+ devmode->dmBitsPerPel = dwBpp;
+ devmode->dmPelsHeight = screen_height;
+ devmode->dmPelsWidth = screen_width;
+ devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
+ TRACE("mode %ld (current) -- returning current %ldx%ldx%ldbpp\n", n,
+ devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
+ return TRUE;
+ }
+ else if (n==(DWORD)-2)
{
devmode->dmBitsPerPel = dwBpp;
devmode->dmPelsHeight = dd_modes[0].dwHeight;
devmode->dmPelsWidth = dd_modes[0].dwWidth;
devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
- TRACE("mode %ld -- returning default %ldx%ldx%ldbpp\n", n,
+ TRACE("mode %ld (registry) -- returning default %ldx%ldx%ldbpp\n", n,
devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
return TRUE;
- }
- if (n <= nmodes)
+ }
+ else if (n < nmodes)
{
devmode->dmPelsWidth = dd_modes[n].dwWidth;
devmode->dmPelsHeight = dd_modes[n].dwHeight;
- devmode->dmBitsPerPel = dwBpp;
+ devmode->dmBitsPerPel = dd_modes[n].dwBPP;
devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
TRACE("mode %ld -- %ldx%ldx%ldbpp\n", n,
devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
@@ -349,7 +393,7 @@
{
if (devmode->dmFields & DM_BITSPERPEL)
{
- if (devmode->dmBitsPerPel != dwBpp)
+ if (devmode->dmBitsPerPel != dd_modes[i].dwBPP)
continue;
}
if (devmode->dmFields & DM_PELSWIDTH)
@@ -363,12 +407,8 @@
continue;
}
/* we have a valid mode */
- TRACE("Matches mode %ld\n", i);
+ TRACE("Requested display settings match mode %ld\n", i);
X11DRV_desktop_SetCurrentMode(i);
-#if 0 /* FIXME */
- SYSMETRICS_Set( SM_CXSCREEN, devmode->dmPelsWidth );
- SYSMETRICS_Set( SM_CYSCREEN, devmode->dmPelsHeight );
-#endif
return DISP_CHANGE_SUCCESSFUL;
}
@@ -381,6 +421,7 @@
static DWORD PASCAL X11DRV_desktop_SetMode(LPDDHAL_SETMODEDATA data)
{
+ TRACE("Mode %ld requested by DDHAL\n", data->dwModeIndex);
X11DRV_desktop_SetCurrentMode(data->dwModeIndex);
X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL);
data->ddRVal = DD_OK;
@@ -391,6 +432,7 @@
{
if (!nmodes) return 0; /* no desktop */
+ TRACE("Setting up Desktop mode for DDRAW\n");
info->dwNumModes = nmodes;
info->lpModeInfo = dd_modes;
X11DRV_DDHAL_SwitchMode(X11DRV_desktop_GetCurrentMode(), NULL, NULL);
Index: dlls/x11drv/xvidmode.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/xvidmode.c,v
retrieving revision 1.22
diff -u -r1.22 xvidmode.c
--- dlls/x11drv/xvidmode.c 16 Sep 2003 20:24:29 -0000 1.22
+++ dlls/x11drv/xvidmode.c 29 Sep 2003 19:01:09 -0000
@@ -52,12 +52,13 @@
static BOOL xf86vm_use_gammaramp;
#endif
-static LPDDHALMODEINFO xf86vm_modes;
-static unsigned xf86vm_mode_count;
-static XF86VidModeModeInfo** modes;
+static LPDDHALMODEINFO dd_modes;
+static unsigned int dd_mode_count;
+static XF86VidModeModeInfo** real_xf86vm_modes;
+static unsigned int real_xf86vm_mode_count;
static unsigned int xf86vm_initial_mode;
-static void convert_modeinfo( const XF86VidModeModeInfo *mode, LPDDHALMODEINFO info )
+static void convert_modeinfo( const XF86VidModeModeInfo *mode, LPDDHALMODEINFO info, unsigned int bpp)
{
info->dwWidth = mode->hdisplay;
info->dwHeight = mode->vdisplay;
@@ -67,10 +68,8 @@
info->wRefreshRate = 0;
TRACE(" width=%ld, height=%ld, refresh=%d\n",
info->dwWidth, info->dwHeight, info->wRefreshRate);
- /* XVidMode cannot change display depths... */
- /* let's not bother with filling out these then... */
info->lPitch = 0;
- info->dwBPP = 0;
+ info->dwBPP = bpp;
info->wFlags = 0;
info->dwRBitMask = 0;
info->dwGBitMask = 0;
@@ -78,7 +77,7 @@
info->dwAlphaBitMask = 0;
}
-static void convert_modeline(int dotclock, const XF86VidModeModeLine *mode, LPDDHALMODEINFO info)
+static void convert_modeline(int dotclock, const XF86VidModeModeLine *mode, LPDDHALMODEINFO info, unsigned int bpp)
{
info->dwWidth = mode->hdisplay;
info->dwHeight = mode->vdisplay;
@@ -88,10 +87,8 @@
info->wRefreshRate = 0;
TRACE(" width=%ld, height=%ld, refresh=%d\n",
info->dwWidth, info->dwHeight, info->wRefreshRate);
- /* XVidMode cannot change display depths... */
- /* let's not bother with filling out these then... */
info->lPitch = 0;
- info->dwBPP = 0;
+ info->dwBPP = bpp;
info->wFlags = 0;
info->dwRBitMask = 0;
info->dwGBitMask = 0;
@@ -105,10 +102,14 @@
}
static Bool in_desktop_mode;
+static const unsigned int depths[] = {8, 16, 32};
void X11DRV_XF86VM_Init(void)
{
- int nmodes, i;
+ int nmodes, i, j;
+ int max_modes;
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
Bool ok;
in_desktop_mode = (root_window != DefaultRootWindow(gdi_display));
@@ -138,7 +139,7 @@
#endif
/* retrieve modes */
- if (!in_desktop_mode) ok = XF86VidModeGetAllModeLines(gdi_display, DefaultScreen(gdi_display), &nmodes, &modes);
+ if (!in_desktop_mode) ok = XF86VidModeGetAllModeLines(gdi_display, DefaultScreen(gdi_display), &nmodes, &real_xf86vm_modes);
}
wine_tsx11_unlock();
if (!ok) return;
@@ -148,12 +149,29 @@
TRACE("XVidMode modes: count=%d\n", nmodes);
- xf86vm_mode_count = nmodes;
- xf86vm_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * nmodes);
+ real_xf86vm_mode_count = nmodes;
+ max_modes = (3+1)*(nmodes);
+
+ dd_modes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDHALMODEINFO) * max_modes);
/* convert modes to DDHALMODEINFO format */
- for (i=0; i<nmodes; i++)
- convert_modeinfo(modes[i], &xf86vm_modes[i]);
+ for (i=0; i<real_xf86vm_mode_count; i++)
+ {
+ convert_modeinfo(real_xf86vm_modes[i], &dd_modes[dd_mode_count++], dwBpp);
+ }
+ /* add modes for different color depths */
+ for (j=0; j<3; j++)
+ {
+ if (depths[j] != dwBpp)
+ {
+ for (i=0; i < real_xf86vm_mode_count; i++)
+ {
+ convert_modeinfo(real_xf86vm_modes[i], &dd_modes[dd_mode_count++], depths[j]);
+ }
+ }
+ }
+
+ TRACE("Available DD modes: count=%d\n", dd_mode_count);
/* store the current mode at the time we started */
xf86vm_initial_mode = X11DRV_XF86VM_GetCurrentMode();
@@ -163,7 +181,7 @@
void X11DRV_XF86VM_Cleanup(void)
{
- if (modes) TSXFree(modes);
+ if (real_xf86vm_modes) TSXFree(real_xf86vm_modes);
}
int X11DRV_XF86VM_GetCurrentMode(void)
@@ -171,16 +189,18 @@
XF86VidModeModeLine line;
int dotclock, i;
DDHALMODEINFO cmode;
+ DWORD dwBpp = screen_depth;
+ if (dwBpp == 24) dwBpp = 32;
- if (!xf86vm_modes) return 0; /* no XVidMode */
+ if (!dd_modes) return 0; /* no XVidMode */
TRACE("Querying XVidMode current mode\n");
wine_tsx11_lock();
XF86VidModeGetModeLine(gdi_display, DefaultScreen(gdi_display), &dotclock, &line);
wine_tsx11_unlock();
- convert_modeline(dotclock, &line, &cmode);
- for (i=0; i<xf86vm_mode_count; i++)
- if (memcmp(&xf86vm_modes[i], &cmode, sizeof(cmode)) == 0) {
+ convert_modeline(dotclock, &line, &cmode, dwBpp);
+ for (i=0; i<dd_mode_count; i++)
+ if (memcmp(&dd_modes[i], &cmode, sizeof(cmode)) == 0) {
TRACE("mode=%d\n", i);
return i;
}
@@ -190,10 +210,22 @@
void X11DRV_XF86VM_SetCurrentMode(int mode)
{
- if (!xf86vm_modes) return; /* no XVidMode */
+ if (!dd_modes) return; /* no XVidMode */
+
+ /* only set modes from the original color depth */
+ mode = mode % real_xf86vm_mode_count;
wine_tsx11_lock();
- XF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), modes[mode]);
+ TRACE("Resizing X display to %dx%d\n",
+ real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay);
+ XF86VidModeSwitchToMode(gdi_display, DefaultScreen(gdi_display), real_xf86vm_modes[mode]);
+#if 0 /* FIXME */
+ SYSMETRICS_Set( SM_CXSCREEN, real_xf86vm_modes[mode]->hdisplay );
+ SYSMETRICS_Set( SM_CYSCREEN, real_xf86vm_modes[mode]->vdisplay );
+#else
+ FIXME("Need to update SYSMETRICS after resizing display (now %dx%d)\n",
+ real_xf86vm_modes[mode]->hdisplay, real_xf86vm_modes[mode]->vdisplay);
+#endif
#if 0 /* it is said that SetViewPort causes problems with some X servers */
XF86VidModeSetViewPort(gdi_display, DefaultScreen(gdi_display), 0, 0);
#else
@@ -205,7 +237,7 @@
void X11DRV_XF86VM_SetExclusiveMode(int lock)
{
- if (!xf86vm_modes) return; /* no XVidMode */
+ if (!dd_modes) return; /* no XVidMode */
wine_tsx11_lock();
XF86VidModeLockModeSwitch(gdi_display, DefaultScreen(gdi_display), lock);
@@ -216,6 +248,7 @@
static DWORD PASCAL X11DRV_XF86VM_SetMode(LPDDHAL_SETMODEDATA data)
{
+ TRACE("Mode %ld requested by DDHAL\n", data->dwModeIndex);
X11DRV_XF86VM_SetCurrentMode(data->dwModeIndex);
X11DRV_DDHAL_SwitchMode(data->dwModeIndex, NULL, NULL);
data->ddRVal = DD_OK;
@@ -224,10 +257,11 @@
int X11DRV_XF86VM_CreateDriver(LPDDHALINFO info)
{
- if (!xf86vm_mode_count) return 0; /* no XVidMode */
+ if (!dd_mode_count) return 0; /* no XVidMode */
- info->dwNumModes = xf86vm_mode_count;
- info->lpModeInfo = xf86vm_modes;
+ TRACE("Setting up XF86VM mode for DDRAW\n");
+ info->dwNumModes = dd_mode_count;
+ info->lpModeInfo = dd_modes;
X11DRV_DDHAL_SwitchMode(X11DRV_XF86VM_GetCurrentMode(), NULL, NULL);
info->lpDDCallbacks->SetMode = X11DRV_XF86VM_SetMode;
return TRUE;
@@ -427,36 +461,38 @@
devmode->dmDisplayFlags = 0;
devmode->dmDisplayFrequency = 85;
devmode->dmSize = sizeof(DEVMODEW);
- if (n==0 || n == (DWORD)-1 || n == (DWORD)-2)
+ if (n == (DWORD)-1)
+ {
+ TRACE("mode %ld (current) -- getting current mode\n", n);
+ n = X11DRV_XF86VM_GetCurrentMode();
+ }
+ if (n == (DWORD)-2)
{
devmode->dmBitsPerPel = dwBpp;
devmode->dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
devmode->dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL);
- TRACE("mode %ld -- returning default %ldx%ldx%ldbpp\n", n,
+ TRACE("mode %ld (registry) -- returning default %ldx%ldx%ldbpp\n", n,
devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
return TRUE;
}
-#ifdef HAVE_LIBXXF86VM
- if (n <= xf86vm_mode_count)
+ if (n < dd_mode_count)
{
- XF86VidModeModeInfo *mode;
- mode = modes[n-1];
- devmode->dmPelsWidth = mode->hdisplay;
- devmode->dmPelsHeight = mode->vdisplay;
- devmode->dmBitsPerPel = dwBpp;
- devmode->dmDisplayFrequency = mode->dotclock * 1000 / (mode->htotal * mode->vtotal);
+ devmode->dmPelsWidth = dd_modes[n].dwWidth;
+ devmode->dmPelsHeight = dd_modes[n].dwHeight;
+ devmode->dmBitsPerPel = dd_modes[n].dwBPP;
+ devmode->dmDisplayFrequency = dd_modes[n].wRefreshRate;
devmode->dmFields = (DM_PELSWIDTH|DM_PELSHEIGHT|DM_BITSPERPEL|DM_DISPLAYFREQUENCY);
- TRACE("mode %ld -- %ldx%ldx%ldbpp\n", n,
- devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel);
+ TRACE("mode %ld -- %ldx%ldx%ldbpp %ld Hz\n", n,
+ devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel,
+ devmode->dmDisplayFrequency);
return TRUE;
}
-#endif
TRACE("mode %ld -- not present\n", n);
return FALSE;
}
-/* implementation of ChangeDisplaySettings for desktop */
+/* implementation of ChangeDisplaySettings for XF86VM */
LONG X11DRV_XF86VM_ChangeDisplaySettingsExW( LPCWSTR devname, LPDEVMODEW devmode,
HWND hwnd, DWORD flags, LPVOID lpvoid )
{
@@ -483,31 +519,35 @@
#endif
#ifdef HAVE_LIBXXF86VM
- for (i = 0; i < xf86vm_mode_count; i++)
+ for (i = 0; i < dd_mode_count; i++)
{
- XF86VidModeModeInfo *mode = modes[i];
if (devmode->dmFields & DM_BITSPERPEL)
{
- if (devmode->dmBitsPerPel != dwBpp)
+ if (devmode->dmBitsPerPel != dd_modes[i].dwBPP)
continue;
}
if (devmode->dmFields & DM_PELSWIDTH)
{
- if (devmode->dmPelsWidth != mode->hdisplay)
+ if (devmode->dmPelsWidth != dd_modes[i].dwWidth)
continue;
}
if (devmode->dmFields & DM_PELSHEIGHT)
{
- if (devmode->dmPelsHeight != mode->vdisplay)
+ if (devmode->dmPelsHeight != dd_modes[i].dwHeight)
+ continue;
+ }
+ if (devmode->dmFields & DM_DISPLAYFREQUENCY)
+ {
+ if (devmode->dmDisplayFrequency != dd_modes[i].wRefreshRate)
continue;
}
/* we have a valid mode */
- TRACE("Matches mode %ld\n", i);
+ TRACE("Requested display settings match mode %ld\n", i);
X11DRV_XF86VM_SetCurrentMode(i);
-#if 0 /* FIXME */
- SYSMETRICS_Set( SM_CXSCREEN, devmode->dmPelsWidth );
- SYSMETRICS_Set( SM_CYSCREEN, devmode->dmPelsHeight );
-#endif
+ if (dwBpp != dd_modes[i].dwBPP)
+ {
+ FIXME("Cannot change screen BPP from %ld to %ld\n", dwBpp, dd_modes[i].dwBPP);
+ }
return DISP_CHANGE_SUCCESSFUL;
}
#endif
@@ -571,7 +611,7 @@
*/
BOOL X11DRV_EnumDisplaySettingsExW( LPCWSTR name, DWORD n, LPDEVMODEW devmode, DWORD flags)
{
- if (xf86vm_modes)
+ if (dd_modes)
{
/* XVidMode */
return X11DRV_XF86VM_EnumDisplaySettingsExW(name, n, devmode, flags);
@@ -633,7 +673,7 @@
{
TRACE("Return to original display mode\n");
}
- if (xf86vm_modes)
+ if (dd_modes)
{
/* XVidMode */
return X11DRV_XF86VM_ChangeDisplaySettingsExW( devname, devmode,
Index: dlls/d3d8/directx.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/directx.c,v
retrieving revision 1.53
diff -u -r1.53 directx.c
--- dlls/d3d8/directx.c 25 Sep 2003 20:22:21 -0000 1.53
+++ dlls/d3d8/directx.c 29 Sep 2003 19:01:10 -0000
@@ -160,9 +160,9 @@
int i = 0;
while (EnumDisplaySettingsExW(NULL, i, &DevModeW, 0)) {
- TRACE("(%p}->(Adapter: %d) => %d\n", This, Adapter, i);
i++;
}
+ TRACE("(%p}->(Adapter: %d) => %d\n", This, Adapter, i);
return i;
} else {
FIXME("Adapter not primary display\n");
@@ -190,8 +190,12 @@
{
pMode->Width = DevModeW.dmPelsWidth;
pMode->Height = DevModeW.dmPelsHeight;
+ bpp = DevModeW.dmBitsPerPel;
pMode->RefreshRate = D3DADAPTER_DEFAULT;
- bpp = DevModeW.dmBitsPerPel;
+ if (DevModeW.dmFields&DM_DISPLAYFREQUENCY)
+ {
+ pMode->RefreshRate = DevModeW.dmDisplayFrequency;
+ }
}
else
{
@@ -229,16 +233,18 @@
}
if (Adapter == 0) { /* Display */
- HDC hdc;
int bpp = 0;
+ DEVMODEW DevModeW;
- pMode->Width = GetSystemMetrics(SM_CXSCREEN);
- pMode->Height = GetSystemMetrics(SM_CYSCREEN);
- pMode->RefreshRate = 85; /*FIXME: How to identify? */
-
- hdc = CreateDCA("DISPLAY", NULL, NULL, NULL);
- bpp = GetDeviceCaps(hdc, BITSPIXEL);
- DeleteDC(hdc);
+ EnumDisplaySettingsExW(NULL, (DWORD)-1, &DevModeW, 0);
+ pMode->Width = DevModeW.dmPelsWidth;
+ pMode->Height = DevModeW.dmPelsHeight;
+ bpp = DevModeW.dmBitsPerPel;
+ pMode->RefreshRate = D3DADAPTER_DEFAULT;
+ if (DevModeW.dmFields&DM_DISPLAYFREQUENCY)
+ {
+ pMode->RefreshRate = DevModeW.dmDisplayFrequency;
+ }
switch (bpp) {
case 8: pMode->Format = D3DFMT_R3G3B2; break;
Index: dlls/ddraw/ddraw/user.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/ddraw/user.c,v
retrieving revision 1.18
diff -u -r1.18 user.c
--- dlls/ddraw/ddraw/user.c 16 Sep 2003 20:25:02 -0000 1.18
+++ dlls/ddraw/ddraw/user.c 29 Sep 2003 19:01:11 -0000
@@ -93,28 +93,6 @@
return TRUE;
}
-/* If you change this function, you probably want to change the enumeration
- * code in EnumDisplayModes. */
-static BOOL
-IsValidDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP,
- DWORD dwRefreshRate, DWORD dwFlags)
-{
- switch (dwBPP)
- {
- case 8:
- case 15:
- case 16:
- case 24:
- case 32:
- break;
-
- default:
- return FALSE;
- }
-
- return TRUE;
-}
-
static const DDPIXELFORMAT* pixelformat_for_depth(DWORD depth)
{
switch (depth)
@@ -310,13 +288,11 @@
LPDDSURFACEDESC2 pDDSD, LPVOID context,
LPDDENUMMODESCALLBACK2 callback)
{
- static const int num_pixelformats
- = sizeof(pixelformats)/sizeof(pixelformats[0]);
-
DDSURFACEDESC2 callback_sd;
DEVMODEW DevModeW;
+ const DDPIXELFORMAT* pixelformat;
- int i, j;
+ int i;
TRACE("(%p)->(0x%08lx,%p,%p,%p)\n",iface,dwFlags,pDDSD,context,callback);
@@ -336,33 +312,31 @@
{
callback_sd.dwHeight = DevModeW.dmPelsHeight;
callback_sd.dwWidth = DevModeW.dmPelsWidth;
+ if (DevModeW.dmFields&DM_DISPLAYFREQUENCY)
+ {
+ callback_sd.u2.dwRefreshRate = DevModeW.dmDisplayFrequency;
+ }
TRACE("- mode: %ldx%ld\n", callback_sd.dwWidth, callback_sd.dwHeight);
- for (j = 0; j < num_pixelformats; j++)
- {
- callback_sd.u1.lPitch
- = DDRAW_width_bpp_to_pitch(DevModeW.dmPelsWidth,
- pixelformats[j].u1.dwRGBBitCount);
-
- callback_sd.u4.ddpfPixelFormat = pixelformats[j];
-
- callback_sd.ddsCaps.dwCaps = 0;
- if (pixelformats[j].dwFlags & DDPF_PALETTEINDEXED8) /* ick */
- callback_sd.ddsCaps.dwCaps |= DDSCAPS_PALETTE;
-
- assert(IsValidDisplayMode(callback_sd.dwWidth,
- callback_sd.dwHeight,
- callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount,
- 0, 0));
-
- TRACE(" - %2ld bpp, R=%08lx G=%08lx B=%08lx\n",
- callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount,
- callback_sd.u4.ddpfPixelFormat.u2.dwRBitMask,
- callback_sd.u4.ddpfPixelFormat.u3.dwGBitMask,
- callback_sd.u4.ddpfPixelFormat.u4.dwBBitMask);
- if (callback(&callback_sd, context) == DDENUMRET_CANCEL)
- return DD_OK;
- }
+
+ pixelformat = pixelformat_for_depth(DevModeW.dmBitsPerPel);
+ callback_sd.u1.lPitch
+ = DDRAW_width_bpp_to_pitch(DevModeW.dmPelsWidth,
+ pixelformat->u1.dwRGBBitCount);
+
+ callback_sd.u4.ddpfPixelFormat = *pixelformat;
+
+ callback_sd.ddsCaps.dwCaps = 0;
+ if (pixelformat->dwFlags & DDPF_PALETTEINDEXED8) /* ick */
+ callback_sd.ddsCaps.dwCaps |= DDSCAPS_PALETTE;
+
+ TRACE(" - %2ld bpp, R=%08lx G=%08lx B=%08lx\n",
+ callback_sd.u4.ddpfPixelFormat.u1.dwRGBBitCount,
+ callback_sd.u4.ddpfPixelFormat.u2.dwRBitMask,
+ callback_sd.u4.ddpfPixelFormat.u3.dwGBitMask,
+ callback_sd.u4.ddpfPixelFormat.u4.dwBBitMask);
+ if (callback(&callback_sd, context) == DDENUMRET_CANCEL)
+ return DD_OK;
i++;
}
@@ -528,8 +502,7 @@
LONG pitch;
TRACE("(%p)->(%ldx%ldx%ld,%ld Hz,%08lx)\n",This,dwWidth,dwHeight,dwBPP,dwRefreshRate,dwFlags);
- devmode.dmFields = /* DM_BITSPERPEL | */ DM_PELSWIDTH | DM_PELSHEIGHT;
- FIXME("Ignoring requested BPP (%ld)\n", dwBPP);
+ devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
devmode.dmBitsPerPel = dwBPP;
devmode.dmPelsWidth = dwWidth;
devmode.dmPelsHeight = dwHeight;
More information about the wine-patches
mailing list