diff options
-rw-r--r-- | kcontrol/iccconfig/Makefile.am | 4 | ||||
-rw-r--r-- | kcontrol/iccconfig/iccconfig.cpp | 319 | ||||
-rw-r--r-- | kcontrol/iccconfig/iccconfig.h | 27 | ||||
-rw-r--r-- | kcontrol/iccconfig/iccconfigbase.ui | 136 | ||||
-rw-r--r-- | kcontrol/iccconfig/iccconfigbase2.ui | 104 | ||||
-rw-r--r-- | kcontrol/randr/krandrtray.cpp | 49 | ||||
-rw-r--r-- | kcontrol/randr/krandrtray.h | 5 |
7 files changed, 478 insertions, 166 deletions
diff --git a/kcontrol/iccconfig/Makefile.am b/kcontrol/iccconfig/Makefile.am index 8ebd2b289..3484a3708 100644 --- a/kcontrol/iccconfig/Makefile.am +++ b/kcontrol/iccconfig/Makefile.am @@ -3,9 +3,9 @@ kde_module_LTLIBRARIES = kcm_iccconfig.la kcm_iccconfig_la_SOURCES = iccconfig.cpp iccconfigbase.ui iccconfig.skel -kcm_iccconfig_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined +kcm_iccconfig_la_LDFLAGS = $(all_libraries) -lkrandr -module -avoid-version -no-undefined -kcm_iccconfig_la_LIBADD = -lkdeui $(LIB_KIO) +kcm_iccconfig_la_LIBADD = -lkdeui $(LIB_KIO) $(LIB_XRANDR) METASOURCES = AUTO diff --git a/kcontrol/iccconfig/iccconfig.cpp b/kcontrol/iccconfig/iccconfig.cpp index 4174f3ce8..05ea09cac 100644 --- a/kcontrol/iccconfig/iccconfig.cpp +++ b/kcontrol/iccconfig/iccconfig.cpp @@ -1,8 +1,7 @@ /** - * smartcard.cpp + * iccconfig.cpp * - * Copyright (c) 2001 George Staikos <staikos@kde.org> - * Copyright (c) 2001 Fernando Llobregat <fernando.llobregat@free.fr> + * Copyright (c) 2009-2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,8 +18,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "iccconfig.h" - #include <qcheckbox.h> #include <qlabel.h> #include <qlayout.h> @@ -32,6 +29,7 @@ #include <kaboutdata.h> #include <kapplication.h> #include <kconfig.h> +#include <kcombobox.h> #include <kdebug.h> #include <kdialog.h> #include <kglobal.h> @@ -39,6 +37,7 @@ #include <klocale.h> #include <kmessagebox.h> #include <kpopupmenu.h> +#include <kinputdialog.h> #include <kurlrequester.h> #include <kgenericfactory.h> @@ -48,6 +47,8 @@ #include <stdio.h> #include <qstring.h> +#include "iccconfig.h" + using namespace std; /**** DLL Interface ****/ @@ -55,6 +56,7 @@ typedef KGenericFactory<KICCConfig, QWidget> KICCCFactory; K_EXPORT_COMPONENT_FACTORY( kcm_iccconfig, KICCCFactory("kcmiccconfig") ) KSimpleConfig *config; +KSimpleConfig *systemconfig; /**** KICCConfig ****/ @@ -63,7 +65,8 @@ KICCConfig::KICCConfig(QWidget *parent, const char *name, const QStringList &) { QVBoxLayout *layout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint()); - config = new KSimpleConfig( QString::fromLatin1( KDE_CONFDIR "/kicc/kiccconfigrc" )); + config = new KSimpleConfig( QString::fromLatin1( "kiccconfigrc" )); + systemconfig = new KSimpleConfig( QString::fromLatin1( KDE_CONFDIR "/kicc/kiccconfigrc" )); KAboutData *about = new KAboutData(I18N_NOOP("kcmiccconfig"), I18N_NOOP("KDE ICC Profile Control Module"), @@ -76,25 +79,149 @@ KICCConfig::KICCConfig(QWidget *parent, const char *name, const QStringList &) base = new ICCConfigBase(this); layout->add(base); - setRootOnlyMsg(i18n("<b>The ICC color profile is a system wide setting, and requires administrator access</b><br>To alter the system's ICC profile, click on the \"Administrator Mode\" button below.")); + setRootOnlyMsg(i18n("<b>The global ICC color profile is a system wide setting, and requires administrator access</b><br>To alter the system's global ICC profile, click on the \"Administrator Mode\" button below.")); setUseRootOnlyMsg(true); + connect(base->systemEnableSupport, SIGNAL(clicked()), SLOT(changed())); + connect(base->systemEnableSupport, SIGNAL(toggled(bool)), base->systemIccFile, SLOT(setEnabled(bool))); connect(base->enableSupport, SIGNAL(clicked()), SLOT(changed())); connect(base->enableSupport, SIGNAL(toggled(bool)), base->iccFile, SLOT(setEnabled(bool))); + connect(base->enableSupport, SIGNAL(toggled(bool)), base->randrScreenList, SLOT(setEnabled(bool))); + connect(base->enableSupport, SIGNAL(toggled(bool)), base->iccProfileList, SLOT(setEnabled(bool))); + connect(base->enableSupport, SIGNAL(toggled(bool)), base->addProfileButton, SLOT(setEnabled(bool))); + connect(base->enableSupport, SIGNAL(toggled(bool)), base->renameProfileButton, SLOT(setEnabled(bool))); + connect(base->enableSupport, SIGNAL(toggled(bool)), base->deleteProfileButton, SLOT(setEnabled(bool))); + connect(base->iccProfileList, SIGNAL(activated(int)), this, SLOT(selectProfile(int))); + connect(base->randrScreenList, SIGNAL(activated(int)), this, SLOT(selectScreen(int))); + connect(base->iccFile, SIGNAL(textChanged(const QString&)), SLOT(updateArray())); + connect(base->systemIccFile, SIGNAL(textChanged(const QString&)), SLOT(changed())); - connect(base->iccFile, SIGNAL(textChanged(const QString&)), SLOT(changed())); + connect(base->addProfileButton, SIGNAL(clicked()), this, SLOT(addProfile())); + connect(base->renameProfileButton, SIGNAL(clicked()), this, SLOT(renameProfile())); + connect(base->deleteProfileButton, SIGNAL(clicked()), this, SLOT(deleteProfile())); load(); - if (getuid() != 0 || !config->checkConfigFilesWritable( true )) { + if (!config->checkConfigFilesWritable( true )) { base->enableSupport->setEnabled(false); + base->randrScreenList->setEnabled(false); + base->iccProfileList->setEnabled(false); base->iccFile->setEnabled(false); + base->addProfileButton->setEnabled(false); + base->renameProfileButton->setEnabled(false); + base->deleteProfileButton->setEnabled(false); + } + + if (getuid() != 0 || !systemconfig->checkConfigFilesWritable( true )) { + base->systemEnableSupport->setEnabled(false); + base->systemIccFile->setEnabled(false); } } KICCConfig::~KICCConfig() { + delete [] iccFileArray; delete config; + delete systemconfig; +} + +void KICCConfig::deleteProfile () { + int i; + QString *iccFileArrayNew; + + // Delete the profile + config->deleteGroup(base->iccProfileList->currentText()); + base->iccProfileList->removeItem(base->iccProfileList->currentItem()); + base->iccProfileList->setCurrentItem(base->iccProfileList->count()-1); + + // Contract the profile memory + numberOfProfiles--; + iccFileArrayNew = new QString[numberOfProfiles*numberOfScreens]; + for (i=0;i<(numberOfProfiles*numberOfScreens);i++) { + iccFileArrayNew[i] = iccFileArray[i]; + } + delete [] iccFileArray; + iccFileArray = iccFileArrayNew; +} + +void KICCConfig::renameProfile () { + int i; + QString *iccFileArrayNew; + + // Pop up a text entry box asking for the name of the new profile + bool _ok = false; + bool _end = false; + QString _new; + QString _text = i18n("Please enter the new profile name below:"); + QString _error; + + while (!_end) { + _new = KInputDialog::getText( i18n("ICC Profile Configuration"), _error + _text, QString::null, &_ok, this); + if (!_ok ) { + _end = true; + } else { + _error = QString(); + if (!_new.isEmpty()) { + if (findProfileIndex(_new) != -1) + _error = i18n("Error: A profile with that name already exists") + QString("\n"); + else + _end = true; + } + } + } + + // Rename the profile + config->deleteGroup(base->iccProfileList->currentText()); + base->iccProfileList->changeItem(_new, base->iccProfileList->currentItem()); + + updateDisplayedInformation(); + emit changed(); +} + +void KICCConfig::addProfile () { + int i; + QString *iccFileArrayNew; + + // Pop up a text entry box asking for the name of the new profile + bool _ok = false; + bool _end = false; + QString _new; + QString _text = i18n("Please enter the new profile name below:"); + QString _error; + + while (!_end) { + _new = KInputDialog::getText( i18n("ICC Profile Configuration"), _error + _text, QString::null, &_ok, this); + if (!_ok ) { + _end = true; + } else { + _error = QString(); + if (!_new.isEmpty()) { + if (findProfileIndex(_new) != -1) + _error = i18n("Error: A profile with that name already exists") + QString("\n"); + else + _end = true; + } + } + } + + // Expand the profile memory + numberOfProfiles++; + iccFileArrayNew = new QString[numberOfProfiles*numberOfScreens]; + for (i=0;i<((numberOfProfiles-1)*numberOfScreens);i++) { + iccFileArrayNew[i] = iccFileArray[i]; + } + delete [] iccFileArray; + iccFileArray = iccFileArrayNew; + for (;i<(numberOfProfiles*numberOfScreens);i++) { + iccFileArray[i] = ""; + } + + // Insert the new profile name + base->iccProfileList->insertItem(_new, -1); + base->iccProfileList->setCurrentItem(base->iccProfileList->count()-1); + + updateDisplayedInformation(); + emit changed(); } void KICCConfig::load() @@ -102,52 +229,170 @@ void KICCConfig::load() load( false ); } +void KICCConfig::selectProfile (int slotNumber) { + updateDisplayedInformation(); + emit changed(); +} + +void KICCConfig::selectScreen (int slotNumber) { + updateDisplayedInformation(); +} + +void KICCConfig::updateArray (void) { + iccFileArray[((base->iccProfileList->currentItem())*(base->randrScreenList->count()))+(base->randrScreenList->currentItem())] = base->iccFile->url(); + config->setGroup(base->iccProfileList->currentText()); + if (config->readEntry(base->randrScreenList->currentText()) != iccFileArray[((base->iccProfileList->currentItem())*(base->randrScreenList->count()))+(base->randrScreenList->currentItem())]) { + emit changed(); + } +} + +void KICCConfig::updateDisplayedInformation () { + base->iccFile->setURL(iccFileArray[((base->iccProfileList->currentItem())*(base->randrScreenList->count()))+(base->randrScreenList->currentItem())]); +} + +QString KICCConfig::extractFileName(QString displayName, QString profileName) { + // +} + +int KICCConfig::findProfileIndex(QString profileName) { + int i; + for (i=0;i<numberOfProfiles;i++) { + if (base->iccProfileList->text(i) == profileName) { + return i; + } + } + return -1; +} + +int KICCConfig::findScreenIndex(QString screenName) { + int i; + for (i=0;i<(base->randrScreenList->count());i++) { + if (base->randrScreenList->text(i) == screenName) { + return i; + } + } + return -1; +} + void KICCConfig::load(bool useDefaults ) { //Update the toggle buttons with the current configuration + int i; + int j; + + // FIXME Should use font size (basically resultant string length) to set button widths... + base->addProfileButton->setFixedWidth(110); + base->renameProfileButton->setFixedWidth(90); + base->deleteProfileButton->setFixedWidth(90); + + XRROutputInfo *output_info; + KRandrSimpleAPI *randrsimple = new KRandrSimpleAPI::KRandrSimpleAPI(); config->setReadDefaults( useDefaults ); + config->setGroup(NULL); base->enableSupport->setChecked(config->readBoolEntry("EnableICC", false)); + base->randrScreenList->setEnabled(config->readBoolEntry("EnableICC", false)); + base->iccProfileList->setEnabled(config->readBoolEntry("EnableICC", false)); base->iccFile->setEnabled(config->readBoolEntry("EnableICC", false)); - base->iccFile->setURL(config->readEntry("ICCFile")); + base->addProfileButton->setEnabled(config->readBoolEntry("EnableICC", false)); + base->renameProfileButton->setEnabled(config->readBoolEntry("EnableICC", false)); + base->deleteProfileButton->setEnabled(config->readBoolEntry("EnableICC", false)); + + numberOfScreens = 0; + if (randrsimple->isValid() == true) { + randr_display = XOpenDisplay(NULL); + randr_screen_info = randrsimple->read_screen_info(randr_display); + for (i = 0; i < randr_screen_info->n_output; i++) { + output_info = randr_screen_info->outputs[i]->info; + base->randrScreenList->insertItem(output_info->name, -1); + numberOfScreens++; + } + } + else { + base->randrScreenList->insertItem("Default", -1); + numberOfScreens++; + } + + // Find all profile names + numberOfProfiles = 0; + cfgProfiles = config->groupList(); + for (QStringList::Iterator i(cfgProfiles.begin()); i != cfgProfiles.end(); ++i) { + base->iccProfileList->insertItem((*i), -1); + numberOfProfiles++; + } + if (numberOfProfiles == 0) { + base->iccProfileList->insertItem("<default>", -1); + numberOfProfiles++; + } + + // Load all profiles into memory + iccFileArray = new QString[numberOfProfiles*numberOfScreens]; + for (i=0;i<(base->iccProfileList->count());i++) { + config->setGroup(base->iccProfileList->text(i)); + for (j=0;j<(base->randrScreenList->count());j++) { + iccFileArray[(i*(base->randrScreenList->count()))+j] = config->readEntry(base->randrScreenList->text(j)); + } + } + + if ((findProfileIndex(base->iccProfileList->currentText()) >= 0) && (findScreenIndex(base->randrScreenList->currentText()) >= 0)) { + base->iccFile->setURL(iccFileArray[(findProfileIndex(base->iccProfileList->currentText())*base->randrScreenList->count())+findScreenIndex(base->randrScreenList->currentText())]); + } + else { + base->iccFile->setURL(""); + } + + systemconfig->setGroup(NULL); + base->systemEnableSupport->setChecked(systemconfig->readBoolEntry("EnableICC", false)); + base->systemIccFile->setEnabled(systemconfig->readBoolEntry("EnableICC", false)); + base->systemIccFile->setURL(systemconfig->readEntry("ICCFile")); + + delete randrsimple; emit changed(useDefaults); } void KICCConfig::save() { + int i; + int j; + KRandrSimpleAPI *randrsimple = new KRandrSimpleAPI::KRandrSimpleAPI(); + + // Write system configuration + systemconfig->setGroup(NULL); + systemconfig->writeEntry("EnableICC", base->systemEnableSupport->isChecked()); + systemconfig->writeEntry("ICCFile", base->systemIccFile->url()); + + // Write user configuration + config->setGroup(NULL); + config->writeEntry("DefaultProfile", m_defaultProfile); config->writeEntry("EnableICC", base->enableSupport->isChecked()); - config->writeEntry("ICCFile", base->iccFile->url()); - - if (base->enableSupport->isChecked()) { - // Apply ICC settings with XCalib - string icc_command="/usr/bin/xcalib "; - FILE *pipe_xcalib; - char xcalib_result[2048]; - int i; - xcalib_result[0]=0; - - icc_command.append(base->iccFile->url().ascii()); - if ((pipe_xcalib = popen(icc_command.c_str(), "r")) == NULL) - { - printf("Xcalib pipe error\n\r"); - } - else { - fgets(xcalib_result, 2048, pipe_xcalib); - pclose(pipe_xcalib); - for (i=1;i<2048;i++) { - if (xcalib_result[i] == 0) { - xcalib_result[i-1]=0; - i=2048; - } - } - if (strlen(xcalib_result) > 2) { - KMessageBox::error(this, QString("Unable to apply ICC configuration:\n\r%1").arg(xcalib_result)); - } + + // Save all profiles to disk + for (i=0;i<(base->iccProfileList->count());i++) { + config->setGroup(base->iccProfileList->text(i)); + for (j=0;j<(base->randrScreenList->count());j++) { + config->writeEntry(base->randrScreenList->text(j), iccFileArray[(i*(base->randrScreenList->count()))+j]); } } + config->sync(); + systemconfig->sync(); + + QString errorstr; + if (base->enableSupport->isChecked() == true) { + errorstr = randrsimple->applyIccConfiguration(base->iccProfileList->currentText(), KDE_CONFDIR); + } + else if (base->systemEnableSupport->isChecked() == true) { + errorstr = randrsimple->applySystemWideIccConfiguration(KDE_CONFDIR); + } + else { + errorstr = randrsimple->clearIccConfiguration(); + } + if (errorstr != "") { + KMessageBox::error(this, QString("Unable to apply ICC configuration:\n\r%1").arg(errorstr)); + } + emit changed(false); } diff --git a/kcontrol/iccconfig/iccconfig.h b/kcontrol/iccconfig/iccconfig.h index 0736968b4..a12c9a49d 100644 --- a/kcontrol/iccconfig/iccconfig.h +++ b/kcontrol/iccconfig/iccconfig.h @@ -1,7 +1,7 @@ /** * iccconfig.h * - * Copyright (c) 2009 Timothy Pearson <kb9vqf@pearsoncomputing.net> + * Copyright (c) 2009-2010 Timothy Pearson <kb9vqf@pearsoncomputing.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ #include <dcopobject.h> -#include <kcmodule.h> +#include <libkrandr/libkrandr.h> #include "iccconfigbase.h" @@ -62,9 +62,26 @@ private: KConfig *config; bool _ok; - KPopupMenu * _popUpKardChooser; - - + Display *randr_display; + ScreenInfo *randr_screen_info; + int numberOfProfiles; + int numberOfScreens; + QStringList cfgScreenInfo; + QStringList cfgProfiles; + void updateDisplayedInformation (); + QString extractFileName(QString displayName, QString profileName); + QString *iccFileArray; + int findProfileIndex(QString profileName); + int findScreenIndex(QString screenName); + QString m_defaultProfile; + +private slots: + void selectProfile (int slotNumber); + void selectScreen (int slotNumber); + void updateArray (void); + void addProfile (void); + void renameProfile (void); + void deleteProfile (void); }; #endif diff --git a/kcontrol/iccconfig/iccconfigbase.ui b/kcontrol/iccconfig/iccconfigbase.ui index 0d6689fd7..c9be0818f 100644 --- a/kcontrol/iccconfig/iccconfigbase.ui +++ b/kcontrol/iccconfig/iccconfigbase.ui @@ -34,31 +34,131 @@ <property name="name"> <cstring>unnamed</cstring> </property> - <widget class="QCheckBox" row="0" column="0" colspan="2"> - <property name="name"> - <cstring>enableSupport</cstring> - </property> - <property name="text"> - <string>&Enable global ICC color profile support</string> - </property> - </widget> - <widget class="KURLRequester" row="1" column="1"> + <widget class="QGroupBox" row="0" column="0"> <property name="name"> - <cstring>iccFile</cstring> + <cstring>groupSystemSettings</cstring> </property> - <property name="filter"> - <string>*.icc</string> + <property name="title"> + <string>System Settings</string> </property> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="0" column="0" colspan="2"> + <property name="name"> + <cstring>systemEnableSupport</cstring> + </property> + <property name="text"> + <string>&Enable global ICC color profile support</string> + </property> + </widget> + <widget class="KURLRequester" row="1" column="1" colspan="4"> + <property name="name"> + <cstring>systemIccFile</cstring> + </property> + <property name="filter"> + <string>*.icc</string> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>textLabel4_2</cstring> + </property> + <property name="text"> + <string>ICC File</string> + </property> + </widget> + </grid> </widget> - <widget class="QLabel" row="1" column="0"> + <widget class="QGroupBox" row="1" column="0"> <property name="name"> - <cstring>textLabel2_2</cstring> + <cstring>groupUserSettings</cstring> </property> - <property name="text"> - <string>ICC File</string> + <property name="title"> + <string>User Settings</string> </property> - </widget> - <spacer row="2" column="0"> + <grid> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QCheckBox" row="0" column="0" colspan="2"> + <property name="name"> + <cstring>enableSupport</cstring> + </property> + <property name="text"> + <string>&Enable user ICC color profile support</string> + </property> + </widget> + <widget class="KComboBox" row="1" column="1"> + <property name="name"> + <cstring>iccProfileList</cstring> + </property> + </widget> + <widget class="QLabel" row="1" column="0"> + <property name="name"> + <cstring>textLabel2_9</cstring> + </property> + <property name="text"> + <string>Current Profile</string> + </property> + </widget> + <widget class="KPushButton" row="1" column="2"> + <property name="name"> + <cstring>addProfileButton</cstring> + </property> + <property name="text"> + <string>Create New</string> + </property> + </widget> + <widget class="KPushButton" row="1" column="3"> + <property name="name"> + <cstring>renameProfileButton</cstring> + </property> + <property name="text"> + <string>Rename</string> + </property> + </widget> + <widget class="KPushButton" row="1" column="4"> + <property name="name"> + <cstring>deleteProfileButton</cstring> + </property> + <property name="text"> + <string>Delete</string> + </property> + </widget> + <widget class="KComboBox" row="2" column="1" colspan="4"> + <property name="name"> + <cstring>randrScreenList</cstring> + </property> + </widget> + <widget class="QLabel" row="2" column="0"> + <property name="name"> + <cstring>textLabel2_8</cstring> + </property> + <property name="text"> + <string>Settings for output</string> + </property> + </widget> + <widget class="KURLRequester" row="3" column="1" colspan="4"> + <property name="name"> + <cstring>iccFile</cstring> + </property> + <property name="filter"> + <string>*.icc</string> + </property> + </widget> + <widget class="QLabel" row="3" column="0"> + <property name="name"> + <cstring>textLabel2_2</cstring> + </property> + <property name="text"> + <string>ICC File</string> + </property> + </widget> + </grid> + </widget> + <spacer row="4" column="0"> <property name="name" stdset="0"> <cstring>Spacer4</cstring> </property> diff --git a/kcontrol/iccconfig/iccconfigbase2.ui b/kcontrol/iccconfig/iccconfigbase2.ui deleted file mode 100644 index cad130b47..000000000 --- a/kcontrol/iccconfig/iccconfigbase2.ui +++ /dev/null @@ -1,104 +0,0 @@ -<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> -<class>ICCConfigBase</class> -<widget class="QWidget"> - <property name="name"> - <cstring>ICCConfigBase</cstring> - </property> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>519</width> - <height>356</height> - </rect> - </property> - <property name="caption"> - <string>ICCConfigBase</string> - </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QTabWidget" row="0" column="0"> - <property name="name"> - <cstring>TabWidget2</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <widget class="QWidget"> - <property name="name"> - <cstring>tab</cstring> - </property> - <attribute name="title"> - <string>ICC Color Profile Configuration</string> - </attribute> - <grid> - <property name="name"> - <cstring>unnamed</cstring> - </property> - <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2"> - <property name="name"> - <cstring>enableSupport</cstring> - </property> - <property name="text"> - <string>&Enable ICC color profile support</string> - </property> - </widget> - <widget class="KURLRequester" row="1" column="1"> - <property name="name"> - <cstring>editPCF</cstring> - </property> - <property name="filter"> - <string>.icc</string> - </property> - </widget> - <widget class="QLabel" row="1" column="0"> - <property name="name"> - <cstring>textLabel2_2</cstring> - </property> - <property name="text"> - <string>ICC File</string> - </property> - </widget> - <spacer row="2" column="0"> - <property name="name"> - <cstring>Spacer4</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </grid> - </widget> - </widget> - </grid> -</widget> -<connections> - <connection> - <sender>enableSupport</sender> - <signal>toggled(bool)</signal> - <receiver>ICCConfigBase</receiver> - <slot>enableSupport_toggled(bool)</slot> - </connection> -</connections> -<slots> - <slot>enableSupport_toggled(bool)</slot> -</slots> -<layoutdefaults spacing="3" margin="6"/> -<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/> -<includehints> - <includehint>kurlrequester.h</includehint> - <includehint>klineedit.h</includehint> - <includehint>kpushbutton.h</includehint> -</includehints> -</UI> diff --git a/kcontrol/randr/krandrtray.cpp b/kcontrol/randr/krandrtray.cpp index 18d14bdc6..292d51380 100644 --- a/kcontrol/randr/krandrtray.cpp +++ b/kcontrol/randr/krandrtray.cpp @@ -78,6 +78,14 @@ KRandRSystemTray::KRandRSystemTray(QWidget* parent, const char *name) last_known_x = currentScreen()->currentPixelWidth(); last_known_y = currentScreen()->currentPixelHeight(); } + + t_config = new KSimpleConfig("kiccconfigrc"); + + QString cur_profile; + cur_profile = getCurrentProfile(); + if (cur_profile != "") { + applyIccConfiguration(cur_profile, NULL); + } } void KRandRSystemTray::mousePressEvent(QMouseEvent* e) @@ -179,8 +187,26 @@ void KRandRSystemTray::contextMenuAboutToShow(KPopupMenu* menu) addOutputMenu(menu); + // Find any user ICC profiles + menu->insertTitle(SmallIcon("kcoloredit"), i18n("Color Profile")); + QStringList cfgProfiles; + cfgProfiles = t_config->groupList(); + for (QStringList::Iterator t(cfgProfiles.begin()); t != cfgProfiles.end(); ++t) { + lastIndex = menu->insertItem(*t); + if (t_config->readEntry("CurrentProfile") == (*t)) { + menu->setItemChecked(lastIndex, true); + } + menu->setItemEnabled(lastIndex, t_config->readBoolEntry("EnableICC", false)); + menu->connectItem(lastIndex, this, SLOT(slotColorProfileChanged(int))); + } + menu->insertTitle(SmallIcon("randr"), i18n("Global Configuation")); + KAction *actColors = new KAction( i18n( "Configure Color Profiles..." ), + SmallIconSet( "configure" ), KShortcut(), this, SLOT( slotColorConfig() ), + actionCollection() ); + actColors->plug( menu ); + // KAction *actPrefs = new KAction( i18n( "Configure Display..." ), // SmallIconSet( "configure" ), KShortcut(), this, SLOT( slotPrefs() ), // actionCollection() ); @@ -194,6 +220,8 @@ void KRandRSystemTray::contextMenuAboutToShow(KPopupMenu* menu) menu->insertItem(SmallIcon("help"),KStdGuiItem::help().text(), m_help->menu()); KAction *quitAction = actionCollection()->action(KStdAction::name(KStdAction::Quit)); quitAction->plug(menu); + + m_menu = menu; } void KRandRSystemTray::slotScreenActivated() @@ -225,6 +253,12 @@ void KRandRSystemTray::configChanged() } first = false; + + QString cur_profile; + cur_profile = getCurrentProfile(); + if (cur_profile != "") { + applyIccConfiguration(cur_profile, NULL); + } } int KRandRSystemTray::GetDefaultResolutionParameter() @@ -401,6 +435,15 @@ void KRandRSystemTray::slotPrefs() kcm->exec(); } +void KRandRSystemTray::slotColorConfig() +{ + KCMultiDialog *kcm = new KCMultiDialog( KDialogBase::Plain, i18n( "Configure" ), this ); + + kcm->addModule( "iccconfig" ); + kcm->setPlainCaption( i18n( "Configure Display Color Profiles" ) ); + kcm->exec(); +} + void KRandRSystemTray::slotSettingsChanged(int category) { if ( category == (int) KApplication::SETTINGS_SHORTCUTS ) { @@ -693,6 +736,12 @@ void KRandRSystemTray::addOutputMenu(KPopupMenu* menu) } } +void KRandRSystemTray::slotColorProfileChanged(int parameter) +{ + t_config->writeEntry("CurrentProfile", m_menu->text(parameter)); + applyIccConfiguration(m_menu->text(parameter), NULL); +} + void KRandRSystemTray::slotOutputChanged(int parameter) { XRROutputInfo *output_info; diff --git a/kcontrol/randr/krandrtray.h b/kcontrol/randr/krandrtray.h index fac91e358..d34c85071 100644 --- a/kcontrol/randr/krandrtray.h +++ b/kcontrol/randr/krandrtray.h @@ -50,10 +50,12 @@ protected slots: void slotOrientationChanged(int parameter); void slotRefreshRateChanged(int parameter); void slotPrefs(); + void slotColorConfig(); void slotSKeys(); void slotSettingsChanged(int category); void slotCycleDisplays(); void slotOutputChanged(int parameter); + void slotColorProfileChanged(int parameter); protected: void mousePressEvent( QMouseEvent *e ); @@ -75,6 +77,9 @@ private: int last_known_x; int last_known_y; + + KPopupMenu* m_menu; + KSimpleConfig *t_config; }; #endif |