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

  1. #/.../
  2. # Copyright (c) 2005 SUSE LINUX Products GmbH.  All rights reserved.
  3. #
  4. # Author: Marcus Schaefer <ms@suse.de>, 2005
  5. #
  6. # XLib.pm YAPI interface module to access libsax
  7. # functions to handle the X11 configuration
  8. #
  9. package XLib;
  10.  
  11. use strict;
  12. use YaST::YCP qw(:LOGGING Boolean sformat);;
  13. use YaPI;
  14. use Data::Dumper;
  15. use Time::localtime;
  16. use SaX;
  17. use Env;
  18.  
  19. textdomain("x11");
  20.  
  21. our %TYPEINFO;
  22.  
  23. use strict;
  24. use Errno qw(ENOENT);
  25.  
  26. #==========================================
  27. # Globals
  28. #------------------------------------------
  29. my %profileDriverOptions = ();
  30. my $init = 0;
  31. my %section;
  32. my $config;
  33. my %cdb;
  34.  
  35. #==========================================
  36. # isInitialized
  37. #------------------------------------------
  38. BEGIN{ $TYPEINFO{isInitialized} = ["function","boolean"]; }
  39. sub isInitialized {
  40.     return $init;
  41. }
  42.  
  43. #==========================================
  44. # loadApplication
  45. #------------------------------------------
  46. BEGIN{ $TYPEINFO{loadApplication} = ["function","void"]; }
  47. sub loadApplication {
  48.     my $class  = shift;
  49.     my $sinit = new SaX::SaXInit;
  50.     $ENV{HW_UPDATE} = 1;
  51.     $sinit -> doInit();
  52.     my @importID = (
  53.         $SaX::SAX_CARD,
  54.         $SaX::SAX_DESKTOP,
  55.         $SaX::SAX_POINTERS,
  56.         $SaX::SAX_KEYBOARD,
  57.         $SaX::SAX_LAYOUT,
  58.         $SaX::SAX_PATH,
  59.         $SaX::SAX_EXTENSIONS
  60.     );
  61.     $config = new SaX::SaXConfig;
  62.     foreach my $id (@importID) {
  63.         my $import = new SaX::SaXImport ( $id );
  64.         $import->setSource ( $SaX::SAX_AUTO_PROBE );
  65.         $import->doImport();
  66.         $config->addImport ( $import );
  67.         my $name = $import->getSectionName();
  68.         $section{$name} = $import;
  69.     }
  70.     if (isExternalVGANoteBook()) {
  71.         activateExternalVGA();
  72.     }
  73.     $init = 1;
  74. }
  75. #==========================================
  76. # writeConfiguration
  77. #------------------------------------------
  78. BEGIN{ $TYPEINFO{writeConfiguration} = ["function","boolean"]; }
  79. sub writeConfiguration {
  80.     my $class = shift;
  81.     $config->setMode ($SaX::SAX_NEW);
  82.     my $status = $config->createConfiguration();
  83.     $config->commitConfiguration();
  84.     return $status;
  85. }
  86. #==========================================
  87. # testConfiguration
  88. #------------------------------------------
  89. BEGIN{ $TYPEINFO{testConfiguration} = ["function","boolean"]; }
  90. sub testConfiguration {
  91.     my $ok = 1;
  92.     $config->setMode ($SaX::SAX_NEW);
  93.     my $status = $config->testConfiguration();
  94.     if ($status == -1) {
  95.         $ok = 0;
  96.     }
  97.     if ($status == 0) {
  98.         $ok = writeConfiguration();
  99.     }
  100.     return $ok;
  101. }
  102. #==========================================
  103. # isExternalVGANoteBook
  104. #------------------------------------------
  105. BEGIN{ $TYPEINFO{isExternalVGANoteBook} = ["function","boolean"]; }
  106. sub isExternalVGANoteBook {
  107.     my $ok = 0;
  108.     my $saxCard = new SaX::SaXManipulateCard (
  109.         $section{Card}
  110.     );
  111.     my $saxDesktop = new SaX::SaXManipulateDesktop (
  112.         $section{Desktop},$section{Card},$section{Path}
  113.     );
  114.     if ($saxCard->isNoteBook()) {
  115.         my $profile = $saxDesktop->getDualHeadProfile();
  116.         if (defined $profile) {
  117.             if ($profile ne "") {
  118.                 $ok = 1;
  119.             }
  120.         }
  121.     }
  122.     return $ok;
  123. }
  124. #==========================================
  125. # isNoteBookHardware
  126. #------------------------------------------
  127. BEGIN{ $TYPEINFO{isNoteBookHardware} = ["function","boolean"]; }
  128. sub isNoteBookHardware {
  129.     my $saxCard = new SaX::SaXManipulateCard (
  130.         $section{Card}
  131.     );
  132.     if ($saxCard->isNoteBook()) {
  133.         return 1;
  134.     }
  135.     return 0;
  136. }
  137. #==========================================
  138. # isExternalVGAactive
  139. #------------------------------------------
  140. BEGIN{ $TYPEINFO{isExternalVGAactive} = ["function","boolean"]; }
  141. sub isExternalVGAactive {
  142.     my $ok = 0;
  143.     my $saxCard = new SaX::SaXManipulateCard ( $section{Card} );
  144.     my %options = %{$saxCard->getOptions()};
  145.     if (defined $options{SaXDualHead}) {
  146.         $ok = 1;
  147.     }
  148.     return $ok;
  149. }
  150. #==========================================
  151. # activateExternalVGA
  152. #------------------------------------------
  153. BEGIN{ $TYPEINFO{activateExternalVGA} = ["function", "void"]; }
  154. sub activateExternalVGA {
  155.     my $class = shift;
  156.     my $saxCard = new SaX::SaXManipulateCard ( $section{Card} );
  157.     if ((keys %profileDriverOptions) == 0) {
  158.         %profileDriverOptions = readProfile();
  159.     }
  160.     foreach my $key (sort keys %profileDriverOptions) {
  161.         $saxCard->removeCardOption ( $key );
  162.     }
  163.     foreach my $key (sort keys %profileDriverOptions) {
  164.         $saxCard->addCardOption ( $key,$profileDriverOptions{$key} );
  165.     }
  166. }
  167. #==========================================
  168. # deactivateExternalVGA
  169. #------------------------------------------
  170. BEGIN{ $TYPEINFO{deactivateExternalVGA} = ["function", "void"]; }
  171. sub deactivateExternalVGA {
  172.     my $class = shift;
  173.     my $saxCard = new SaX::SaXManipulateCard ( $section{Card} );
  174.     if ((keys %profileDriverOptions) == 0) {
  175.         %profileDriverOptions = readProfile();
  176.     }
  177.     foreach my $key (sort keys %profileDriverOptions) {
  178.         $saxCard->removeCardOption ( $key );
  179.     }
  180. }
  181. #==========================================
  182. # setDisplaySize
  183. #------------------------------------------
  184. BEGIN{ $TYPEINFO{setDisplaySize} = ["function","void",["list","string"]]; }
  185. sub setDisplaySize {
  186.     my $class = shift;
  187.     my @list  = @{+shift};
  188.     my $mDesktop = new SaX::SaXManipulateDesktop (
  189.         $section{Desktop},$section{Card},$section{Path}
  190.     );
  191.     my $traversal = $list[0];
  192.     my @ratios = split (/\//,$list[1]);
  193.     my $aspect = $ratios[0];
  194.     my $ratio  = $ratios[1];
  195.     $mDesktop->setDisplayRatioAndTraversal (
  196.         $traversal,$aspect,$ratio
  197.     );
  198. }
  199. #==========================================
  200. # getDisplaySize
  201. #------------------------------------------
  202. BEGIN{ $TYPEINFO{getDisplaySize} = ["function", ["list","string"]]; }
  203. sub getDisplaySize {
  204.     my $class = shift;
  205.     my $mDesktop = new SaX::SaXManipulateDesktop (
  206.         $section{Desktop},$section{Card},$section{Path}
  207.     );
  208.     my @result = ("undef");
  209.     my $traversal = $mDesktop->getDisplayTraversal();
  210.     my @ratio  = @{$mDesktop->getDisplayRatio()};
  211.     if (defined $traversal) {
  212.         $traversal = sprintf ("%.1f",$traversal);
  213.         if ($traversal < 13.3) {
  214.             $traversal = 12.2;
  215.         } elsif (($traversal >= 13.3) && ($traversal < 14.1)) {
  216.             $traversal = 13.3;
  217.         } elsif (($traversal >= 14.1) && ($traversal < 14.5)) {
  218.             $traversal = 14.1;
  219.         } elsif (($traversal >= 14.5) && ($traversal < 15.4)) {
  220.             $traversal = 15;
  221.         } elsif (($traversal >= 15.4) && ($traversal < 16.5)) {
  222.             $traversal = 15.4;
  223.         } elsif (($traversal >= 16.5) && ($traversal < 18.1)) {
  224.             $traversal = 17;
  225.         } elsif (($traversal >= 18.1) && ($traversal < 18.5)) {
  226.             $traversal = 18.1;
  227.         } elsif (($traversal >= 18.5) && ($traversal < 19.5)) {
  228.             $traversal = 19;
  229.         } elsif (($traversal >= 19.5) && ($traversal < 20.5)) {
  230.             $traversal = 20;
  231.         } elsif (($traversal >= 20.5) && ($traversal < 21.3)) {
  232.             $traversal = 21.1;
  233.         } elsif (($traversal >= 21.3) && ($traversal < 21.5)) {
  234.             $traversal = 21.3;
  235.         } elsif (($traversal >= 21.5) && ($traversal < 22.2)) {
  236.             $traversal = 22.2;
  237.         } elsif (($traversal >= 22.2) && ($traversal < 23.5)) {
  238.             $traversal = 23;
  239.         } elsif (($traversal >= 23.5) && ($traversal < 24.5)) {
  240.             $traversal = 24;
  241.         } elsif (($traversal >= 24.5) && ($traversal < 30.5)) {
  242.             $traversal = 30;
  243.         } elsif (($traversal >= 30.5) && ($traversal < 31.8)) {
  244.             $traversal = 31.5;
  245.         } elsif (($traversal >= 31.8) && ($traversal < 32.5)) {
  246.             $traversal = 32;
  247.         } elsif (($traversal >= 32.5) && ($traversal < 40.5)) {
  248.             $traversal = 40;
  249.         } elsif ($traversal >= 40.5) {
  250.             $traversal = 46;
  251.         }
  252.         @result = ($traversal,@ratio);
  253.     }
  254.     return \@result;
  255. }
  256. #==========================================
  257. # setResolution
  258. #------------------------------------------
  259. BEGIN{ $TYPEINFO{setResolution} = ["function", "void", "string"]; }
  260. sub setResolution {
  261.     my $class = shift;
  262.     my $resolution = $_[0];
  263.     my $mDesktop = new SaX::SaXManipulateDesktop (
  264.         $section{Desktop},$section{Card},$section{Path}
  265.     );
  266.     my @resList = ();
  267.     my $basePixels  = 0;
  268.     my $basePixelsX = 0;
  269.     my $basePixelsY = 0;
  270.     my %resDict = %{getAvailableResolutions()};
  271.     foreach (keys %resDict) {
  272.         if ($resDict{$_} eq $resolution) {
  273.         if ($_ =~ /(.*)x(.*)/) {
  274.             $basePixelsX = $1;
  275.             $basePixelsY = $2;
  276.             $basePixels = $basePixelsX * $basePixelsY;
  277.             push (@resList,$_);
  278.         }
  279.         }
  280.     }
  281.     if ($basePixels == 0) {
  282.         return;
  283.     }
  284.     foreach (keys %resDict) {
  285.     if ($_ =~ /(.*)x(.*)/) {
  286.         my $x = $1;
  287.         my $y = $2;
  288.         my $pixelSpace = $x * $y;
  289.         if (($pixelSpace < $basePixels) &&
  290.             ($x<=$basePixelsX) && ($y<=$basePixelsY)
  291.         ) {
  292.             push (@resList,$_);
  293.         }
  294.     }
  295.     }
  296.     my @colors = (8,15,16,24,32);
  297.     foreach my $color ( @colors ) {
  298.         $section{Desktop}->removeEntry ("Modes:$color");
  299.         foreach my $ritem ( sortResolution (@resList)) {
  300.         if ($ritem =~ /(.*)x(.*)/) {
  301.             $mDesktop->addResolution ($color,$1,$2);
  302.         }
  303.         }
  304.     }
  305.     setupMetaModes ($resList[0]);
  306. }
  307. #==========================================
  308. # setDefaultColorDepth
  309. #------------------------------------------
  310. BEGIN{ $TYPEINFO{setDefaultColorDepth} = ["function", "void","string"]; }
  311. sub setDefaultColorDepth {
  312.     my $class = shift;
  313.     my $color = $_[0];
  314.     my $mDesktop = new SaX::SaXManipulateDesktop (
  315.         $section{Desktop},$section{Card},$section{Path}
  316.     );
  317.     $mDesktop->setColorDepth ( $color );
  318. }
  319. #==========================================
  320. # activate3D
  321. #------------------------------------------
  322. BEGIN{ $TYPEINFO{activate3D} = ["function", "void"]; }
  323. sub activate3D {
  324.     my $class = shift;
  325.     my $mDesktop = new SaX::SaXManipulateDesktop (
  326.         $section{Desktop},$section{Card},$section{Path}
  327.     );
  328.     $mDesktop->selectDesktop (0);
  329.     $mDesktop->enable3D();
  330. }
  331. #==========================================
  332. # deactivate3D
  333. #------------------------------------------
  334. BEGIN{ $TYPEINFO{deactivate3D} = ["function", "void"]; }
  335. sub deactivate3D {
  336.     my $class = shift;
  337.     my $mDesktop = new SaX::SaXManipulateDesktop (
  338.         $section{Desktop},$section{Card},$section{Path}
  339.     );
  340.     $mDesktop->selectDesktop (0);
  341.     $mDesktop->disable3D();
  342. }
  343. #==========================================
  344. # hasOpenGLFeatures
  345. #------------------------------------------
  346. BEGIN{ $TYPEINFO{hasOpenGLFeatures} = ["function", "boolean"]; }
  347. sub hasOpenGLFeatures {
  348.     my $class = shift;
  349.     my $mDesktop = new SaX::SaXManipulateDesktop (
  350.         $section{Desktop},$section{Card},$section{Path}
  351.     );
  352.     $mDesktop->selectDesktop (0);
  353.     if ($mDesktop->is3DEnabled()) {
  354.         return 1;
  355.     }
  356.     return 0;
  357. }
  358. #==========================================
  359. # has3DCapabilities
  360. #------------------------------------------
  361. BEGIN{ $TYPEINFO{has3DCapabilities} = ["function", "boolean"]; }
  362. sub has3DCapabilities {
  363.     my $class = shift;
  364.     my $mDesktop = new SaX::SaXManipulateDesktop (
  365.         $section{Desktop},$section{Card},$section{Path}
  366.     );
  367.     my $mCard = new SaX::SaXManipulateCard (
  368.         $section{Card}
  369.     );
  370.     $mDesktop->selectDesktop (0);
  371.     my $has3DCapabilities = $mDesktop->is3DCard();
  372.     my $isMultiheaded = $mCard->getDevices();
  373.     if ((! $has3DCapabilities) || ($isMultiheaded > 1)) {
  374.         return 0;
  375.     }
  376.     return 1;
  377. }
  378. #==========================================
  379. # getCardName
  380. #------------------------------------------
  381. BEGIN{ $TYPEINFO{getCardName} = ["function", "string"]; }
  382. sub getCardName {
  383.     my $class = shift;
  384.     my $mCard = new SaX::SaXManipulateCard (
  385.         $section{Card}
  386.     );
  387.     $mCard->selectCard (0);
  388.     my $vendor = $mCard->getCardVendor();
  389.     my $model  = $mCard->getCardModel();
  390.     my $result = $vendor." ".$model;
  391.     return $result;
  392. }
  393. #==========================================
  394. # getMonitorName
  395. #------------------------------------------
  396. BEGIN{ $TYPEINFO{getMonitorName} = ["function", "string"]; }
  397. sub getMonitorName {
  398.     my $class = shift;
  399.     my $mDesktop = new SaX::SaXManipulateDesktop (
  400.         $section{Desktop},$section{Card},$section{Path}
  401.     );
  402.     $mDesktop->selectDesktop (0);
  403.     my $vendor = $mDesktop->getMonitorVendor();
  404.     if ($vendor =~ /Unknown/i) {
  405.         return "undef";
  406.     }
  407.     my $model  = $mDesktop->getMonitorName();
  408.     my $result = $vendor." ".$model;
  409.     return $result;
  410. }
  411. #==========================================
  412. # getMonitorVendor
  413. #------------------------------------------
  414. BEGIN{ $TYPEINFO{getMonitorVendor} = ["function", "string"]; }
  415. sub getMonitorVendor {
  416.     my $class = shift;
  417.     my $mDesktop = new SaX::SaXManipulateDesktop (
  418.         $section{Desktop},$section{Card},$section{Path}
  419.     );
  420.     $mDesktop->selectDesktop (0);
  421.     my $vendor = $mDesktop->getMonitorVendor();
  422.     if ($vendor =~ /Unknonw/i) {
  423.         return "undef";
  424.     }
  425.     return $vendor;
  426. }
  427. #==========================================
  428. # getMonitorModel
  429. #------------------------------------------
  430. BEGIN{ $TYPEINFO{getMonitorModel} = ["function", "string"]; }
  431. sub getMonitorModel {
  432.     my $class = shift;
  433.     my $mDesktop = new SaX::SaXManipulateDesktop (
  434.         $section{Desktop},$section{Card},$section{Path}
  435.     );
  436.     $mDesktop->selectDesktop (0);
  437.     my $model  = $mDesktop->getMonitorName();
  438.     if ($model =~ /Unknonw/i) {
  439.         return "undef";
  440.     }
  441.     return $model;
  442. }
  443. #==========================================
  444. # getActiveResolution
  445. #------------------------------------------
  446. BEGIN{ $TYPEINFO{getActiveResolution} = ["function", "string"]; }
  447. sub getActiveResolution {
  448.     my $class   = shift;
  449.     my $mDesktop = new SaX::SaXManipulateDesktop (
  450.         $section{Desktop},$section{Card},$section{Path}
  451.     );
  452.     $mDesktop->selectDesktop (0);
  453.     my @list = @{$mDesktop->getResolutions(
  454.         $mDesktop->getColorDepth()
  455.     )};
  456.     my $result = shift (@list);
  457.     return $result;
  458. }
  459. #==========================================
  460. # getActiveResolutionString
  461. #------------------------------------------
  462. BEGIN{ $TYPEINFO{getActiveResolutionString} = ["function", "string"]; }
  463. sub getActiveResolutionString {
  464.     my $resolution = getActiveResolution();
  465.     my @reslist = @{getAvailableResolutionNames()};
  466.     foreach (@reslist) {
  467.     if ($_ =~ /$resolution/) {
  468.         return $_;
  469.     }
  470.     }
  471.     return $resolution;
  472. }
  473. #==========================================
  474. # getActiveColorDepth
  475. #------------------------------------------
  476. BEGIN{ $TYPEINFO{getActiveColorDepth} = ["function", "string"]; }
  477. sub getActiveColorDepth {
  478.     my $class = shift;
  479.     my $mDesktop = new SaX::SaXManipulateDesktop (
  480.         $section{Desktop},$section{Card},$section{Path}
  481.     );
  482.     $mDesktop->selectDesktop (0);
  483.     return $mDesktop->getColorDepth();
  484. }
  485. #==========================================
  486. # getHsyncMin
  487. #------------------------------------------
  488. BEGIN{ $TYPEINFO{getHsyncMin} = ["function", "string"]; }
  489. sub getHsyncMin {
  490.     my $class = shift;
  491.     my $mDesktop = new SaX::SaXManipulateDesktop (
  492.         $section{Desktop},$section{Card},$section{Path}
  493.     );
  494.     my @hrange = @{$mDesktop->getHsyncRange()};
  495.     return $hrange[0];
  496. }
  497. #==========================================
  498. # getHsyncMax
  499. #------------------------------------------
  500. BEGIN{ $TYPEINFO{getHsyncMax} = ["function", "string"]; }
  501. sub getHsyncMax {
  502.     my $class = shift;
  503.     my $mDesktop = new SaX::SaXManipulateDesktop (
  504.         $section{Desktop},$section{Card},$section{Path}
  505.     );
  506.     my @hrange = @{$mDesktop->getHsyncRange()};
  507.     return $hrange[1];
  508. }
  509. #==========================================
  510. # getVsyncMin
  511. #------------------------------------------
  512. BEGIN{ $TYPEINFO{getVsyncMin} = ["function", "string"]; }
  513. sub getVsyncMin {
  514.     my $class = shift;
  515.     my $mDesktop = new SaX::SaXManipulateDesktop (
  516.         $section{Desktop},$section{Card},$section{Path}
  517.     );
  518.     my @vrange = @{$mDesktop->getVsyncRange()};
  519.     return $vrange[0];
  520. }
  521. #==========================================
  522. # getVsyncMax
  523. #------------------------------------------
  524. BEGIN{ $TYPEINFO{getVsyncMax} = ["function", "string"]; }
  525. sub getVsyncMax {
  526.     my $class = shift;
  527.     my $mDesktop = new SaX::SaXManipulateDesktop (
  528.         $section{Desktop},$section{Card},$section{Path}
  529.     );
  530.     my @vrange = @{$mDesktop->getVsyncRange()};
  531.     return $vrange[1];
  532. }
  533. #==========================================
  534. # setHsyncRange
  535. #------------------------------------------
  536. BEGIN{ $TYPEINFO{setHsyncRange} = ["function", "void","integer","integer"]; }
  537. sub setHsyncRange {
  538.     my $class = shift;
  539.     my $start = shift;
  540.     my $stop  = shift;
  541.     my $mDesktop = new SaX::SaXManipulateDesktop (
  542.         $section{Desktop},$section{Card},$section{Path}
  543.     );
  544.     $mDesktop->setHsyncRange ($start,$stop);
  545. }
  546. #==========================================
  547. # setVsyncRange
  548. #------------------------------------------
  549. BEGIN{ $TYPEINFO{setVsyncRange} = ["function", "void","integer","integer"]; }
  550. sub setVsyncRange {
  551.     my $class = shift;
  552.     my $start = shift;
  553.     my $stop  = shift;
  554.     my $mDesktop = new SaX::SaXManipulateDesktop (
  555.         $section{Desktop},$section{Card},$section{Path}
  556.     );
  557.     $mDesktop->setVsyncRange ($start,$stop);
  558. }
  559. #==========================================
  560. # getMonitorCDB
  561. #------------------------------------------
  562. BEGIN{ $TYPEINFO{getMonitorCDB} = ["function",["map","string",["list","string"]]]; }
  563. sub getMonitorCDB {
  564.     my $class = shift;
  565.     my $size = keys %cdb;
  566.     if ($size > 0) {
  567.         return \%cdb;
  568.     }
  569.     my $mDesktop = new SaX::SaXManipulateDesktop (
  570.         $section{Desktop},$section{Card},$section{Path}
  571.     );
  572.     $mDesktop->selectDesktop (0);
  573.     my @vendorList = @{$mDesktop->getCDBMonitorVendorList()};
  574.     foreach my $vendor (@vendorList) {
  575.         my $modelList = $mDesktop->getCDBMonitorModelList ($vendor);
  576.         $cdb{$vendor} = $modelList;
  577.     }
  578.     return \%cdb;
  579. }
  580. #==========================================
  581. # setMonitorCDB
  582. #------------------------------------------
  583. BEGIN{ $TYPEINFO{setMonitorCDB} = ["function","void",["list","string"]]; }
  584. sub setMonitorCDB {
  585.     my $class = shift;
  586.     my @list = @{+shift};
  587.     my $group = join (":",@list);
  588.     my $mDesktop = new SaX::SaXManipulateDesktop (
  589.         $section{Desktop},$section{Card},$section{Path}
  590.     );
  591.     $mDesktop->selectDesktop (0);
  592.     $mDesktop->setCDBMonitor ($group);
  593. }
  594. #==========================================
  595. # getAvailableResolutions
  596. #------------------------------------------
  597. BEGIN{ $TYPEINFO{getAvailableResolutions} = ["function",["map","string","string"]]; }
  598. sub getAvailableResolutions {
  599.     my $class = shift;
  600.     my $file = "/usr/share/sax/api/data/MonitorResolution";
  601.     if (! open (FD,$file)) {
  602.         return;
  603.     }
  604.     my %resList;
  605.     while (<FD>) {
  606.     if ($_ =~ /(.*)=(.*)/) {
  607.         $resList{$1} = $2;
  608.     }
  609.     }
  610.     close (FD);
  611.     return \%resList;
  612. }
  613. #==========================================
  614. # getAvailableResolutionNames
  615. #------------------------------------------
  616. BEGIN{ $TYPEINFO{getAvailableResolutionNames} = ["function",["list","string"]]; }
  617. sub getAvailableResolutionNames {
  618.     my $class = shift;
  619.     my $file = "/usr/share/sax/api/data/MonitorResolution";
  620.     my @result = ();
  621.     if (! open (FD,$file)) {
  622.         return \@result;
  623.     }
  624.     while (<FD>) {
  625.     if ($_ =~ /(.*)=(.*)/) {
  626.         push (@result,$2);
  627.     }
  628.     }
  629.     close (FD);
  630.     return \@result;
  631. }
  632. #==========================================
  633. # sortResolution
  634. #------------------------------------------
  635. sub sortResolution {
  636.     my @list = @_;   # list of resolutions
  637.     my %index;       # index hash
  638.     foreach my $i (@list) {
  639.         my @res   = split(/x/,$i);
  640.         my $pixel = $res[0] * $res[1];
  641.         $index{$pixel} = $i;
  642.     }
  643.     @list = ();
  644.     sub numerisch { $b <=> $a; }
  645.     foreach my $i (sort numerisch keys %index) {
  646.         push(@list,$index{$i});
  647.     }
  648.     return @list;
  649. }
  650. #==========================================
  651. # readProfile
  652. #------------------------------------------
  653. sub readProfile {
  654.     my $saxDesktop = new SaX::SaXManipulateDesktop (
  655.         $section{Desktop},$section{Card},$section{Path}
  656.     );
  657.     my %result  = ();
  658.     my $profile = $saxDesktop->getDualHeadProfile();
  659.     if ($profile ne "") {
  660.         my $pProfile = new SaX::SaXImportProfile ( $profile );
  661.         $pProfile -> doImport();
  662.         my $mImport = $pProfile -> getImport ( $SaX::SAX_CARD );
  663.         if (defined $mImport) {
  664.             my $saxProfileCard = new SaX::SaXManipulateCard ( $mImport );
  665.             %result = %{$saxProfileCard->getOptions()};
  666.         }
  667.     }
  668.     return %result;
  669. }
  670. #==========================================
  671. # setupMetaModes
  672. #------------------------------------------
  673. sub setupMetaModes {
  674.     my $resolution = $_[0];
  675.     my $mCard = new SaX::SaXManipulateCard (
  676.         $section{Card}
  677.     );
  678.     my %options = %{$mCard->getOptions()};
  679.     if (defined $options{MetaModes}) {
  680.         my @metaList = split (/,/,$options{MetaModes});
  681.         $metaList[0] = $resolution;
  682.         my $value = join (",",@metaList);
  683.         $mCard->removeCardOption ("MetaModes");
  684.         $mCard->addCardOption ("MetaModes",$value);
  685.     }
  686. }   
  687.  
  688. #==========================================
  689. # return current Keyboard layout
  690. #------------------------------------------
  691. BEGIN{ $TYPEINFO{getXkbLayout} = ["function", "string"]; }
  692. sub getXkbLayout {
  693.     my $class   = shift;
  694.     my $mKeyboard = new SaX::SaXManipulateKeyboard (
  695.         $section{Keyboard}
  696.     );
  697.     my @list = @{$mKeyboard->getXKBLayout()};
  698.     my $result = shift (@list);
  699.     return $result;
  700. }
  701.  
  702. #==========================================
  703. # set new Keyboard layout
  704. #------------------------------------------
  705. BEGIN{ $TYPEINFO{setXkbLayout} = ["function", "void", "string"]; }
  706. sub setXkbLayout {
  707.     my ($class, $layout)   = @_;
  708.     my $mKeyboard = new SaX::SaXManipulateKeyboard (
  709.         $section{Keyboard}
  710.     );
  711.     $mKeyboard->setXKBLayout ($layout);
  712. }
  713.  
  714. #==========================================
  715. # set new Keyboard model
  716. #------------------------------------------
  717. BEGIN{ $TYPEINFO{setXkbModel} = ["function", "void", "string"]; }
  718. sub setXkbModel {
  719.     my ($class, $model)   = @_;
  720.     my $mKeyboard = new SaX::SaXManipulateKeyboard (
  721.         $section{Keyboard}
  722.     );
  723.     $mKeyboard->setXKBModel ($model);
  724. }
  725.  
  726. #==========================================
  727. # set new layout variant for given layout
  728. #------------------------------------------
  729. BEGIN{ $TYPEINFO{setXkbVariant} = ["function", "void", "string", "string"]; }
  730. sub setXkbVariant {
  731.     my ($class, $layout, $variant)   = @_;
  732.     my $mKeyboard = new SaX::SaXManipulateKeyboard (
  733.         $section{Keyboard}
  734.     );
  735.     $mKeyboard->setXKBVariant ($layout, $variant);
  736. }
  737.  
  738. #==========================================
  739. # set mapping for the special keys
  740. #------------------------------------------
  741. BEGIN{ $TYPEINFO{setXkbMappings} = ["function","void", ["map","string","string"]];}
  742. sub setXkbMappings {
  743.     # ...
  744.     # set mapping for the special keys (Left/Right-Alt Scroll-Lock
  745.     # and Right Ctrl) parameter is map with pairs of type
  746.     # { SaX::XKB_LEFT_ALT => SaX::XKB_MAP_META }
  747.     # ---
  748.     my ($class, $mappings)   = @_;
  749.     my $mKeyboard = new SaX::SaXManipulateKeyboard (
  750.         $section{Keyboard}
  751.     );
  752.     return if (ref ($mappings) ne "HASH" || ! %{$mappings});
  753.     while (my ($type, $mapping) = each %{$mappings}) {
  754.         next if !$mapping;
  755.         $mKeyboard->setXKBMapping ($type, $mapping);
  756.     }
  757. }
  758.  
  759. #==========================================
  760. # set new list of Xkb options
  761. #------------------------------------------
  762. BEGIN{ $TYPEINFO{setXkbOptions} = ["function","void", ["list","string"]];}
  763. sub setXkbOptions {
  764.     # ...
  765.     # resets the current list of options and adds the new ones
  766.     # parameter is list of options
  767.     # ---
  768.     my ($class, $options)   = @_;
  769.     return if (!defined $options || ref ($options) ne "ARRAY");
  770.     my $mKeyboard = new SaX::SaXManipulateKeyboard (
  771.         $section{Keyboard}
  772.     );
  773.     my @opt = @{$options};
  774.     $mKeyboard->setXKBOption (shift @opt);
  775.     foreach my $option (@opt) {
  776.         $mKeyboard->addXKBOption ($option);
  777.     }
  778. }
  779.  
  780. #==========================================
  781. # test code
  782. #------------------------------------------
  783. if (0) {
  784.     loadApplication();
  785.     
  786.     my @list = @{getDisplaySize()};
  787.     print "@list\n";
  788.     @list = (12.2,"5/4");
  789.     setDisplaySize ("class",\@list);
  790.     @list = @{getDisplaySize()};
  791.     print "@list\n";
  792.     exit;
  793.  
  794.     print "HW_UPDATE=$ENV{HW_UPDATE}\n";
  795.     my $resolution = getActiveResolution ();
  796.     my $colordepth = getActiveColorDepth ();
  797.     my $cardname   = getCardName();
  798.     my $monitorname= getMonitorName();
  799.     my $status3D   = hasOpenGLFeatures();
  800.     my $statusCard = has3DCapabilities();
  801.     my $resstring  = getActiveResolutionString();
  802.     print "$resolution: $colordepth: $cardname: $monitorname\n";
  803.     print "3D enabled: $status3D\n";
  804.     print "3D capable: $statusCard\n";
  805.     print "$resstring\n";
  806. }
  807.  
  808. 1;
  809.