From 261c0e1f6b9a69442520936ef7f91e1eac9f9514 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sat, 12 Jan 2013 04:30:22 -0600 Subject: [PATCH] Add display hotplug support to TDM Fix displayconfig control module --- kcontrol/displayconfig/displayconfig.cpp | 57 +++++++++++++-------- kcontrol/displayconfig/displayconfig.h | 1 + kcontrol/displayconfig/displayconfigbase.ui | 14 ++--- tdeinit/displayconfig.cpp | 2 +- tdm/kfrontend/kgapp.cpp | 19 ++++++- tdm/kfrontend/kgapp.h | 6 ++- 6 files changed, 66 insertions(+), 33 deletions(-) diff --git a/kcontrol/displayconfig/displayconfig.cpp b/kcontrol/displayconfig/displayconfig.cpp index 9c3d37849..9d38de323 100644 --- a/kcontrol/displayconfig/displayconfig.cpp +++ b/kcontrol/displayconfig/displayconfig.cpp @@ -797,6 +797,8 @@ KDisplayConfig::KDisplayConfig(TQWidget *parent, const char *name, const TQStrin connect(base->activateProfileButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(activateProfile())); connect(base->reloadProfileButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(reloadProfileFromDisk())); connect(base->saveProfileButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(saveProfile())); + connect(base->systemEnableStartupProfile, TQT_SIGNAL(clicked()), this, TQT_SLOT(changed())); + connect(base->systemEnableStartupProfile, TQT_SIGNAL(clicked()), this, TQT_SLOT(processLockoutControls())); connect(base->startupDisplayProfileList, TQT_SIGNAL(activated(int)), this, TQT_SLOT(changed())); connect(base->startupDisplayProfileList, TQT_SIGNAL(activated(int)), this, TQT_SLOT(selectDefaultProfile(int))); connect(base->displayProfileList, TQT_SIGNAL(activated(int)), this, TQT_SLOT(selectProfile(int))); @@ -877,8 +879,9 @@ void KDisplayConfig::updateExtendedMonitorInformation () { void KDisplayConfig::rescanHardware (void) { m_randrsimple->destroyScreenInformationObject(m_screenInfoArray[activeProfileName]); - m_screenInfoArray[activeProfileName] = m_randrsimple->readCurrentDisplayConfiguration(); - m_randrsimple->ensureMonitorDataConsistency(m_screenInfoArray[activeProfileName]); + m_hardwareScreenInfoArray = m_randrsimple->readCurrentDisplayConfiguration(); + m_randrsimple->ensureMonitorDataConsistency(m_hardwareScreenInfoArray); + m_screenInfoArray[activeProfileName] = m_randrsimple->copyScreenInformationObject(m_hardwareScreenInfoArray); numberOfScreens = m_screenInfoArray[activeProfileName].count(); refreshDisplayedInformation(); } @@ -964,7 +967,9 @@ void KDisplayConfig::loadProfileFromDiskHelper(bool forceReload) { // If there is still no valid configuration, read the active display information from the hardware // to initialise the configuration... if (m_screenInfoArray[activeProfileName].count() < 1) { - m_screenInfoArray[activeProfileName] = m_randrsimple->readCurrentDisplayConfiguration(); + m_hardwareScreenInfoArray = m_randrsimple->readCurrentDisplayConfiguration(); + m_randrsimple->ensureMonitorDataConsistency(m_hardwareScreenInfoArray); + m_screenInfoArray[activeProfileName] = m_randrsimple->copyScreenInformationObject(m_hardwareScreenInfoArray); } m_randrsimple->ensureMonitorDataConsistency(m_screenInfoArray[activeProfileName]); @@ -1153,8 +1158,9 @@ void KDisplayConfig::selectScreen (int slotNumber) { } void KDisplayConfig::updateArray (void) { - m_screenInfoArray[activeProfileName] = m_randrsimple->readCurrentDisplayConfiguration(); - m_randrsimple->ensureMonitorDataConsistency(m_screenInfoArray[activeProfileName]); + m_hardwareScreenInfoArray = m_randrsimple->readCurrentDisplayConfiguration(); + m_randrsimple->ensureMonitorDataConsistency(m_hardwareScreenInfoArray); + m_screenInfoArray[activeProfileName] = m_randrsimple->copyScreenInformationObject(m_hardwareScreenInfoArray); numberOfScreens = m_screenInfoArray[activeProfileName].count(); } @@ -1641,7 +1647,7 @@ void KDisplayConfig::createHotplugRulesGrid() { TQLabel* label; SingleScreenData *screendata; for (i=0;iprofileRulesGridWidget, (TQString("%1").arg(i)).ascii()); if (screendata) { label->setText(screendata->screenUniqueName); @@ -1658,7 +1664,7 @@ void KDisplayConfig::createHotplugRulesGrid() { HotPlugRulesList::Iterator it2; for (it2=currentHotplugRules.begin(); it2 != currentHotplugRules.end(); ++it2) { for (j=0;jscreenUniqueName); + int index = (*it2).outputs.findIndex(m_hardwareScreenInfoArray.at(j)->screenUniqueName); TQCheckBox* cb = new TQCheckBox(base->profileRulesGridWidget, (TQString("%1:%2").arg(i).arg(j)).ascii()); connect(cb, TQT_SIGNAL(stateChanged(int)), this, TQT_SLOT(profileRuleCheckBoxStateChanged(int))); @@ -1707,14 +1713,6 @@ void KDisplayConfig::createHotplugRulesGrid() { connect(button, TQT_SIGNAL(clicked()), this, TQT_SLOT(changed())); profileRulesGrid->addMultiCellWidget(button, i+2, i+2, 0, numberOfScreens+2); button->show(); - - if (getuid() == 0) { - // FIXME - label = new TQLabel(base->profileRulesGridWidget, ""); - label->setText(i18n("NOTE: Hotplug support for the graphical login manager is only partly implemented!")); - profileRulesGrid->addMultiCellWidget(label, i+3, i+3, 0, numberOfScreens+2); - label->show(); - } } void KDisplayConfig::addNewProfileRule() { @@ -1861,6 +1859,7 @@ void KDisplayConfig::processLockoutControls() { base->saveProfileButton->setEnabled(false); base->activateProfileButton->setEnabled(false); base->startupDisplayProfileList->setEnabled(false); + base->systemEnableStartupProfile->setEnabled(false); base->groupProfileRules->setEnabled(false); } else { @@ -1876,8 +1875,14 @@ void KDisplayConfig::processLockoutControls() { base->reloadProfileButton->setEnabled(true); base->saveProfileButton->setEnabled(true); base->activateProfileButton->setEnabled(true); - base->startupDisplayProfileList->setEnabled(true); + base->systemEnableStartupProfile->setEnabled(true); base->groupProfileRules->setEnabled(true); + if (base->systemEnableStartupProfile->isChecked()) { + base->startupDisplayProfileList->setEnabled(true); + } + else { + base->startupDisplayProfileList->setEnabled(false); + } } else { base->resolutionTab->setEnabled(false); @@ -1891,6 +1896,7 @@ void KDisplayConfig::processLockoutControls() { base->saveProfileButton->setEnabled(false); base->activateProfileButton->setEnabled(false); base->startupDisplayProfileList->setEnabled(false); + base->systemEnableStartupProfile->setEnabled(false); base->groupProfileRules->setEnabled(false); } } @@ -1935,10 +1941,16 @@ void KDisplayConfig::load(bool useDefaults ) // Update the toggle buttons with the current configuration updateArray(); - systemconfig->setGroup(NULL); - base->systemEnableSupport->setChecked(systemconfig->readBoolEntry("EnableDisplayControl", false)); - - startupProfileName = systemconfig->readEntry("StartupProfileName", ""); + if (getuid() != 0) { + base->systemEnableSupport->setChecked(m_randrsimple->getDisplayConfigurationEnabled(locateLocal("config", "/", true))); + base->systemEnableStartupProfile->setChecked(m_randrsimple->getDisplayConfigurationStartupAutoApplyEnabled(locateLocal("config", "/", true))); + startupProfileName = m_randrsimple->getDisplayConfigurationStartupAutoApplyName(locateLocal("config", "/", true)); + } + else { + base->systemEnableStartupProfile->setChecked(m_randrsimple->getDisplayConfigurationStartupAutoApplyEnabled(KDE_CONFDIR)); + base->systemEnableSupport->setChecked(m_randrsimple->getDisplayConfigurationEnabled(KDE_CONFDIR)); + startupProfileName = m_randrsimple->getDisplayConfigurationStartupAutoApplyName(KDE_CONFDIR); + } updateStartupProfileLabel(); refreshDisplayedInformation(); @@ -1968,10 +1980,10 @@ void KDisplayConfig::load(bool useDefaults ) void KDisplayConfig::saveActiveSystemWideProfileToDisk() { if (getuid() != 0) { - m_randrsimple->saveDisplayConfiguration(base->systemEnableSupport->isChecked(), activeProfileName, startupProfileName, locateLocal("config", "/", true), m_screenInfoArray[activeProfileName]); + m_randrsimple->saveDisplayConfiguration(base->systemEnableSupport->isChecked(), base->systemEnableStartupProfile->isChecked(), activeProfileName, startupProfileName, locateLocal("config", "/", true), m_screenInfoArray[activeProfileName]); } else { - m_randrsimple->saveDisplayConfiguration(base->systemEnableSupport->isChecked(), activeProfileName, startupProfileName, KDE_CONFDIR, m_screenInfoArray[activeProfileName]); + m_randrsimple->saveDisplayConfiguration(base->systemEnableSupport->isChecked(), base->systemEnableStartupProfile->isChecked(), activeProfileName, startupProfileName, KDE_CONFDIR, m_screenInfoArray[activeProfileName]); } } @@ -1991,6 +2003,7 @@ void KDisplayConfig::save() // Write system configuration systemconfig->setGroup(NULL); systemconfig->writeEntry("EnableDisplayControl", base->systemEnableSupport->isChecked()); + systemconfig->writeEntry("EnableAutoStartProfile", base->systemEnableStartupProfile->isChecked()); systemconfig->writeEntry("StartupProfileName", startupProfileName); systemconfig->sync(); diff --git a/kcontrol/displayconfig/displayconfig.h b/kcontrol/displayconfig/displayconfig.h index 8cb47940c..62e53209f 100644 --- a/kcontrol/displayconfig/displayconfig.h +++ b/kcontrol/displayconfig/displayconfig.h @@ -86,6 +86,7 @@ private: TQString m_defaultProfile; KRandrSimpleAPI *m_randrsimple; ScreenConfigurationMap m_screenInfoArray; + TQPtrList m_hardwareScreenInfoArray; TQString activeProfileName; TQString startupProfileName; int realResolutionSliderValue(); diff --git a/kcontrol/displayconfig/displayconfigbase.ui b/kcontrol/displayconfig/displayconfigbase.ui index 2019ed700..edd6a2328 100644 --- a/kcontrol/displayconfig/displayconfigbase.ui +++ b/kcontrol/displayconfig/displayconfigbase.ui @@ -58,13 +58,13 @@ unnamed - - - textLabel2_0 - - - Startup Profile: - + + + systemEnableStartupProfile + + + &Automatically apply profile on startup + diff --git a/tdeinit/displayconfig.cpp b/tdeinit/displayconfig.cpp index 0f4811d0b..4150300fa 100644 --- a/tdeinit/displayconfig.cpp +++ b/tdeinit/displayconfig.cpp @@ -63,7 +63,7 @@ int main(int argc, char **argv) #ifdef WITH_XRANDR // Load up user specific display settings KRandrSimpleAPI *randrsimple = new KRandrSimpleAPI(); - randrsimple->applyDisplayConfiguration("", locateLocal("config", "/", true)); + randrsimple->applyStartupDisplayConfiguration(locateLocal("config", "/", true)); randrsimple->applyHotplugRules(locateLocal("config", "/", true)); delete randrsimple; #endif diff --git a/tdm/kfrontend/kgapp.cpp b/tdm/kfrontend/kgapp.cpp index bb57b617b..120e20cb4 100644 --- a/tdm/kfrontend/kgapp.cpp +++ b/tdm/kfrontend/kgapp.cpp @@ -100,6 +100,9 @@ GreeterApp::GreeterApp() alarm( pingInterval * 70 ); // sic! give the "proper" pinger enough time startTimer( pingInterval * 60000 ); } + + TDEHardwareDevices *hwdevices = KGlobal::hardwareDevices(); + connect(hwdevices, TQT_SIGNAL(hardwareUpdated(TDEGenericDevice*)), this, TQT_SLOT(deviceChanged(TDEGenericDevice*))); } GreeterApp::GreeterApp(Display *dpy, Qt::HANDLE visual, Qt::HANDLE colormap) : KApplication(dpy, visual, colormap) @@ -114,6 +117,17 @@ GreeterApp::GreeterApp(Display *dpy, Qt::HANDLE visual, Qt::HANDLE colormap) : K alarm( pingInterval * 70 ); // sic! give the "proper" pinger enough time startTimer( pingInterval * 60000 ); } + + TDEHardwareDevices *hwdevices = KGlobal::hardwareDevices(); + connect(hwdevices, TQT_SIGNAL(hardwareUpdated(TDEGenericDevice*)), this, TQT_SLOT(deviceChanged(TDEGenericDevice*))); +} + +void GreeterApp::deviceChanged(TDEGenericDevice* device) { + if (device->type() == TDEGenericDeviceType::Monitor) { + KRandrSimpleAPI *randrsimple = new KRandrSimpleAPI(); + randrsimple->applyHotplugRules(KDE_CONFDIR); + delete randrsimple; + } } void @@ -272,13 +286,14 @@ kg_main( const char *argv0 ) Display *dpy = tqt_xdisplay(); - if (!_GUIStyle.isEmpty()) + if (!_GUIStyle.isEmpty()) { app->setStyle( _GUIStyle ); + } // Load up systemwide display settings #ifdef WITH_XRANDR KRandrSimpleAPI *randrsimple = new KRandrSimpleAPI(); - TQPoint primaryScreenPosition = randrsimple->applyDisplayConfiguration("", KDE_CONFDIR); + TQPoint primaryScreenPosition = randrsimple->applyStartupDisplayConfiguration(KDE_CONFDIR); randrsimple->applyHotplugRules(KDE_CONFDIR); delete randrsimple; #endif diff --git a/tdm/kfrontend/kgapp.h b/tdm/kfrontend/kgapp.h index 2c4374f47..4769ff65a 100644 --- a/tdm/kfrontend/kgapp.h +++ b/tdm/kfrontend/kgapp.h @@ -27,6 +27,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define KGAPP_H #include +#include class GreeterApp : public KApplication { Q_OBJECT @@ -41,7 +42,10 @@ class GreeterApp : public KApplication { virtual void timerEvent( TQTimerEvent * ); signals: - void activity(); + void activity(); + + private slots: + void deviceChanged( TDEGenericDevice * ); private: int pingInterval;