layout.cpp

00001 /**************
00002 FILE          : layout.cpp
00003 ***************
00004 PROJECT       : SaX2 - library interface
00005               :
00006 AUTHOR        : Marcus Schäfer <ms@suse.de>
00007               :
00008 BELONGS TO    : SaX2 - SuSE advanced X11 configuration 
00009               : 
00010               :
00011 DESCRIPTION   : native C++ class library to access SaX2
00012               : functionality. Easy to use interface for
00013               : //.../
00014               : - importing/exporting X11 configurations
00015               : - modifying/creating X11 configurations 
00016               : ---
00017               :
00018               :
00019 STATUS        : Status: Development
00020 **************/
00021 #include "layout.h"
00022 
00023 namespace SaX {
00024 //====================================
00025 // Constructor...
00026 //------------------------------------
00027 SaXManipulateLayout::SaXManipulateLayout (SaXImport* layout,SaXImport* card ) {
00028         // .../
00032         // ----
00033         if ((! layout) || (! card)) {
00034                 excNullPointerArgument ();
00035                 qError (errorString(),EXC_NULLPOINTERARGUMENT);
00036                 return;
00037         }
00038         if ( layout->getSectionID() != SAX_LAYOUT ) {
00039                 excLayoutImportBindFailed ( layout->getSectionID() );
00040                 qError (errorString(),EXC_LAYOUTIMPORTBINDFAILED);
00041                 return;
00042         }
00043         if ( card->getSectionID() != SAX_CARD ) {
00044                 excCardImportBindFailed ( card->getSectionID() );
00045                 qError (errorString(),EXC_CARDIMPORTBINDFAILED);
00046                 return;
00047         }
00048         mLayout = layout;
00049         mCard   = card;
00050         mLayout -> setID ( 0 );
00051         mCard   -> setID ( 0 );
00052 }
00053 
00054 //====================================
00055 // setMultiheadMode
00056 //------------------------------------
00057 void SaXManipulateLayout::setXOrgMultiheadMode ( int mode ) {
00058         // .../
00062         // ----
00063         switch (mode) {
00064                 case SAX_XINERAMA:
00065                         mLayout -> setItem ("Clone","off");
00066                         mLayout -> setItem ("Xinerama","on");
00067                 break;
00068                 case SAX_TRADITIONAL:
00069                         mLayout -> setItem ("Clone","off");
00070                         mLayout -> setItem ("Xinerama","off");
00071                 break;
00072                 case SAX_CLONE:
00073                         mLayout -> setItem ("Clone","on");
00074                         mLayout -> setItem ("Xinerama","on");
00075                 break;
00076                 default:
00077                         excInvalidArgument (mode);
00078                         qError (errorString(),EXC_INVALIDARGUMENT);
00079                 break;
00080         }
00081 }
00082 
00083 //====================================
00084 // setRelative
00085 //------------------------------------
00086 bool SaXManipulateLayout::setRelative (
00087         int relativeTo,int originForScreen, int x, int y
00088 ) {
00089         // .../
00111         // ----
00112         SaXManipulateCard cardData (mCard); 
00113         if (! cardData.selectCard (relativeTo)) {
00114                 return false;
00115         }
00116         QString screenID; screenID.sprintf ("%d",relativeTo);
00117         QString origin; origin.sprintf ("Screen[%d],%d,%d",originForScreen,x,y);
00118         mLayout -> setItem (
00119                 QString("Relative:Screen["+ screenID + "]"),origin
00120         );
00121         return true;    
00122 }
00123 
00124 //====================================
00125 // removeRelative
00126 //------------------------------------
00127 bool SaXManipulateLayout::removeRelative ( int screen ) {
00128         // .../
00131         // ----
00132         SaXManipulateCard cardData (mCard);
00133         if (! cardData.selectCard (screen)) {
00134                 return false;
00135         }
00136         QString remove;
00137         remove.sprintf ("Relative:Screen[%d]",screen);
00138         mLayout -> removeEntry ( remove );
00139         return true;
00140 }
00141 
00142 //====================================
00143 // setLayout
00144 //------------------------------------
00145 bool SaXManipulateLayout::setXOrgLayout (
00146         int screen, int left, int right, int top, int bottom
00147 ) {
00148         // .../
00153         // ----
00154         SaXManipulateCard cardData (mCard);
00155         if (! cardData.selectCard (screen)) {
00156                 return false;
00157         }
00158         QString leftID   ("<none>");
00159         QString rightID  ("<none>");
00160         QString topID    ("<none>");
00161         QString bottomID ("<none>");
00162         if (left >= 0) {
00163                 leftID.sprintf ("Screen[%d]",left);
00164         }
00165         if (right >= 0) {
00166                 rightID.sprintf ("Screen[%d]",right);
00167         }
00168         if (top >= 0) {
00169                 topID.sprintf ("Screen[%d]",top);
00170         }
00171         if (bottom >= 0) {
00172                 bottomID.sprintf ("Screen[%d]",bottom);
00173         }
00174         QString screenID; screenID.sprintf ("%d",screen);
00175         mLayout -> setItem (
00176                 QString("Screen:Screen["+ screenID + "]"),
00177                 QString(leftID + " " + rightID + " " + topID + " " + bottomID)
00178         );
00179         return true;
00180 }
00181 
00182 //====================================
00183 // getMultiheadMode
00184 //------------------------------------
00185 int SaXManipulateLayout::getMultiheadMode ( void ) {
00186         // .../
00192         // ----
00193         QString clone = mLayout -> getItem ("Clone");
00194         QString xrama = mLayout -> getItem ("Xinerama");
00195         //====================================
00196         // check for merged framebuffer...
00197         //------------------------------------
00198         if (mCard->getCount() == 1) {
00199                 SaXManipulateCard cardData (mCard);
00200                 for (int card=0;card<mCard->getCount();card++) {
00201                         cardData.selectCard (card);
00202                         QDict<QString> options = cardData.getOptions();
00203                         //====================================
00204                         // nvidia...
00205                         //------------------------------------
00206                         if (options["TwinView"]) {
00207                                 if (*options["TwinView"] == "Clone") {
00208                                         return SAX_MERGED_FB_CLONE;
00209                                 } else {
00210                                         return SAX_MERGED_FB;
00211                                 }
00212                         }
00213                         //====================================
00214                         // fglrx...
00215                         //------------------------------------
00216                         if (options["DesktopSetup"]) {
00217                                 if (*options["DesktopSetup"] == "Clone") {
00218                                         return SAX_MERGED_FB_CLONE;
00219                                 } else {
00220                                         return SAX_MERGED_FB;
00221                                 }
00222                         }
00223                         //====================================
00224                         // intel...
00225                         //------------------------------------
00226                         if (options["Clone"]) {
00227                                 return SAX_MERGED_FB_CLONE;
00228                         }
00229                         //====================================
00230                         // matrox / radeon...
00231                         //------------------------------------
00232                         if (options["MergedFB"]) {
00233                                 if (
00234                                         (*options["Monitor2Position"] == "Clone") ||
00235                                         (*options["CRT2Position"] == "Clone")
00236                                 ) {
00237                                         return SAX_MERGED_FB_CLONE;
00238                                 } else {
00239                                         return SAX_MERGED_FB;
00240                                 }
00241                         }
00242                 }
00243         }
00244         //====================================
00245         // check for traditional mode...
00246         //------------------------------------
00247         if ((clone == "off") && (xrama == "off") && (mCard->getCount() > 1)) {
00248                 return SAX_TRADITIONAL;
00249         }
00250         //====================================
00251         // check for singlehead mode...
00252         //------------------------------------
00253         if ((clone == "off") && (xrama == "off")) {
00254                 return SAX_SINGLE_HEAD;
00255         }
00256         //====================================
00257         // check for clone mode...
00258         //------------------------------------
00259         if (clone == "on") {
00260                 return SAX_CLONE;
00261         }
00262         //====================================
00263         // check for Xinerama mode...
00264         //------------------------------------
00265         if (xrama == "on") {
00266                 return SAX_XINERAMA;
00267         }
00268         return SAX_UNKNOWN_MODE;
00269 }
00270 
00271 //====================================
00272 // getLayout
00273 //------------------------------------
00274 QList<QString> SaXManipulateLayout::getXOrgLayout ( int screen ) {
00275         // .../
00280         // ----
00281         SaXManipulateCard cardData (mCard);
00282         if (! cardData.selectCard (screen)) {
00283                 return QList<QString> ();
00284         }
00285         QString idString; idString.sprintf ("%d",screen);
00286         QString layout = mLayout -> getItem (
00287                 QString("Screen:Screen["+ idString + "]")
00288         );
00289         if (layout.isEmpty()) {
00290                 excGetScreenLayoutFailed (screen);
00291                 qError (errorString(),EXC_GETSCREENLAYOUTFAILED);
00292                 return QList<QString> ();
00293         }
00294         QList<QString> layoutList;
00295         QStringList positions = QStringList::split ( " ", layout );
00296         for ( QStringList::Iterator
00297                 in = positions.begin(); in != positions.end(); ++in
00298         ) {
00299                 QString* pos = new QString (*in);
00300                 layoutList.append (pos);
00301         }
00302         return layoutList;
00303 }
00304 
00305 //====================================
00306 // getInputLayout
00307 //------------------------------------
00308 QList<QString> SaXManipulateLayout::getInputLayout ( void ) {
00309         // .../
00312         // ----
00313         QString layout = mLayout -> getItem ("InputDevice");
00314         if (layout.isEmpty()) {
00315                 excGetInputLayoutFailed ();
00316                 qError (errorString(),EXC_GETINPUTLAYOUTFAILED);
00317                 return QList<QString> ();
00318         }
00319         QList<QString> inputList;
00320         QStringList tokens = QStringList::split ( ",", layout );
00321         for ( QStringList::Iterator
00322                 in = tokens.begin(); in != tokens.end(); ++in
00323         ) {
00324                 QString* item = new QString (*in);
00325                 QRegExp identifier ("\\[(.+)\\]");
00326                 int pos = identifier.search (*item);
00327                 if (pos >= 0) {
00328                         inputList.append (
00329                                 new QString (identifier.cap(1))
00330                         );
00331                 }
00332         }
00333         return inputList;
00334 }
00335 
00336 //====================================
00337 // addInputLayout
00338 //------------------------------------
00339 void SaXManipulateLayout::addInputLayout ( int id ) {
00340         // .../
00343         // ----
00344         QString mouseID;
00345         QString layout = mLayout -> getItem ("InputDevice");
00346         QTextOStream (&mouseID) << ",Mouse[" << id << "]";
00347         layout.append (mouseID);
00348         layout.replace (QRegExp("^,"),"");
00349         mLayout -> setItem (
00350                 "InputDevice",layout
00351         );
00352 }
00353 
00354 //====================================
00355 // removeInputLayout
00356 //------------------------------------
00357 void SaXManipulateLayout::removeInputLayout ( int id ) {
00358         // .../
00361         // ----
00362         QString mouseID;
00363         QString result ("");
00364         QString layout = mLayout -> getItem ("InputDevice");
00365         QTextOStream (&mouseID) << "Mouse[" << id << "]";
00366         QStringList tokens = QStringList::split ( ",", layout );
00367         for ( QStringList::Iterator
00368                 in = tokens.begin(); in != tokens.end(); ++in
00369         ) {
00370                 QString item = *in;
00371                 if ( item != mouseID ) {
00372                         result.append (","+item);
00373                 }
00374         }
00375         result.replace (QRegExp("^,"),"");
00376         mLayout -> setItem (
00377                 "InputDevice",result
00378         );
00379 }
00380 } // end namespace

Generated on Mon Jun 19 12:42:49 2006 for libsax by  doxygen 1.4.6