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.
5 #include "chrome/browser/idle.h"
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
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
;
27 current_idle_time
= now
- last_input_info
.dwTime
;
30 // Convert from ms to seconds.
31 current_idle_time
/= 1000;
34 return current_idle_time
;
37 bool IsScreensaverRunning() {
39 if (::SystemParametersInfo(SPI_GETSCREENSAVERRUNNING
, 0, &result
, 0))
40 return result
!= FALSE
;
44 bool IsWorkstationLocked() {
45 bool is_locked
= true;
46 HDESK input_desk
= ::OpenInputDesktop(0, 0, GENERIC_READ
);
48 wchar_t name
[256] = {0};
50 if (::GetUserObjectInformation(input_desk
,
55 is_locked
= lstrcmpi(name
, L
"default") != 0;
57 ::CloseDesktop(input_desk
);
64 void CalculateIdleTime(IdleTimeCallback notify
) {
65 notify
.Run(static_cast<int>(CalculateIdleTimeInternal()));
68 bool CheckIdleStateIsLocked() {
69 return IsWorkstationLocked() || IsScreensaverRunning();