Name: winePatchDevModeFill
ChangeLog: fill devmode struct with more info -- xp like
GenDate: 2007/01/01 07:14:37 UTC
ModifiedFiles: dlls/user32/sysparams.c dlls/winex11.drv/settings.c
AddedFiles: 
Index: dlls/user32/sysparams.c
===================================================================
RCS file: /home/wine/wine/dlls/user32/sysparams.c,v
retrieving revision 1.1
diff -u -r1.1 sysparams.c
--- dlls/user32/sysparams.c	16 Nov 2006 14:02:17 -0000	1.1
+++ dlls/user32/sysparams.c	1 Jan 2007 07:14:26 -0000
@@ -2988,12 +2988,72 @@
 
     if (devmode)
     {
-        devmodeW.dmBitsPerPel       = devmode->dmBitsPerPel;
-        devmodeW.dmPelsHeight       = devmode->dmPelsHeight;
-        devmodeW.dmPelsWidth        = devmode->dmPelsWidth;
-        devmodeW.dmDisplayFlags     = devmode->dmDisplayFlags;
-        devmodeW.dmDisplayFrequency = devmode->dmDisplayFrequency;
-        devmodeW.dmFields           = devmode->dmFields;
+        MultiByteToWideChar(CP_ACP, 0, (const char*)devmode->dmDeviceName, CCHDEVICENAME, devmodeW.dmDeviceName, CCHDEVICENAME);
+        devmodeW.dmSpecVersion = devmode->dmSpecVersion;
+        devmodeW.dmDriverVersion = devmode->dmDriverVersion;
+        devmodeW.dmSize = sizeof(DEVMODEW);
+        devmodeW.dmDriverExtra = devmode->dmDriverExtra;
+        devmodeW.dmFields = devmode->dmFields;
+    
+        if(devmode->dmFields & DM_ORIENTATION)
+            devmodeW.dmOrientation = devmode->dmOrientation;
+        if(devmode->dmFields & DM_PAPERSIZE)
+            devmodeW.dmPaperSize = devmode->dmPaperSize;
+        if(devmode->dmFields & DM_PAPERLENGTH)
+            devmodeW.dmPaperLength = devmode->dmPaperLength;
+        if(devmode->dmFields & DM_PAPERWIDTH)
+            devmodeW.dmPaperWidth = devmode->dmPaperWidth;
+        if(devmode->dmFields & DM_POSITION)
+        {
+            devmodeW.dmPosition.x = devmode->dmPosition.x;
+            devmodeW.dmPosition.y = devmode->dmPosition.y;
+        }
+        if(devmode->dmFields & DM_SCALE)
+            devmodeW.dmScale = devmode->dmScale;
+        if(devmode->dmFields & DM_COPIES)
+            devmodeW.dmCopies = devmode->dmCopies;
+        if(devmode->dmFields & DM_DEFAULTSOURCE)
+            devmodeW.dmDefaultSource = devmode->dmDefaultSource;
+        if(devmode->dmFields & DM_PRINTQUALITY)
+            devmodeW.dmPrintQuality = devmode->dmPrintQuality;
+        if(devmode->dmFields & DM_COLOR)
+            devmodeW.dmColor = devmode->dmColor;
+        if(devmode->dmFields & DM_DUPLEX)
+            devmodeW.dmDuplex = devmode->dmDuplex;
+        if(devmode->dmFields & DM_YRESOLUTION)
+            devmodeW.dmYResolution = devmode->dmYResolution;
+        if(devmode->dmFields & DM_TTOPTION)
+            devmodeW.dmTTOption = devmode->dmTTOption;
+        if(devmode->dmFields & DM_COLLATE)
+            devmodeW.dmCollate = devmode->dmCollate;
+        if(devmode->dmFields & DM_FORMNAME)
+            MultiByteToWideChar(CP_ACP, 0, (const char*)devmode->dmFormName, CCHFORMNAME, devmodeW.dmFormName, CCHFORMNAME);
+        if(devmode->dmFields & DM_LOGPIXELS)
+            devmodeW.dmLogPixels = devmode->dmLogPixels;
+        if(devmode->dmFields & DM_BITSPERPEL)
+            devmodeW.dmBitsPerPel = devmode->dmBitsPerPel;
+        if(devmode->dmFields & DM_PELSWIDTH)
+            devmodeW.dmPelsWidth = devmode->dmPelsWidth;
+        if(devmode->dmFields & DM_PELSHEIGHT)
+            devmodeW.dmPelsHeight = devmode->dmPelsHeight;
+        if(devmode->dmFields & DM_DISPLAYFLAGS)
+            devmodeW.dmDisplayFlags = devmode->dmDisplayFlags;
+        if(devmode->dmFields & DM_DISPLAYFREQUENCY)
+            devmodeW.dmDisplayFrequency = devmode->dmDisplayFrequency;
+        /* Check OS version? */
+        if(devmode->dmFields & DM_ICMMETHOD)
+            devmodeW.dmICMMethod = devmode->dmICMMethod;
+        if(devmode->dmFields & DM_ICMINTENT)
+            devmodeW.dmICMIntent = devmode->dmICMIntent;
+        if(devmode->dmFields & DM_MEDIATYPE)
+            devmodeW.dmMediaType = devmode->dmMediaType;
+        if(devmode->dmFields & DM_DITHERTYPE)
+            devmodeW.dmDitherType = devmode->dmDitherType;
+        /* Check OS version? reserved1,2? */
+        if(devmode->dmFields & DM_PANNINGWIDTH)
+            devmodeW.dmPanningWidth = devmode->dmPanningWidth;
+        if(devmode->dmFields & DM_PANNINGHEIGHT) 
+            devmodeW.dmPanningHeight = devmode->dmPanningHeight;
         ret = ChangeDisplaySettingsExW(nameW.Buffer, &devmodeW, hwnd, flags, lparam);
     }
     else
