#!/usr/bin/perl -w

use strict;

sub xrandr {
    my ($width, $height, $xrate) = @_;
    my $xrandr_cmd = sprintf("xrandr -s %dx%d -r %d", $width, $height, $xrate);
    system($xrandr_cmd) == 0 or die "$xrandr_cmd\nfailed";
}

my $save_width;
my $save_height;
my $save_xrate;

open(XRANDR, "xrandr |") or die "Cannot execute xrandr";
while (<XRANDR>) {
    if (/^\s+(\d+)x(\d+)\s+(.+)/) {
        my $width = $1;
        my $height = $2;
        my $rates = $3;
        my @rates = split(' ', $rates);
        foreach my $xrate (@rates) {
            if ($xrate =~ /\*$/) {
                chop($xrate);
                $save_width = $width;
                $save_height = $height;
                $save_xrate = $xrate;
            }
            xrandr($width, $height, $xrate);

            my $xvidtune = `xvidtune -show`;
            my ($mode, $pclk,
                $hdisp, $hstart, $hend, $htotal,
                $vdisp, $vstart, $vend, $vtotal) = split(' ', $xvidtune);
            my $drate = ($pclk * 1000000.0) / ($htotal * $vtotal);
            my $drate_str =
                ($xvidtune =~ /interlace/i ?
                 sprintf("%.2fi,", $drate * 2.0) :
                 sprintf("%.2f,", $drate));
            printf "%d,%d,%s%2d\n", $width, $height, $drate_str, $xrate;
        }
    }
}

close(XRANDR);
xrandr($save_width, $save_height, $save_xrate);

