summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perl-install/Xconfig.pm125
1 files changed, 93 insertions, 32 deletions
diff --git a/perl-install/Xconfig.pm b/perl-install/Xconfig.pm
index 350c7df33..fdbb85e93 100644
--- a/perl-install/Xconfig.pm
+++ b/perl-install/Xconfig.pm
@@ -34,25 +34,81 @@ sub getinfo {
}
sub getinfoFromXF86Config {
- my $o = shift || {};
+ my $o = shift || {}; #- original $::o->{X} which must be changed only if sure!
my $prefix = shift || "";
+ my (%keyboard, %mouse, %wacom, %card, %monitor);
my (%c, $depth, $driver);
- $o->{card}{server} ||= $1 if readlink("$prefix/etc/X11/X") =~ /XF86_ (\w+)$/x; #- /x for perl2fcalls
-
- local *F; open F, "$prefix/etc/X11/XF86Config" or return {};
local $_;
+ local *G; open G, "$prefix/etc/X11/XF86Config-4";
+ while (<G>) {
+ if (my $i = /^Section "InputDevice"/ .. /^EndSection/) {
+ %c = () if $i == 1;
+
+ $c{driver} = $1 if /^\s*Driver\s+"(.*?)"/;
+ $c{xkb_keymap} ||= $1 if /^\s*Option\s+"XkbLayout"\s+"(.*?)"/;
+ $c{XMOUSETYPE} ||= $1 if /^\s*Option\s+"Protocol"\s+"(.*?)"/;
+ $c{device} ||= $1 if /^\s*Option\s+"Device"\s+"\/dev\/(.*?)"/;
+ $c{chordmiddle} ||= $1 if /^\s*Option\s+"ChordMiddle"\s+"\/dev\/(.*?)"/;
+ $c{nbuttons} = 2 if /^\s*Option\s+"Emulate3Buttons"\s+/;
+ $c{nbuttons} ||= 3 if /^\s*#\s*Option\s+"Emulate3Buttons"\s+/;
+ $c{nbuttons} ||= 5 if /^\s*#\s*Option\s+"ZAxisMapping"\s.*5/;
+ $c{nbuttons} = 7 if /^\s*#\s*Option\s+"ZAxisMapping"\s.*7/;
+
+ if ($i =~ /E0/) {
+ @keyboard{qw(xkb_keymap)} = @c{qw(xkb_keymap)}
+ if $c{driver} =~ /keyboard/i;
+ @mouse{qw(XMOUSETYPE device chordmiddle nbuttons)} = @c{qw(XMOUSETYPE device chordmiddle nbuttons)}
+ if $c{driver} =~ /mouse/i;
+ @wacom{qw(device)} = @c{qw(device)}
+ if $c{driver} =~ /wacom/i;
+ }
+ } elsif (/^Section "Monitor"/ .. /^EndSection/) {
+ $monitor{type} ||= $1 if /^\s*Identifier\s+"(.*?)"/;
+ $monitor{hsyncrange} ||= $1 if /^\s*HorizSync\s+(.*)/;
+ $monitor{vsyncrange} ||= $1 if /^\s*VertRefresh\s+(.*)/;
+ $monitor{vendor} ||= $1 if /^\s*VendorName\s+"(.*?)"/;
+ $monitor{model} ||= $1 if /^\s*ModelName\s+"(.*?)"/;
+ $monitor{modelines}{"$1_$2"} = $_ if /^\s*Mode[lL]ine\s+(\S+)\s+(\S+)\s+/;
+ } elsif (my $s = /^Section "Screen"/ .. /^EndSection/) {
+ $card{default_depth} ||= $1 if /^\s*DefaultColorDepth\s+(\d+)/;
+ if (my $i = /^\s*Subsection\s+"Display"/ .. /^\s*EndSubsection/) {
+ undef $depth if $i == 1;
+ $depth = $1 if /^\s*Depth\s+(\d*)/;
+ if (/^\s*Modes\s+(.*)/) {
+ my $a = 0;
+ unshift @{$card{depth}{$depth || 8} ||= []}, #- insert at the beginning for resolution_wanted!
+ grep { $_->[0] >= 640 } map { [ /"(\d+)x(\d+)"/ ] } split ' ', $1;
+ }
+ }
+ }
+ }
+ close G;
+ local *F; open F, "$prefix/etc/X11/XF86Config";
while (<F>) {
if (/^Section "Keyboard"/ .. /^EndSection/) {
- $o->{keyboard}{xkb_keymap} ||= $1 if /^\s*XkbLayout\s+"(.*?)"/;
+ $keyboard{xkb_keymap} ||= $1 if /^\s*XkbLayout\s+"(.*?)"/;
} elsif (/^Section "Pointer"/ .. /^EndSection/) {
- $o->{mouse}{XMOUSETYPE} ||= $1 if /^\s*Protocol\s+"(.*?)"/;
- $o->{mouse}{device} ||= $1 if m|^\s*Device\s+"/dev/(.*?)"|;
- $o->{mouse}{cleardtrrts} ||= 1 if m/^\s*ClearDTR\s+/;
- $o->{mouse}{cleardtrrts} ||= 1 if m/^\s*ClearRTS\s+/;
- $o->{mouse}{nbuttons} = 2 if m/^\s*Emulate3Buttons\s+/;
- $o->{mouse}{nbuttons} ||= 5 if m/^\s*ZAxisMapping\s.*5/;
- $o->{mouse}{nbuttons} = 7 if m/^\s*ZAxisMapping\s.*7/;
+ $mouse{XMOUSETYPE} ||= $1 if /^\s*Protocol\s+"(.*?)"/;
+ $mouse{device} ||= $1 if m|^\s*Device\s+"/dev/(.*?)"|;
+ $mouse{cleardtrrts} ||= 1 if m/^\s*ClearDTR\s+/;
+ $mouse{cleardtrrts} ||= 1 if m/^\s*ClearRTS\s+/;
+ $mouse{chordmiddle} ||= 1 if m/^\s*ChordMiddle\s+/;
+ $mouse{nbuttons} = 2 if m/^\s*Emulate3Buttons\s+/;
+ $mouse{nbuttons} ||= 3 if m/^\s*#\s*Emulate3Buttons\s+/;
+ $mouse{nbuttons} ||= 5 if m/^\s*ZAxisMapping\s.*5/;
+ $mouse{nbuttons} = 7 if m/^\s*ZAxisMapping\s.*7/;
+ } elsif (/^Section "XInput"/ .. /^EndSection/) {
+ if (/^\s*SubSection "Wacom/ .. /^\s*EndSubSection/) {
+ $wacom{device} ||= $1 if /^\s*Port\s+"\/dev\/(.*?)"/;
+ }
+ } elsif (/^Section "Monitor"/ .. /^EndSection/) {
+ $monitor{type} ||= $1 if /^\s*Identifier\s+"(.*?)"/;
+ $monitor{hsyncrange} ||= $1 if /^\s*HorizSync\s+(.*)/;
+ $monitor{vsyncrange} ||= $1 if /^\s*VertRefresh\s+(.*)/;
+ $monitor{vendor} ||= $1 if /^\s*VendorName\s+"(.*?)"/;
+ $monitor{model} ||= $1 if /^\s*ModelName\s+"(.*?)"/;
+ $monitor{modelines}{"$1_$2"} = $_ if /^\s*Mode[lL]ine\s+(\S+)\s+(\S+)\s+/;
} elsif (my $i = /^Section "Device"/ .. /^EndSection/) {
%c = () if $i == 1;
@@ -62,43 +118,48 @@ sub getinfoFromXF86Config {
$c{vendor} ||= $1 if /^\s*VendorName\s+"(.*?)"/;
$c{board} ||= $1 if /^\s*BoardName\s+"(.*?)"/;
$c{driver} ||= $1 if /^\s*Driver\s+"(.*?)"/;
- $c{options}{$1} ||= 1 if /^\s*Option\s+"(.*?)"/;
- $c{options}{$1} ||= 0 if /^\s*#\s*Option\s+"(.*?)"/;
+ $c{options_xf3}{$1} ||= 1 if /^\s*Option\s+"(.*?)"/;
+ $c{options_xf3}{$1} ||= 0 if /^\s*#\s*Option\s+"(.*?)"/;
- #- clockchip, ramdac, dacspeed read with following line.
- push @{$c{lines}}, $_ unless /(Section|Identifier|VideoRam|VendorName|BoardName|Option)/;
-
- add2hash($o->{card} ||= {}, \%c) if ($i =~ /E0/ && $c{type} && $c{type} ne "Generic VGA");
- } elsif (/^Section "Monitor"/ .. /^EndSection/) {
- $o->{monitor}{type} ||= $1 if /^\s*Identifier\s+"(.*?)"/;
- $o->{monitor}{hsyncrange} ||= $1 if /^\s*HorizSync\s+(.*)/;
- $o->{monitor}{vsyncrange} ||= $1 if /^\s*VertRefresh\s+(.*)/;
- $o->{monitor}{vendor} ||= $1 if /^\s*VendorName\s+"(.*?)"/;
- $o->{monitor}{model} ||= $1 if /^\s*ModelName\s+"(.*?)"/;
- $o->{monitor}{modelines} .= $_ if /^\s*Mode[lL]ine\s+/;
+ add2hash(\%card, \%c) if ($i =~ /E0/ && $c{type} && $c{type} ne "Generic VGA");
} elsif (my $s = /^Section "Screen"/ .. /^EndSection/) {
undef $driver if $s == 1;
$driver = $1 if /^\s*Driver\s+"(.*?)"/;
- if ($driver eq $Xconfigurator::serversdriver{$o->{card}{server}}) {
- $o->{default_depth} ||= $1 if /^\s*DefaultColorDepth\s+(\d+)/;
+ if ($driver eq $Xconfigurator::serversdriver{$card{server}}) {
+ $card{default_depth} ||= $1 if /^\s*DefaultColorDepth\s+(\d+)/;
if (my $i = /^\s*Subsection\s+"Display"/ .. /^\s*EndSubsection/) {
undef $depth if $i == 1;
$depth = $1 if /^\s*Depth\s+(\d*)/;
if (/^\s*Modes\s+(.*)/) {
my $a = 0;
- unshift @{$o->{card}{depth}{$depth || 8} ||= []}, #- insert at the beginning for resolution_wanted!
+ unshift @{$card{depth}{$depth || 8} ||= []}, #- insert at the beginning for resolution_wanted!
grep { $_->[0] >= 640 } map { [ /"(\d+)x(\d+)"/ ] } split ' ', $1;
}
}
}
}
}
+ close F;
+
+ #- clean up modeline by those automatically given by $modelines_text.
+ foreach (split /\n/, $Xconfigurator::modelines_text) {
+ delete $monitor{modelines_}{"$1_$2"} if /^\s*Mode[lL]ine\s+(\S+)\s+(\S+)\s+(.*)/;
+ }
+ $monitor{modelines} .= $_ foreach values %{$monitor{modelines_}}; delete $monitor{modelines_};
+
#- get the default resolution according the the current file.
- if (my @depth = keys %{$o->{card}{depth}}) {
- $o->{resolution_wanted} ||=
- ($o->{card}{depth}{$o->{default_depth} || $depth[0]}[0][0]) . "x" .
- ($o->{card}{depth}{$o->{default_depth} || $depth[0]}[0][1]);
+ #- suggestion to take into account, but that have to be checked.
+ $o->{card}{suggest_depth} = $card{default_depth};
+ if (my @depth = keys %{$card{depth}}) {
+ $o->{card}{suggest_wres} = ($card{depth}{$o->{card}{suggest_depth} || $depth[0]}[0][0]);
}
+
+ #- try to merge with $o, the previous has been obtained by ddcxinfos.
+ add2hash($o->{keyboard} ||= {}, \%keyboard);
+ add2hash($o->{mouse} ||= {}, \%mouse);
+ $o->{wacom} ||= $wacom{device};
+ add2hash($o->{monitor} ||= {}, \%monitor);
+
$o;
}