# HG changeset patch # User Richard Laager # Date 1140752289 0 # Node ID 723f5b7ef6a2f21be7f6195200861db11206bb80 # Parent 83d522bbc7414fa5e836a21fcd57c0fc8216d9e9 [gaim-migrate @ 15693] Long long ago, in a far-off land, a patch was sent to gaim-devel... I modified this patch, but couldn't test it, so it sat. Today, I got to borrow an evaluation laptop from Apple (here at the University of Minnesota, Crookston). So, I bring you... A patch from Michael Culbertson: On Mac OS X, obtain the system idle time via IOKit. Thus, our idle time calculations will reflect system usage rather than X11 application usage. committer: Tailor Script diff -r 83d522bbc741 -r 723f5b7ef6a2 COPYRIGHT --- a/COPYRIGHT Fri Feb 24 02:16:25 2006 +0000 +++ b/COPYRIGHT Fri Feb 24 03:38:09 2006 +0000 @@ -64,6 +64,7 @@ Adam Cowell Palmer Cox Jeramey Crawford +Michael Culbertson Martijn Dekker Balwinder Singh Dheeman Andrew Dieffenbach diff -r 83d522bbc741 -r 723f5b7ef6a2 config.h.mingw --- a/config.h.mingw Fri Feb 24 02:16:25 2006 +0000 +++ b/config.h.mingw Fri Feb 24 03:38:09 2006 +0000 @@ -183,6 +183,9 @@ declares uintmax_t. */ #define HAVE_INTTYPES_H_WITH_UINTMAX 1 +/* Define if we have IOKit */ +/* #undef HAVE_IOKIT */ + /* Define to 1 if you have the `krb_get_err_text' function. */ /* #undef HAVE_KRB_GET_ERR_TEXT */ @@ -318,7 +321,7 @@ /* Define to 1 if you have the header file. */ /* #define HAVE_SIGNAL_H 1 */ -/* define if we have silcmime.h */ +/* Define if we have silcmime.h */ /* #undef HAVE_SILCMIME_H */ /* Define to 1 if you have the header file. */ diff -r 83d522bbc741 -r 723f5b7ef6a2 configure.ac --- a/configure.ac Fri Feb 24 02:16:25 2006 +0000 +++ b/configure.ac Fri Feb 24 03:38:09 2006 +0000 @@ -25,6 +25,14 @@ case "$host_os" in darwin*) AC_CHECK_LIB(resolv, res_query) + + AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h, [ + AC_CHECK_HEADER(IOKit/IOKitLib.h, [ + AC_DEFINE(HAVE_IOKIT, 1, [Define if we have IOKit]) + LIBS="$LIBS -framework IOKit -framework CoreFoundation" + ], []) + ], []) + AC_MSG_CHECKING([for fink]) if test -d /sw; then AC_MSG_RESULT([found, adding /sw to search paths]) @@ -264,7 +272,7 @@ #include ], [], [ AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_SILCMIME_H, 1, [define if we have silcmime.h]) + AC_DEFINE(HAVE_SILCMIME_H, 1, [Define if we have silcmime.h]) ], [ AC_MSG_RESULT(no) ]) diff -r 83d522bbc741 -r 723f5b7ef6a2 src/gtkidle.c --- a/src/gtkidle.c Fri Feb 24 02:16:25 2006 +0000 +++ b/src/gtkidle.c Fri Feb 24 03:38:09 2006 +0000 @@ -23,23 +23,32 @@ #include "internal.h" #include "gtkidle.h" -#ifdef USE_SCREENSAVER -# ifndef _WIN32 -# include -# include -# include -# include -# else -# include "idletrack.h" -# endif -#endif /* USE_SCREENSAVER */ +#ifdef HAVE_IOKIT +# include +# include +#else +# ifdef USE_SCREENSAVER +# ifdef _WIN32 +# include "idletrack.h" +# else + /* We're on X11 and not MacOS X with IOKit. */ +# include +# include +# include +# include +# endif /* !_WIN32 */ +# endif /* USE_SCREENSAVER */ +#endif /* !HAVE_IOKIT */ #include "idle.h" /** * Get the number of seconds the user has been idle. In Unix-world - * this is based on the X Windows usage. In MS Windows this is based - * on keyboard/mouse usage. + * this is based on the X Windows usage. In MS Windows this is + * based on keyboard/mouse usage information obtained from the OS. + * In MacOS X, this is based on keyboard/mouse usage information + * obtained from the OS, if configure detected IOKit. Otherwise, + * MacOS X is handled as a case of X Windows. * * In Debian bug #271639, jwz says: * @@ -58,11 +67,40 @@ * * @return The number of seconds the user has been idle. */ -#ifdef USE_SCREENSAVER +#if defined(USE_SCREENSAVER) || defined(HAVE_IOKIT) static time_t gaim_gtk_get_time_idle() { -# ifndef _WIN32 +# ifdef HAVE_IOKIT + /* Query the IOKit API */ + + static io_service_t macIOsrvc = NULL; + CFTypeRef property; + uint64_t idle_time = 0; /* nanoseconds */ + + if (macIOsrvc == NULL) + { + mach_port_t master; + IOMasterPort(MACH_PORT_NULL, &master); + macIOsrvc = IOServiceGetMatchingService(master, + IOServiceMatching("IOHIDSystem")); + } + + property = IORegistryEntryCreateCFProperty(macIOsrvc, CFSTR("HIDIdleTime"), + kCFAllocatorDefault, 0); + CFNumberGetValue((CFNumberRef)property, + kCFNumberSInt64Type, &idle_time); + CFRelease(property); + + /* convert nanoseconds to seconds */ + return idle_time / 1000000000; +# else +# ifdef _WIN32 + /* Query Windows */ + return (GetTickCount() - wgaim_get_lastactive()) / 1000; +# else + /* We're on X11 and not MacOS X with IOKit. */ + /* Query xscreensaver */ static XScreenSaverInfo *mit_info = NULL; int event_base, error_base; @@ -74,20 +112,18 @@ return (mit_info->idle) / 1000; } else return 0; -# else - /* Query windows */ - return (GetTickCount() - wgaim_get_lastactive()) / 1000; -# endif /* _WIN32 */ +# endif /* !_WIN32 */ +# endif /* !HAVE_IOKIT */ } -#endif /* USE_SCREENSAVER */ +#endif /* USE_SCREENSAVER || HAVE_IOKIT */ static GaimIdleUiOps ui_ops = { -#ifdef USE_SCREENSAVER +#if defined(USE_SCREENSAVER) || defined(HAVE_IOKIT) gaim_gtk_get_time_idle #else NULL -#endif /* USE_SCREENSAVER */ +#endif /* USE_SCREENSAVER || HAVE_IOKIT */ }; GaimIdleUiOps * diff -r 83d522bbc741 -r 723f5b7ef6a2 src/gtkprefs.c --- a/src/gtkprefs.c Fri Feb 24 02:16:25 2006 +0000 +++ b/src/gtkprefs.c Fri Feb 24 03:38:09 2006 +0000 @@ -1748,7 +1748,7 @@ GAIM_PREF_STRING, "/core/away/idle_reporting", _("Never"), "none", _("From last sent message"), "gaim", -#ifdef USE_SCREENSAVER +#ifdef USE_SCREENSAVER || defined(HAVE_IOKIT) _("Based on keyboard or mouse use"), "system", #endif NULL);