/bin/ash /bin/cpio /bin/echo /bin/gzip /LIB/libnss_nis.so.2 /LIB/libnss_files.so.2 /LIB/libnss_dns.so.2 /LIB/libresolv.so.2 /etc/protocols /etc/imrc /etc/im_palette.pal /etc/X11/xserver/SecurityPolicy /sbin/badblocks /sbin/e2fsck /sbin/tune2fs /sbin/fdisk /sbin/insmod /sbin/insmod.old /sbin/losetup /sbin/lvm2 /sbin/mke2fs /sbin/mkswap /sbin/modinfo /sbin/resize2fs /sbin/dumpe2fs /sbin/modinfo /usr/bin/bzip2 /usr/bin/consolechars /usr/bin/fb2png /usr/bin/kbd_mode /usr/bin/packdrake /usr/bin/parsehdlist /usr/bin/perl /usr/LIB/gconv/BIG5.so /usr/LIB/gconv/EUC-JP.so /usr/LIB/gconv/libGB.so /usr/LIB/gconv/libJIS.so /usr/LIB/gconv/libKSC.so /usr/LIB/gconv/EUC-KR.so /usr/LIB/gconv/ISO8859-15.so /usr/LIB/gconv/ISO8859-14.so /usr/LIB/gconv/ISO8859-13.so /usr/LIB/gconv/ISO8859-9E.so /usr/LIB/gconv/ISO8859-9.so /usr/LIB/gconv/ISO8859-7.so /usr/LIB/gconv/ISO8859-5.so /usr/LIB/gconv/ISO8859-3.so /usr/LIB/gconv/ISO8859-2.so /usr/LIB/gconv/ISO8859-1.so /usr/LIB/gconv/KOI8-K.so /usr/LIB/gconv/KOI8-U.so /usr/LIB/gconv/KOI8-R.so /usr/LIB/gconv/TIS-620.so /usr/LIB/gconv/CP1251.so /usr/LIB/gconv/GEORGIAN-PS.so /usr/LIB/gconv/EUC-CN.so /usr/LIB/gconv/gconv-modules /etc/gtk-2.0/gdk-pixbuf.loaders.* /etc/gtk-2.0/gtk.immodules.* /etc/pango/ARCH/pango.modules /usr/LIB/gtk-2.0/*/loaders/libpixbufloader-xpm.so /usr/LIB/gtk-2.0/*/loaders/libpixbufloader-png.so /usr/LIB/gtk-2.0/*/immodules/im-cedilla.so /usr/LIB/gtk-2.0/*/engines/libgalaxy.so /usr/LIB/pango/*/modules/pango-basic-fc.so /usr/LIB/pango/*/modules/pango-arabic-fc.so /usr/LIB/pango/*/modules/pango-hangul-fc.so /usr/LIB/pango/*/modules/pango-hebrew-fc.so /usr/LIB/pango/*/modules/pango-indic-fc.so /usr/LIB/pango/*/modules/pango-thai-fc.so /usr/lib/perl5/PERL_VERSION/AutoLoader.pm /usr/lib/perl5/PERL_VERSION/Carp.pm /usr/lib/perl5/PERL_VERSION/Carp/Heavy.pm /usr/lib/perl5/PERL_VERSION/Exporter.pm /usr/lib/perl5/PERL_VERSION/Exporter/Heavy.pm /usr/lib/perl5/PERL_VERSION/FileHandle.pm /usr/lib/perl5/PERL_VERSION/PerlIO.pm /usr/lib/perl5/PERL_VERSION/SelectSaver.pm /usr/lib/perl5/PERL_VERSION/SelfLoader.pm /usr/lib/perl5/PERL_VERSION/Symbol.pm /usr/lib/perl5/PERL_VERSION/Time/Local.pm /usr/lib/perl5/PERL_VERSION/IO/Socket/INET.pm /usr/lib/perl5/PERL_VERSION/IO/Socket/UNIX.pm /usr/lib/perl5/PERL_VERSION/base.pm /usr/lib/perl5/PERL_VERSION/constant.pm /usr/lib/perl5/PERL_VERSION/locale.pm /usr/lib/perl5/PERL_VERSION/utf8.pm /usr/lib/perl5/PERL_VERSION/utf8_heavy.pl /usr/lib/perl5/PERL_VERSION/unicore/Exact.pl /usr/lib/perl5/PERL_VERSION/unicore/Canonical.pl /usr/lib/perl5/PERL_VERSION/unicore/PVA.pl /usr/lib/perl5/PERL_VERSION/unicore/To/Lower.pl /usr/lib/perl5/PERL_VERSION/unicore/To/Fold.pl /usr/lib/perl5/PERL_VERSION/unicore/To/Upper.pl /usr/lib/perl5/PERL_VERSION/unicore/lib/gc_sc/Word.pl /usr/lib/perl5/PERL_VERSION/unicore/lib/gc_sc/Digit.pl /usr/lib/perl5/PERL_VERSION/dumpvar.pl /usr/lib/perl5/PERL_VERSION/warnings.pm /usr/lib/perl5/PERL_VERSION/warnings/register.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/File/Glob.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/auto/File/Glob/Glob.so /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/Config.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/Data/Dumper.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/DynaLoader.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/Errno.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/Fcntl.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/XSLoader.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/auto/Fcntl/Fcntl.so /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/IO.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/IO/File.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/IO/Handle.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/IO/Seekable.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/IO/Select.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/IO/Socket.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/Socket.pm /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/_h2ph_pre.ph /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/asm/unistd.ph /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/auto/Data/Dumper/Dumper.so /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/auto/IO/IO.so /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/auto/Socket/Socket.so /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/bits/syscall.ph /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/bits/wordsize.ph /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/sys/syscall.ph /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/syscall.ph /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/auto/DynaLoader/dl_findfile.al /usr/lib/perl5/PERL_VERSION/ARCH-linux-thread-multi/lib.pm /usr/lib/perl5/PERL_VERSION/bytes.pm /usr/lib/perl5/PERL_VERSION/integer.pm /usr/lib/perl5/PERL_VERSION/overload.pm /usr/lib/perl5/PERL_VERSION/strict.pm /usr/lib/perl5/PERL_VERSION/vars.pm /usr/lib/perl5/PERL_VERSION/Net/Cmd.pm /usr/lib/perl5/PERL_VERSION/Net/Config.pm /usr/lib/perl5/PERL_VERSION/Net/FTP.pm /usr/lib/perl5/PERL_VERSION/Net/FTP/A.pm /usr/lib/perl5/PERL_VERSION/Net/FTP/I.pm /usr/lib/perl5/PERL_VERSION/Net/FTP/dataconn.pm /usr/lib/perl5/PERL_VERSION/Net/Netrc.pm /usr/lib/perl5/vendor_perl/*/packdrake.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/DataStructure.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/File.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/Func.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/Globals.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/Math.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/String.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/System.pm /usr/lib/perl5/vendor_perl/*/MDK/Common/Various.pm /usr/lib/perl5/vendor_perl/*/MDK/Common.pm /usr/lib/perl5/vendor_perl/*/ARCH-linux-thread-multi/URPM.pm /usr/lib/perl5/vendor_perl/*/ARCH-linux-thread-multi/URPM/Build.pm /usr/lib/perl5/vendor_perl/*/ARCH-linux-thread-multi/URPM/Resolve.pm /usr/lib/perl5/vendor_perl/*/ARCH-linux-thread-multi/URPM/Signature.pm /usr/lib/perl5/vendor_perl/*/ARCH-linux-thread-multi/auto/URPM/URPM.so /usr/lib/perl5/vendor_perl/*/ARCH-linux-thread-multi/Gtk2.pm /usr/lib/perl5/vendor_perl/*/ARCH-linux-thread-multi/auto/Gtk2/Gtk2.so /usr/lib/rpm/rpmrc /usr/lib/rpm/macros /sbin/rescuept /usr/share/ldetect-lst/Cards+ /usr/share/ldetect-lst/MonitorsDB /usr/share/ldetect-lst/isdn.db /usr/share/ldetect-lst/pcitable /usr/share/ldetect-lst/usbtable /usr/share/locale/UTF-8/LC_ADDRESS /usr/share/locale/UTF-8/LC_COLLATE /usr/share/locale/UTF-8/LC_CTYPE /usr/share/locale/UTF-8/LC_IDENTIFICATION /usr/share/locale/UTF-8/LC_MEASUREMENT /usr/share/locale/UTF-8/LC_MONETARY /usr/share/locale/UTF-8/LC_NAME /usr/share/locale/UTF-8/LC_NUMERIC /usr/share/locale/UTF-8/LC_PAPER /usr/share/locale/UTF-8/LC_TELEPHONE /usr/share/locale/UTF-8/LC_TIME /usr/share/locale/UTF-8/LC_MESSAGES/SYS_LC_MESSAGES /usr/share/terminfo/l/linux /bin/brltty /etc/brltty/text.*.tbl /etc/brltty/brltty-??.hlp /lib/brltty/libbrlttyb??.so ef='#n22'>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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
package Xconfig; # $Id$

