batt: detect when battery is inserted or removed
authorHenry Gebhardt <hsggebhardt@gmail.com>
Mon, 27 Jan 2014 02:58:24 +0000 (21:58 -0500)
committerHenry Gebhardt <hsggebhardt@gmail.com>
Mon, 27 Jan 2014 02:58:24 +0000 (21:58 -0500)
src/plugins/batt/batt.c
src/plugins/batt/batt_sys.c
src/plugins/batt/batt_sys.h

index 788dd61..6809c6a 100644 (file)
@@ -221,18 +221,18 @@ void update_display(lx_battery *lx_b, gboolean repaint) {
     cr = cairo_create(lx_b->pixmap);
     cairo_set_line_width (cr, 1.0);
 
+    /* draw background */
+    gdk_cairo_set_source_color(cr, &lx_b->background);
+    cairo_rectangle(cr, 0, 0, lx_b->width, lx_b->height);
+    cairo_fill(cr);
+
     /* no battery is found */
     if( b == NULL ) 
     {
        gtk_widget_set_tooltip_text( lx_b->drawingArea, _("No batteries found") );
-       return;
+       goto update_done;
     }
     
-    /* draw background */
-    gdk_cairo_set_source_color(cr, &lx_b->background);
-    cairo_rectangle(cr, 0, 0, lx_b->width, lx_b->height);
-    cairo_fill(cr);
-
     /* fixme: only one battery supported */
 
     rate = lx_b->b->current_now;
@@ -301,6 +301,8 @@ void update_display(lx_battery *lx_b, gboolean repaint) {
         cairo_fill(cr);
 
     }
+
+update_done:
     if( repaint )
        gtk_widget_queue_draw( lx_b->drawingArea );
 
@@ -310,13 +312,19 @@ void update_display(lx_battery *lx_b, gboolean repaint) {
 
 /* This callback is called every 3 seconds */
 static int update_timout(lx_battery *lx_b) {
+    battery *bat;
     GDK_THREADS_ENTER();
     lx_b->state_elapsed_time++;
     lx_b->info_elapsed_time++;
 
-    /* check the  batteries every 3 seconds */
-    if (lx_b->b != NULL)
-       battery_update( lx_b->b );
+    bat = battery_update( lx_b->b );
+    if (bat == NULL)
+    {
+       battery_free(lx_b->b);
+
+       /* maybe in the mean time a battery has been inserted. */
+       lx_b->b = battery_get();
+    }
 
     update_display( lx_b, TRUE );
 
index 5d62edc..37cde51 100644 (file)
@@ -143,10 +143,34 @@ void battery_print(battery *b, int show_capacity)
 }
 
 
-void battery_update(battery *b)
+static gboolean battery_inserted(gchar* path)
+{
+    if (path == NULL)
+        return FALSE;
+
+    GString *dirname = g_string_new(ACPI_PATH_SYS_POWER_SUPPY);
+    GDir *dir;
+
+    g_string_append_printf (dirname, "/%s/", path);
+    dir = g_dir_open(dirname->str, 0, NULL);
+    if (dir)
+        g_dir_close(dir);
+    g_string_free(dirname, TRUE);
+
+    return dir ? TRUE : FALSE;
+}
+
+
+battery* battery_update(battery *b)
 {
     gchar *gctmp;
 
+    if (b == NULL)
+        return NULL;
+
+    if (!battery_inserted(b->path))
+        return NULL;
+
     /* read from sysfs */
     b->charge_now = get_gint_from_infofile(b, "charge_now");
     b->energy_now = get_gint_from_infofile(b, "energy_now");
@@ -255,6 +279,8 @@ void battery_update(battery *b)
        b->poststr = NULL;
        b->seconds = -1;
     }
+
+    return b;
 }
 
 
@@ -287,8 +313,10 @@ battery *battery_get() {
 
 void battery_free(battery* bat)
 {
-    g_free(bat->path);
-    g_free(bat);
+    if (bat) {
+        g_free(bat->path);
+        g_free(bat);
+    }
 }
 
 gboolean battery_is_charging( battery *b )
index c2d72c3..a6d1483 100644 (file)
@@ -55,9 +55,10 @@ typedef struct battery {
 } battery;
 
 battery *battery_get();
-void battery_update( battery *b );
+battery *battery_update( battery *b );
 void battery_print(battery *b, int show_capacity);
 gboolean battery_is_charging( battery *b );
 gint battery_get_remaining( battery *b );
+void battery_free(battery* bat);
 
 #endif