home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / sax / profile / Profile.pm < prev    next >
Text File  |  2006-11-29  |  13KB  |  461 lines

  1. #!/usr/bin/perl
  2.  
  3. use lib   '/usr/share/sax/modules';
  4.  
  5. use strict;
  6. use Env;
  7. use CreateSections;
  8. use Storable;
  9. use SaX;
  10.  
  11. #=====================================
  12. # ProfileGetDualDisplaySize
  13. #-------------------------------------
  14. sub ProfileGetDualDisplaySize {
  15.     my $x1 = 0;
  16.     my $x2 = 0;
  17.     my $x  = 0;
  18.     my $y  = 0;
  19.     my $sysp = "/usr/sbin/sysp";
  20.     my $s1 = qx ($sysp -q xstuff | grep Size | head -n 1 | cut -f2 -d:);
  21.     my $s2 = qx ($sysp -q xstuff | grep Size | tail -n 1 | cut -f2 -d:);
  22.     if ($s1 =~ /(\d+)x(\d+)/) {
  23.         $x1 = $1;
  24.         $y  = $2;
  25.     }
  26.     if ($s2 =~ /(\d+)x(\d+)/) {
  27.         $x2 = $1;
  28.     } else {
  29.         $x2 = $x1;
  30.     }
  31.     $x = $x1 + $x2;
  32.     return ($x,$y);
  33. }
  34.  
  35. #=====================================
  36. # ProfileIsNoteBookHardware
  37. #-------------------------------------
  38. sub ProfileIsNoteBookHardware {
  39.     my $import = new SaX::SaXImport ( $SaX::SAX_CARD );
  40.     my $name = $import->getSectionName();
  41.     my $saxCard = new SaX::SaXManipulateCard (
  42.         $import
  43.     );
  44.     if ($saxCard->isNoteBook()) {
  45.         return 1;
  46.     }
  47.     return 0;
  48. }
  49.  
  50. #=====================================
  51. # ProfileName
  52. #-------------------------------------
  53. sub ProfileName {
  54.     my $profile = qx(basename $0 | cut -f1 -d.);
  55.     chomp $profile && return $profile;
  56. }
  57.  
  58. #=====================================
  59. # ProfileInitScript
  60. #-------------------------------------
  61. sub ProfileInitScript {
  62.     my $profile = ProfileName();
  63.     my $stdname = $profile;
  64.     my $newfile = "/var/lib/sax/$profile.tmp";
  65.     $profile = "/usr/share/sax/profile/$profile";
  66.     if (( ! -f $profile ) || ( $< != 0 )) {
  67.         die "*** $stdname: no such file or permission denied";
  68.     }
  69.     qx (cp $profile $newfile);
  70.     return $newfile;
  71. }
  72.  
  73. #=====================================
  74. # ProfileIsXOrgVendor
  75. #-------------------------------------
  76. sub ProfileIsXOrgVendor {
  77.     my $driver = $_[0];
  78.     my $vendor = qx(/usr/share/sax/sysp/script/vendor.pl $driver);
  79.     chomp $vendor;
  80.     if (($vendor eq "The XFree86 Project") || ($vendor eq "X.Org Foundation")) {
  81.         return 1;
  82.     }
  83.     return 0;
  84. }
  85.  
  86. #=====================================
  87. # ProfileNVDualCheck
  88. #-------------------------------------
  89. sub ProfileNVDualCheck {
  90.     my $vendor = qx(/usr/share/sax/sysp/script/vendor.pl nvidia);
  91.     chomp $vendor;
  92.     if (($vendor eq "The XFree86 Project") || ($vendor eq "X.Org Foundation")) {
  93.         print "single\n";
  94.     } else {
  95.         print "dual\n";
  96.     }
  97. }
  98.  
  99. #=====================================
  100. # ProfileReadXLogFile
  101. #-------------------------------------
  102. sub ProfileReadXLogFile {
  103.     my $stdname = ProfileName();
  104.     my $xorglogname = "/var/log/Xorg.99.log";
  105.     if (($ENV{HW_UPDATE} == 1) || (! -f $xorglogname)) {
  106.         my $xc = ProfileCreatePreliminaryConfig();
  107.         qx (X -probeonly -logverbose 255 -xf86config $xc :99 >/dev/null 2>&1);
  108.     }
  109.     local $/;
  110.     open (FD, "<$xorglogname") ||
  111.         die "*** $stdname: Cannot read X.org log $xorglogname";
  112.     my $xorglog = <FD>;
  113.     close FD;
  114.     return $xorglog;
  115. }
  116.  
  117. #=====================================
  118. # ProfileIntelGetMonitorLayout
  119. #-------------------------------------
  120. sub ProfileIntelGetMonitorLayout {
  121.     my $xorglog  = ProfileReadXLogFile();
  122.     my %bootdevs = ();
  123.     my %devs = ();
  124.     my $primary;
  125.     my $secondary;
  126.     my $connected;
  127.     $_ = $xorglog;
  128.     my $D = "Display Info:";
  129.     my $A = "attached:";
  130.     my $P = "present:";
  131.     while (/^\(..\) I8.0\(\d+\): $D ([^ :]+)[^:]*: $A (\w+), $P (\w+)/mg) {
  132.         my $d=$1;
  133.         my $a=$2;
  134.         my $p=$3;
  135.         if ($p =~ /true/i) {
  136.             $devs{$d}=1;
  137.             $bootdevs{$d}=1 if $a =~ /true/i;
  138.         }
  139.     }
  140.     print STDERR "*** Display info disabled - guessing displays\n";
  141.     if (keys %devs < 1) {
  142.         my $C = "Currently active displays on Pipe";
  143.         my $p = "";
  144.         while ($xorglog =~ /^\(..\) I8.0\(\d+\): (.*)$/mg) {
  145.             $_=$1;
  146.             $p="" unless /^\s/;
  147.             $p=$1 if /^\s*$C\s+(\S+):\s*$/;
  148.             if ($p ne "" && /^\s+(\S+)/) {
  149.                 $devs{$1}=1;
  150.                 $bootdevs{$1}=1 if $1 eq "LFP";
  151.             }
  152.         }
  153.     }
  154.     if ($bootdevs{"LFP"}) {
  155.         $primary="LFP";
  156.     } elsif ($bootdevs{"DFP"}) {
  157.         $primary="DFP";
  158.     } elsif ($bootdevs{"CRT"}) {
  159.         $primary="CRT";
  160.         print STDERR "*** Device not booted into DFP panel\n";
  161.     } else {
  162.         $primary="LFP";
  163.         print STDERR "*** Cannot determine boot display\n";
  164.     }
  165.     undef $devs{$primary};
  166.     if ($devs{"LFP"}) {
  167.         $primary="LFP";
  168.         $secondary="CRT";
  169.         print STDERR "*** Not booted into LFP, but connected\n";
  170.         print STDERR "*** Weird. Config may not work\n";
  171.     } elsif ($devs{"CRT"}) {
  172.         $secondary="CRT";
  173.     } elsif ($devs{"DFP"}) {
  174.         $secondary="DFP";
  175.         print STDERR "*** Secondary output seems to be a flat panel as well\n";
  176.     } elsif ($devs{"DFP2"}) {
  177.         $secondary="DFP";
  178.         print STDERR "*** Secondary output seems to be a flat panel as well\n";
  179.     } elsif ($devs{"CRT2"}) {
  180.         $secondary="CRT";
  181.     } else {
  182.         $secondary="CRT";
  183.         print STDERR "*** No secondary output found\n";
  184.         print STDERR "*** Config may not work\n";
  185.     }
  186.     # ...
  187.     # Intel chips *always* seem to have the internal display attached
  188.     # to pipe B. The following code *might* work well enough to find strange
  189.     # hardware with LDP attached to Pipe A. Might.
  190.     # ---
  191.     $connected="$secondary,$primary";
  192.     $_ = $xorglog;
  193.     if (s/^.*\(..\) I8.0\([0-9]+\): Currently active displays on Pipe A:\s*//s
  194.         && s/\(..\) I8.0\([0-9]+\): \S.*$//s
  195.     ) {
  196.         if (/\sLFP\s/) {
  197.             $connected="$primary,$secondary";
  198.         }
  199.     }
  200.     $_ = $xorglog;
  201.     if (/^\(..\) I[89].0\([0-9]+\): Primary Pipe is A,/m) {
  202.         $connected="$primary,$secondary";
  203.     }
  204.     print STDERR "*** Selecting $connected as monitor configuration.\n";
  205.     return $connected;
  206. }
  207.  
  208. #=====================================
  209. # ProfileIntelSetupMonitorLayout
  210. #-------------------------------------
  211. sub ProfileIntelSetupMonitorLayout {
  212.     my $profile = $_[0];
  213.     my $stdname = ProfileName();
  214.     local $/;
  215.     open (FD,"<",$profile) ||
  216.         die "*** $stdname: Can't open $profile: $!";
  217.     my $profileData = <FD>;
  218.     my $monitorLayout = ProfileIntelGetMonitorLayout();
  219.     $profileData =~ s/\[MONITORLAYOUT\]/$monitorLayout/;
  220.     close FD;
  221.     open (FD,">",$profile) ||
  222.         die "*** $stdname: Can't open $profile: $!";
  223.     print FD $profileData;
  224.     close FD;
  225.     return $monitorLayout;
  226. }
  227.  
  228. #=====================================
  229. # ProfileNVidiaGetMonitorLayout
  230. #-------------------------------------
  231. sub ProfileNVidiaGetMonitorLayout {
  232.     my $xorglog = ProfileReadXLogFile();
  233.     my $bootdev;
  234.     my $otherdevs;
  235.     my $connected;
  236.     $_ = $xorglog;
  237.     my $I = '^\(..\) NVIDIA\(\d+\): ';
  238.     my $B = 'Boot display device\(?s?\)?: ';
  239.     my $S = 'Supported display device\(?s?\)?: ';
  240.     if (/$I$B(.*?)\s*$/m) {
  241.         $bootdev = $1;
  242.         if ($bootdev =~ /,\s*(DFP[^,]*)/) {
  243.             $bootdev = $1;
  244.         } elsif ($bootdev =~ /,\s*(CRT[^,]*)/) {
  245.             $bootdev = $1;
  246.         } else {
  247.             $bootdev =~ s/,.*$//;
  248.         }
  249.     } else {
  250.         $bootdev = "AUTO";
  251.     }
  252.     if (/$I$S(.*?)\s*$/m) {
  253.         ($otherdevs = $1) =~ s/$bootdev//;
  254.     } else {
  255.         $otherdevs="AUTO";
  256.     }
  257.     if ($bootdev =~ /CRT/) {
  258.         print STDERR "*** Device booted into CRT.\n";
  259.         print STDERR "*** OOPS! This might not be what you intended!\n";
  260.     }
  261.     if ($bootdev =~ /DFP/ || $bootdev =~ /CRT/) {
  262.         if ($otherdevs =~ /DFP/) {
  263.         if ($otherdevs =~ /CRT/) {
  264.             print STDERR "*** Secondary output might be both: DFP or a CRT.\n";
  265.             print STDERR "    Change AUTO to DFP or CRT to activate\n";
  266.             print STDERR "    the output without hardware plugged in.\n";
  267.             $connected = "$bootdev,AUTO";
  268.         } else {
  269.             $connected = "$bootdev,DFP";
  270.         }
  271.         } elsif ($otherdevs =~ /CRT/) {
  272.             $connected = "$bootdev,CRT";
  273.         } else {
  274.             print STDERR "*** No known secondary output found.\n";
  275.             $connected = "$bootdev,AUTO";
  276.         }
  277.     } else {
  278.         print STDERR "*** Unknown boot display device.\n";
  279.         $connected = "$bootdev,AUTO";
  280.     }
  281.  
  282.     print STDERR "*** Selecting $connected as monitor configuration.\n";
  283.     return $connected;
  284. }
  285.  
  286. #=====================================
  287. # ProfileNvidiaSetupMonitorLayout
  288. #-------------------------------------
  289. sub ProfileNVidiaSetupMonitorLayout {
  290.     my $profile = $_[0];
  291.     my $stdname = ProfileName();
  292.     local $/;
  293.     open (FD,"<",$profile) ||
  294.         die "*** $stdname: Can't open $profile: $!";
  295.     my $profileData = <FD>;
  296.     my $monitorLayout = ProfileNVidiaGetMonitorLayout();
  297.     $profileData =~ s/\[MONITORLAYOUT\]/$monitorLayout/;
  298.     close FD;
  299.     open (FD,">",$profile) ||
  300.         die "*** $stdname: Can't open $profile: $!";
  301.     print FD $profileData;
  302.     close FD;
  303.     return $monitorLayout;
  304. }
  305.  
  306. #=====================================
  307. # ProfileCreatePreliminaryConfig
  308. #-------------------------------------
  309. sub ProfileCreatePreliminaryConfig {
  310.     my $cfgfile = "/tmp/xorg.conf.$$";
  311.     my $config  = "/var/cache/sax/files/config";
  312.     my $stdname = ProfileName();
  313.  
  314.     #==========================================
  315.     # Retrieve registry data
  316.     #------------------------------------------
  317.     my $hashref = retrieve($config);
  318.     if (! defined $hashref) {
  319.         die "*** $stdname: can not load sax registry";
  320.     }
  321.     my %var = %{$hashref};
  322.  
  323.     #==========================================
  324.     # Create config suggestion
  325.     #------------------------------------------
  326.     my @part0  = CreateHeaderSection ();
  327.     my @part1  = CreateFilesSection  (\%var);
  328.     my @part2  = CreateModuleSection (\%var);
  329.     my @part3  = CreateServerFlagsSection (\%var);
  330.     my @part4  = CreateInputDeviceSection (\%var);
  331.     my @part5  = CreateMonitorSection (\%var,"yes");
  332.     my @part7  = CreateDeviceSection (\%var);
  333.     my @part8  = CreateScreenSection (\%var);
  334.     my @part9  = CreateServerLayoutSection (\%var);
  335.     my @part10 = CreateDRISection ();
  336.     my @part11 = CreateExtensionsSection (\%var);
  337.  
  338.     #==========================================
  339.     # Write preliminary config file
  340.     #------------------------------------------
  341.     open (HANDLE,">$cfgfile") ||
  342.         die "*** $stdname: Can't open file: $cfgfile : $!";
  343.     print HANDLE @part0;  print HANDLE "\n";
  344.     print HANDLE @part1;  print HANDLE "\n";
  345.     print HANDLE @part2;  print HANDLE "\n";
  346.     print HANDLE @part3;  print HANDLE "\n";
  347.     print HANDLE @part4;  print HANDLE "\n";
  348.     print HANDLE @part5;  print HANDLE "\n";
  349.     print HANDLE @part7;  print HANDLE "\n";
  350.     print HANDLE @part8;  print HANDLE "\n";
  351.     print HANDLE @part9;  print HANDLE "\n";
  352.     print HANDLE @part10; print HANDLE "\n";
  353.     print HANDLE @part11; print HANDLE "\n";
  354.     close HANDLE;
  355.  
  356.     return $cfgfile;
  357. }
  358.  
  359. #=====================================
  360. # ProfileGetRealMouseDevice
  361. #-------------------------------------
  362. sub ProfileGetRealMouseDevice {
  363.     my $card = $_[0];
  364.     #=====================================
  365.     # get SYSP mouse...
  366.     #-------------------------------------
  367.     my $mouse = new SaX::SaXImportSysp ($SaX::SYSP_MOUSE);
  368.     $mouse->doImport();
  369.     $mouse->setID ($card);
  370.     my $device = $mouse->getItem("RealDevice");
  371.     if (! defined $device) {
  372.         return;
  373.     }
  374.     return $device;
  375. }
  376.  
  377. #=====================================
  378. # ProfileGetDDC2Data
  379. #-------------------------------------
  380. sub ProfileGetDDC2Data {
  381.     my %result = ();
  382.     #=====================================
  383.     # get SYSP xstuff ...[2] data
  384.     #-------------------------------------
  385.     my $xstuff = new SaX::SaXImportSysp ($SaX::SYSP_DESKTOP);
  386.     $xstuff->doImport();
  387.     my $ddc = $xstuff->getItem("DDC[2]");
  388.     if (! defined $ddc) {
  389.         return %result;
  390.     }
  391.     #=====================================
  392.     # Save DDC record values
  393.     #-------------------------------------
  394.     if (defined $xstuff->getItem("Vendor[2]")) {
  395.     if (defined $xstuff->getItem("Name[2]")) {
  396.         $result{Model}  = $xstuff->getItem("Name[2]");
  397.         $result{Vendor} = $xstuff->getItem("Vendor[2]");
  398.     }
  399.     }
  400.     if (defined $xstuff->getItem("Vesa[2]")) {
  401.     if ($xstuff->getItem("Vesa[2]") =~ /(.*) (.*) .* .*/)    {
  402.         $result{Resolution} = "$1x$2";
  403.     }
  404.     }
  405.     if (defined $xstuff->getItem("Hsync[2]")) {
  406.         $result{Hsync} = "31-".$xstuff->getItem("Hsync[2]");
  407.     }
  408.     if (defined $xstuff->getItem("Vsync[2]")) {
  409.         $result{Vsync} = "50-".$xstuff->getItem("Vsync[2]");
  410.     }
  411.     if (defined $xstuff->getItem("Size[2]")) {
  412.     if ($xstuff->getItem("Size[2]") =~ /(.*)x(.*)/) {
  413.         my $x = $1 * 10;
  414.         my $y = $2 * 10;
  415.         $result{Size} = "$x $y";
  416.     }
  417.     }
  418.     #=====================================
  419.     # get CDB monitor pointer
  420.     #-------------------------------------
  421.     my %section;
  422.     my @importID = (
  423.         $SaX::SAX_CARD, $SaX::SAX_DESKTOP, $SaX::SAX_PATH
  424.     );
  425.     foreach my $id (@importID) {
  426.         my $import = new SaX::SaXImport ( $id );
  427.         $import->setSource ( $SaX::SAX_AUTO_PROBE );
  428.         $import->doImport();
  429.         $section{$import->getSectionName()} = $import;
  430.     }
  431.     my $mDesktop = new SaX::SaXManipulateDesktop (
  432.         $section{Desktop},$section{Card},$section{Path}
  433.     );
  434.     my %data = %{$mDesktop->getCDBMonitorIDData ($ddc)};
  435.     if (defined %data) {
  436.         #=====================================
  437.         # Found monitor in the CDB
  438.         #-------------------------------------
  439.         if (defined $data{Name}) {
  440.             $data{Name} =~ s/\(/__OB__/g;
  441.             $data{Name} =~ s/\)/__CB__/g;
  442.             if ($data{Name} =~ /(.*):(.*)/) {
  443.                 $result{Model}  = $2;
  444.                 $result{Vendor} = $1;
  445.             }
  446.         }
  447.         if (defined $data{Resolution}) {
  448.             $result{Resolution} = $data{Resolution};
  449.         }
  450.         if (defined $data{HorizSync}) {
  451.             $result{Hsync} = $data{HorizSync};
  452.         }
  453.         if (defined $data{VertRefresh}) {
  454.             $result{Vsync} = $data{VertRefresh};
  455.         }
  456.     }
  457.     return %result;
  458. }
  459.  
  460. 1;
  461.