2022-01-26 06:54:36 -08:00
|
|
|
package segments
|
2019-03-13 04:14:30 -07:00
|
|
|
|
|
|
|
import (
|
2022-01-26 01:23:18 -08:00
|
|
|
"oh-my-posh/environment"
|
2022-01-26 04:53:35 -08:00
|
|
|
"oh-my-posh/properties"
|
2019-03-13 04:14:30 -07:00
|
|
|
|
|
|
|
"github.com/distatus/battery"
|
|
|
|
)
|
|
|
|
|
2022-01-26 05:10:18 -08:00
|
|
|
type Battery struct {
|
2022-01-26 04:53:35 -08:00
|
|
|
props properties.Properties
|
2022-01-26 01:23:18 -08:00
|
|
|
env environment.Environment
|
2021-11-25 02:26:37 -08:00
|
|
|
|
2022-04-24 03:56:59 -07:00
|
|
|
*environment.BatteryInfo
|
|
|
|
Error string
|
|
|
|
Icon string
|
2019-03-13 04:14:30 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
const (
|
2020-11-12 00:43:32 -08:00
|
|
|
// ChargingIcon to display when charging
|
2022-01-26 04:53:35 -08:00
|
|
|
ChargingIcon properties.Property = "charging_icon"
|
2020-11-12 00:43:32 -08:00
|
|
|
// DischargingIcon o display when discharging
|
2022-01-26 04:53:35 -08:00
|
|
|
DischargingIcon properties.Property = "discharging_icon"
|
2020-11-12 00:43:32 -08:00
|
|
|
// ChargedIcon to display when fully charged
|
2022-01-26 04:53:35 -08:00
|
|
|
ChargedIcon properties.Property = "charged_icon"
|
2022-05-09 22:25:05 -07:00
|
|
|
// NotChargingIcon to display when on AC power
|
|
|
|
NotChargingIcon properties.Property = "not_charging_icon"
|
2019-03-13 04:14:30 -07:00
|
|
|
)
|
|
|
|
|
2022-01-26 05:26:56 -08:00
|
|
|
func (b *Battery) Template() string {
|
2022-02-01 05:07:58 -08:00
|
|
|
return " {{ if not .Error }}{{ .Icon }}{{ .Percentage }}{{ end }}{{ .Error }} "
|
2022-01-23 12:37:51 -08:00
|
|
|
}
|
|
|
|
|
2022-01-26 05:26:56 -08:00
|
|
|
func (b *Battery) Enabled() bool {
|
2022-02-09 08:47:28 -08:00
|
|
|
// disable in WSL1
|
|
|
|
if b.env.IsWsl() && !b.env.IsWsl2() {
|
2022-02-06 23:02:02 -08:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2022-04-24 03:56:59 -07:00
|
|
|
var err error
|
|
|
|
b.BatteryInfo, err = b.env.BatteryState()
|
2021-04-20 04:11:09 -07:00
|
|
|
|
2021-04-12 10:15:36 -07:00
|
|
|
if !b.enabledWhileError(err) {
|
|
|
|
return false
|
2019-03-13 04:14:30 -07:00
|
|
|
}
|
2021-01-04 23:23:11 -08:00
|
|
|
|
2021-04-20 04:11:09 -07:00
|
|
|
// case on computer without batteries(no error, empty array)
|
2022-04-24 03:56:59 -07:00
|
|
|
if err == nil && b.BatteryInfo == nil {
|
2021-04-20 04:11:09 -07:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2022-04-24 03:56:59 -07:00
|
|
|
switch b.BatteryInfo.State {
|
2022-05-09 22:25:05 -07:00
|
|
|
case battery.Discharging:
|
2022-01-26 04:09:21 -08:00
|
|
|
b.Icon = b.props.GetString(DischargingIcon, "")
|
2022-05-09 22:25:05 -07:00
|
|
|
case battery.NotCharging:
|
|
|
|
b.Icon = b.props.GetString(NotChargingIcon, "")
|
2019-03-13 04:14:30 -07:00
|
|
|
case battery.Charging:
|
2022-01-26 04:09:21 -08:00
|
|
|
b.Icon = b.props.GetString(ChargingIcon, "")
|
2019-03-13 04:14:30 -07:00
|
|
|
case battery.Full:
|
2022-01-26 04:09:21 -08:00
|
|
|
b.Icon = b.props.GetString(ChargedIcon, "")
|
2020-11-12 00:43:32 -08:00
|
|
|
case battery.Empty, battery.Unknown:
|
2020-09-27 23:03:27 -07:00
|
|
|
return true
|
2019-03-13 04:14:30 -07:00
|
|
|
}
|
2020-09-27 23:03:27 -07:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2022-01-26 05:10:18 -08:00
|
|
|
func (b *Battery) enabledWhileError(err error) bool {
|
2021-04-12 10:15:36 -07:00
|
|
|
if err == nil {
|
|
|
|
return true
|
|
|
|
}
|
2022-01-26 01:23:18 -08:00
|
|
|
if _, ok := err.(*environment.NoBatteryError); ok {
|
2021-04-12 10:15:36 -07:00
|
|
|
return false
|
|
|
|
}
|
2022-01-26 04:53:35 -08:00
|
|
|
displayError := b.props.GetBool(properties.DisplayError, false)
|
2021-04-12 10:15:36 -07:00
|
|
|
if !displayError {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
b.Error = err.Error()
|
|
|
|
// On Windows, it sometimes errors when the battery is full.
|
|
|
|
// This hack ensures we display a fully charged battery, even if
|
|
|
|
// that state can be incorrect. It's better to "ignore" the error
|
|
|
|
// than to not display the segment at all as that will confuse users.
|
2022-04-24 03:56:59 -07:00
|
|
|
b.Percentage = 100
|
|
|
|
b.State = battery.Full
|
2021-04-12 10:15:36 -07:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2022-01-26 05:26:56 -08:00
|
|
|
func (b *Battery) Init(props properties.Properties, env environment.Environment) {
|
2019-03-13 04:14:30 -07:00
|
|
|
b.props = props
|
|
|
|
b.env = env
|
|
|
|
}
|