rendered paste bodysub 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();
}