- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / idle_win.cc
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/idle.h"
6
7 #include <limits.h>
8 #include <windows.h>
9
10 namespace {
11
12 DWORD CalculateIdleTimeInternal() {
13   LASTINPUTINFO last_input_info = {0};
14   last_input_info.cbSize = sizeof(LASTINPUTINFO);
15   DWORD current_idle_time = 0;
16   if (::GetLastInputInfo(&last_input_info)) {
17     DWORD now = ::GetTickCount();
18     if (now < last_input_info.dwTime) {
19       // GetTickCount() wraps around every 49.7 days -- assume it wrapped just
20       // once.
21       const DWORD kMaxDWORD = static_cast<DWORD>(-1);
22       DWORD time_before_wrap = kMaxDWORD - last_input_info.dwTime;
23       DWORD time_after_wrap = now;
24       // The sum is always smaller than kMaxDWORD.
25       current_idle_time = time_before_wrap + time_after_wrap;
26     } else {
27       current_idle_time = now - last_input_info.dwTime;
28     }
29
30     // Convert from ms to seconds.
31     current_idle_time /= 1000;
32   }
33
34   return current_idle_time;
35 }
36
37 bool IsScreensaverRunning() {
38   DWORD result = 0;
39   if (::SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &result, 0))
40     return result != FALSE;
41   return false;
42 }
43
44 bool IsWorkstationLocked() {
45   bool is_locked = true;
46   HDESK input_desk = ::OpenInputDesktop(0, 0, GENERIC_READ);
47   if (input_desk)  {
48     wchar_t name[256] = {0};
49     DWORD needed = 0;
50     if (::GetUserObjectInformation(input_desk,
51       UOI_NAME,
52       name,
53       sizeof(name),
54       &needed)) {
55         is_locked = lstrcmpi(name, L"default") != 0;
56     }
57     ::CloseDesktop(input_desk);
58   }
59   return is_locked;
60 }
61
62 }  // namespace
63
64 void CalculateIdleTime(IdleTimeCallback notify) {
65   notify.Run(static_cast<int>(CalculateIdleTimeInternal()));
66 }
67
68 bool CheckIdleStateIsLocked() {
69   return IsWorkstationLocked() || IsScreensaverRunning();
70 }