libsax 7.2

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                         Q3Dict<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                 QList<QString>* nope = new QList<QString>;
00284                 return *nope;
00285         }
00286         QString idString; idString.sprintf ("%d",screen);
00287         QString layout = mLayout -> getItem (
00288                 QString("Screen:Screen["+ idString + "]")
00289         );
00290         if (layout.isEmpty()) {
00291                 excGetScreenLayoutFailed (screen);
00292                 qError (errorString(),EXC_GETSCREENLAYOUTFAILED);
00293                 QList<QString>* nope = new QList<QString>;
00294                 return *nope;
00295         }
00296         QList<QString> layoutList;
00297         QStringList positions = QStringList::split ( " ", layout );
00298         for ( QStringList::Iterator in = positions.begin(); in != positions.end(); ++in ) {
00299                 layoutList.append (*in);
00300         }
00301         return layoutList;
00302 }
00303 
00304 //====================================
00305 // getInputLayout
00306 //------------------------------------
00307 QList<QString> SaXManipulateLayout::getInputLayout ( void ) {
00308         // .../
00311         // ----
00312         QString layout = mLayout -> getItem ("InputDevice");
00313         if (layout.isEmpty()) {
00314                 excGetInputLayoutFailed ();
00315                 qError (errorString(),EXC_GETINPUTLAYOUTFAILED);
00316                 QList<QString>* nope = new QList<QString>;
00317                 return *nope;
00318         }
00319         QList<QString> inputList;
00320         QStringList tokens = QStringList::split ( ",", layout );
00321         for ( QStringList::Iterator in = tokens.begin(); in != tokens.end(); ++in ) {
00322                 QRegExp identifier ("\\[(.+)\\]");
00323                 int pos = identifier.search (*in);
00324                 if (pos >= 0) {
00325                         inputList.append (identifier.cap(1));
00326                 }
00327         }
00328         return inputList;
00329 }
00330 
00331 //====================================
00332 // addInputLayout
00333 //------------------------------------
00334 void SaXManipulateLayout::addInputLayout ( int id ) {
00335         // .../
00338         // ----
00339         QString mouseID;
00340         QString layout = mLayout -> getItem ("InputDevice");
00341         QTextOStream (&mouseID) << ",Mouse[" << id << "]";
00342         layout.append (mouseID);
00343         layout.replace (QRegExp("^,"),"");
00344         mLayout -> setItem (
00345                 "InputDevice",layout
00346         );
00347 }
00348 
00349 //====================================
00350 // removeInputLayout
00351 //------------------------------------
00352 void SaXManipulateLayout::removeInputLayout ( int id ) {
00353         // .../
00356         // ----
00357         QString mouseID;
00358         QString result ("");
00359         QString layout = mLayout -> getItem ("InputDevice");
00360         QTextOStream (&mouseID) << "Mouse[" << id << "]";
00361         QStringList tokens = QStringList::split ( ",", layout );
00362         for ( QStringList::Iterator
00363                 in = tokens.begin(); in != tokens.end(); ++in
00364         ) {
00365                 QString item = *in;
00366                 if ( item != mouseID ) {
00367                         result.append (","+item);
00368                 }
00369         }
00370         result.replace (QRegExp("^,"),"");
00371         mLayout -> setItem (
00372                 "InputDevice",result
00373         );
00374 }
00375 } // end namespace