LINUX.ORG.RU

Xrandr показывает фантомный режим монитора в списке

 ,


0

1

У меня на флешке есть небольшое брр…, которое опрашивает, какое разрешение я хочу, на какой монитор, какую частоту обновления я хочу, создаёт режим, применяет режим, а теперь должно ещё и кастовать 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(заметьте, что название ЭТОГО режима уже без кавычек) и оно работает. Даже табом выделяется. А что не работает-то? Почему в списке появляется фантомный режим?



Последнее исправление: Tyse_EX (всего исправлений: 1)

Ищи скрипт который тебе автодополнение делает, вероятно в нём баг. Автодопонения - не часть софта к которому ты таб жмёшь, это скрипты для баша в /etc где-то.

Чтобы узнать список режимов, запусти xrandr без аргументов просто.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 3)

Это тема про «я познаю shell»? Про то, что кавычки раскрываются при подстановке аргументов? Если вы создали режим, у которого в названии кавычки, то и указывайте его название так, чтобы в xrandr оно передавалось правильно:

xrandr --output LVDS --mode '"1600x900_60.00"'

mky ★★★★★
()