sub hwdetect_getvideo() { print getStr('video_probe') . ": "; my @probed_cards; eval { @probed_cards = Xconfig::card::probe() }; print scalar(@probed_cards) . " " . getStr('found'); my $probed_card; if (scalar @probed_cards) { print_success(); foreach $card (@probed_cards) { my ($probed_vendor, $_probed_desc) = split(/\|/, $card->{description}); my $module = 'unknown'; unless ($probed_card) { # one card only :( $probed_card = $card; if (defined($cmdline{xdrv})) { $probed_card->{Driver} = $cmdline{xdrv}; $probed_card->{Driver2} = $probed_card->{Driver}; } if ($probed_card->{Driver2} eq 'nvidia' && -e "/usr/X11R6/lib/modules/drivers/nvidia_drv.o" && -e "/usr/X11R6/lib/modules/extensions/libglx.so" && (-e "/lib/modules/$kernel_ver/kernel/drivers/char/nvidia.o.gz" || -e "/lib/modules/$kernel_ver/kernel/drivers/video/nvidia.ko" || -e "/lib/modules/$kernel_ver/kernel/drivers/video/nvidia.o")) { $probed_card->{Driver} = $probed_card->{Driver2}; $probed_card->{DRI_GLX_SPECIAL} = 1; $module = $probed_card->{Driver2}; $modules_conf->set_alias("/dev/nvidia*", $module); } if ($probed_card->{Driver2} eq 'fglrx' && -e "/usr/X11R6/lib/modules/dri/fglrx_dri.so" && -e "/usr/X11R6/lib/modules/drivers/fglrx_drv.o" && (-e "/lib/modules/$kernel_ver/kernel/drivers/char/fglrx.o.gz" || -e "/lib/modules/$kernel_ver/kernel/drivers/video/fglrx.ko" || -e "/lib/modules/$kernel_ver/kernel/drivers/video/fglrx.o")) { $probed_card->{Driver} = $probed_card->{Driver2}; $probed_card->{use_DRI_GLX} = 1; $module = $probed_card->{Driver2}; } } $card->{VideoRam} = $cmdline{xram} if defined($cmdline{xram}); hwdetect_loadmod($module, $probed_vendor, $card->{card_name}); print_hash($card) if $debug; } } else { print_warning(); $probed_card = { Driver => 'fbdev', description => 'Linux|Default Framebuffer Device', VideoRam => 4096 }; my ($probed_vendor, $_probed_desc) = split(/\|/, $card->{description}); $probed_card->{Driver} = $cmdline{xdrv} if defined($cmdline{xdrv}); $probed_card->{VideoRam} = $cmdline{xram} if defined($cmdline{xram}); hwdetect_loadmod($module, $probed_vendor, $card->{card_name}); } $probed_card; } # res => [ laptop (monitor), generic (monitor), x, y ] my %generic_res = ( '640x480' => [ 'Generic|Flat Panel 1024x768', 'Generic|1024x768 @ 60 Hz', 640, 480 ], '800x600' => [ 'Generic|Flat Panel 1024x768', 'Generic|1024x768 @ 60 Hz', 800, 600 ], '1024x768' => [ 'Generic|Flat Panel 1024x768', 'Generic|1024x768 @ 60 Hz', 1024, 768 ], '1280x1024' => [ 'Generic|Flat Panel 1280x1024', 'Generic|1280x1024 @ 60 Hz', 1280, 1024 ], '1400x1050' => [ 'Generic|Flat Panel 1400x1050', 'Generic|1280x1024 @ 60 Hz', 1400, 1050 ], '1600x1400' => [ 'Generic|Flat Panel 1600x1200', 'Generic|1600x1200 @ 70 Hz', 1600, 1400 ] ); sub hwdetect_getmonitors { my ($rawX) = @_; print getStr('monitor_probe') . ": "; my $probed_monitors; # try to get a monitor via DDC eval { $probed_monitors = Xconfig::monitor::configure_auto_install($rawX, {}); }; if (int @$probed_monitors > 0) { print_success(); } else { print_failed(); } foreach my $monitor (@$probed_monitors) { hwdetect_loadmod('unknown', $monitor->{VendorName}, $monitor->{ModelName}, 0); print_hash($monitor) if $debug; } $probed_monitors; } sub hwdetect_getxfree() { my $def_keyboard = hwdetect_getkeyb(); my $def_mouse = hwdetect_getmouse(); my $def_card = hwdetect_getvideo(); my $rawX = Xconfig::default::configure(undef, $def_keyboard, $def_mouse); my $def_monitors = hwdetect_getmonitors($rawX); # config card and screen Xconfig::card::to_raw_X($def_card, $rawX); Xconfig::screen::configure($rawX, $def_card); # detect a resolution print getStr('resolution_probe') . ": "; $old_X->{default_depth} = defined($cmdline{xbpp}) ? $cmdline{xbpp} : 16; my $resolution_wanted; if (defined($cmdline{xres})) { $resolution_wanted->{Depth} = $old_X->{default_depth}; $resolution_wanted->{X} = $generic_res{$cmdline{xres}}[2] || 1024; $resolution_wanted->{Y} = $generic_res{$cmdline{xres}}[3] || 768; $old_X->{resolution_wanted} = $resolution_wanted; } # set the desired res, and override if failed and we are not safe my $resolution; eval { $resolution = Xconfig::resolution_and_depth::configure_auto_install($rawX, $def_card, $def_monitors, $old_X) }; if (!defined($resolution) && defined($resolution_wanted) && !defined($cmdline{safex})) { eval { $rawX->set_resolution($resolution_wanted) }; eval { $resolution = $rawX->get_resolution }; } # try to make sure we have at least a valid 800x600 before finally setting it if (!defined($resolution) || !defined($resolution->{X}) || !defined($resolution->{Y}) || !defined($resolution->{Depth}) || ($resolution->{X} < 800 && !defined($cmdline{xres}) && !defined($cmdline{xbpp}))) { $resolution->{X} = 800; $resolution->{Y} = 600; $resolution->{Depth} = 16; } eval { $rawX->set_resolution($resolution) }; eval { $resolution = $rawX->get_resolution and print_success() } or print_failed(); hwdetect_loadmod('unknown', $resolution->{X} . "x" . $resolution->{Y}, $resolution->{Depth} . " bpp", 0); unless ($probe) { print getStr('x_write') . ": "; eval { mouse::write(undef, $def_mouse) }; eval { keyboard::write($def_keyboard) }; eval { $rawX->write and print_success() } or print_failed(); } set_progress(); }