summaryrefslogtreecommitdiffstats
path: root/kcontrol/displayconfig/displayconfig.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/displayconfig/displayconfig.cpp')
-rw-r--r--kcontrol/displayconfig/displayconfig.cpp266
1 files changed, 261 insertions, 5 deletions
diff --git a/kcontrol/displayconfig/displayconfig.cpp b/kcontrol/displayconfig/displayconfig.cpp
index 98285276a..3498327b0 100644
--- a/kcontrol/displayconfig/displayconfig.cpp
+++ b/kcontrol/displayconfig/displayconfig.cpp
@@ -43,6 +43,7 @@
#include <kurlrequester.h>
#include <kcmoduleloader.h>
#include <kgenericfactory.h>
+#include <kstandarddirs.h>
#include <unistd.h>
#include <ksimpleconfig.h>
@@ -642,18 +643,84 @@ void KDisplayConfig::moveMonitor(DraggableMonitor* monitor, int realx, int realy
monitor->move(base->monitorPhyArrange->width(), base->monitorPhyArrange->height());
}
+// int KDisplayConfig::realResolutionSliderValue() {
+// return base->resolutionSlider->maxValue() - base->resolutionSlider->value();
+// }
+//
+// void KDisplayConfig::setRealResolutionSliderValue(int index) {
+// base->resolutionSlider->setValue(base->resolutionSlider->maxValue() - index);
+// }
+
+TQStringList sortResolutions(TQStringList unsorted) {
+ int i;
+ int xres;
+ int largest;
+ TQStringList sorted;
+ TQStringList::Iterator it;
+ TQStringList::Iterator largestit;
+
+ while (unsorted.count()) {
+ largest = -1;
+ for ( it = unsorted.begin(); it != unsorted.end(); ++it ) {
+ TQString resolutionstring = *it;
+ int separator_pos = resolutionstring.find(" x ");
+ TQString x_res_string = resolutionstring.left(separator_pos);
+ TQString y_res_string = resolutionstring.right(resolutionstring.length()-separator_pos-3);
+ xres = x_res_string.toInt();
+ if (xres > largest) {
+ largest = xres;
+ largestit = it;
+ }
+ }
+ sorted.prepend(*largestit);
+ unsorted.remove(largestit);
+ }
+
+ return sorted;
+}
+
int KDisplayConfig::realResolutionSliderValue() {
- return base->resolutionSlider->maxValue() - base->resolutionSlider->value();
+ int i;
+ int j;
+ SingleScreenData *screendata;
+
+ screendata = m_screenInfoArray.at(base->monitorDisplaySelectDD->currentItem());
+ TQStringList sortedList = screendata->resolutions;
+ sortedList = sortResolutions(sortedList);
+
+ j=0;
+ for (i=0; i<screendata->resolutions.count(); i++) {
+ if ((*sortedList.at(base->resolutionSlider->value())) == (*screendata->resolutions.at(i))) {
+ j=i;
+ }
+ }
+
+ return j;
}
void KDisplayConfig::setRealResolutionSliderValue(int index) {
- base->resolutionSlider->setValue(base->resolutionSlider->maxValue() - index);
+ int i;
+ int j;
+ SingleScreenData *screendata;
+
+ screendata = m_screenInfoArray.at(base->monitorDisplaySelectDD->currentItem());
+ TQStringList sortedList = screendata->resolutions;
+ sortedList = sortResolutions(sortedList);
+
+ j=0;
+ for (i=0; i<screendata->resolutions.count(); i++) {
+ if ((*sortedList.at(i)) == (*screendata->resolutions.at(index))) {
+ j=i;
+ }
+ }
+
+ base->resolutionSlider->setValue(j);
}
/**** KDisplayConfig ****/
KDisplayConfig::KDisplayConfig(TQWidget *parent, const char *name, const TQStringList &)
- : KCModule(KDisplayCFactory::instance(), parent, name), m_randrsimple(0)
+ : KCModule(KDisplayCFactory::instance(), parent, name), m_randrsimple(0), m_gammaApplyTimer(0)
{
m_randrsimple = new KRandrSimpleAPI();
@@ -669,6 +736,9 @@ KDisplayConfig::KDisplayConfig(TQWidget *parent, const char *name, const TQStrin
about->addAuthor("Timothy Pearson", 0, "kb9vqf@pearsoncomputing.net");
setAboutData( about );
+ m_gammaApplyTimer = new TQTimer();
+ connect(m_gammaApplyTimer, SIGNAL(timeout()), this, SLOT(applyGamma()));
+
base = new DisplayConfigBase(this);
layout->add(base);
@@ -678,12 +748,19 @@ KDisplayConfig::KDisplayConfig(TQWidget *parent, const char *name, const TQStrin
connect(base->systemEnableSupport, TQT_SIGNAL(clicked()), TQT_SLOT(changed()));
connect(base->systemEnableSupport, TQT_SIGNAL(clicked()), TQT_SLOT(processLockoutControls()));
connect(base->monitorDisplaySelectDD, TQT_SIGNAL(activated(int)), TQT_SLOT(changed()));
+ connect(base->gammamonitorDisplaySelectDD, TQT_SIGNAL(activated(int)), TQT_SLOT(changed()));
+ connect(base->gammaTargetSelectDD, TQT_SIGNAL(activated(int)), TQT_SLOT(gammaTargetChanged(int)));
connect(base->rotationSelectDD, TQT_SIGNAL(activated(int)), TQT_SLOT(rotationInfoChanged()));
connect(base->refreshRateDD, TQT_SIGNAL(activated(int)), TQT_SLOT(refreshInfoChanged()));
connect(base->orientationHFlip, TQT_SIGNAL(clicked()), TQT_SLOT(rotationInfoChanged()));
connect(base->orientationVFlip, TQT_SIGNAL(clicked()), TQT_SLOT(rotationInfoChanged()));
connect(base->resolutionSlider, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(resolutionSliderChanged(int)));
+ connect(base->gammaAllSlider, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(gammaAllSliderChanged(int)));
+ connect(base->gammaRedSlider, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(gammaRedSliderChanged(int)));
+ connect(base->gammaGreenSlider, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(gammaGreenSliderChanged(int)));
+ connect(base->gammaBlueSlider, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(gammaBlueSliderChanged(int)));
connect(base->monitorDisplaySelectDD, TQT_SIGNAL(activated(int)), TQT_SLOT(selectScreen(int)));
+ connect(base->gammamonitorDisplaySelectDD, TQT_SIGNAL(activated(int)), TQT_SLOT(gammaselectScreen(int)));
connect(base->monitorPhyArrange, TQT_SIGNAL(workspaceRelayoutNeeded()), this, TQT_SLOT(layoutDragDropDisplay()));
connect(base->isPrimaryMonitorCB, TQT_SIGNAL(clicked()), TQT_SLOT(changed()));
@@ -708,6 +785,10 @@ KDisplayConfig::KDisplayConfig(TQWidget *parent, const char *name, const TQStrin
KDisplayConfig::~KDisplayConfig()
{
delete systemconfig;
+ if (m_gammaApplyTimer) {
+ delete m_gammaApplyTimer;
+ m_gammaApplyTimer = 0;
+ }
if (m_randrsimple) {
delete m_randrsimple;
m_randrsimple = 0;
@@ -750,7 +831,7 @@ void KDisplayConfig::identifyMonitors () {
ScreenInfo *randr_screen_info;
XRROutputInfo *output_info;
- randr_display = XOpenDisplay(NULL);
+ randr_display = qt_xdisplay();
randr_screen_info = m_randrsimple->read_screen_info(randr_display);
for (i = 0; i < randr_screen_info->n_output; i++) {
@@ -774,6 +855,8 @@ void KDisplayConfig::identifyMonitors () {
KDialog::centerOnScreen(idWidget, i);
TQTimer::singleShot(3000, idWidget, SLOT(close()));
}
+
+ m_randrsimple->freeScreenInfoStructure(randr_screen_info);
}
void KDisplayConfig::deleteProfile () {
@@ -803,6 +886,7 @@ void KDisplayConfig::selectProfile (int slotNumber) {
void KDisplayConfig::selectScreen (int slotNumber) {
base->monitorDisplaySelectDD->setCurrentItem(slotNumber);
+ base->gammamonitorDisplaySelectDD->setCurrentItem(slotNumber);
updateDisplayedInformation();
}
@@ -920,6 +1004,12 @@ void KDisplayConfig::refreshDisplayedInformation () {
base->monitorDisplaySelectDD->insertItem(screendata->screenFriendlyName, i);
}
base->monitorDisplaySelectDD->setCurrentItem(currentScreenIndex);
+ base->gammamonitorDisplaySelectDD->clear();
+ for (i=0;i<numberOfScreens;i++) {
+ screendata = m_screenInfoArray.at(i);
+ base->gammamonitorDisplaySelectDD->insertItem(screendata->screenFriendlyName, i);
+ }
+ base->gammamonitorDisplaySelectDD->setCurrentItem(currentScreenIndex);
updateDisplayedInformation();
@@ -956,7 +1046,7 @@ void KDisplayConfig::updateDragDropDisplay() {
for (j=0;j<2;j++) {
for (i=0;i<numberOfScreens;i++) {
screendata = m_screenInfoArray.at(i);
- if (((j==0) && (screendata->is_primary==true)) || (j==1)) { // This ensures that the primary monitor is always the first one created and placed on the configuration widget
+ if (((j==0) && (screendata->is_primary==true)) || ((j==1) && (screendata->is_primary==false))) { // This ensures that the primary monitor is always the first one created and placed on the configuration widget
TQString rotationDesired = *screendata->rotations.at(screendata->current_rotation_index);
bool isvisiblyrotated = ((rotationDesired == "Rotate 90 degrees") || (rotationDesired == "Rotate 270 degrees"));
DraggableMonitor *m = new DraggableMonitor( base->monitorPhyArrange, 0, WStyle_Customize | WDestructiveClose | WStyle_NoBorder | WX11BypassWM );
@@ -1080,18 +1170,173 @@ int KDisplayConfig::findScreenIndex(TQString screenName) {
}
+void KDisplayConfig::setGammaLabels() {
+ SingleScreenData *screendata;
+
+ screendata = m_screenInfoArray.at(base->gammamonitorDisplaySelectDD->currentItem());
+
+ // Round off the gammas to one decimal place
+ screendata->gamma_red = floorf(screendata->gamma_red * 10 + 0.5) / 10;
+ screendata->gamma_green = floorf(screendata->gamma_green * 10 + 0.5) / 10;
+ screendata->gamma_blue = floorf(screendata->gamma_blue * 10 + 0.5) / 10;
+
+ // Set the labels
+ base->gammaAllLabel->setText(TQString("%1").tqarg(((float)base->gammaAllSlider->value())/10.0, 0, 'f', 1));
+ base->gammaRedLabel->setText(TQString("%1").tqarg(((float)base->gammaRedSlider->value())/10.0, 0, 'f', 1));
+ base->gammaGreenLabel->setText(TQString("%1").tqarg(((float)base->gammaGreenSlider->value())/10.0, 0, 'f', 1));
+ base->gammaBlueLabel->setText(TQString("%1").tqarg(((float)base->gammaBlueSlider->value())/10.0, 0, 'f', 1));
+}
+
+void KDisplayConfig::gammaSetAverageAllSlider() {
+ float average_gamma;
+ SingleScreenData *screendata;
+
+ screendata = m_screenInfoArray.at(base->gammamonitorDisplaySelectDD->currentItem());
+ average_gamma = (screendata->gamma_red+screendata->gamma_green+screendata->gamma_blue)/3.0;
+ average_gamma = floorf(average_gamma* 10 + 0.5) / 10; // Round off the gamma to one decimal place
+ base->gammaAllSlider->setValue(average_gamma*10.0);
+}
+
+void KDisplayConfig::gammaselectScreen (int slotNumber) {
+ SingleScreenData *screendata;
+
+ base->gammaAllSlider->blockSignals(true);
+ base->gammaRedSlider->blockSignals(true);
+ base->gammaGreenSlider->blockSignals(true);
+ base->gammaBlueSlider->blockSignals(true);
+
+ screendata = m_screenInfoArray.at(base->gammamonitorDisplaySelectDD->currentItem());
+ base->gammaRedSlider->setValue(screendata->gamma_red*10.0);
+ base->gammaGreenSlider->setValue(screendata->gamma_green*10.0);
+ base->gammaBlueSlider->setValue(screendata->gamma_blue*10.0);
+ gammaSetAverageAllSlider();
+ setGammaLabels();
+
+ base->gammaAllSlider->blockSignals(false);
+ base->gammaRedSlider->blockSignals(false);
+ base->gammaGreenSlider->blockSignals(false);
+ base->gammaBlueSlider->blockSignals(false);
+}
+
+void KDisplayConfig::gammaAllSliderChanged(int index) {
+ SingleScreenData *screendata;
+
+ base->gammaAllSlider->blockSignals(true);
+ base->gammaRedSlider->blockSignals(true);
+ base->gammaGreenSlider->blockSignals(true);
+ base->gammaBlueSlider->blockSignals(true);
+
+ screendata = m_screenInfoArray.at(base->gammamonitorDisplaySelectDD->currentItem());
+
+ base->gammaRedSlider->setValue(base->gammaAllSlider->value());
+ base->gammaGreenSlider->setValue(base->gammaAllSlider->value());
+ base->gammaBlueSlider->setValue(base->gammaAllSlider->value());
+ setGammaLabels();
+
+ screendata->gamma_red = ((float)base->gammaAllSlider->value())/10.0;
+ screendata->gamma_green = ((float)base->gammaAllSlider->value())/10.0;
+ screendata->gamma_blue = ((float)base->gammaAllSlider->value())/10.0;
+
+ m_gammaApplyTimer->start(10, TRUE);
+
+ base->gammaAllSlider->blockSignals(false);
+ base->gammaRedSlider->blockSignals(false);
+ base->gammaGreenSlider->blockSignals(false);
+ base->gammaBlueSlider->blockSignals(false);
+
+ changed();
+}
+
+void KDisplayConfig::gammaRedSliderChanged(int index) {
+ SingleScreenData *screendata;
+
+ base->gammaAllSlider->blockSignals(true);
+ base->gammaRedSlider->blockSignals(true);
+ base->gammaGreenSlider->blockSignals(true);
+ base->gammaBlueSlider->blockSignals(true);
+
+ screendata = m_screenInfoArray.at(base->gammamonitorDisplaySelectDD->currentItem());
+ screendata->gamma_red = ((float)index)/10.0;
+ gammaSetAverageAllSlider();
+ setGammaLabels();
+ m_gammaApplyTimer->start(10, TRUE);
+
+ base->gammaAllSlider->blockSignals(false);
+ base->gammaRedSlider->blockSignals(false);
+ base->gammaGreenSlider->blockSignals(false);
+ base->gammaBlueSlider->blockSignals(false);
+
+ changed();
+}
+
+void KDisplayConfig::gammaGreenSliderChanged(int index) {
+ SingleScreenData *screendata;
+
+ base->gammaAllSlider->blockSignals(true);
+ base->gammaRedSlider->blockSignals(true);
+ base->gammaGreenSlider->blockSignals(true);
+ base->gammaBlueSlider->blockSignals(true);
+
+ screendata = m_screenInfoArray.at(base->gammamonitorDisplaySelectDD->currentItem());
+ screendata->gamma_green = ((float)index)/10.0;
+ gammaSetAverageAllSlider();
+ setGammaLabels();
+ m_gammaApplyTimer->start(10, TRUE);
+
+ base->gammaAllSlider->blockSignals(false);
+ base->gammaRedSlider->blockSignals(false);
+ base->gammaGreenSlider->blockSignals(false);
+ base->gammaBlueSlider->blockSignals(false);
+
+ changed();
+}
+
+void KDisplayConfig::gammaBlueSliderChanged(int index) {
+ SingleScreenData *screendata;
+
+ base->gammaAllSlider->blockSignals(true);
+ base->gammaRedSlider->blockSignals(true);
+ base->gammaGreenSlider->blockSignals(true);
+ base->gammaBlueSlider->blockSignals(true);
+
+ screendata = m_screenInfoArray.at(base->gammamonitorDisplaySelectDD->currentItem());
+ screendata->gamma_blue = ((float)index)/10.0;
+ gammaSetAverageAllSlider();
+ setGammaLabels();
+ m_gammaApplyTimer->start(10, TRUE);
+
+ base->gammaAllSlider->blockSignals(false);
+ base->gammaRedSlider->blockSignals(false);
+ base->gammaGreenSlider->blockSignals(false);
+ base->gammaBlueSlider->blockSignals(false);
+
+ changed();
+}
+
+void KDisplayConfig::applyGamma() {
+ m_randrsimple->applySystemwideDisplayGamma(m_screenInfoArray);
+}
+
+void KDisplayConfig::gammaTargetChanged (int slotNumber) {
+ TQPixmap gammaPixmap( locate("data", TQString("kcontrol/pics/gamma%1.png").arg(base->gammaTargetSelectDD->text(slotNumber))) );
+ base->gammaTestImage->setBackgroundPixmap( gammaPixmap );
+}
+
void KDisplayConfig::processLockoutControls() {
if (getuid() != 0 || !systemconfig->checkConfigFilesWritable( true )) {
base->globalTab->setEnabled(false);
base->resolutionTab->setEnabled(false);
+ base->gammaTab->setEnabled(false);
}
else {
base->globalTab->setEnabled(true);
if (base->systemEnableSupport->isChecked()) {
base->resolutionTab->setEnabled(true);
+ base->gammaTab->setEnabled(true);
}
else {
base->resolutionTab->setEnabled(false);
+ base->gammaTab->setEnabled(false);
}
}
@@ -1133,6 +1378,17 @@ void KDisplayConfig::load(bool useDefaults )
refreshDisplayedInformation();
+ gammaselectScreen(base->gammamonitorDisplaySelectDD->currentItem());
+ base->gammaTargetSelectDD->clear();
+ base->gammaTargetSelectDD->insertItem("1.4", 0);
+ base->gammaTargetSelectDD->insertItem("1.6", 1);
+ base->gammaTargetSelectDD->insertItem("1.8", 2);
+ base->gammaTargetSelectDD->insertItem("2.0", 3);
+ base->gammaTargetSelectDD->insertItem("2.2", 4);
+ base->gammaTargetSelectDD->insertItem("2.4", 5);
+ base->gammaTargetSelectDD->setCurrentItem(4);
+ gammaTargetChanged(4);
+
emit changed(useDefaults);
}