--- a/ipaq-sleep.c.org 2006-01-20 19:43:14.000000000 +0200 +++ a/ipaq-sleep.c 2007-12-26 03:59:28.000000000 +0200 @@ -27,14 +27,14 @@ #include #include -#undef DEBUG +#define DEBUG int irqs[MAX_IRQS]; /* irqs to examine have a value of 1 */ long v, irq_count[MAX_IRQS]; /* holds previous counters of the irq's */ int sleep_idle=3 * 60; /* in seconds */ int dim_idle=1 * 60; /* in seconds */ int daemonize=1; -int sleep_time = DEFAULT_SLEEP_TIME; +int sleep_time = 1; //DEFAULT_SLEEP_TIME; int cpu=1; int apm=1; int dimming=1; @@ -57,6 +57,7 @@ Window root; /* The root window (which holds MIT_SCREEN_SAVER info). */ XScreenSaverInfo *info; /* The MIT_SCREEN_SAVER info object. */ +int xfd = -1; int init() { int first_event, first_error; @@ -69,6 +70,8 @@ else { XScreenSaverQueryExtension(dpy, &first_event, &first_error); root = DefaultRootWindow(dpy); + XSelectInput(dpy, root, KeyPressMask | KeyReleaseMask | PointerMotionMask); + xfd = ConnectionNumber(dpy); info = XScreenSaverAllocInfo(); #ifdef DEBUG if (debug) @@ -108,7 +111,7 @@ if (fgets (buf, 32, input)) { if (!strncmp (buf, "on ", 3)) - r = atoi (buf + 4); + r = atoi (buf + 3); else r = -1; } @@ -487,8 +490,11 @@ return(1); } + if (info.ac_line_status == AC_LINE_STATUS_UNKNOWN || info.battery_status == BATTERY_STATUS_UNKNOWN) + return(1); + #ifdef DEBUG - if (debug) fprintf(dgfp,"You are NOT on external power. Its all good.....\n"); + if (debug) fprintf(dgfp,"You are NOT on external power. Line status: %d, battery status: %d.\n", info.ac_line_status, info.battery_status); #endif runtime = info.battery_time; if (apm && runtime >= 0 && runtime < battery_level) @@ -587,12 +593,17 @@ } +/* X idle status checked every sleep_time, + other boring and expensive stuff - sleep_time * CYCLE_INTERLEAVE */ +#define CYCLE_INTERLEAVE 10 + /* Keep checking the interrupts. As long as there is activity, do nothing. */ void main_loop (void) { int activity, i, total_unused=0, apm_active=0, old_apm=0; int dimmed=0, current_bl=32; int newIdle, oldIdle, lastIdle, oldTime, newTime; char iline[64]; + int cycle = 0; Time idleTime; /* milliseconds */ FILE *f; @@ -656,6 +667,7 @@ if (dimming && !dimmed && !apm_active) { if ((newIdle-oldIdle)>=dim_idle) { current_bl = read_backlight (); + if (debug) fprintf(dgfp, "Dim timeout. Current bl value=%d, setting to=%d\n", current_bl, dim_level); set_backlight (dim_level); dimmed=1; } @@ -664,6 +676,11 @@ lastIdle=newIdle; } + + cycle++; + cycle %= CYCLE_INTERLEAVE; + if (cycle) + goto sleep; apm_active=check_apm(); if (apm_active) { @@ -724,16 +741,27 @@ } +sleep: #ifdef DEBUG if (debug) fflush(dgfp); #endif - sleep(sleep_time); + { + struct timeval tv; + fd_set readset; + FD_ZERO(&readset); + if (xfd != -1) + FD_SET(xfd, &readset); + tv.tv_sec = 1; + tv.tv_usec = 0; + if (debug) fprintf(dgfp, "select=%d, tv_sec=%d, tv_usec=%d\n", select(xfd+1, &readset, NULL, NULL, &tv), tv.tv_sec, tv.tv_usec); + } + newTime=time(NULL); - if (oldTime && newTime-sleep_time > oldTime +1) { + if (oldTime && newTime-sleep_time > oldTime +2) { #ifdef DEBUG if (debug) - fprintf(stderr, "%i sec sleep; resetting timer and resetting dimmer...", (int)(newTime - oldTime)); + fprintf(dgfp, "%i sec sleep, apparently, was suspended; resetting timer and resetting dimmer...", (int)(newTime - oldTime)); #endif total_unused=0; @@ -764,7 +792,7 @@ #ifdef DEBUG if (debug) { - dgfp=fopen("/tmp/ipaq-sleep.log", "a"); + dgfp=fopen("/var/log/ipaq-sleep.log", "a"); if (! dgfp) { fprintf(stderr, "problem opening ipaq-sleep.log\n"); exit(1);