diff options
author | dsh@google.com <dsh@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-06 23:33:41 +0000 |
---|---|---|
committer | dsh@google.com <dsh@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-11-06 23:33:41 +0000 |
commit | 49a90249dc26805a1d0c80fdf5bd6b88e1548b55 (patch) | |
tree | 00176a5cbc0bc44c50d8b563d577e62342dae749 /base/idle_timer.cc | |
parent | 21dae9b9628a3a7ef481c1871d69e9b48ed90158 (diff) | |
download | chromium_src-49a90249dc26805a1d0c80fdf5bd6b88e1548b55.zip chromium_src-49a90249dc26805a1d0c80fdf5bd6b88e1548b55.tar.gz chromium_src-49a90249dc26805a1d0c80fdf5bd6b88e1548b55.tar.bz2 |
Implement the idle timer for Linux using libxss.
BUG=2183
Review URL: http://codereview.chromium.org/8806
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@4930 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/idle_timer.cc')
-rw-r--r-- | base/idle_timer.cc | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/base/idle_timer.cc b/base/idle_timer.cc index 5d9670d..5e6bda7 100644 --- a/base/idle_timer.cc +++ b/base/idle_timer.cc @@ -4,10 +4,24 @@ #include "base/idle_timer.h" +// We may not want to port idle_timer to Linux, but we have implemented it +// anyway. Define this to 1 to enable the Linux idle timer and then add the +// libs that need to be linked (Xss). +#define ENABLE_XSS_SUPPORT 0 + #if defined(OS_MACOSX) #include <ApplicationServices/ApplicationServices.h> #endif +#if defined(OS_LINUX) && ENABLE_XSS_SUPPORT +// We may not want to port idle_timer to Linux, but we have implemented it +// anyway. Remove the 0 above if we want it. +#include <gdk/gdkx.h> +#include <X11/extensions/scrnsaver.h> +#include "base/lazy_instance.h" +#include "base/thread_local.h" +#endif + #include "base/message_loop.h" #include "base/time.h" @@ -40,6 +54,50 @@ bool OSIdleTimeSource(int32 *milliseconds_interval_since_last_event) { kCGAnyInputEventType) * 1000.0; return true; } +#elif defined(OS_LINUX) && ENABLE_XSS_SUPPORT +class IdleState { + public: + IdleState() { + int event_base, error_base; + have_idle_info_ = XScreenSaverQueryExtension(GDK_DISPLAY(), &event_base, + &error_base); + if (have_idle_info_) + *idle_info_.Get() = XScreenSaverAllocInfo(); + } + + ~IdleState() { + if (*idle_info_.Get()) { + XFree(*idle_info_.Get()); + idle_info_.~ThreadLocalPointer(); + } + } + + int32 IdleTime() { + if (have_idle_info_ && idle_info_.Get()) { + XScreenSaverQueryInfo(GDK_DISPLAY(), GDK_ROOT_WINDOW(), + *idle_info_.Get()); + return (*idle_info_.Get())->idle; + } + return -1; + } + + private: + bool have_idle_info_; + ThreadLocalPointer<XScreenSaverInfo*> idle_info_; + + DISALLOW_COPY_AND_ASSIGN(IdleState); +}; + +bool OSIdleTimeSource(int32* milliseconds_interval_since_last_event) { + static LazyInstance<IdleState> state_instance(base::LINKER_INITIALIZED); + IdleState* state = state_instance.Pointer(); + int32 idle_time = state->IdleTime(); + if (0 < idle_time) { + *milliseconds_interval_since_last_event = idle_time; + return true; + } + return false; +} #endif IdleTimer::IdleTimer(TimeDelta idle_time, bool repeat) |