[Pkg-wmaker-commits] [wmacpi] 13/105: wmacpi: Bump to version 1.99r5.

Doug Torrance dtorrance-guest at moszumanska.debian.org
Tue Aug 18 01:13:40 UTC 2015


This is an automated email from the git hooks/post-receive script.

dtorrance-guest pushed a commit to branch master
in repository wmacpi.

commit 6c83770627b9f4ba59d97a9d7e7ccfb1809f82de
Author: Doug Torrance <dtorrance at monmouthcollege.edu>
Date:   Mon Aug 18 17:56:19 2014 -0500

    wmacpi: Bump to version 1.99r5.
    
    Source obtained from http://sourceforge.net/projects/wmacpi/files/.
    
    2004 April 23 1.99r5
    	Collected fixes for the collected fixes below . . .
    
    	* Manpage fixes, to reflect the reality of the current code.
    
    	* Code cleanups, to make a few things more sensible. Most notably,
    	the interface for setting the samplerate has changed so that it's
    	no longer inverted and illogical - you now say how many times you
    	want to sample per minute.
    
    	* Fixed an issue with initialisation - I'd moved the power_init()
    	call below the options parsing code, without dealing with the -m
    	option properly. The end result was that if you told it to monitor
    	a battery number, it would fail saying the battery didn't exist. I
    	moved the check for this out of the options parsing and after the
    	power_init() call.
    
    	* Fixed a leaking file descriptor in init_ac_adapters.
    
    	* Implemented a way to handle changing batteries - reinitialise
    	the battery info periodically. I don't know of a better way to do
    	that, since we'd have to do all that parsing anyway to find out if
    	it had changed . . .
    
    	libdockapp is waiting, but I think that's the only change left
    	without more bug repots . . .
---
 ChangeLog |  27 ++++++++++++++
 acpi.c    |   6 ++--
 libacpi.c |  74 ++++++++++++++++++++++++++++-----------
 libacpi.h |  10 ++++--
 wmacpi.1  |   7 ++--
 wmacpi.c  | 118 +++++++++++++++++++++++++++++++++++++++++++-------------------
 6 files changed, 176 insertions(+), 66 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index ddc4c65..1f1e857 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+2004 April 23 1.99r5
+	Collected fixes for the collected fixes below . . .
+
+	* Manpage fixes, to reflect the reality of the current code.
+
+	* Code cleanups, to make a few things more sensible. Most notably,
+	the interface for setting the samplerate has changed so that it's
+	no longer inverted and illogical - you now say how many times you
+	want to sample per minute.
+
+	* Fixed an issue with initialisation - I'd moved the power_init()
+	call below the options parsing code, without dealing with the -m
+	option properly. The end result was that if you told it to monitor
+	a battery number, it would fail saying the battery didn't exist. I
+	moved the check for this out of the options parsing and after the
+	power_init() call.
+
+	* Fixed a leaking file descriptor in init_ac_adapters.
+
+	* Implemented a way to handle changing batteries - reinitialise
+	the battery info periodically. I don't know of a better way to do
+	that, since we'd have to do all that parsing anyway to find out if
+	it had changed . . .
+
+	libdockapp is waiting, but I think that's the only change left
+	without more bug repots . . .
+	
 2004 April 15 1.99r4
 	Collected fixes for various small issues.
 
