diff options
author | Ken Moore <ken@ixsystems.com> | 2017-08-15 19:19:54 -0400 |
---|---|---|
committer | Ken Moore <ken@ixsystems.com> | 2017-08-15 19:19:54 -0400 |
commit | 3b6e8b8ee6e05e3d05e3d69b64b2afe5bc8c0d22 (patch) | |
tree | 5f8ebc9c2451d2f9b0adf37a1ce57eb9f9d0d0ef | |
parent | Added translations to menu buttons and the panel settings dialogue (diff) | |
download | lumina-3b6e8b8ee6e05e3d05e3d69b64b2afe5bc8c0d22.tar.gz lumina-3b6e8b8ee6e05e3d05e3d69b64b2afe5bc8c0d22.tar.bz2 lumina-3b6e8b8ee6e05e3d05e3d69b64b2afe5bc8c0d22.zip |
Get the lumina-xconfig monitor settings all up and working again.
1) Add 2D placement options for screens
2) Add Rotation options for screens
3) Add Fluxbox restart fix for session changes.
-rw-r--r-- | src-qt5/core-utils/lumina-xconfig/MainUI.cpp | 22 | ||||
-rw-r--r-- | src-qt5/core-utils/lumina-xconfig/MainUI.ui | 57 | ||||
-rw-r--r-- | src-qt5/core-utils/lumina-xconfig/ScreenSettings.cpp | 19 | ||||
-rw-r--r-- | src-qt5/core-utils/lumina-xconfig/ScreenSettings.h | 10 |
4 files changed, 88 insertions, 20 deletions
diff --git a/src-qt5/core-utils/lumina-xconfig/MainUI.cpp b/src-qt5/core-utils/lumina-xconfig/MainUI.cpp index 90f09104..9ef2bca8 100644 --- a/src-qt5/core-utils/lumina-xconfig/MainUI.cpp +++ b/src-qt5/core-utils/lumina-xconfig/MainUI.cpp @@ -20,6 +20,11 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){ ui->combo_location->clear(); ui->combo_location->addItem(tr("Right Of"), "--right-of"); ui->combo_location->addItem(tr("Left Of"), "--left-of"); + ui->combo_rotation->clear(); + ui->combo_rotation->addItem(tr("None"), 0); + ui->combo_rotation->addItem(tr("Left"), -90); + ui->combo_rotation->addItem(tr("Right"), 90); + ui->combo_rotation->addItem(tr("Inverted"), 180); connect(ui->push_close, SIGNAL(clicked()), this, SLOT(close()) ); connect(ui->push_rescan, SIGNAL(clicked()), this, SLOT(UpdateScreens()) ); @@ -174,15 +179,11 @@ void MainUI::ScreenSelected(){ //QListWidgetItem *item = ui->list_screens->currentItem(); if(item.isEmpty()){ //nothing selected - //ui->tool_deactivate->setEnabled(false); - //ui->tool_moveleft->setEnabled(false); - //ui->tool_moveright->setEnabled(false); + ui->tool_deactivate->setEnabled(false); ui->tab_config->setEnabled(false); }else{ //Item selected - //ui->tool_deactivate->setEnabled(ui->list_screens->count()>1); - //ui->tool_moveleft->setEnabled(ui->list_screens->row(item) > 0); - //ui->tool_moveright->setEnabled(ui->list_screens->row(item) < (ui->list_screens->count()-1)); + ui->tool_deactivate->setEnabled(true); ui->tab_config->setEnabled(true); //Update the info available on the config tab ScreenInfo cur = currentScreenInfo(); @@ -195,6 +196,9 @@ void MainUI::ScreenSelected(){ if(cur.resList[i].contains(cres)){ ui->combo_resolution->setCurrentIndex(i); } } ui->check_primary->setChecked( cur.isprimary ); + int index = ui->combo_rotation->findData( cur.rotation ); + if(index<0){ index = 0; } + ui->combo_rotation->setCurrentIndex(index); } } @@ -268,7 +272,6 @@ void MainUI::ActivateScreen(){ } void MainUI::ApplyChanges(){ - //NOTE: need to re-specifiy the QString item = currentSelection(); if(item.isEmpty()){ return; } //nothing to do QString newres = ui->combo_resolution->currentData().toString(); @@ -281,6 +284,7 @@ void MainUI::ApplyChanges(){ if(SCREENS[i].ID == item){ SCREENS[i].geom.setWidth(newres.section("x",0,0).toInt()); SCREENS[i].geom.setHeight(newres.section("x",1,1).toInt()); + SCREENS[i].rotation = ui->combo_rotation->currentData().toInt(); } if(setprimary){ SCREENS[i].isprimary = SCREENS[i].ID==item; } //Find the window associated with this screen @@ -291,8 +295,8 @@ void MainUI::ApplyChanges(){ } } //Now run the command - QStringList opts = currentOpts(); - LUtils::runCmd("xrandr", opts); + RRSettings::Apply(SCREENS); + //And update the UI and WM in a moment QTimer::singleShot(500, this, SLOT(UpdateScreens()) ); QTimer::singleShot(1000, this, SLOT(RestartFluxbox()) ); } diff --git a/src-qt5/core-utils/lumina-xconfig/MainUI.ui b/src-qt5/core-utils/lumina-xconfig/MainUI.ui index 01bb032d..b4061b95 100644 --- a/src-qt5/core-utils/lumina-xconfig/MainUI.ui +++ b/src-qt5/core-utils/lumina-xconfig/MainUI.ui @@ -24,16 +24,51 @@ <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QToolButton" name="tool_deactivate"> + <property name="toolTip"> + <string>Disable Current Screen</string> + </property> <property name="text"> <string>...</string> </property> </widget> </item> <item> + <spacer name="verticalSpacer_4"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> <widget class="QToolButton" name="tool_tile"> + <property name="toolTip"> + <string>Tile Screens</string> + </property> <property name="text"> <string>...</string> </property> + <property name="icon"> + <iconset theme="format-view-grid-small"/> + </property> </widget> </item> </layout> @@ -88,7 +123,7 @@ </item> </layout> </item> - <item row="2" column="1"> + <item row="3" column="1"> <spacer name="verticalSpacer_3"> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -101,7 +136,7 @@ </property> </spacer> </item> - <item row="3" column="1"> + <item row="4" column="1"> <layout class="QHBoxLayout" name="horizontalLayout_4"> <item> <spacer name="horizontalSpacer_2"> @@ -118,13 +153,29 @@ </item> </layout> </item> - <item row="1" column="1"> + <item row="1" column="0"> + <widget class="QLabel" name="label_2"> + <property name="font"> + <font> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Rotation:</string> + </property> + </widget> + </item> + <item row="2" column="1"> <widget class="QCheckBox" name="check_primary"> <property name="text"> <string>Primary Screen</string> </property> </widget> </item> + <item row="1" column="1"> + <widget class="QComboBox" name="combo_rotation"/> + </item> </layout> </widget> <widget class="QWidget" name="tab_new"> diff --git a/src-qt5/core-utils/lumina-xconfig/ScreenSettings.cpp b/src-qt5/core-utils/lumina-xconfig/ScreenSettings.cpp index 6122c1a9..13ed86f4 100644 --- a/src-qt5/core-utils/lumina-xconfig/ScreenSettings.cpp +++ b/src-qt5/core-utils/lumina-xconfig/ScreenSettings.cpp @@ -29,6 +29,7 @@ void RRSettings::ApplyPrevious(){ if(screens[i].isprimary){ primary = screens[i].ID; } screens[i].isactive = lastactive.contains(screens[i].ID); screens[i].order = (screens[i].isactive ? -1 : -3); //check/ignore + screens[i].rotation = set.value("rotation",0).toInt(); set.endGroup(); }else if(screens[i].isavailable){ screens[i].order = -2; //needs activation/placement @@ -116,6 +117,8 @@ QList<ScreenInfo> RRSettings::CurrentScreens(){ QString devres = info[i].section(" ",2,2, QString::SectionSkipEmpty); if(!devres.contains("x")){ devres = info[i].section(" ",3,3,QString::SectionSkipEmpty); } if(!devres.contains("x")){ devres.clear(); } + //Pull the monitor rotation mode out as well (last word before the parenthesis) + QString devrotate = info[i].section("(",0,0).split(" ",QString::SkipEmptyParts).last(); qDebug() << " - ID:" <<dev << "Current Geometry:" << devres; //qDebug() << " - Res:" << devres; if( !devres.contains("x") || !devres.contains("+") ){ devres.clear(); } @@ -127,12 +130,16 @@ QList<ScreenInfo> RRSettings::CurrentScreens(){ }else if( !devres.isEmpty() ){ cscreen.isprimary = info[i].contains(" primary "); //Device that is connected and attached (has a resolution) - qDebug() << "Create new Screen entry:" << dev << devres; + qDebug() << "Create new Screen entry:" << dev << devres << devrotate << info[i].section("(",0,0); cscreen.ID = dev; //Note: devres format: "<width>x<height>+<xoffset>+<yoffset>" cscreen.geom.setRect( devres.section("+",-2,-2).toInt(), devres.section("+",-1,-1).toInt(), devres.section("x",0,0).toInt(), devres.section("+",0,0).section("x",1,1).toInt() ); cscreen.isavailable = true; cscreen.isactive = true; + if(devrotate=="left"){ cscreen.rotation = -90; } + else if(devrotate=="right"){ cscreen.rotation = 90; } + else if(devrotate=="inverted"){ cscreen.rotation = 180; } + else{ cscreen.rotation = 0; } }else if(info[i].contains(" connected")){ //Device that is connected, but not attached qDebug() << "Create new Screen entry:" << dev << "none"; @@ -164,6 +171,7 @@ bool RRSettings::SaveScreens(QList<ScreenInfo> screens){ set.beginGroup(screens[i].ID); set.setValue("geometry", screens[i].geom); set.setValue("isprimary", screens[i].isprimary); + set.setValue("rotation", screens[i].rotation); set.endGroup(); } set.setValue("lastActive",active); @@ -178,15 +186,18 @@ bool RRSettings::SaveScreens(QList<ScreenInfo> screens){ void RRSettings::Apply(QList<ScreenInfo> screens){ //Read all the settings and create the xrandr options to maintain these settings QStringList opts; - qDebug() << "Apply:" << screens.length(); + //qDebug() << "Apply:" << screens.length(); for(int i=0; i<screens.length(); i++){ qDebug() << " -- Screen:" << i << screens[i].ID << screens[i].isactive << screens[i].order; if(screens[i].order <0 || !screens[i].isactive){ 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()); opts << "--pos" << QString::number(screens[i].geom.x())+"x"+QString::number(screens[i].geom.y()); + if(screens[i].rotation==-90){ opts << "--rotate" << "left"; } + else if(screens[i].rotation==90){ opts << "--rotate" << "right"; } + else if(screens[i].rotation==180){ opts << "--rotate" << "inverted"; } + else{ opts << "--rotate" << "normal"; } if(screens[i].isprimary){ opts << "--primary"; } } - qDebug() << "Run command: xrandr" << opts; + //qDebug() << "Run command: xrandr" << opts; LUtils::runCmd("xrandr", opts); - //LUtils::runCmd("sleep 2; killall fluxbox"); //restart fluxbox as needed - it can't handle xrandr changes to the current session } diff --git a/src-qt5/core-utils/lumina-xconfig/ScreenSettings.h b/src-qt5/core-utils/lumina-xconfig/ScreenSettings.h index 5826f804..0532cf72 100644 --- a/src-qt5/core-utils/lumina-xconfig/ScreenSettings.h +++ b/src-qt5/core-utils/lumina-xconfig/ScreenSettings.h @@ -13,7 +13,7 @@ #include <QStringList> class ScreenInfo{ - public: + public: QString ID; QRect geom; //screen geometry bool isprimary; @@ -21,13 +21,15 @@ class ScreenInfo{ bool isavailable; int order; //left to right QStringList resList; + int rotation; //possible values: [-90, 0, 90, 180] //Initial Defaults ScreenInfo(){ - order = -1; //initial value is invalid + order = -1; //initial value is invalid isprimary = false; isactive = false; isavailable = false; + rotation = 0; //no rotation by default } ~ScreenInfo(){} }; @@ -42,9 +44,9 @@ public: //Save the screen config for later static bool SaveScreens(QList<ScreenInfo> screens); - + //Apply screen configuration static void Apply(QList<ScreenInfo> screens); -}; +}; #endif |