Added ChangeDisplaySettingsExA stub and some flag defines.
diff --git a/include/winuser.h b/include/winuser.h
index eada590..009b18c 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -1202,6 +1202,17 @@
#define DISP_CHANGE_BADMODE (-2)
#define DISP_CHANGE_NOTUPDATED (-3)
#define DISP_CHANGE_BADFLAGS (-4)
+#define DISP_CHANGE_BADPARAM (-5)
+
+/* ChangeDisplaySettings.dwFlags */
+#define CDS_UPDATEREGISTRY 0x00000001
+#define CDS_TEST 0x00000002
+#define CDS_FULLSCREEN 0x00000004
+#define CDS_GLOBAL 0x00000008
+#define CDS_SET_PRIMARY 0x00000010
+#define CDS_RESET 0x40000000
+#define CDS_SETRECT 0x20000000
+#define CDS_NORESET 0x10000000
/* flags to FormatMessage */
#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100
@@ -3019,6 +3030,12 @@
LRESULT WINAPI CallWindowProcW(WNDPROC,HWND,UINT,WPARAM,LPARAM);
#define CallWindowProc WINELIB_NAME_AW(CallWindowProc)
BOOL WINAPI ChangeClipboardChain(HWND,HWND);
+LONG WINAPI ChangeDisplaySettingsA(LPDEVMODEA,DWORD);
+LONG WINAPI ChangeDisplaySettingsW(LPDEVMODEW,DWORD);
+#define ChangeDisplaySettings WINELIB_NAME_AW(ChangeDisplaySettings)
+LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPARAM);
+LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPARAM);
+#define ChangeDisplaySettingsEx WINELIB_NAME_AW(ChangeDisplaySettingsEx)
BOOL WINAPI ChangeMenuA(HMENU,UINT,LPCSTR,UINT,UINT);
BOOL WINAPI ChangeMenuW(HMENU,UINT,LPCWSTR,UINT,UINT);
#define ChangeMenu WINELIB_NAME_AW(ChangeMenu)
diff --git a/relay32/user32.spec b/relay32/user32.spec
index 305bfebb..9c597bb 100644
--- a/relay32/user32.spec
+++ b/relay32/user32.spec
@@ -606,7 +606,7 @@
601 stub WNDPROC_CALLBACK
602 stdcall DrawCaptionTempW(long long ptr long long wstr long) DrawCaptionTempW
603 stub IsHungAppWindow
-604 stub ChangeDisplaySettingsExA
+604 stdcall ChangeDisplaySettingsExA(str ptr long long ptr) ChangeDisplaySettingsExA
605 stub ChangeDisplaySettingsExW
606 stdcall SetWindowText(long str) SetWindowTextA
607 stdcall GetMonitorInfoA(long ptr) GetMonitorInfoA
diff --git a/windows/user.c b/windows/user.c
index 672783b..bda9b03 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -322,13 +322,50 @@
return FALSE;
}
+static void _dump_CDS_flags(DWORD flags) {
+#define X(x) if (flags & CDS_##x) MESSAGE(""#x ",");
+ X(UPDATEREGISTRY);X(TEST);X(FULLSCREEN);X(GLOBAL);
+ X(SET_PRIMARY);X(RESET);X(SETRECT);X(NORESET);
+#undef X
+}
/***********************************************************************
* ChangeDisplaySettingA (USER32.589)
*/
LONG WINAPI ChangeDisplaySettingsA( LPDEVMODEA devmode, DWORD flags )
{
- FIXME_(system)(": stub\n");
+ FIXME_(system)("(%p,0x%08lx), stub\n",devmode,flags);
+ MESSAGE("\tflags=");_dump_CDS_flags(flags);MESSAGE("\n");
+ if (devmode==NULL)
+ FIXME_(system)(" devmode=NULL (return to default mode)\n");
+ else if ( (devmode->dmBitsPerPel != DESKTOP_GetScreenDepth())
+ || (devmode->dmPelsHeight != DESKTOP_GetScreenHeight())
+ || (devmode->dmPelsWidth != DESKTOP_GetScreenWidth()) )
+
+ {
+
+ if (devmode->dmFields & DM_BITSPERPEL)
+ FIXME_(system)(" bpp=%ld\n",devmode->dmBitsPerPel);
+ if (devmode->dmFields & DM_PELSWIDTH)
+ FIXME_(system)(" width=%ld\n",devmode->dmPelsWidth);
+ if (devmode->dmFields & DM_PELSHEIGHT)
+ FIXME_(system)(" height=%ld\n",devmode->dmPelsHeight);
+ FIXME_(system)(" (Putting X in this mode beforehand might help)\n");
+ /* we don't, but the program ... does not need to know */
+ return DISP_CHANGE_SUCCESSFUL;
+ }
+ return DISP_CHANGE_SUCCESSFUL;
+}
+
+/***********************************************************************
+ * ChangeDisplaySettingExA (USER32.604)
+ */
+LONG WINAPI ChangeDisplaySettingsExA(
+ LPCSTR devname, LPDEVMODEA devmode, HWND hwnd, DWORD flags,
+ LPARAM lparam
+) {
+ FIXME_(system)("(%s,%p,0x%04x,0x%08lx,0x%08lx), stub\n",devname,devmode,hwnd,flags,lparam);
+ MESSAGE("\tflags=");_dump_CDS_flags(flags);MESSAGE("\n");
if (devmode==NULL)
FIXME_(system)(" devmode=NULL (return to default mode)\n");
else if ( (devmode->dmBitsPerPel != DESKTOP_GetScreenDepth())