diff options
Diffstat (limited to 'packages/ipaq-sleep/files/unbreak.patch')
| -rw-r--r-- | packages/ipaq-sleep/files/unbreak.patch | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/packages/ipaq-sleep/files/unbreak.patch b/packages/ipaq-sleep/files/unbreak.patch new file mode 100644 index 0000000000..5884bf69e1 --- /dev/null +++ b/packages/ipaq-sleep/files/unbreak.patch @@ -0,0 +1,184 @@ +--- 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 <X11/Xlib.h> + #include <X11/extensions/scrnsaver.h> + +-#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; |
