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())