summaryrefslogtreecommitdiffstats
path: root/perl-install/Xconfigurator.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/Xconfigurator.pm')
-rw-r--r--perl-install/Xconfigurator.pm102
1 files changed, 60 insertions, 42 deletions
diff --git a/perl-install/Xconfigurator.pm b/perl-install/Xconfigurator.pm
index 751efeebd..d39e58238 100644
--- a/perl-install/Xconfigurator.pm
+++ b/perl-install/Xconfigurator.pm
@@ -13,7 +13,7 @@ use my_gtk qw(:wrappers);
my $tmpconfig = "/tmp/Xconfig";
-my (%cards, %monitors);
+my ($prefix, %cards, %monitors);
1;
@@ -84,7 +84,7 @@ sub readMonitorsDB {
%monitors and return;
local *F;
- open F, $file or die "can't open monitors database ($file): ?!";
+ open F, $file or die "can't open monitors database ($file): $!";
my $lineno = 0; foreach (<F>) {
$lineno++;
s/\s+$//;
@@ -109,15 +109,15 @@ sub rewriteInittab {
my ($runlevel) = @_;
{
local (*F, *G);
- open F, "/etc/inittab" or die "cannot open /etc/inittab: $!";
- open G, "> /etc/inittab-" or die "cannot write in /etc/inittab-: $!";
+ open F, "$prefix/etc/inittab" or die "cannot open $prefix/etc/inittab: $!";
+ open G, "> $prefix/etc/inittab-" or die "cannot write in $prefix/etc/inittab-: $!";
foreach (<F>) {
- print G /^(id:)[35](:initdefault:)\s*$/ ? "$1$runlevel$2\n" : $_;
+ print G /^(id:)[35](:initdefault:)\s*$/ ? "$1$runlevel$2\n" : $_; # **
}
}
- unlink("/etc/inittab");
- rename("/etc/inittab-", "/etc/inittab");
+ unlink("$prefix/etc/inittab");
+ rename("$prefix/etc/inittab-", "$prefix/etc/inittab");
}
sub keepOnlyLegalModes {
@@ -144,21 +144,25 @@ sub cardConfiguration(;$$) {
my ($card, $noauto) = @_;
$card ||= {};
- readCardsDB("/usr/X11R6/lib/X11/Cards");
+ readCardsDB("$prefix/usr/X11R6/lib/X11/Cards");
- add2hash($card, cardConfigurationAuto()) unless $card->{type} || $card->{server} || $noauto;
+ add2hash($card, $cards{$card->{type}}) if $card->{type}; # try to get info from given type
+ $card->{type} = undef unless $card->{server}; # bad type as we can't find the server
+
+ add2hash($card, cardConfigurationAuto()) unless $card->{server} || $noauto;
add2hash($card, { type => $in->ask_from_list('', _("Choose a graphic card"), [keys %cards]) }) unless $card->{type} || $card->{server};
+
add2hash($card, $cards{$card->{type}}) if $card->{type};
add2hash($card, { vendor => "Unknown", board => "Unknown" });
$card->{prog} = "/usr/X11R6/bin/XF86_$card->{server}";
-
- -x $card->{prog} or !defined $install or &$install($card->{server});
- -x $card->{prog} or die "server $card->{server} is not available (should be in $card->{prog})";
-
+
+ -x "$prefix$card->{prog}" or !defined $install or &$install($card->{server});
+ -x "$prefix$card->{prog}" or die "server $card->{server} is not available (should be in $prefix$card->{prog})";
+
unless ($::testing) {
- unlink("/etc/X11/X");
- symlink("../../$card->{prog}", "/etc/X11/X");
+ unlink("$prefix/etc/X11/X");
+ symlink("../..$card->{prog}", "$prefix/etc/X11/X");
}
unless ($card->{type}) {
@@ -177,11 +181,13 @@ sub cardConfiguration(;$$) {
sub monitorConfiguration(;$) {
my $monitor = shift || {};
- readMonitorsDB("MonitorsDB");
+ $monitor->{hsyncrange} && $monitor->{vsyncrange} and return $monitor;
+
+ readMonitorsDB(-e "MonitorsDB" ? "MonitorsDB" : "/usr/share/MonitorsDB");
add2hash($monitor, { type => $in->ask_from_list('', _("Choose a monitor"), [keys %monitors]) }) unless $monitor->{type};
add2hash($monitor, $monitors{$monitor->{type}});
- add2hash($monitor, { vendor => "Unknown", model => "Unknown" });
+ add2hash($monitor, { type => "Unknown", vendor => "Unknown", model => "Unknown" });
$monitor;
}
@@ -192,7 +198,7 @@ sub testConfig($) {
write_XF86Config($o, $tmpconfig);
local *F;
- open F, "$o->{card}->{prog} :9 -probeonly -pn -xf86config $tmpconfig 2>&1 |";
+ open F, "$prefix$o->{card}->{prog} :9 -probeonly -pn -xf86config $tmpconfig 2>&1 |";
foreach (<F>) {
$o->{card}->{memory} ||= $2 if /(videoram|Video RAM):\s*(\d*)/;
@@ -219,9 +225,9 @@ sub testFinalConfig($;$) {
$o->{card}->{depth} or
$in->ask_warn('', _("Resolutions not chosen yet")), return;
- rename("/etc/X11/XF86Config", "/etc/X11/XF86Config.old") || die "unable to make a backup of XF86Config" unless $::testing;
+ rename("$prefix/etc/X11/XF86Config", "$prefix/etc/X11/XF86Config.old") || die "unable to make a backup of XF86Config" unless $::testing;
- write_XF86Config($o, $::testing ? $tmpconfig : "/etc/X11/XF86Config");
+ write_XF86Config($o, $::testing ? $tmpconfig : "$prefix/etc/X11/XF86Config");
$auto
or $in->ask_yesorno(_("Test configuration"), _("Do you want to test configuration?"))
@@ -230,10 +236,16 @@ sub testFinalConfig($;$) {
my $pid; unless ($pid = fork) {
my @l = "X";
@l = ($o->{card}->{prog}, "-xf86config", $tmpconfig) if $::testing;
+ chroot $prefix if $prefix;
exec @l, ":9" or exit 1;
}
do { sleep 1; } until (c::Xtest(':0'));
+ # create a link from the non-prefixed /tmp/.X11-unix/X9 to the prefixed one
+ # that way, you can talk to :9 without doing a chroot
+ unlink "/tmp/.X11-unix/X9" if $prefix;
+ symlink "$prefix/tmp/.X11-unix/X9", "/tmp/.X11-unix/X9" if $prefix;
+
local *F;
open F, "|perl" or die;
print F "use lib qw(", join(' ', @INC), ");\n";
@@ -242,7 +254,7 @@ sub testFinalConfig($;$) {
use my_gtk qw(:wrappers);
$ENV{DISPLAY} = ":9";
- gtkset_mousecursor(2);
+ gtkset_mousecursor(68);
gtkset_background(200, 210, 210);
my ($h, $w) = Gtk::Gdk::Window->new_foreign(Gtk::Gdk->ROOT_WINDOW)->get_size;
$my_gtk::force_position = [ $w / 3, $h / 2.4 ];
@@ -259,10 +271,11 @@ sub testFinalConfig($;$) {
};
my $rc = close F;
my $err = $?;
+
+ unlink "/tmp/.X11-unix/X9" if $prefix;
kill 2, $pid;
$rc || $err == 222 << 8 or $in->ask_warn('', _("An error occured, try changing some parameters"));
-
$rc;
}
@@ -378,11 +391,6 @@ sub resolutionsConfiguration($$) {
my $nowarning = $auto || $option eq 'nowarning';
my $noauto = $option eq 'noauto';
- unless ($card->{depth}) {
- $card->{depth}->{$_} = [ map { [ split "x" ] } @resolutions ]
- foreach @depths;
- }
-
# For the mono and vga16 server, no further configuration is required.
return if member($card->{server}, "Mono", "VGA16");
@@ -411,15 +419,25 @@ sub resolutionsConfiguration($$) {
#$unknown and $manual ||= !$in->ask_okcancel('', [ _("I can try to autodetect information about graphic card, but it may freeze :("),
# _("Do you want to try?") ]);
- if ($nowarning || (!$noauto && $in->ask_okcancel(_("Automatic resolutions"),
+ unless ($card->{depth}) {
+ $card->{depth}->{$_} = [ map { [ split "x" ] } @resolutions ]
+ foreach @depths;
+
+ if ($nowarning || (!$noauto && $in->ask_okcancel(_("Automatic resolutions"),
_("I can try to find the available resolutions (eg: 800x600).
Alas it can freeze sometimes
Do you want to try?")))) {
- autoResolutions($o, $nowarning);
+ autoResolutions($o, $nowarning);
+ }
}
# sort resolutions in each depth
- @$_ = sort { $b->[0] <=> $a->[0] } @$_ foreach values %{$card->{depth}};
+ {
+ my $i;
+ @$_ = grep { first($i != $_->[0], $i = $_->[0]) }
+ sort { $b->[0] <=> $a->[0] } @$_
+ foreach values %{$card->{depth}};
+ }
# remove unusable resolutions (based on the video memory size)
keepOnlyLegalModes($card);
@@ -462,11 +480,11 @@ sub write_XF86Config {
# Write pointer section.
$O = $o->{mouse};
print F $pointersection_text1;
- print F qq( Protocol "$O->{type}"\n);
+ print F qq( Protocol "$O->{xtype}"\n);
print F qq( Device "$O->{device}"\n);
# this will enable the "wheel" or "knob" functionality if the mouse supports it
print F " ZAxisMapping 4 5\n" if
- member($O->{type}, qw(IntelliMouse IMPS/2 ThinkingMousePS/2 NetScrollPS/2 NetMousePS/2 MouseManPlusPS/2));
+ member($O->{xtype}, qw(IntelliMouse IMPS/2 ThinkingMousePS/2 NetScrollPS/2 NetMousePS/2 MouseManPlusPS/2));
print F $pointersection_text2;
print F "#" unless $O->{emulate3buttons};
@@ -538,9 +556,7 @@ Section "Screen"
print F " DefaultColorDepth $defdepth\n" if $defdepth;
foreach (ikeys(%$depths)) {
- my $m = join(" ",
- map { '"' . join("x", @$_) . '"' }
- sort { $b->[0] <=> $a->[0] } @{$depths->{$_}});
+ my $m = join(" ", map { qq("$_->[0]x$_->[1]") } @{$depths->{$_}});
print F qq( Subsection "Display"\n);
print F qq( Depth $_\n) if $_;
print F qq( Modes $m\n);
@@ -575,10 +591,10 @@ Section "Screen"
sub XF86check_link {
my ($void) = @_;
- my $f = "/etc/X11/XF86Config";
+ my $f = "$prefix/etc/X11/XF86Config";
touch($f);
- my $l = "/usr/X11R6/lib/X11/XF86Config";
+ my $l = "$prefix/usr/X11R6/lib/X11/XF86Config";
if (-e $l && (stat($f))[1] != (stat($l))[1]) { # compare the inode, must be the sames
-e $l and unlink($l) || die "can't remove bad $l";
@@ -589,10 +605,9 @@ sub XF86check_link {
# * Program entry point.
sub main {
- my ($default, $interact, $install_pkg) = @_;
- my $o = $default;
- $in = $interact;
- $install = $install_pkg;
+ my $o;
+ ($prefix, $o, $in, $install) = @_;
+ $o ||= {};
XF86check_link();
@@ -611,7 +626,10 @@ sub main {
__("Change Monitor") => sub { $o->{monitor} = monitorConfiguration() },
__("Change Graphic card") => sub { $o->{card} = cardConfiguration('', 'noauto') },
__("Change Resolution") => sub { resolutionsConfiguration($o, 'noauto') },
- __("Automaticall resolutions search") => sub { resolutionsConfiguration($o, 'nowarning') },
+ __("Automaticall resolutions search") => sub {
+ delete $o->{card}->{depth};
+ resolutionsConfiguration($o, 'nowarning');
+ },
__("Test again") => sub { $ok = testFinalConfig($o, 1) },
__("Quit") => sub { $quit = 1 },
);