|
libsax 7.2
|
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
1.7.3