diff options
Diffstat (limited to 'perl-install/Xconfig/monitor.pm')
-rw-r--r-- | perl-install/Xconfig/monitor.pm | 275 |
1 files changed, 0 insertions, 275 deletions
diff --git a/perl-install/Xconfig/monitor.pm b/perl-install/Xconfig/monitor.pm deleted file mode 100644 index ba5360b69..000000000 --- a/perl-install/Xconfig/monitor.pm +++ /dev/null @@ -1,275 +0,0 @@ -package Xconfig::monitor; #- $Id$ - -use diagnostics; -use strict; - -use Xconfig::xfree; -use detect_devices; -use common; -use any; -use log; - - -sub good_default_monitor() { - detect_devices::is_xbox() ? 'Generic|640x480 @ 60 Hz' : - arch() =~ /ppc/ ? - (detect_devices::get_mac_model() =~ /^iBook/ ? 'Apple|iBook 800x600' : 'Apple|iMac/PowerBook 1024x768') : - (detect_devices::isLaptop() ? 'Generic|Flat Panel 1024x768' : 'Generic|1024x768 @ 60 Hz'); -} - -my @VertRefresh_ranges = ("50-70", "50-90", "50-100", "40-150"); - -my @HorizSync_ranges = ( - "31.5", - "31.5-35.1", - "31.5-37.9", - "31.5-48.5", - "31.5-57.0", - "31.5-64.3", - "31.5-79.0", - "31.5-82.0", - "31.5-88.0", - "31.5-94.0", -); - -sub configure { - my ($in, $raw_X, $nb_monitors, $o_probed_info, $b_auto) = @_; - - my $monitors = [ $raw_X->get_or_new_monitors($nb_monitors) ]; - if ($o_probed_info) { - put_in_hash($monitors->[0], $o_probed_info); - } - my $head_nb = 1; - foreach my $monitor (@$monitors) { - choose($in, $monitor, @$monitors > 1 ? $head_nb++ : 0, $raw_X->get_Driver, $b_auto) or return; - } - $raw_X->set_monitors(@$monitors); - $monitors; -} - -sub configure_auto_install { - my ($raw_X, $old_X) = @_; - - if ($old_X->{monitor}) { - #- keep compatibility - $old_X->{monitor}{VertRefresh} = $old_X->{monitor}{vsyncrange}; - $old_X->{monitor}{HorizSync} = $old_X->{monitor}{hsyncrange}; - - #- new name - $old_X->{monitors} = [ delete $old_X->{monitor} ]; - } - - my $monitors = [ $raw_X->get_or_new_monitors($old_X->{monitors} ? int @{$old_X->{monitors}} : 1) ]; - mapn { - my ($monitor, $auto_install_monitor) = @_; - put_in_hash($monitor, $auto_install_monitor); - configure_automatic($monitor); - } $monitors, $old_X->{monitors} if $old_X->{monitors}; - - if (!is_valid($monitors->[0])) { - put_in_hash($monitors->[0], probe($old_X->{card}{Driver})); - } - - foreach my $monitor (@$monitors) { - if (!is_valid($monitor)) { - good_default_monitor() =~ /(.*)\|(.*)/ or internal_error("bad good_default_monitor"); - put_in_hash($monitor, { VendorName => $1, ModelName => $2 }); - configure_automatic($monitor) or internal_error("good_default_monitor (" . good_default_monitor() . ") is unknown in MonitorsDB"); - } - } - $raw_X->set_monitors(@$monitors); - $monitors; -} - -sub choose { - my ($in, $monitor, $head_nb, $card_Driver, $b_auto) = @_; - - my $ok = is_valid($monitor); - if ($b_auto) { - log::l("Xconfig::monitor: auto failed") if !$ok; - return $ok; - } - - my %h_monitors = map { ("$_->{VendorName}|$_->{ModelName}" => $_) } monitors_db(); - - ask_monitor: - my $merged_name = do { - if ($monitor->{VendorName} eq "Plug'n Play") { - $monitor->{VendorName}; - } else { - my $merged_name = $monitor->{VendorName} . '|' . $monitor->{ModelName}; - - if (!exists $h_monitors{$merged_name}) { - $merged_name = is_valid($monitor) ? 'Custom' : good_default_monitor(); - } else { - $merged_name; - } - } - }; - - $in->ask_from_({ title => N("Monitor"), - messages => $head_nb ? N("Choose a monitor for head #%d", $head_nb) : N("Choose a monitor"), - interactive_help_id => 'configureX_monitor' - }, - [ { val => \$merged_name, separator => '|', - list => ['Custom', "Plug'n Play", sort keys %h_monitors], - format => sub { $_[0] eq 'Custom' ? N("Custom") : - $_[0] eq "Plug'n Play" ? N("Plug'n Play") . ($monitor->{VendorName} eq "Plug'n Play" ? " ($monitor->{ModelName})" : '') : - $_[0] =~ /^Generic\|(.*)/ ? N("Generic") . "|$1" : - N("Vendor") . "|$_[0]" }, - sort => 0 } ]) or return; - - if ($merged_name eq "Plug'n Play") { - local $::noauto = 0; #- hey, you asked for plug'n play, so i do probe! - delete @$monitor{'VendorName', 'ModelName', 'EISA_ID'}; - if ($head_nb <= 1) { - if (my $probed_info = probe($card_Driver)) { - put_in_hash($monitor, $probed_info); - } else { - $in->ask_warn('', N("Plug'n Play probing failed. Please select the correct monitor")); - goto ask_monitor; - } - } else { - $monitor->{VendorName} = "Plug'n Play"; - } - } elsif ($merged_name eq 'Custom') { - $in->ask_from('', -N("The two critical parameters are the vertical refresh rate, which is the rate -at which the whole screen is refreshed, and most importantly the horizontal -sync rate, which is the rate at which scanlines are displayed. - -It is VERY IMPORTANT that you do not specify a monitor type with a sync range -that is beyond the capabilities of your monitor: you may damage your monitor. - If in doubt, choose a conservative setting."), - [ { val => \$monitor->{HorizSync}, list => \@HorizSync_ranges, label => N("Horizontal refresh rate"), not_edit => 0 }, - { val => \$monitor->{VertRefresh}, list => \@VertRefresh_ranges, label => N("Vertical refresh rate"), not_edit => 0 } ]) or goto &choose; - delete @$monitor{'VendorName', 'ModelName', 'EISA_ID'}; - } else { - put_in_hash($monitor, $h_monitors{$merged_name}); - } - $monitor->{manually_chosen} = 1; - 1; -} - -sub configure_automatic { - my ($monitor) = @_; - - if ($monitor->{EISA_ID}) { - log::l("EISA_ID: $monitor->{EISA_ID}"); - if (my $mon = find { lc($_->{EISA_ID}) eq $monitor->{EISA_ID} } monitors_db()) { - add2hash($monitor, $mon); - log::l("EISA_ID corresponds to: $monitor->{ModelName}"); - } elsif (!is_valid($monitor)) { - log::l("unknown EISA_ID and partial DDC probe, so unknown monitor"); - delete @$monitor{'VendorName', 'ModelName', 'EISA_ID'}; - } - } elsif ($monitor->{VendorName}) { - if (my $mon = find { $_->{VendorName} eq $monitor->{VendorName} && $_->{ModelName} eq $monitor->{ModelName} } monitors_db()) { - put_in_hash($monitor, $mon); - } - } - is_valid($monitor); -} - -sub is_valid { - my ($monitor) = @_; - $monitor->{HorizSync} && $monitor->{VertRefresh}; -} - -sub probe { - my ($o_card_Driver) = @_; - probe_DDC() || probe_DMI() || probe_using_X($o_card_Driver); -} - -sub probe_DDC() { - my ($edid, $vbe) = any::monitor_full_edid() or return; - my $monitor = eval($edid); - - if ($vbe =~ /Memory: (\d+)k/) { - $monitor->{VideoRam_probed} = $1; - } - $monitor->{ModeLine} = Xconfig::xfree::default_ModeLine(); - my $detailed_timings = $monitor->{detailed_timings} || []; - foreach (grep { !$_->{bad_ratio} } @$detailed_timings) { - my $ratio = $_->{horizontal_active} / $_->{vertical_active}; - - if (abs($ratio - 4 / 3) < 0.01) { - #- we don't want the 4/3 modelines otherwise they conflict with the Xorg builtin vesamodes - } else { - unshift @{$monitor->{ModeLine}}, - { val => $_->{ModeLine}, pre_comment => $_->{ModeLine_comment} . "\n" }; - } - - if (@$detailed_timings == 1) { - #- should we care about {has_preferred_timing} ? - $monitor->{preferred_resolution} = { X => $_->{horizontal_active}, Y => $_->{vertical_active} }; - } - } - - if ($monitor->{EISA_ID}) { - $monitor->{VendorName} = "Plug'n Play"; - $monitor->{ModelName} = $monitor->{monitor_name}; - $monitor->{ModelName} =~ s/"/''/g; - } - configure_automatic($monitor) or return; - $monitor; -} - -sub probe_using_X { - my ($card_Driver) = @_; - - detect_devices::isLaptop() or return; - - $card_Driver ||= do { - require Xconfig::card; - my @cards = Xconfig::card::probe(); - $cards[0]{Driver}; - } or return; - - my $resolution = run_program::rooted_get_stdout($::prefix, 'monitor-probe-using-X', $card_Driver) or return; - generic_flat_panel(chomp_($resolution)); -} - -sub probe_DMI() { - my $res = detect_devices::probe_unique_name('Resolution'); - $res && generic_flat_panel($res); -} - -sub generic_flat_panel { - my ($resolution) = @_; - my ($X, $Y) = $resolution =~ /(\d+)x(\d+)/ or log::l("bad resolution $resolution"), return; - { - VendorName => 'Generic', - ModelName => "Flat Panel $resolution", - HorizSync => '31.5-100', VertRefresh => '60', - preferred_resolution => { X => $X, Y => $Y }, - }; -} - -my $monitors_db; -sub monitors_db() { - $monitors_db ||= readMonitorsDB("$ENV{SHARE_PATH}/ldetect-lst/MonitorsDB"); - @$monitors_db; -} -sub readMonitorsDB { - my ($file) = @_; - - my @monitors_db; - my $F = openFileMaybeCompressed($file); - local $_; - my $lineno = 0; while (<$F>) { - $lineno++; - s/\s+$//; - /^#/ and next; - /^$/ and next; - - my @fields = qw(VendorName ModelName EISA_ID HorizSync VertRefresh dpms); - my %l; @l{@fields} = split /\s*;\s*/; - push @monitors_db, \%l; - } - \@monitors_db; -} - - -1; - |