--- acpi-linux.c	2005-09-09 01:40:36.911938160 -0400
+++ acpi-linux.c	2005-09-09 01:39:56.879024088 -0400
@@ -182,7 +182,9 @@
 static gboolean update_battery_info(struct acpi_info * acpiinfo)
 {
   char batt_info[60];
+  char batt_state[60];
   gulong acpi_ver;
+  gulong remaining_capacity;
   GHashTable *hash;
   DIR * procdir;
   struct dirent * procdirentry;
@@ -219,7 +221,9 @@
      {
       strcpy(batt_info,"/proc/acpi/battery/");
       strcat(batt_info,procdirentry->d_name);
+      strcpy(batt_state, batt_info);
       strcat(batt_info,"/info");
+      strcat(batt_state, "/state");
       hash = read_file (batt_info, buf, sizeof (buf));
       if (hash)
        {
@@ -227,6 +231,26 @@
         acpiinfo->low_capacity += read_long (hash, "design capacity warning");
         acpiinfo->critical_capacity += read_long (hash, "design capacity low");
         g_hash_table_destroy (hash);
+
+	/* correct for incomplete acpi implementations by estimating
+	   battery capacities. */
+	hash = read_file (batt_state, buf, sizeof (buf));
+	if (hash) {
+	  remaining_capacity = read_long (hash, "remaining capacity");
+	  if (remaining_capacity > acpiinfo->max_capacity)
+	    acpiinfo->max_capacity = remaining_capacity;
+	}
+	g_hash_table_destroy (hash);
+
+	if (acpiinfo->critical_capacity == 0) {
+	  acpiinfo->critical_capacity = 1;
+	}
+	if (acpiinfo->low_capacity < acpiinfo->critical_capacity) {
+	  acpiinfo->low_capacity = 50 * acpiinfo->critical_capacity;
+	}
+	if (acpiinfo->max_capacity < acpiinfo->low_capacity) {
+	  acpiinfo->max_capacity = 4 * acpiinfo->low_capacity;
+	}
        }
      }
    }

