Set 2nd stage setup to language selected in registry
authorHervé Poussineau <hpoussin@reactos.org>
Sat, 9 Sep 2006 17:10:42 +0000 (17:10 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Sat, 9 Sep 2006 17:10:42 +0000 (17:10 +0000)
Try to use GetLastInputInfo API instead of a keyboard/mouse hook for screensaver (not enabled yet)

svn path=/trunk/; revision=23998

reactos/base/system/winlogon/sas.c
reactos/base/system/winlogon/screensaver.c
reactos/base/system/winlogon/winlogon.c
reactos/base/system/winlogon/winlogon.h

index 1266928..00068ea 100644 (file)
@@ -94,13 +94,12 @@ SetDefaultLanguage(
                goto cleanup;
        }
 
-       Value = HeapAlloc(GetProcessHeap(), 0, dwSize + sizeof(UNICODE_NULL));
+       Value = HeapAlloc(GetProcessHeap(), 0, dwSize);
        if (!Value)
        {
                TRACE("HeapAlloc() failed\n");
                goto cleanup;
        }
-       Value[dwSize / sizeof(WCHAR)] = UNICODE_NULL;
        rc = RegQueryValueExW(
                hKey,
                ValueName,
@@ -115,7 +114,8 @@ SetDefaultLanguage(
        }
 
        /* Convert Value to a Lcid */
-       RtlInitUnicodeString(&ValueString, Value);
+       ValueString.Length = ValueString.MaximumLength = dwSize;
+       ValueString.Buffer = Value;
        Status = RtlUnicodeStringToInteger(&ValueString, 16, &Lcid);
        if (!NT_SUCCESS(Status))
        {
index 62febd8..329fe9f 100644 (file)
@@ -11,6 +11,7 @@
 #define YDEBUG\r
 #include <wine/debug.h>\r
 \r
+#ifndef USE_GETLASTINPUTINFO\r
 static LRESULT CALLBACK\r
 KeyboardActivityProc(\r
        IN INT nCode,\r
@@ -30,6 +31,7 @@ MouseActivityProc(
        InterlockedExchange((LONG*)&WLSession->LastActivity, ((PMSLLHOOKSTRUCT)lParam)->time);\r
        return CallNextHookEx(NULL, nCode, wParam, lParam);\r
 }\r
+#endif\r
 \r
 static VOID\r
 LoadScreenSaverParameters(\r
@@ -65,7 +67,12 @@ ScreenSaverThreadMain(
 {\r
        PWLSESSION Session = (PWLSESSION)lpParameter;\r
        HANDLE HandleArray[3];\r
-       DWORD LastActivity, TimeToWait;\r
+#ifdef USE_GETLASTINPUTINFO\r
+       LASTINPUTINFO lastInputInfo;\r
+#else\r
+       DWORD LastActivity;\r
+#endif\r
+       DWORD TimeToWait;\r
        DWORD Timeout; /* Timeout before screen saver starts, in milliseconds */\r
        DWORD ret;\r
 \r
@@ -88,12 +95,26 @@ ScreenSaverThreadMain(
 \r
        LoadScreenSaverParameters(&Timeout);\r
 \r
+#ifndef USE_GETLASTINPUTINFO\r
        InterlockedExchange((LONG*)&Session->LastActivity, GetTickCount());\r
+#else\r
+       lastInputInfo.cbSize = sizeof(LASTINPUTINFO);\r
+#endif\r
        for (;;)\r
        {\r
                /* See the time of last activity and calculate a timeout */\r
+#ifndef USE_GETLASTINPUTINFO\r
                LastActivity = InterlockedCompareExchange((LONG*)&Session->LastActivity, 0, 0);\r
                TimeToWait = Timeout - (GetTickCount() - LastActivity);\r
+#else\r
+               if (GetLastInputInfo(&lastInputInfo))\r
+                       TimeToWait = Timeout - (GetTickCount() - lastInputInfo.dwTime);\r
+               else\r
+               {\r
+                       WARN("GetLastInputInfo() failed with error %lu\n", GetLastError());\r
+                       TimeToWait = 10; /* Try again in 10 ms */\r
+               }\r
+#endif\r
                if (TimeToWait > Timeout)\r
                {\r
                        /* GetTickCount() got back to 0 */\r
@@ -108,9 +129,19 @@ ScreenSaverThreadMain(
                        LoadScreenSaverParameters(&Timeout);\r
 \r
                /* Check if we didn't had recent activity */\r
+#ifndef USE_GETLASTINPUTINFO\r
                LastActivity = InterlockedCompareExchange((LONG*)&Session->LastActivity, 0, 0);\r
                if (LastActivity + Timeout > GetTickCount())\r
                        continue;\r
+#else\r
+               if (!GetLastInputInfo(&lastInputInfo))\r
+               {\r
+                       WARN("GetLastInputInfo() failed with error %lu\n", GetLastError());\r
+                       continue;\r
+               }\r
+               if (lastInputInfo.dwTime + Timeout > GetTickCount())\r
+                       continue;\r
+#endif\r
 \r
                /* Run screen saver */\r
                PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_SCRNSVR_TIMEOUT, 0);\r
@@ -129,10 +160,12 @@ cleanup:
        RevertToSelf();\r
        if (Session->hUserActivity)\r
                CloseHandle(Session->hUserActivity);\r
+#ifndef USE_GETLASTINPUTINFO\r
        if (Session->KeyboardHook)\r
                UnhookWindowsHookEx(Session->KeyboardHook);\r
        if (Session->MouseHook)\r
                UnhookWindowsHookEx(Session->MouseHook);\r
+#endif\r
        CloseHandle(Session->hEndOfScreenSaverThread);\r
        CloseHandle(Session->hScreenSaverParametersChanged);\r
        return 0;\r
@@ -147,6 +180,7 @@ InitializeScreenSaver(
        FIXME("Disabling screen saver due to numerous bugs in ReactOS (see r23540)!\n");\r
        return TRUE;\r
 \r
+#ifndef USE_GETLASTINPUTINFO\r
        /* Register hooks to detect keyboard and mouse activity */\r
        Session->KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardActivityProc, hAppInstance, 0);\r
        if (!Session->KeyboardHook)\r
@@ -160,6 +194,7 @@ InitializeScreenSaver(
                ERR("WL: Unable to register mouse hook\n");\r
                return FALSE;\r
        }\r
+#endif\r
 \r
        if (!(Session->hScreenSaverParametersChanged = CreateEventW(NULL, FALSE, FALSE, NULL)))\r
        {\r
@@ -264,6 +299,8 @@ cleanup:
        else\r
        {\r
                PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_SCRNSVR_ACTIVITY, 0);\r
+#ifndef USE_GETLASTINPUTINFO\r
                InterlockedExchange((LONG*)&Session->LastActivity, GetTickCount());\r
+#endif\r
        }\r
 }\r
index c0896e9..245720c 100644 (file)
@@ -406,6 +406,9 @@ WinMain(
        {
                TRACE("WL: Setup mode detected\n");
 
+               /* Set locale */
+               SetDefaultLanguage(FALSE);
+
                /* Run setup and reboot when done */
                SwitchDesktop(WLSession->ApplicationDesktop);
                RunSetup();
index 4bcaa42..6487484 100644 (file)
@@ -27,6 +27,8 @@
 #ifndef __WINLOGON_MAIN_H__
 #define __WINLOGON_MAIN_H__
 
+//#define USE_GETLASTINPUTINFO
+
 #define WIN32_NO_STATUS
 #include <windows.h>
 #include <userenv.h>
@@ -137,12 +139,16 @@ typedef struct _WLSESSION
   DWORD DialogTimeout; /* Timeout for dialog boxes, in seconds */
 
   /* Screen-saver informations */
+#ifndef USE_GETLASTINPUTINFO
   HHOOK KeyboardHook;
   HHOOK MouseHook;
+#endif
   HANDLE hEndOfScreenSaverThread;
   HANDLE hScreenSaverParametersChanged;
   HANDLE hUserActivity;
+#ifndef USE_GETLASTINPUTINFO
   DWORD LastActivity;
+#endif
 
   /* Logon informations */
   DWORD Options;
@@ -171,6 +177,10 @@ UpdatePerUserSystemParameters(DWORD dwUnknown,
                               DWORD dwReserved);
 
 /* sas.c */
+BOOL
+SetDefaultLanguage(
+       IN BOOL UserProfile);
+
 BOOL
 InitializeSAS(
        IN OUT PWLSESSION Session);