All pastes #395395 Raw Edit

Stuff

public text v1 · immutable
·published 2007-03-15 00:19 UTC
rendered paste body
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();
}