@@ -3057,12 +3117,72 @@
     ret = EnumDisplaySettingsExW(nameW.Buffer,iModeNum,&devmodeW,dwFlags);
     if (ret)
     {
-        lpDevMode->dmBitsPerPel       = devmodeW.dmBitsPerPel;
-        lpDevMode->dmPelsHeight       = devmodeW.dmPelsHeight;
-        lpDevMode->dmPelsWidth        = devmodeW.dmPelsWidth;
-        lpDevMode->dmDisplayFlags     = devmodeW.dmDisplayFlags;
-        lpDevMode->dmDisplayFrequency = devmodeW.dmDisplayFrequency;
-        lpDevMode->dmFields           = devmodeW.dmFields;
+        WideCharToMultiByte(CP_ACP, 0, devmodeW.dmDeviceName, CCHDEVICENAME, (char*)lpDevMode->dmDeviceName, CCHDEVICENAME, NULL, NULL);
+        lpDevMode->dmSpecVersion = devmodeW.dmSpecVersion;
+        lpDevMode->dmDriverVersion = devmodeW.dmDriverVersion;
+        lpDevMode->dmSize = sizeof(DEVMODEA);
+        lpDevMode->dmDriverExtra = devmodeW.dmDriverExtra;
+        lpDevMode->dmFields = devmodeW.dmFields;
+    
+        if(lpDevMode->dmFields & DM_ORIENTATION)
+            lpDevMode->dmOrientation = devmodeW.dmOrientation;
+        if(lpDevMode->dmFields & DM_PAPERSIZE)
+            lpDevMode->dmPaperSize = devmodeW.dmPaperSize;
+        if(lpDevMode->dmFields & DM_PAPERLENGTH)
+            lpDevMode->dmPaperLength = devmodeW.dmPaperLength;
+        if(lpDevMode->dmFields & DM_PAPERWIDTH)
+            lpDevMode->dmPaperWidth = devmodeW.dmPaperWidth;
+        if(lpDevMode->dmFields & DM_POSITION)
+        {
+            lpDevMode->dmPosition.x = devmodeW.dmPosition.x;
+            lpDevMode->dmPosition.y = devmodeW.dmPosition.y;
+        }
+        if(lpDevMode->dmFields & DM_SCALE)
+            lpDevMode->dmScale = devmodeW.dmScale;
+        if(lpDevMode->dmFields & DM_COPIES)
+            lpDevMode->dmCopies = devmodeW.dmCopies;
+        if(lpDevMode->dmFields & DM_DEFAULTSOURCE)
+            lpDevMode->dmDefaultSource = devmodeW.dmDefaultSource;
+        if(lpDevMode->dmFields & DM_PRINTQUALITY)
+            lpDevMode->dmPrintQuality = devmodeW.dmPrintQuality;
+        if(lpDevMode->dmFields & DM_COLOR)
+            lpDevMode->dmColor = devmodeW.dmColor;
+        if(lpDevMode->dmFields & DM_DUPLEX)
+            lpDevMode->dmDuplex = devmodeW.dmDuplex;
+        if(lpDevMode->dmFields & DM_YRESOLUTION)
+            lpDevMode->dmYResolution = devmodeW.dmYResolution;
+        if(lpDevMode->dmFields & DM_TTOPTION)
+            lpDevMode->dmTTOption = devmodeW.dmTTOption;
+        if(lpDevMode->dmFields & DM_COLLATE)
+            lpDevMode->dmCollate = devmodeW.dmCollate;
+        if(lpDevMode->dmFields & DM_FORMNAME)
+            WideCharToMultiByte(CP_ACP, 0, devmodeW.dmFormName, CCHFORMNAME, (char*)lpDevMode->dmFormName, CCHFORMNAME, NULL, NULL);
+        if(lpDevMode->dmFields & DM_LOGPIXELS)
+            lpDevMode->dmLogPixels = devmodeW.dmLogPixels;
+        if(lpDevMode->dmFields & DM_BITSPERPEL)
+            lpDevMode->dmBitsPerPel = devmodeW.dmBitsPerPel;
+        if(lpDevMode->dmFields & DM_PELSWIDTH)
+            lpDevMode->dmPelsWidth = devmodeW.dmPelsWidth;
+        if(lpDevMode->dmFields & DM_PELSHEIGHT)
+            lpDevMode->dmPelsHeight = devmodeW.dmPelsHeight;
+        if(lpDevMode->dmFields & DM_DISPLAYFLAGS)
+            lpDevMode->dmDisplayFlags = devmodeW.dmDisplayFlags;
+        if(lpDevMode->dmFields & DM_DISPLAYFREQUENCY)
+            lpDevMode->dmDisplayFrequency = devmodeW.dmDisplayFrequency;
+        /* Check OS version? */
+        if(lpDevMode->dmFields & DM_ICMMETHOD)
+            lpDevMode->dmICMMethod = devmodeW.dmICMMethod;
+        if(lpDevMode->dmFields & DM_ICMINTENT)
+            lpDevMode->dmICMIntent = devmodeW.dmICMIntent;
+        if(lpDevMode->dmFields & DM_MEDIATYPE)
+            lpDevMode->dmMediaType = devmodeW.dmMediaType;
+        if(lpDevMode->dmFields & DM_DITHERTYPE)
+            lpDevMode->dmDitherType = devmodeW.dmDitherType;
+        /* Check OS version? reserved1,2? */
+        if(lpDevMode->dmFields & DM_PANNINGWIDTH)
+            lpDevMode->dmPanningWidth = devmodeW.dmPanningWidth;
+        if(lpDevMode->dmFields & DM_PANNINGHEIGHT) 
+            lpDevMode->dmPanningHeight = devmodeW.dmPanningHeight;
     }
     if (lpszDeviceName) RtlFreeUnicodeString(&nameW);
     return ret;
