diff options
author | Ken Moore <moorekou@gmail.com> | 2016-04-15 12:41:23 -0400 |
---|---|---|
committer | Ken Moore <moorekou@gmail.com> | 2016-04-15 12:41:23 -0400 |
commit | e1829230afb78a9b097e25f29c828b427051fafc (patch) | |
tree | 5d63aaf1955ddc98255ca047628adc2c17659cfb | |
parent | Make sure that the desktop widget updates itself and any panels on screen/res... (diff) | |
download | lumina-e1829230afb78a9b097e25f29c828b427051fafc.tar.gz lumina-e1829230afb78a9b097e25f29c828b427051fafc.tar.bz2 lumina-e1829230afb78a9b097e25f29c828b427051fafc.zip |
Fix up lumina-xconfig so it works better with multiple (3+) monitors and custom settings.
-rw-r--r-- | lumina-xconfig/MainUI.cpp | 64 | ||||
-rw-r--r-- | lumina-xconfig/MainUI.h | 2 |
2 files changed, 60 insertions, 6 deletions
diff --git a/lumina-xconfig/MainUI.cpp b/lumina-xconfig/MainUI.cpp index d2216fa7..f4aa1c49 100644 --- a/lumina-xconfig/MainUI.cpp +++ b/lumina-xconfig/MainUI.cpp @@ -48,6 +48,24 @@ void MainUI::loadIcons(){ ui->tool_applyconfig->setIcon( LXDG::findIcon("dialog-ok-apply","") ); } +QStringList MainUI::currentOpts(){ + //Read all the settings and create the xrandr options to maintain these settings + QStringList opts; + for(int i=0; i<SCREENS.length(); i++){ + if(SCREENS[i].order <0){ continue; } //skip this screen - non-active + opts << "--output" << SCREENS[i].ID << "--mode" << QString::number(SCREENS[i].geom.width())+"x"+QString::number(SCREENS[i].geom.height()); + if(SCREENS[i].order > 0){ + //Get the ID of the previous screen + QString id; + for(int j=0; j<SCREENS.length(); j++){ + if(SCREENS[j].order == SCREENS[i].order-1){ id = SCREENS[j].ID; break;} + } + if(!id.isEmpty()){ opts << "--right-of" << id; } + } + } + return opts; +} + ScreenInfo MainUI::currentScreenInfo(){ QListWidgetItem *item = ui->list_screens->currentItem(); if(item!=0){ @@ -190,8 +208,16 @@ void MainUI::MoveScreenLeft(){ item = ui->list_screens->item( ui->list_screens->row(item)-1 ); if(item == 0){ return; } //no item on the left (can't go left) QString LID = item->whatsThis(); //left ID + //Adjust the order of the two screens + for(int i=0; i<SCREENS.length(); i++){ + if(SCREENS[i].ID == CID){ SCREENS[i].order = SCREENS[i].order-1; } + else if(SCREENS[i].ID==LID){ SCREENS[i].order = SCREENS[i].order+1; } + } + //Now run the command + QStringList opts = currentOpts(); + LUtils::runCmd("xrandr", opts); //Now run the command - LUtils::runCmd("xrandr", QStringList() << "--output" << CID << "--left-of" << LID); + //LUtils::runCmd("xrandr", QStringList() << "--output" << CID << "--left-of" << LID); QTimer::singleShot(500, this, SLOT(UpdateScreens()) ); } @@ -204,8 +230,14 @@ void MainUI::MoveScreenRight(){ item = ui->list_screens->item( ui->list_screens->row(item)+1 ); if(item == 0){ return; } //no item on the right (can't go right) QString RID = item->whatsThis(); //right ID + //Adjust the order of the two screens + for(int i=0; i<SCREENS.length(); i++){ + if(SCREENS[i].ID == RID){ SCREENS[i].order = SCREENS[i].order-1; } + else if(SCREENS[i].ID==CID){ SCREENS[i].order = SCREENS[i].order+1; } + } //Now run the command - LUtils::runCmd("xrandr", QStringList() << "--output" << CID << "--right-of" << RID); + QStringList opts = currentOpts(); + LUtils::runCmd("xrandr", opts); QTimer::singleShot(500, this, SLOT(UpdateScreens()) ); } @@ -218,7 +250,14 @@ void MainUI::DeactivateScreen(QString device){ device = item->whatsThis(); } if(device.isEmpty()){ return; } //nothing found - LUtils::runCmd("xrandr", QStringList() << "--output" << device << "--off"); + //Remove the screen from the settings + for(int i=0; i<SCREENS.length(); i++){ + if(SCREENS[i].ID==device){ SCREENS.removeAt(i); break; } + } + //Now run the command + QStringList opts = currentOpts(); + opts << "--output" << device << "--off"; + LUtils::runCmd("xrandr", opts); QTimer::singleShot(500, this, SLOT(UpdateScreens()) ); } @@ -228,16 +267,29 @@ void MainUI::ActivateScreen(){ QString DID = ui->combo_cscreens->currentText(); QString loc = ui->combo_location->currentData().toString(); if(ID.isEmpty() || DID.isEmpty() || loc.isEmpty()){ return; } //invalid inputs - LUtils::runCmd("xrandr", QStringList() << "--output" << ID << loc << DID <<"--auto"); + QStringList opts = currentOpts(); + opts << "--output" << ID << loc << DID <<"--auto"; + //qDebug() << "Activate Options:" << opts; + LUtils::runCmd("xrandr", opts ); QTimer::singleShot(500, this, SLOT(UpdateScreens()) ); } void MainUI::ApplyChanges(){ + //NOTE: need to re-specifiy the QListWidgetItem *it = ui->list_screens->currentItem(); if(it==0){ return; } //nothing to do QString newres = ui->combo_resolution->currentData().toString(); if(newres.isEmpty()){ return; } //nothing to do - qDebug() << "Apply Screen Changes" << it->whatsThis() << "->" << newres; - LUtils::runCmd("xrandr", QStringList() << "--output" << it->whatsThis() << "--mode" << newres); + //qDebug() << "Apply Screen Changes" << it->whatsThis() << "->" << newres; + //Adjust the order of the two screens + for(int i=0; i<SCREENS.length(); i++){ + if(SCREENS[i].ID == it->whatsThis()){ + SCREENS[i].geom.setWidth(newres.section("x",0,0).toInt()); + SCREENS[i].geom.setHeight(newres.section("x",1,1).toInt()); + } + } + //Now run the command + QStringList opts = currentOpts(); + LUtils::runCmd("xrandr", opts); QTimer::singleShot(500, this, SLOT(UpdateScreens()) ); }
\ No newline at end of file diff --git a/lumina-xconfig/MainUI.h b/lumina-xconfig/MainUI.h index 363cf257..0563c4ca 100644 --- a/lumina-xconfig/MainUI.h +++ b/lumina-xconfig/MainUI.h @@ -46,6 +46,8 @@ private: QList<ScreenInfo> SCREENS; ScreenInfo currentScreenInfo(); + QStringList currentOpts(); + private slots: void UpdateScreens(); void ScreenSelected(); |