use diagnostics;
use strict;

use common;
use mouse;
use devices;
use Xconfigurator;

# 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 = shift || {};
    getinfoFromDDC($o);
    getinfoFromSysconfig($o);

    my ($mouse) = mouse::detect();
    add2hash($o->{mouse}, $mouse) unless $o->{mouse}{XMOUSETYPE};
    add2hash($o->{mouse}{auxmouse}, $mouse->{auxmouse}) unless $o->{mouse}{auxmouse}{XMOUSETYPE};
    $o->{mouse}{auxmouse}{XMOUSETYPE} or delete $o->{mouse}{auxmouse};

    $o->{mouse}{device} ||= "mouse" if -e "/dev/mouse";
    $o;
}

sub getinfoFromXF86Config {
    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);

    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{id} = $1 if /^\s*Identifier\s+"[^\d"]*(\d*)"/;
	    $c{xkb_model} ||= $1 if /^\s*Option\s+"XkbModel"\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} ||= 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{auxmouse}}{qw(XMOUSETYPE device chordmiddle nbuttons)} = @c{qw(XMOUSETYPE device chordmiddle nbuttons)}
		  if $c{driver} =~ /mouse/i && $c{id} > 1;
		@mouse{qw(XMOUSETYPE device chordmiddle nbuttons)} = @c{qw(XMOUSETYPE device chordmiddle nbuttons)}
		  if $c{driver} =~ /mouse/i && $c{id} < 1;
		$wacom{$c{device}} = undef
		  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/) {
	    $keyboard{xkb_model} ||= $1 if /^\s*XkbModel\s+"(.*?)"/;
	    $keyboard{xkb_keymap} ||= $1 if /^\s*XkbLayout\s+"(.*?)"/;
	} elsif (/^Section "Pointer"/ .. /^EndSection/) {
	    $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} ||= 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{$1} = undef 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;

	    $c{type} ||= $1 if /^\s*Identifier\s+"(.*?)"/;
	    $c{memory} ||= $1 if /VideoRam\s+(\d+)/;
	    $c{flags}{needVideoRam} ||= 1 if /^\s*VideoRam\s+/;
	    $c{vendor} ||= $1 if /^\s*VendorName\s+"(.*?)"/;
	    $c{board} ||= $1 if /^\s*BoardName\s+"(.*?)"/;
	    $c{driver} ||= $1 if /^\s*Driver\s+"(.*?)"/;
	    $c{options_xf3}{$1} ||= 1 if /^\s*Option\s+"(.*?)"/;
	    $c{options_xf3}{$1} ||= 0 if /^\s*#\s*Option\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{$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;