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 | |
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
-rw-r--r-- | base/base_lib.scons | 4 | ||||
-rw-r--r-- | base/base_unittests.scons | 4 | ||||
-rw-r--r-- | base/idle_timer.cc | 58 |
3 files changed, 66 insertions, 0 deletions
diff --git a/base/base_lib.scons b/base/base_lib.scons index 89d0d6e..487d5d8 100644 --- a/base/base_lib.scons +++ b/base/base_lib.scons @@ -96,7 +96,11 @@ if env['PLATFORM'] in ('posix', 'darwin'): 'file_version_info.cc', # This group all depends on MessageLoop. + + # We have an implementation of idle_timer, but it's unclear if we want it + # yet, so it's commented out for now. Leave this 'unported'. 'idle_timer.cc', + 'object_watcher.cc', 'watchdog.cc', diff --git a/base/base_unittests.scons b/base/base_unittests.scons index aedad49..7b1cc28 100644 --- a/base/base_unittests.scons +++ b/base/base_unittests.scons @@ -61,6 +61,7 @@ if env['PLATFORM'] == 'win32': if env['PLATFORM'] == 'posix': env.Append( + # We need 'Xss' (X Screen Saver) in LIBS if we want idletimer_unittest LIBS = [ 'event', ], @@ -133,7 +134,10 @@ if env['PLATFORM'] in ('posix', 'darwin'): # Remove files that still need to be ported from the input_files list. # TODO(port): delete files from this list as they get ported. to_be_ported_files = [ + # We have an implementation of idle_timer, but it's unclear if we want it + # yet, so it's commented out for now. Leave this 'unported'. 'idletimer_unittest.cc', + 'watchdog_unittest.cc', 'gfx/native_theme_unittest.cc', 'gfx/uniscribe_unittest.cc', 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) |