diff --git a/acpi.c b/acpi.c
index 23649fb..8b748c5 100644
--- a/acpi.c
+++ b/acpi.c
@@ -89,7 +89,7 @@ int main(int argc, char *argv[])
 	power_init();
 	/* we want to acquire samples over some period of time, so . . . */
 	for(i = 0; i < samples + 2; i++) {
-		for(j = 0; j < batt_count; j++)
+		for(j = 0; j < globals->battery_count; j++)
 			acquire_batt_info(j);
 		acquire_global_info();
 		usleep(sleep_time);
@@ -98,7 +98,7 @@ int main(int argc, char *argv[])
 	ap = &globals->adapter;
 	if(ap->power == AC) {
 		printf("On AC Power");
-		for(i = 0; i < batt_count; i++) {
+		for(i = 0; i < globals->battery_count; i++) {
 			binfo = &batteries[i];
 			if(binfo->present && (binfo->charge_state == CHARGE)) {
 				printf("; Battery %s charging", binfo->name);
@@ -112,7 +112,7 @@ int main(int argc, char *argv[])
 		printf("\n");
 	} else if(ap->power == BATT) {
 		printf("On Battery");
-		for(i = 0; i < batt_count; i++) {
+		for(i = 0; i < globals->battery_count; i++) {
 			binfo = &batteries[i];
 			if(binfo->present && (binfo->percentage >= 0))
 				printf(", Battery %s at %d%%", binfo->name,
diff --git a/libacpi.c b/libacpi.c
index bf82417..d6148f7 100644
--- a/libacpi.c
+++ b/libacpi.c
@@ -11,8 +11,6 @@
 
 extern char *state[];
 extern global_t *globals;
-/* temp buffer */
-char buf[512];
 
 /* local proto */
 int acpi_get_design_cap(int batt);
@@ -22,15 +20,15 @@ int init_batteries(void)
 {
     DIR *battdir;
     struct dirent *batt;
-    char *name, *tmp1, *tmp2;
+    char *name;
     char *names[MAXBATT];
     int i, j;
     
     /* now enumerate batteries */
-    batt_count = 0;
+    globals->battery_count = 0;
     battdir = opendir("/proc/acpi/battery");
     if (battdir == NULL) {
-	perr("No batteries or ACPI not supported\n");
+	pfatal("No batteries or ACPI not supported\n");
 	return 1;
     }
     while ((batt = readdir(battdir))) {
@@ -46,23 +44,27 @@ int init_batteries(void)
 	if (!strncmp(".", name, 1) || !strncmp("..", name, 2))
 	    continue;
 
-	names[batt_count] = strdup(name);
-	batt_count++;
+	names[globals->battery_count] = strdup(name);
+	globals->battery_count++;
     }
     closedir(battdir);
 
     /* A nice quick insertion sort, ala CLR. */
-    for (i = 1; i < batt_count; i++) {
-	tmp1 = names[i];
-	j = i - 1;
-	while ((j >= 0) && ((strcmp(tmp1, names[j])) < 0)) {
-	    tmp2 = names[j+1];
-	    names[j+1] = names[j];
-	    names[j] = tmp2;
+    {
+	char *tmp1, *tmp2;
+	
+	for (i = 1; i < globals->battery_count; i++) {
+	    tmp1 = names[i];
+	    j = i - 1;
+	    while ((j >= 0) && ((strcmp(tmp1, names[j])) < 0)) {
+		tmp2 = names[j+1];
+		names[j+1] = names[j];
+		names[j] = tmp2;
+	    }
 	}
     }
     
-    for (i = 0; i < batt_count; i++) {
+    for (i = 0; i < globals->battery_count; i++) {
 	snprintf(batteries[i].name, MAX_NAME, "%s", names[i]);
 	snprintf(batteries[i].info_file, MAX_NAME, 
 		 "/proc/acpi/battery/%s/info", names[i]);
@@ -73,13 +75,20 @@ int init_batteries(void)
     }
 
     /* tell user some info */
-    pdebug("%d batteries detected\n", batt_count);
-    pinfo("libacpi: found %d batter%s\n", batt_count,
-	    (batt_count == 1) ? "y" : "ies");
+    pdebug("%d batteries detected\n", globals->battery_count);
+    pinfo("libacpi: found %d batter%s\n", globals->battery_count,
+	    (globals->battery_count == 1) ? "y" : "ies");
     
     return 0;
 }
 
+/* a stub that just calls the current function */
+int reinit_batteries(void)
+{
+    pdebug("reinitialising batteries\n");
+    return init_batteries();
+}
+
 /* the actual name of the subdirectory under ac_adapter may
  * be anything, so we need to read the directory and use the
  * name we find there. */
@@ -104,6 +113,7 @@ int init_ac_adapters(void)
 	    continue;
 	pdebug("found adapter %s\n", name);
     }
+    closedir(acdir);
     /* we /should/ only see one filename other than . and .. so
      * we'll just use the last value name acquires . . . */
     ap->name = strdup(name);
@@ -114,6 +124,13 @@ int init_ac_adapters(void)
     return 0;
 }
 
+/* stub that does nothing but call the normal init function */
+int reinit_ac_adapters(void)
+{
+    pdebug("reinitialising ac adapters\n");
+    return init_ac_adapters();
+}
+
 /* see if we have ACPI support and check version */
 int power_init(void)
 {
@@ -145,6 +162,23 @@ int power_init(void)
     return retval;
 }
 
+/* reinitialise everything, to deal with changing batteries or ac adapters */
+int power_reinit(void)
+{
+    FILE *acpi;
+    int retval;
+
+    if (!(acpi = fopen("/proc/acpi/info", "r"))) {
+	pfatal("Could not reopen ACPI info file - does this system support ACPI?\n");
+	return 1;
+    }
+    
+    if (!(retval = reinit_batteries()))
+	retval = reinit_ac_adapters();
+
+    return retval;
+}
+
 char *get_value(char *string)
 {
     char *retval;
@@ -440,7 +474,7 @@ void acquire_all_batt_info(void)
 {
     int i;
     
-    for(i = 0; i < batt_count; i++)
+    for(i = 0; i < globals->battery_count; i++)
 	acquire_batt_info(i);
 }
 
@@ -465,7 +499,7 @@ void acquire_global_info(void)
     /* XXX: this needs to correctly handle the case where 
      * any of the values used is unknown (which we flag using
      * -1). */
-    for (i = 0; i < batt_count; i++) {
+    for (i = 0; i < globals->battery_count; i++) {
 	binfo = &batteries[i];
 	if (binfo->present && binfo->valid) {
 	    rcap += (float)binfo->remaining_cap;
diff --git a/libacpi.h b/libacpi.h
index 2ba7cc8..631ef63 100644
--- a/libacpi.h
+++ b/libacpi.h
@@ -72,11 +72,12 @@ typedef struct {
 } adapter_t;
 
 typedef struct {
-    adapter_t adapter;
     int rtime;			/* remaining time */
     int timer;			/* how long been on battery? */
     int crit_level;		/* anything below this is critical low */
+    int battery_count;		/* number of batteries found */
     battery_t *binfo;		/* pointer to the battery being monitored */
+    adapter_t adapter;
 } global_t;
 
 /*
@@ -120,12 +121,15 @@ typedef struct {
 
 /* Since these /are/ needed here . . . */
 battery_t batteries[MAXBATT];
-int batt_count;
-
 int verbosity;
 
 /* check if apm/acpi is enabled, etc */
 int power_init(void);
+/* reinitialise everything */
+int power_reinit(void);
+int reinit_ac_adapters(void);
+int reinit_batteries(void);
+
 /* fill global_t with data */
 void acquire_batt_info(int);
 void acquire_all_batt_info(void);
diff --git a/wmacpi.1 b/wmacpi.1
index dd27598..381587b 100644
--- a/wmacpi.1
+++ b/wmacpi.1
@@ -92,9 +92,8 @@ Set the X display to open the window on.
 Set the battery to monitor initially.
 .TP
 .B \-s sample rate
-Set the rate at which to sample the ACPI data (default is 100, which 
-translates to once every three seconds. 10 gives once every 30 seconds, 
-1 once every 300 seconds (five minutes), 1000 once every 0.3 seconds).
+Set the rate at which to sample the ACPI data, in number of times per
+minute. Minimum is 1, ie once a minute, default is 20, maximum is 600.
 .TP
 .B \-n
 Disable blinking power glyph when charging. Note that it still blinks when 
@@ -117,7 +116,7 @@ each successive use increases the verbosity.
 Print the version information.
 .TP
 .B \-b
-Make a noise when the battery is critically low.
+Enable blinking of the power glyph when charging the batteries.
 .TP
 .B \-r
 Disable scrolling message.
diff --git a/wmacpi.c b/wmacpi.c
index c9b384d..256bed3 100644
--- a/wmacpi.c
+++ b/wmacpi.c
@@ -64,12 +64,11 @@ typedef struct {
 /* globals */
 Dockapp *dockapp;
 global_t *globals;
-int count = 0;			/* global timer variable */
-/* extern int verbosity; */
 
-/* Time for scroll updates */
-#define DEFAULT_UPDATE 150
-static int update_timeout = DEFAULT_UPDATE;
+/* this gives us a variable scroll rate, depending on the importance of the
+ * message . . . */
+#define DEFAULT_SCROLL_RESET 150;
+int scroll_reset = DEFAULT_SCROLL_RESET;
 
 /* proto for local stuff */
 static void new_window(char *name);
@@ -264,8 +263,6 @@ static void render_text(char *string)
     dockapp->tw = k;		/* length of text segment */
     /* re-scroll the message */
     scroll_text(6, 50, 52, dockapp->tw, 1);
-    /* reset the scroll repeat counter */
-    count = 0;
 }
 
 static int open_display(char *display)
@@ -482,6 +479,18 @@ static void set_power_panel(void)
     }
 }
 
+void scroll_faster(double factor) {
+    scroll_reset = scroll_reset * factor;
+}
+
+void scroll_slower(double factor) {
+    scroll_reset = scroll_reset * factor;
+}
+
+void reset_scroll(void) {
+    scroll_reset = DEFAULT_SCROLL_RESET;
+}
+
 /* 
  * The message that needs to be displayed needs to be decided
  * according to a heirarchy: a message like not present needs to take
@@ -517,19 +526,20 @@ static void set_message(void)
     if (!binfo->present) {
 	if (state != M_NP) {
 	    state = M_NP;
+	    reset_scroll();
 	    render_text("not present");
 	}
     } else if (ap->power == AC) {
 	if (binfo->charge_state == CHARGE) {
 	    if (state != M_CH) {
 		state = M_CH;
-		update_timeout = DEFAULT_UPDATE;
+		reset_scroll();
 		render_text("battery charging");
 	    }
 	} else {
 	    if (state != M_AC) {
 		state = M_AC;
-		update_timeout = DEFAULT_UPDATE;
+		reset_scroll();
 		render_text("on ac power");
 	    }
 	}
@@ -537,25 +547,25 @@ static void set_message(void)
 	if (binfo->state == CRIT) {
 	    if (state != M_CB) {
 		state = M_CB;
-		update_timeout = 80;
+		scroll_faster(0.75);
 		render_text("critical low battery");
 	    }
 	} else if (binfo->state == HARD_CRIT) {
 	    if (state != M_HCB) {
 		state = M_HCB;
-		update_timeout = 60;
+		scroll_faster(0.5);
 		render_text("hard critical low battery");
 	    }
 	} else if (binfo->state == LOW) {
 	    if (state != M_LB) {
 		state = M_LB;
-		update_timeout = 100;
+		scroll_faster(0.85);
 		render_text("low battery");
 	    }
 	} else {
 	    if (state != M_BATT) {
 		state = M_BATT;
-		update_timeout = DEFAULT_UPDATE;
+		reset_scroll();
 		render_text("on battery");
 	    }
 	}
@@ -604,13 +614,13 @@ void usage(char *name)
 {
     printf("%s - help\t\t[simon at dreamcraft.com.au]\n\n"
 	   "-d display\t\tdisplay on remote display <display>\n"
-	   "-b\t\t\tmake noise when battery is critical low (beep)\n"
+	   "-b\t\t\tenable blinking of various UI elements\n"
 	   "-r\t\t\tdisable scrolling message\n"
 	   "-c value\t\tset critical low alarm at <value> percent\n"
 	   "\t\t\t(default: 10 percent)\n"
 	   "-m <battery number>\tbattery number to monitor\n"
-	   "-s <sample rate>\trate at which to sample battery status\n"
-	   "\t\t\tdefault 100 (once every three seconds)\n"
+	   "-s <sample rate>\tnumber of times per minute to sample battery information\n"
+	   "\t\t\tdefault 20 (once every three seconds)\n"
 	   "-n\t\t\tdo not blink\n"
 	   "-w\t\t\trun in command line mode\n"
 	   "-a <samples>\t\tsamples to average over (cli mode only)\n"
@@ -638,7 +648,7 @@ void cli_wmacpi(int samples)
 
     /* we want to acquire samples over some period of time, so . . . */
     for(i = 0; i < samples + 2; i++) {
-	for(j = 0; j < batt_count; j++)
+	for(j = 0; j < globals->battery_count; j++)
 	    acquire_batt_info(j);
 	acquire_global_info();
 	usleep(sleep_time);
@@ -647,7 +657,7 @@ void cli_wmacpi(int samples)
     ap = &globals->adapter;
     if(ap->power == AC) {
 	printf("On AC Power");
-	for(i = 0; i < batt_count; i++) {
+	for(i = 0; i < globals->battery_count; i++) {
 	    binfo = &batteries[i];
 	    if(binfo->present && (binfo->charge_state == CHARGE)) {
 		printf("; Battery %s charging", binfo->name);
@@ -661,7 +671,7 @@ void cli_wmacpi(int samples)
 	printf("\n");
     } else if(ap->power == BATT) {
 	printf("On Battery");
-	for(i = 0; i < batt_count; i++) {
+	for(i = 0; i < globals->battery_count; i++) {
 	    binfo = &batteries[i];
 	    if(binfo->present && (binfo->percentage >= 0))
 		printf(", Battery %s at %d%%", binfo->name,
@@ -679,9 +689,15 @@ int main(int argc, char **argv)
 {
     char *display = NULL;
     int ch;
-    int update = 0;
+    int sample_count = 0;
+    int batt_reinit, ac_reinit;
+    int batt_count = 0;
+    int ac_count = 0;
     int cli = 0, samples = 1;
-    int samplerate = 100;
+    int samplerate = 20;
+    int sleep_rate = 10;
+    int sleep_time = 1000000/sleep_rate;
+    int scroll_count = 0;
     battery_t *binfo;
 
     dockapp = calloc(1, sizeof(Dockapp));
@@ -693,6 +709,15 @@ int main(int argc, char **argv)
     globals->crit_level = 10;
     battery_no = 1;
 
+    /* after this many samples, we reinit the battery and AC adapter 
+     * information. 
+     * XXX: make these configurable . . . */
+    batt_reinit = 100;
+    ac_reinit = 1000;
+
+    /* this needs to be up here because we need to know what batteries
+     * are available /before/ we can decide if the battery we want to
+     * monitor is available. */
     /* parse command-line options */
     while ((ch = getopt(argc, argv, "d:c:m:s:a:hnwbrvV")) != EOF) {
 	switch (ch) {
@@ -718,11 +743,6 @@ int main(int argc, char **argv)
 			    MAXBATT);
 		    return 1;
 		}
-		if (battery_no > batt_count) {
-		    fprintf(stderr, "Battery %d does not appear to be installed\n",
-			    battery_no);
-		    return 1;
-		}
 		fprintf(stderr, "Monitoring battery %d\n", battery_no);
 	    } 
 	    break;
@@ -730,7 +750,7 @@ int main(int argc, char **argv)
 	    if (optarg) {
 		samplerate = atoi(optarg);
 		if (samplerate == 0) samplerate = 1;
-		if (samplerate > 3000) samplerate = 3000;
+		if (samplerate > 600) samplerate = 600;
 	    } else {
 		usage(argv[0]);
 		exit(1);
@@ -764,7 +784,6 @@ int main(int argc, char **argv)
 	    dockapp->blink = 1;
 	    break;
 	case 'r':
-	    printf("disabling scroll\n");
 	    dockapp->scroll = 0;
 	    break;
 	default:
@@ -774,11 +793,15 @@ int main(int argc, char **argv)
 	
     }
     
-    /* see if whatever we want to use is supported */
     if (power_init())
 	/* power_init functions handle printing error messages */
 	exit(1);
 
+    if (battery_no > globals->battery_count) {
+	pfatal("Battery %d not available for monitoring\n", battery_no);
+	exit(1);
+    }
+
     /* check for cli mode */
     if (cli) {
 	cli_wmacpi(samples);
@@ -828,7 +851,7 @@ int main(int argc, char **argv)
 	    case ButtonRelease:
 		/* cycle through the known batteries. */
 		battery_no++;
-		battery_no = battery_no % batt_count;
+		battery_no = battery_no % globals->battery_count;
 		globals->binfo = &batteries[battery_no];
 		binfo = globals->binfo;
 		pinfo("changing to monitor battery %d\n", battery_no + 1);
@@ -856,17 +879,39 @@ int main(int argc, char **argv)
 	 *
 	 * So, given the base rate of once every three seconds, we want to
 	 * change this test to . . . */
-	if (update++ == (3000/samplerate)) {
+	/* Okay, this needs /fixing/ - it's ridiculous. We should be giving
+	 * the user the option of saying how many times per minute the 
+	 * battery should be sampled, defaulting to 20 times. 
+	 * 
+	 * We sleep for one tenth of a second at a time, so 60 seconds
+	 * translates to 600 sleeps. So, we change the default sample
+	 * rate to 20, and the calculation below becomes . . .*/
+	if (sample_count++ == ((sleep_rate*60)/samplerate)) {
 	    acquire_all_info();
-	    update = 0;
+
+	    /* we need to be able to reinitialise batteries and adapters, because
+	     * they change - you can hotplug batteries on most laptops these days
+	     * and who knows what kind of shit will be happening soon . . . */
+	    if (batt_count++ >= batt_reinit) {
+		    if(reinit_batteries()) 
+			    pfatal("Oh my god, the batteries are gone!\n");
+		    batt_count = 0;
+	    }
+
+	    if (ac_count++ >= ac_reinit) {
+		    if(reinit_ac_adapters()) 
+			    pfatal("What happened to our AC adapters?!?\n");
+		    ac_count = 0;
+	    }
+	    sample_count = 0;
 	}
 
-	if (count++ == update_timeout) {
+	if (scroll_count++ >= scroll_reset) {
 	    scroll_text(6, 50, 52, dockapp->tw, 1);
-	    count = 0;
+	    scroll_count = 0;
 	}
 
-	/* the old code had some kind of weird crap with timers and the like. 
+	/* The old code had some kind of weird crap with timers and the like. 
 	 * As far as I can tell, it's meaningless - the time we want to display
 	 * is the time calculated from the remaining capacity, as per the 
 	 * ACPI spec. The only thing I'd change is the handling of a charging
@@ -886,7 +931,8 @@ int main(int argc, char **argv)
 	/* redraw_window, if anything changed - determined inside 
 	 * redraw_window. */
 	redraw_window();
-	usleep(100000);
+
+	usleep(sleep_time);
     }
     return 0;
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wmaker/wmacpi.git



More information about the Pkg-wmaker-commits mailing list