IntChangeDisplaySettings: set last error before leaving the function
[reactos.git] / reactos / subsystems / win32 / win32k / objects / device.c
index 15ecb5f..3469a56 100644 (file)
@@ -204,7 +204,7 @@ SetupDevMode(PDEVMODEW DevMode, ULONG DisplayNumber)
 static BOOL FASTCALL
 IntPrepareDriver()
 {
-    PGD_ENABLEDRIVER GDEnableDriver;
+    PFN_DrvEnableDriver GDEnableDriver;
     DRVENABLEDATA DED;
     UNICODE_STRING DriverFileNames;
     PWSTR CurrentName;
@@ -326,7 +326,7 @@ IntPrepareDriver()
                                        HS_DDI_MAX,
                                        PrimarySurface.FillPatterns,
                                        sizeof(PrimarySurface.GDIInfo),
-                                       (ULONG *) &PrimarySurface.GDIInfo,
+                                       &PrimarySurface.GDIInfo,
                                        sizeof(PrimarySurface.DevInfo),
                                        &PrimarySurface.DevInfo,
                                        NULL,
@@ -353,7 +353,7 @@ IntPrepareDriver()
                                        HS_DDI_MAX,
                                        PrimarySurface.FillPatterns,
                                        sizeof(PrimarySurface.GDIInfo),
-                                       (ULONG *) &PrimarySurface.GDIInfo,
+                                       &PrimarySurface.GDIInfo,
                                        sizeof(PrimarySurface.DevInfo),
                                        &PrimarySurface.DevInfo,
                                        NULL,
@@ -553,6 +553,11 @@ IntCreatePrimarySurface()
     gpsi->ptCursor.x = (SurfaceRect.right - SurfaceRect.left) / 2;
     gpsi->ptCursor.y = (SurfaceRect.bottom - SurfaceRect.top) / 2;
 
+    /* Give the PDEV a MovePointer function */
+    PrimarySurface.pfnMovePointer = PrimarySurface.DriverFunctions.MovePointer;
+    if (!PrimarySurface.pfnMovePointer)
+        PrimarySurface.pfnMovePointer = EngMovePointer;
+
     EngUnlockSurface(SurfObj);
     co_IntShowDesktop(IntGetActiveDesktop(), SurfSize.cx, SurfSize.cy);
 
@@ -1197,7 +1202,7 @@ IntChangeDisplaySettings(
     BOOLEAN NoReset = FALSE;
     BOOLEAN Reset = FALSE;
     BOOLEAN SetPrimary = FALSE;
-    LONG Ret=0;
+    LONG Ret = DISP_CHANGE_SUCCESSFUL;
     NTSTATUS Status ;
 
     DPRINT1("display flags : %x\n",dwflags);
@@ -1224,15 +1229,18 @@ IntChangeDisplaySettings(
     {
         /* Dynamically change graphics mode */
         DPRINT1("flag 0 UNIMPLEMENTED\n");
+        SetLastWin32Error(ERROR_CALL_NOT_IMPLEMENTED);
         return DISP_CHANGE_FAILED;
     }
 
     if ((dwflags & CDS_TEST) == CDS_TEST)
     {
-        /* Test reslution */
+        /* Test resolution */
         dwflags &= ~CDS_TEST;
-        DPRINT1("flag CDS_TEST UNIMPLEMENTED\n");
-        Ret = DISP_CHANGE_FAILED;
+        Status = IntEnumDisplaySettings(pDeviceName, ENUM_REGISTRY_SETTINGS, DevMode, 0);
+        if (!NT_SUCCESS(Status))
+            Ret = DISP_CHANGE_BADMODE;
+        return Ret;
     }
 
     if ((dwflags & CDS_FULLSCREEN) == CDS_FULLSCREEN)
@@ -1269,6 +1277,7 @@ IntChangeDisplaySettings(
         {
             DPRINT1("flag CDS_VIDEOPARAMETERS UNIMPLEMENTED\n");
             Ret = DISP_CHANGE_FAILED;
+            SetLastWin32Error(ERROR_CALL_NOT_IMPLEMENTED);
         }
 
     }
@@ -1364,6 +1373,13 @@ IntChangeDisplaySettings(
             Status = ZwSetValueKey(DevInstRegKey, &RegistryKey, 0, REG_DWORD, &NewValue, sizeof(NewValue));
         }
 
+        if (NT_SUCCESS(Status) && DevMode->dmFields & DM_DISPLAYFREQUENCY)
+        {
+            RtlInitUnicodeString(&RegistryKey, L"DefaultSettings.VRefresh");
+            NewValue = DevMode->dmDisplayFrequency;
+            Status = ZwSetValueKey(DevInstRegKey, &RegistryKey, 0, REG_DWORD, &NewValue, sizeof(NewValue));
+        }
+
         ZwClose(DevInstRegKey);
         if (NT_SUCCESS(Status))
             Ret = DISP_CHANGE_RESTART;
@@ -1375,6 +1391,7 @@ IntChangeDisplaySettings(
     if (dwflags != 0)
         Ret = DISP_CHANGE_BADFLAGS;
 
+    DPRINT("IntChangeDisplaySettings returning %x\n", Ret);
     return Ret;
 }
 
@@ -1552,8 +1569,8 @@ IntEnumDisplaySettings(
                     CurrentName += wcslen(CurrentName) + 1)
             {
                 INT i;
-                PGD_ENABLEDRIVER GDEnableDriver;
-                PGD_GETMODES GetModes = NULL;
+                PFN_DrvEnableDriver GDEnableDriver;
+                PFN_DrvGetModes GetModes = NULL;
                 INT SizeNeeded, SizeUsed;
 
                 /* Get the DDI driver's entry point */
@@ -1583,7 +1600,7 @@ IntEnumDisplaySettings(
 
                     if (DrvFn->iFunc == INDEX_DrvGetModes)
                     {
-                        GetModes = (PGD_GETMODES)DrvFn->pfn;
+                        GetModes = (PFN_DrvGetModes)DrvFn->pfn;
                         break;
                     }
                 }