00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "layout.h"
00022
00023 namespace SaX {
00024
00025
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
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
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
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
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
00184
00185 int SaXManipulateLayout::getMultiheadMode ( void ) {
00186
00192
00193 QString clone = mLayout -> getItem ("Clone");
00194 QString xrama = mLayout -> getItem ("Xinerama");
00195
00196
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
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
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
00225
00226 if (options["Clone"]) {
00227 return SAX_MERGED_FB_CLONE;
00228 }
00229
00230
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
00246
00247 if ((clone == "off") && (xrama == "off") && (mCard->getCount() > 1)) {
00248 return SAX_TRADITIONAL;
00249 }
00250
00251
00252
00253 if ((clone == "off") && (xrama == "off")) {
00254 return SAX_SINGLE_HEAD;
00255 }
00256
00257
00258
00259 if (clone == "on") {
00260 return SAX_CLONE;
00261 }
00262
00263
00264
00265 if (xrama == "on") {
00266 return SAX_XINERAMA;
00267 }
00268 return SAX_UNKNOWN_MODE;
00269 }
00270
00271
00272
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
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
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
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 }