diff --git a/doc/config_settings.xml b/doc/config_settings.xml index c72c370c..4ccc8972 100644 --- a/doc/config_settings.xml +++ b/doc/config_settings.xml @@ -1029,6 +1029,15 @@ Update interval when running on batterypower + + + + + + + One or more batteries to check in order to use update_interval_on_battery (comma separated, BAT0 default) + + diff --git a/src/conky.cc b/src/conky.cc index f10d08fb..9b2c55ca 100644 --- a/src/conky.cc +++ b/src/conky.cc @@ -210,6 +210,8 @@ conky::range_config_setting update_interval("update_interval", 0.0, std::numeric_limits::infinity(), 3.0, true); conky::range_config_setting update_interval_on_battery("update_interval_on_battery", 0.0, std::numeric_limits::infinity(), NOBATTERY, true); +conky::simple_config_setting detect_battery("detect_battery", + std::string("BAT0"), false); static bool on_battery = false; double active_update_interval() @@ -2054,6 +2056,24 @@ static void update_text(void) int inotify_fd = -1; #endif +bool is_on_battery() { //checks if at least one battery specified in "detect_battery" is discharging + char buf[64]; + std::string detect_battery_str; + std::string str_buf={""}; + detect_battery_str.assign(detect_battery.get(*state)); + detect_battery_str+=','; + + for(std::string::size_type i = 0; i < detect_battery_str.size(); i++){ //parse using ',' as delimiter + if( (detect_battery_str[i] != ',') && (detect_battery_str[i] != ' ') ) str_buf+=detect_battery_str[i]; + if( (detect_battery_str[i] == ',') && !str_buf.empty() ){ + get_battery_short_status(buf, 64, str_buf.c_str()); + if(buf[0] == 'D') return true; + str_buf=""; + } + } + return false; +} + static void main_loop(void) { int terminate = 0; @@ -2100,12 +2120,7 @@ static void main_loop(void) info.looped = 0; while (terminate == 0 && (total_run_times.get(*state) == 0 || info.looped < total_run_times.get(*state))) { - if(update_interval_on_battery.get(*state) != NOBATTERY) { - char buf[64]; - - get_battery_short_status(buf, 64, "BAT0"); - on_battery = (buf[0] == 'D'); - } + if( (update_interval_on_battery.get(*state) != NOBATTERY)) on_battery = is_on_battery(); info.looped++; #ifdef SIGNAL_BLOCKING