Home | History | Annotate | Download | only in browser
      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 }
     71