Index: dlls/winex11.drv/settings.c
===================================================================
RCS file: /home/wine/wine/dlls/winex11.drv/settings.c,v
retrieving revision 1.4
diff -u -r1.4 settings.c
--- dlls/winex11.drv/settings.c	9 Oct 2006 19:06:04 -0000	1.4
+++ dlls/winex11.drv/settings.c	1 Jan 2007 07:14:27 -0000
@@ -26,6 +26,7 @@
 #include "windef.h"
 #include "wingdi.h"
 #include "ddrawi.h"
+#include "wine/unicode.h"
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(x11settings);
@@ -169,15 +170,29 @@
     devmode->dmDisplayFlags = 0;
     devmode->dmDisplayFrequency = 0;
     devmode->dmSize = sizeof(DEVMODEW);
+
+    /* Use a more accurate name based on the real renderer? */
+    MultiByteToWideChar(CP_ACP, 0, handler_name, CCHDEVICENAME, devmode->dmDeviceName, CCHDEVICENAME);
+    /* nv34 and rv250 windows xp drivers specify this as DM_SPECVERSION */
+    devmode->dmSpecVersion = devmode->dmDriverVersion = DM_SPECVERSION;
+    /* nv34 and rv250 windows xp drivers specify this as 0 */
+    devmode->dmDriverExtra = 0;
+
     if (n == ENUM_CURRENT_SETTINGS)
     {
         TRACE("mode %d (current) -- getting current mode (%s)\n", n, handler_name);
         n = pGetCurrentMode();
+        /* according to nv34 and rv250 windows xp drivers */
+        /* dmLogPixels -- on -- A(invalid) W(valid 96) */
+        /* dmPosition -- 0,0 -- maybe useful for multi display machines */
     }
     if (n == ENUM_REGISTRY_SETTINGS)
     {
         TRACE("mode %d (registry) -- getting default mode (%s)\n", n, handler_name);
         n = dd_mode_default;
+        /* according to nv34 and rv250 windows xp drivers */
+        /* dmLogPixels -- on -- A(invalid) W(valid 96) */
+        /* dmPosition -- on -- 0,0 -- maybe useful for multi display machines */
     }
     if (n < dd_mode_count)
     {
@@ -199,6 +214,10 @@
                   devmode->dmPelsWidth, devmode->dmPelsHeight, devmode->dmBitsPerPel, 
                   handler_name);
         }
+        /* nv34 and rv250 xp windows drivers specify this as 0 */
+        devmode->dmFields |= DM_DISPLAYFLAGS;
+        devmode->dmDisplayFlags = 0;
+
         return TRUE;
     }
     TRACE("mode %d -- not present (%s)\n", n, handler_name);
