У меня на флешке есть небольшое брр…, которое опрашивает, какое разрешение я хочу, на какой монитор, какую частоту обновления я хочу, создаёт режим, применяет режим, а теперь должно ещё и кастовать xrandr --output. ОДНАКО, режим оно создать только пытается.
cvt работает:
func getCustomModeline(WantedResolution_H, WantedResolution_V int, refresh float64) (string, error) {
// Формируем команду cvt
cmd := exec.Command("cvt", fmt.Sprint(WantedResolution_V), fmt.Sprint(WantedResolution_H), strconv.FormatFloat(refresh, 'f', -1, 32))
// Запускаем команду и получаем вывод
output, err := cmd.Output()
if err != nil {
return "", fmt.Errorf("ошибка при выполнении cvt: %w", err)
}
// Преобразуем байты в строку
outputStr := string(output)
// Разделяем на строки
lines := strings.Split(outputStr, "\n")
// Ищем строку, начинающуюся с "Modeline"
for _, line := range lines {
if strings.HasPrefix(line, "Modeline") {
// Убираем пробелы в начале и конце
return strings.TrimSpace(line), nil
}
}
return "", fmt.Errorf("не найдена модельная строка Modeline")
}
Он определённо создаётся:
func createmode(modeline string) (modename string) {
println("Вывод для текущего режима получен!")
// println("!", modeline) // debug stuff
println("Содание нового режима...")
_, strippedmodeline, _ := strings.Cut(modeline, "Modeline")
//println("stripped: ", strippedmodeline) //debug stuff
values := strings.Fields(strippedmodeline) //Убирает псевдо-пробелы и выводит массив стрингов.
//fmt.Printf("Срезанные значения: %v", values) //debug stuff
/*
Здесь нужно добавить вычисление имени режиме, которое будет возвращено, чтобы applymode() мог его использовать
*/
args := []string{"--newmode"}
args = append(args, values...)
//fmt.Printf("Арги: %v", args) //debug stuff
cmd := exec.Command("xrandr", args...) //Не сработает, т.к. в название режима указывается в кавычках("2560x1440_144"), а они воспринимаются как отдельный аргумент
//fmt.Printf("%v", cmd) //вуигп ыегаа
output, err := cmd.Output()
if err != nil {
outputStr := string(output)
println(outputStr)
log.Fatalf("Ошибка на моменте создания нового режима: %v", err)
}
fmt.Println("Режим успешно создан")
goodcmd = strings.Join(cmd.Args, " ") //Debug stuff
fmt.Println("Готовая команда: ", goodcmd) //xrandr --newmode "1368x768_50.00" 69.25 1368 1424 1560 1752 768 771 781 793 -hsync +vsync
return
}
Потом оно делает :
func applymode() {
fmt.Println("Применение нового режима...")
compiled := regexp.MustCompile(`"(.*?)"`)
matches := compiled.FindStringSubmatch(goodcmd)
fmt.Println(matches[0]) //debug stuff
cmd := exec.Command("xrandr", "--addmode", display, matches[0])
output, err := cmd.Output()
if err != nil {
outputStr := string(output)
fmt.Println(outputStr)
log.Fatalf("Режим не применён: %v", err)
}
fmt.Println("Режим применён без ошибок!")
}
Но, когда я пытаюсь вручную выбрать режим, я вижу:
$ xrandr --output LVDS --mode
1024x768 1280x720 640x480 800x600
1152x768 1366x768 "1600x900_60.00" 720x480 848x480
Пишу xrandr --output LVDS --mode "1600x900_60.00" и получаю в ответxrandr: cannot find mode 1600x900_60.00`
Делаю вручную:
$ cvt 1600 900 59
# 1600x900 58.93 Hz (CVT) hsync: 55.04 kHz; pclk: 116.25 MHz
Modeline "1600x900_59.00" 116.25 1600 1688 1856 2112 900 903 908 934 -hsync +vsync
xrandr --newmode "1600x900_59.00" 116.25 1600 1688 1856 2112 900 903 908 934 -hsync +vsync
xrandr --addmode LVDS 1600x900_59.00(заметьте, что название ЭТОГО режима уже без кавычек) и оно работает. Даже табом выделяется. А что не работает-то? Почему в списке появляется фантомный режим?

