1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
package Xconfig;
use common qw(:common :file :system);
# otherwise uses the rule substr($keymap, 0, 2)
my %keymap_translate = (
cf => "ca_enhanced",
uk => "gb",
);
1;
sub keymap_translate {
$keymap_translate{$_[0]} || substr($_[0], 0, 2);
}
sub getinfo {
my $o = {};
getinfoFromXF86Config($o);
getinfoFromSysconfig($o);
$o->{mouse}{emulate3buttons} = 1;
unless ($o->{mouse}{xtype}) {
my ($type, $dev) = split("\n", `mouseconfig --nointeractive 2>/dev/null`) or die "mouseconfig failed";
$o->{mouse}{xtype} ||= $type;
$o->{mouse}{device} ||= "/dev/$dev";
}
$o->{mouse}{device} ||= "/dev/mouse" if -e "/dev/mouse";
$o;
}
sub getinfoFromXF86Config {
my $o = shift || {};
my (%c, $depth);
$o->{card}{server} ||= $1 if readlink("/etc/X11/X") =~ /XF86_ (\w+)$/x; # /x for perl2fcalls
local *F;
open F, "/etc/X11/XF86Config" or return {};
foreach (<F>) {
if (/^Section "Keyboard"/ .. /^EndSection/) {
$o->{keyboard}{xkb_keymap} ||= $1 if /^\s*XkbLayout\s+"(.*?)"/;
} elsif (/^Section "Pointer"/ .. /^EndSection/) {
$o->{mouse}{xtype} ||= $1 if /^\s*Protocol\s+"(.*?)"/;
$o->{mouse}{device} ||= $1 if /^\s*Device\s+"(.*?)"/;
} elsif (my $i = /^Section "Device"/ .. /^EndSection/) {
if ($i = 1 && $c{type} && $c{type} ne "Generic VGA") {
add2hash($o->{card} ||= {}, \%c);
%c = ();
}
$c{type} ||= $1 if /^\s*Identifier\s+"(.*?)"/;
$c{memory} ||= $1 if /^\s*VideoRam\s+(\d+)/;
$c{vendor} ||= $1 if /^\s*VendorName\s+"(.*?)"/;
$c{board} ||= $1 if /^\s*BoardName\s+"(.*?)"/;
push @{$c{lines}}, $_ unless /(Section|Identifier|VideoRam|VendorName|BoardName)/;
} 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+"(.*?)"/;
} elsif (/^Section "Screen"/ .. /^EndSection/) {
$o->{card}{default_depth} ||= $1 if /^\s*DefaultColorDepth\s+(\d+)/;
if (my $i = /^\s*Subsection\s+"Display"/ .. /^\s*EndSubsection/) {
$depth = undef if $i == 1;
$depth = $1 if /^\s*Depth\s+(\d*)/;
if (/^\s*Modes\s+(.*)/) {
my $a = 0;
push @{$o->{card}{depth}{$depth || 8}},
grep { $_->[0] >= 640 } map { [ /"(\d+)x(\d+)"/ ] } split ' ', $1;
}
}
}
}
$o;
}
sub getinfoFromSysconfig {
my $o = shift || {};
if (my %mouse = getVarsFromSh "/etc/sysconfig/mouse") {
$o->{mouse}{xtype} ||= $mouse{XMOUSETYPE};
}
if (my %keyboard = getVarsFromSh "/etc/sysconfig/keyboard") {
$keyboard{KEYTABLE} or last;
$o->{keyboard}{xkb_keymap} ||= keymap_translate($keyboard{KEYTABLE});
}
}
|