Chromium Code Reviews| 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) |