xrandr/display_mode.go
2023-12-18 23:08:42 +01:00

56 lines
1.2 KiB
Go

package xrandr
import (
"regexp"
"git.milar.in/milarin/bufr"
)
var modePattern = regexp.MustCompile(`^\s*(\d+?)x(\d+?)\s+(.*?)$`)
var ratePattern = regexp.MustCompile(`(\d+\.\d+)(\*)?(\+)?\s*`)
type DisplayMode struct {
Resolution Resolution `json:"resolution"`
Rate float64 `json:"rate"`
}
func parseDisplayModes(r *bufr.Reader) (active, recommended *DisplayMode, allModes []DisplayMode, err error) {
allModes = make([]DisplayMode, 0)
var line string
for line, err = r.StringUntil(isNewLine); err == nil; line, err = r.StringUntil(isNewLine) {
matches := modePattern.FindStringSubmatch(line)
// line is not a DisplayMode
if matches == nil {
err = nil
break
}
res := NewResolutionFromString(matches[1], matches[2])
rates := ratePattern.FindAllStringSubmatch(matches[3], -1)
for _, rate := range rates {
mode := DisplayMode{
Resolution: *res,
Rate: atof(rate[1]),
}
if rate[2] == "*" {
active = &mode
}
if rate[3] == "+" {
recommended = &mode
}
allModes = append(allModes, mode)
}
}
// last read line was not a DisplayMode. Unread line
if err == nil {
r.UnreadString(line)
}
return active, recommended, allModes, err
}