X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fbattery%2Fbattery.c;h=fd2ffce4bf59d74e6de728bad2e64bd638dcce59;hb=f779570f7f83c10be6e278b1f3ec3795247260b6;hp=5c1f6cc8ee814b3f67d84a6eb0fe44bb2b4f15d2;hpb=7eebd3da48eb6a48eb9b15a71c131b1b442638f6;p=chaz%2Ftint2 diff --git a/src/battery/battery.c b/src/battery/battery.c index 5c1f6cc..fd2ffce 100644 --- a/src/battery/battery.c +++ b/src/battery/battery.c @@ -37,23 +37,44 @@ PangoFontDescription *bat1_font_desc=0; PangoFontDescription *bat2_font_desc=0; struct batstate battery_state; int battery_enabled; +int percentage_hide = 101; +static timeout* battery_timeout=0; static char buf_bat_percentage[10]; static char buf_bat_time[20]; int8_t battery_low_status; char *battery_low_cmd=0; +unsigned char battery_low_cmd_send=0; char *path_energy_now=0; char *path_energy_full=0; char *path_current_now=0; char *path_status=0; -void update_batterys() +void update_batterys(void* arg) { int i; update_battery(); - for (i=0 ; i < nb_panel ; i++) + for (i=0 ; i < nb_panel ; i++) { + if (battery_state.percentage >= percentage_hide) { + if (panel1[i].battery.area.on_screen == 1) { + panel1[i].battery.area.on_screen = 0; + // force resize on panel + panel1[i].area.resize = 1; + panel_refresh = 1; + } + continue; + } + else { + if (panel1[i].battery.area.on_screen == 0) { + panel1[i].battery.area.on_screen = 1; + // force resize on panel + panel1[i].area.resize = 1; + panel_refresh = 1; + } + } panel1[i].battery.area.resize = 1; + } } @@ -130,8 +151,8 @@ void init_battery() g_free(path1); g_free(battery_dir); - if (battery_enabled) - install_timer(0, 1000000, 5, 0, update_batterys); + if (battery_enabled && battery_timeout==0) + battery_timeout = add_timeout(10, 10000, update_batterys, 0); } @@ -184,15 +205,15 @@ void init_battery_panel(void *p) if (panel_horizontal) { // panel horizonal => fixed height and posy - battery->area.posy = panel->area.pix.border.width + panel->area.paddingy; + battery->area.posy = panel->area.bg->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->area.posx = panel->area.bg->border.width + panel->area.paddingy; + battery->area.width = panel->area.width - (2 * panel->area.bg->border.width) - (2 * panel->area.paddingy); } battery->bat1_posy = (battery->area.height - bat_percentage_height) / 2; @@ -210,36 +231,30 @@ void update_battery() { fp = fopen(path_status, "r"); if(fp != NULL) { - fgets(tmp, sizeof tmp, fp); + if (fgets(tmp, sizeof tmp, fp)) { + 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(strcasecmp(tmp, "Full\n")==0) battery_state.state = BATTERY_FULL; + } fclose(fp); } - 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(strcasecmp(tmp, "Full\n")==0) battery_state.state = BATTERY_FULL; - if (battery_state.state == BATTERY_DISCHARGING) { - } - else { - } fp = fopen(path_energy_now, "r"); if(fp != NULL) { - fgets(tmp, sizeof tmp, fp); - energy_now = atoi(tmp); + if (fgets(tmp, sizeof tmp, fp)) energy_now = atoi(tmp); fclose(fp); } fp = fopen(path_energy_full, "r"); if(fp != NULL) { - fgets(tmp, sizeof tmp, fp); - energy_full = atoi(tmp); + if (fgets(tmp, sizeof tmp, fp)) energy_full = atoi(tmp); fclose(fp); } fp = fopen(path_current_now, "r"); if(fp != NULL) { - fgets(tmp, sizeof tmp, fp); - current_now = atoi(tmp); + if (fgets(tmp, sizeof tmp, fp)) current_now = atoi(tmp); fclose(fp); } @@ -266,9 +281,12 @@ void update_battery() { if(energy_full > 0) new_percentage = (energy_now*100)/energy_full; - 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); + if(battery_low_status > new_percentage && battery_state.state == BATTERY_DISCHARGING && !battery_low_cmd_send) { + system(battery_low_cmd); // return value == -1, since we've set SIGCHLD to SIGIGN + battery_low_cmd_send = 1; + } + if(battery_low_status < new_percentage && battery_state.state == BATTERY_CHARGING && battery_low_cmd_send) { + battery_low_cmd_send = 0; } battery_state.percentage = new_percentage; @@ -280,7 +298,7 @@ void update_battery() { } -void draw_battery (void *obj, cairo_t *c, int active) +void draw_battery (void *obj, cairo_t *c) { Battery *battery = obj; PangoLayout *layout; @@ -353,13 +371,13 @@ void resize_battery(void *obj) if(percentage_width > time_width) new_width = percentage_width; else new_width = time_width; - new_width += (2*battery->area.paddingxlr) + (2*battery->area.pix.border.width); + new_width += (2*battery->area.paddingxlr) + (2*battery->area.bg->border.width); int old_width = battery->area.width; 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; + battery->area.posx = panel->area.width - battery->area.width - panel->area.paddingxlr - panel->area.bg->border.width; if (panel->clock.area.on_screen) battery->area.posx -= (panel->clock.area.width + panel->area.paddingx);