Index: base/idle_timer.cc |
=================================================================== |
--- base/idle_timer.cc (revision 4805) |
+++ base/idle_timer.cc (working copy) |
@@ -8,6 +8,15 @@ |
#include <ApplicationServices/ApplicationServices.h> |
#endif |
+#if defined(OS_LINUX) && 0 |
Evan Martin
2008/11/06 20:28:19
Perhaps rather than the 0, just make up a define l
|
+// 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 +49,46 @@ |
kCGAnyInputEventType) * 1000.0; |
return true; |
} |
+#elif defined(OS_LINUX) && 0 |
+// We may not want to port idle_timer to Linux, but we have implemented it |
+// anyway. Remove the 0 above if we want it. |
+ |
+struct IdleState { |
+ bool have_screen_saver; |
+ ThreadLocalPointer<XScreenSaverInfo*> screen_saver_info; |
+}; |
+ |
+struct IdleStateLazyInstanceTraits { |
+ static void New(void* instance) { |
Dean McNamee
2008/11/06 08:57:05
This code is not technically correct. You never c
|
+ IdleState* state = static_cast<IdleState*>(instance); |
+ int event_base, error_base; |
+ state->have_screen_saver = XScreenSaverQueryExtension( |
+ GDK_DISPLAY(), &event_base, &error_base); |
+ if (state->have_screen_saver) |
+ *state->screen_saver_info.Get() = XScreenSaverAllocInfo(); |
+ } |
+ static void Delete(void* instance) { |
+ IdleState* state = static_cast<IdleState*>(instance); |
+ if (*state->screen_saver_info.Get()) { |
+ XFree(*state->screen_saver_info.Get()); |
+ state->screen_saver_info.~ThreadLocalPointer(); |
+ } |
+ } |
+}; |
+ |
+bool OSIdleTimeSource(int32* milliseconds_interval_since_last_event) { |
+ static LazyInstance<IdleState, IdleStateLazyInstanceTraits> state_instance( |
+ base::LINKER_INITIALIZED); |
+ IdleState* state = state_instance.Pointer(); |
+ if (state->have_screen_saver && state->screen_saver_info.Get()) { |
+ XScreenSaverQueryInfo(GDK_DISPLAY(), GDK_ROOT_WINDOW(), |
+ *state->screen_saver_info.Get()); |
+ *milliseconds_interval_since_last_event = |
+ (*state->screen_saver_info.Get())->idle; |
+ return true; |
+ } |
+ return false; |
+} |
#endif |
IdleTimer::IdleTimer(TimeDelta idle_time, bool repeat) |