diff options
Diffstat (limited to 'chrome/browser/idle_win.cc')
-rw-r--r-- | chrome/browser/idle_win.cc | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/chrome/browser/idle_win.cc b/chrome/browser/idle_win.cc new file mode 100644 index 0000000..01afca0 --- /dev/null +++ b/chrome/browser/idle_win.cc @@ -0,0 +1,57 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/idle.h" + +#include <limits.h> +#include <windows.h> + +static bool IsScreensaverRunning(); +static bool IsWorkstationLocked(); + +IdleState CalculateIdleState(unsigned int idle_threshold) { + if (IsScreensaverRunning() || IsWorkstationLocked()) + return IDLE_STATE_LOCKED; + + LASTINPUTINFO last_input_info = {0}; + last_input_info.cbSize = sizeof(LASTINPUTINFO); + DWORD current_idle_time = 0; + if (::GetLastInputInfo(&last_input_info)) { + current_idle_time = ::GetTickCount() - last_input_info.dwTime; + // Will go -ve if we have been idle for a long time (2gb seconds). + if (current_idle_time < 0) + current_idle_time = INT_MAX; + // Convert from ms to seconds. + current_idle_time /= 1000; + } + + if (current_idle_time >= idle_threshold) + return IDLE_STATE_IDLE; + return IDLE_STATE_ACTIVE; +} + +bool IsScreensaverRunning() { + DWORD result = 0; + if (::SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &result, 0)) + return result != FALSE; + return false; +} + +bool IsWorkstationLocked() { + bool is_locked = true; + HDESK input_desk = ::OpenInputDesktop(0, 0, GENERIC_READ); + if (input_desk) { + wchar_t name[256] = {0}; + DWORD needed = 0; + if (::GetUserObjectInformation(input_desk, + UOI_NAME, + name, + sizeof(name), + &needed)) { + is_locked = lstrcmpi(name, L"default") != 0; + } + ::CloseDesktop(input_desk); + } + return is_locked; +} |