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 QDict<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 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
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
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
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 }