X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fbattery%2Fbattery.c;h=39c527a455d4a8edecb6b61667e7c456d038aba6;hb=9cb781048d0a1cf55f0044e2f9f65ac9a5a241e9;hp=a0b122d39d21849b73d41ed599f2ee1692546c59;hpb=6f9e73f8f0b88d1258e99397d9ca8b1afca5085e;p=chaz%2Ftint2 diff --git a/src/battery/battery.c b/src/battery/battery.c index a0b122d..39c527a 100644 --- a/src/battery/battery.c +++ b/src/battery/battery.c @@ -40,48 +40,170 @@ static char buf_bat_percentage[10]; static char buf_bat_time[20]; int8_t battery_low_status; -char* battery_low_cmd; +char *battery_low_cmd; +char *path_energy_now, *path_energy_full, *path_current_now, *path_status; -void update_battery(struct batstate *data) { + +void init_battery() +{ + // check battery + GDir *directory; + GError *error = NULL; + const char *entryname; + char *battery_dir = 0; + + path_energy_now = path_energy_full = path_current_now = path_status = 0; + directory = g_dir_open("/sys/class/power_supply", 0, &error); + if (error) + g_error_free(error); + else { + while ((entryname=g_dir_read_name(directory))) { + if (strncmp(entryname,"AC", 2) == 0) continue; + + char *path1 = g_build_filename("/sys/class/power_supply", entryname, "present", NULL); + if (g_file_test (path1, G_FILE_TEST_EXISTS)) { + g_free(path1); + battery_dir = g_build_filename("/sys/class/power_supply", entryname, NULL); + break; + } + g_free(path1); + } + } + if (battery_dir != 0) { + char *path1 = g_build_filename(battery_dir, "energy_now", NULL); + if (g_file_test (path1, G_FILE_TEST_EXISTS)) { + path_energy_now = g_build_filename(battery_dir, "energy_now", NULL); + path_energy_full = g_build_filename(battery_dir, "energy_full", NULL); + } + else { + char *path2 = g_build_filename(battery_dir, "charge_now", NULL); + if (g_file_test (path2, G_FILE_TEST_EXISTS)) { + path_energy_now = g_build_filename(battery_dir, "charge_now", NULL); + path_energy_full = g_build_filename(battery_dir, "charge_full", NULL); + } + else { + g_free(battery_dir); + battery_dir = 0; + fprintf(stderr, "ERROR: can't found energy_* or charge_*\n"); + } + g_free(path2); + } + path_current_now = g_build_filename(battery_dir, "current_now", NULL); + path_status = g_build_filename(battery_dir, "status", NULL); + g_free(path1); + } + + FILE *fp; + Panel *panel; + Battery *battery; + int i, bat_percentage_height, bat_percentage_height_ink, bat_time_height, bat_time_height_ink; + + for (i=0 ; i < nb_panel ; i++) { + panel = &panel1[i]; + battery = &panel->battery; + + if (battery_dir == 0) battery->area.on_screen = 0; + if (!battery->area.on_screen) continue; + + battery->area.parent = panel; + battery->area.panel = panel; + battery->area._draw_foreground = draw_battery; + battery->area._resize = resize_battery; + battery->area.resize = 1; + battery->area.redraw = 1; + + if((fp = fopen(path_energy_now, "r")) == NULL) { + fprintf(stderr, "ERROR: battery applet can't open energy_now\n"); + panel->battery.area.on_screen = 0; + continue; + } + fclose(fp); + if((fp = fopen(path_energy_full, "r")) == NULL) { + fprintf(stderr, "ERROR: battery applet can't open energy_full\n"); + panel->battery.area.on_screen = 0; + continue; + } + fclose(fp); + if((fp = fopen(path_current_now, "r")) == NULL) { + fprintf(stderr, "ERROR: battery applet can't open current_now\n"); + panel->battery.area.on_screen = 0; + continue; + } + fclose(fp); + if((fp = fopen(path_status, "r")) == NULL) { + fprintf(stderr, "ERROR: battery applet can't open status"); + panel->battery.area.on_screen = 0; + continue; + } + fclose(fp); + + update_battery(&battery_state); + snprintf(buf_bat_percentage, sizeof(buf_bat_percentage), "%d%%", battery_state.percentage); + snprintf(buf_bat_time, sizeof(buf_bat_time), "%02d:%02d", battery_state.time.hours, battery_state.time.minutes); + + get_text_size(bat1_font_desc, &bat_percentage_height_ink, &bat_percentage_height, panel->area.height, buf_bat_percentage, strlen(buf_bat_percentage)); + get_text_size(bat2_font_desc, &bat_time_height_ink, &bat_time_height, panel->area.height, buf_bat_time, strlen(buf_bat_time)); + + if (panel_horizontal) { + // panel horizonal => fixed height and posy + battery->area.posy = panel->area.pix.border.width + panel->area.paddingy; + battery->area.height = panel->area.height - (2 * battery->area.posy); + } + else { + // panel vertical => fixed width, height, posy and posx + battery->area.posy = panel->clock.area.posy + panel->clock.area.height + panel->area.paddingx; + battery->area.height = (2 * battery->area.paddingxlr) + (bat_time_height + bat_percentage_height); + battery->area.posx = panel->area.pix.border.width + panel->area.paddingy; + battery->area.width = panel->area.width - (2 * panel->area.pix.border.width) - (2 * panel->area.paddingy); + } + + battery->bat1_posy = (battery->area.height - bat_percentage_height) / 2; + battery->bat1_posy -= ((bat_time_height_ink + 2) / 2); + battery->bat2_posy = battery->bat1_posy + bat_percentage_height + 2 - (bat_percentage_height - bat_percentage_height_ink)/2 - (bat_time_height - bat_time_height_ink)/2; + } +} + + +void update_battery() { FILE *fp; char tmp[25]; int64_t energy_now = 0, energy_full = 0, current_now = 0; int seconds = 0; int8_t new_percentage = 0; - fp = fopen("/sys/class/power_supply/BAT0/energy_now", "r"); + fp = fopen(path_energy_now, "r"); if(fp != NULL) { fgets(tmp, sizeof tmp, fp); energy_now = atoi(tmp); fclose(fp); - } else printf("ERROR: battery applet can't open energy_now\n"); + } - fp = fopen("/sys/class/power_supply/BAT0/energy_full", "r"); + fp = fopen(path_energy_full, "r"); if(fp != NULL) { fgets(tmp, sizeof tmp, fp); energy_full = atoi(tmp); fclose(fp); - } else printf("ERROR: battery applet can't open energy_full\n"); + } - fp = fopen("/sys/class/power_supply/BAT0/current_now", "r"); + fp = fopen(path_current_now, "r"); if(fp != NULL) { fgets(tmp, sizeof tmp, fp); current_now = atoi(tmp); fclose(fp); - } else printf("ERROR: battery applet can't open current_now\n"); + } - fp = fopen("/sys/class/power_supply/BAT0/status", "r"); + fp = fopen(path_status, "r"); if(fp != NULL) { fgets(tmp, sizeof tmp, fp); fclose(fp); - } else printf("ERROR: battery applet can't open status"); + } - data->state = BATTERY_UNKNOWN; - if(strcasecmp(tmp, "Charging\n")==0) data->state = BATTERY_CHARGING; - if(strcasecmp(tmp, "Discharging\n")==0) data->state = BATTERY_DISCHARGING; + battery_state.state = BATTERY_UNKNOWN; + if(strcasecmp(tmp, "Charging\n")==0) battery_state.state = BATTERY_CHARGING; + if(strcasecmp(tmp, "Discharging\n")==0) battery_state.state = BATTERY_DISCHARGING; if(current_now > 0) { - switch(data->state) { + switch(battery_state.state) { case BATTERY_CHARGING: seconds = 3600 * (energy_full - energy_now) / current_now; break; @@ -94,56 +216,21 @@ void update_battery(struct batstate *data) { } } else seconds = 0; - data->time.hours = seconds / 3600; - seconds -= 3600 * data->time.hours; - data->time.minutes = seconds / 60; - seconds -= 60 * data->time.minutes; - data->time.seconds = seconds; + battery_state.time.hours = seconds / 3600; + seconds -= 3600 * battery_state.time.hours; + battery_state.time.minutes = seconds / 60; + seconds -= 60 * battery_state.time.minutes; + battery_state.time.seconds = seconds; - new_percentage = (energy_now*100)/energy_full; + if(energy_full > 0) + new_percentage = (energy_now*100)/energy_full; - if(battery_low_status != 0 && battery_low_status == new_percentage && data->percentage > new_percentage) { - printf("battery low, executing: %s\n", battery_low_cmd); - if(battery_low_cmd) system(battery_low_cmd); + if(battery_low_status != 0 && battery_low_status == new_percentage && battery_state.percentage > new_percentage) { + //printf("battery low, executing: %s\n", battery_low_cmd); + if (battery_low_cmd) system(battery_low_cmd); } - data->percentage = new_percentage; -} - -void init_battery() -{ - Panel *panel; - Battery *battery; - int i, bat_percentage_height, bat_percentage_height_ink, bat_time_height, bat_time_height_ink; - - for (i=0 ; i < nb_panel ; i++) { - panel = &panel1[i]; - battery = &panel->battery; - - battery->area.parent = panel; - battery->area.panel = panel; - battery->area._draw_foreground = draw_battery; - battery->area._resize = resize_battery; - - if (!battery->area.on_screen) continue; - - battery->area.posy = panel->area.pix.border.width + panel->area.paddingy; - battery->area.height = panel->area.height - (2 * battery->area.posy); - battery->area.resize = 1; - battery->area.redraw = 1; - - update_battery(&battery_state); - snprintf(buf_bat_percentage, sizeof(buf_bat_percentage), "%d%%", battery_state.percentage); - snprintf(buf_bat_time, sizeof(buf_bat_time), "%02d:%02d", battery_state.time.hours, battery_state.time.minutes); - - get_text_size(bat1_font_desc, &bat_percentage_height_ink, &bat_percentage_height, panel->area.height, buf_bat_percentage, strlen(buf_bat_percentage)); - battery->bat1_posy = (battery->area.height - bat_percentage_height) / 2; - - get_text_size(bat2_font_desc, &bat_time_height_ink, &bat_time_height, panel->area.height, buf_bat_time, strlen(buf_bat_time)); - - battery->bat1_posy -= ((bat_time_height_ink + 2) / 2); - battery->bat2_posy = battery->bat1_posy + bat_percentage_height + 2 - (bat_percentage_height - bat_percentage_height_ink)/2 - (bat_time_height - bat_time_height_ink)/2; - } + battery_state.percentage = new_percentage; } @@ -178,9 +265,10 @@ void draw_battery (void *obj, cairo_t *c, int active) g_object_unref(layout); } + void resize_battery(void *obj) { - Battery *battery = obj; + Battery *battery = obj; PangoLayout *layout; int percentage_width, time_width, new_width; @@ -189,6 +277,8 @@ void resize_battery(void *obj) snprintf(buf_bat_percentage, sizeof(buf_bat_percentage), "%d%%", battery_state.percentage); snprintf(buf_bat_time, sizeof(buf_bat_time), "%02d:%02d", battery_state.time.hours, battery_state.time.minutes); + // vertical panel doen't adjust width + if (!panel_horizontal) return; cairo_surface_t *cs; cairo_t *c; @@ -215,23 +305,19 @@ void resize_battery(void *obj) new_width += (2*battery->area.paddingxlr) + (2*battery->area.pix.border.width); - if(new_width > battery->area.width || new_width < (battery->area.width-6)) { - int i; - Panel *panel = ((Area*)obj)->panel; - - printf("battery_width %d, new_width %d\n", battery->area.width, new_width); - - // resize battery - // we try to limit the number of resize - battery->area.width = new_width + 1; - battery->area.posx = panel->area.width - battery->area.width - panel->area.paddingxlr - panel->area.pix.border.width; - if (panel->clock.area.on_screen) - battery->area.posx -= (panel->clock.area.width + panel->area.paddingx); + int old_width = battery->area.width; - // resize other objects on panel - for (i=0 ; i < nb_panel ; i++) - panel1[i].area.resize = 1; + Panel *panel = ((Area*)obj)->panel; + battery->area.width = new_width + 1; + battery->area.posx = panel->area.width - battery->area.width - panel->area.paddingxlr - panel->area.pix.border.width; + if (panel->clock.area.on_screen) + battery->area.posx -= (panel->clock.area.width + panel->area.paddingx); + if(new_width > old_width || new_width < (old_width-6)) { + // refresh and resize other objects on panel + // we try to limit the number of refresh + // printf("battery_width %d, new_width %d\n", battery->area.width, new_width); + panel->area.resize = 1; systray.area.resize = 1; panel_refresh = 1; }