--- a/ipaq-sleep.c.org 2006-01-20 19:43:14.000000000 +0200 +++ a/ipaq-sleep.c 2007-12-26 06:26:32.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; } @@ -189,7 +192,7 @@ if (strcmp(func, Lflag)==0) { dim_level=atoi(value); #ifdef DEBUG - if (debug) fprintf(dgfp, "dim_idle=%d\n", dim_idle); + if (debug) fprintf(dgfp, "dim_level=%d\n", dim_idle); #endif } if (strcmp(func, aflag)==0) { @@ -282,6 +285,12 @@ dimming=0; } } + if (strcmp(func, Lflag)==0) { + dim_level=atoi(value); +#ifdef DEBUG + if (debug) fprintf(dgfp, "dim_level=%d\n", dim_idle); +#endif + } if (strcmp(func, aflag)==0) { apm=atoi(value); #ifdef DEBUG @@ -487,8 +496,11 @@ return(1); } + if (info.ac_line_status == AC_LINE_STATUS_UNKNOWN || info.battery_status == BATTERY_STATUS_UNKNOWN) + return(0); + #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 +599,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 activity, i, apm_active=0, old_apm=0, last_active = time(NULL); 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 +673,9 @@ if (dimming && !dimmed && !apm_active) { if ((newIdle-oldIdle)>=dim_idle) { current_bl = read_backlight (); +#ifdef DEBUG + if (debug) fprintf(dgfp, "Dim timeout. Current bl value=%d, setting to=%d\n", current_bl, dim_level); +#endif set_backlight (dim_level); dimmed=1; } @@ -664,6 +684,11 @@ lastIdle=newIdle; } + + cycle++; + cycle %= CYCLE_INTERLEAVE; + if (cycle) + goto sleep; apm_active=check_apm(); if (apm_active) { @@ -698,17 +723,15 @@ } if (activity) { - total_unused = 0; + last_active = time(NULL); } else { - total_unused += sleep_time; - if (total_unused >= sleep_idle && sleeping) { + if (time(NULL) - last_active >= sleep_idle && sleeping) { if (check_cpu() || check_PID() || probe_IRQs()) { #ifdef DEBUG if (debug) fprintf(dgfp,"You cannot sleep at this time! Not going to sleep....\n"); #endif - total_unused=0; oldIdle=newIdle; } else { @@ -718,24 +741,37 @@ do_sleep (); set_backlight (current_bl); dimmed=0; - total_unused=0; + last_active = time(NULL); } } } +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; +#ifdef DEBUG + 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); +#endif + } + 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; + last_active = time(NULL); query_idle(&idleTime); lastIdle=oldIdle=(int)idleTime;