@@ -273,14 +273,18 @@ waybar::modules::Battery::getInfos() {
273273 // Scale these by the voltage to get μW/μWh.
274274
275275 uint32_t current_now = 0 ;
276+ int32_t _current_now_int = 0 ;
276277 bool current_now_exists = false ;
277278 if (fs::exists (bat / " current_now" )) {
278279 current_now_exists = true ;
279- std::ifstream (bat / " current_now" ) >> current_now ;
280+ std::ifstream (bat / " current_now" ) >> _current_now_int ;
280281 } else if (fs::exists (bat / " current_avg" )) {
281282 current_now_exists = true ;
282- std::ifstream (bat / " current_avg" ) >> current_now ;
283+ std::ifstream (bat / " current_avg" ) >> _current_now_int ;
283284 }
285+ // Documentation ABI allows a negative value when discharging, positive
286+ // value when charging.
287+ current_now = std::abs (_current_now_int);
284288
285289 if (fs::exists (bat / " time_to_empty_now" )) {
286290 time_to_empty_now_exists = true ;
@@ -324,11 +328,15 @@ waybar::modules::Battery::getInfos() {
324328 }
325329
326330 uint32_t power_now = 0 ;
331+ int32_t _power_now_int = 0 ;
327332 bool power_now_exists = false ;
328333 if (fs::exists (bat / " power_now" )) {
329334 power_now_exists = true ;
330- std::ifstream (bat / " power_now" ) >> power_now ;
335+ std::ifstream (bat / " power_now" ) >> _power_now_int ;
331336 }
337+ // Some drivers (example: Qualcomm) exposes use a negative value when
338+ // discharging, positive value when charging.
339+ power_now = std::abs (_power_now_int);
332340
333341 uint32_t energy_now = 0 ;
334342 bool energy_now_exists = false ;
0 commit comments