summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordsh@google.com <dsh@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-06 23:33:41 +0000
committerdsh@google.com <dsh@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-06 23:33:41 +0000
commit49a90249dc26805a1d0c80fdf5bd6b88e1548b55 (patch)
tree00176a5cbc0bc44c50d8b563d577e62342dae749
parent21dae9b9628a3a7ef481c1871d69e9b48ed90158 (diff)
downloadchromium_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.scons4
-rw-r--r--base/base_unittests.scons4
-rw-r--r--base/idle_timer.cc58
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)