From 5b3becd0a5f8f20530034d657db5fc16e4001983 Mon Sep 17 00:00:00 2001 From: tpearson Date: Sat, 3 Sep 2011 22:46:14 +0000 Subject: [PATCH] Add DPMS support to libkrandr git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdelibs@1251242 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- krandr/CMakeLists.txt | 2 +- krandr/libkrandr.cc | 70 +++++++++++++++++++++++++++++++++++++++++++ krandr/libkrandr.h | 5 ++++ krandr/randr.h | 6 ++++ 4 files changed, 82 insertions(+), 1 deletion(-) diff --git a/krandr/CMakeLists.txt b/krandr/CMakeLists.txt index 9f1b45755..31ab2a067 100644 --- a/krandr/CMakeLists.txt +++ b/krandr/CMakeLists.txt @@ -43,6 +43,6 @@ set( ${target}_SRCS tde_add_library( ${target} SHARED AUTOMOC SOURCES ${${target}_SRCS} VERSION 0.0.95 - LINK kdeui-shared ${XRANDR_LIBRARIES} + LINK kdeui-shared ${XRANDR_LIBRARIES} Xext DESTINATION ${LIB_INSTALL_DIR} ) diff --git a/krandr/libkrandr.cc b/krandr/libkrandr.cc index 956328872..182ca7dcf 100644 --- a/krandr/libkrandr.cc +++ b/krandr/libkrandr.cc @@ -33,6 +33,8 @@ #include "libkrandr.h" +#include + // FIXME // For now, just use the standalone xrandr program to apply the display settings #define USE_XRANDR_PROGRAM @@ -433,6 +435,11 @@ void KRandrSimpleAPI::saveSystemwideDisplayConfiguration(bool enable, TQString p display_config->writeEntry("AbsYPos", screendata->absolute_y_position); display_config->writeEntry("CurrentXPixelCount", screendata->current_x_pixel_count); display_config->writeEntry("CurrentYPixelCount", screendata->current_y_pixel_count); + display_config->writeEntry("HasDPMS", screendata->has_dpms); + display_config->writeEntry("EnableDPMS", screendata->enable_dpms); + display_config->writeEntry("DPMSStandbyDelay", screendata->dpms_standby_delay); + display_config->writeEntry("DPMSSuspendDelay", screendata->dpms_suspend_delay); + display_config->writeEntry("DPMSPowerDownDelay", screendata->dpms_off_delay); i++; } @@ -510,6 +517,11 @@ TQPtrList KRandrSimpleAPI::loadSystemwideDisplayConfiguration( screendata->absolute_y_position = display_config->readNumEntry("AbsYPos"); screendata->current_x_pixel_count = display_config->readNumEntry("CurrentXPixelCount"); screendata->current_y_pixel_count = display_config->readNumEntry("CurrentYPixelCount"); + screendata->has_dpms = display_config->readBoolEntry("HasDPMS"); + screendata->enable_dpms = display_config->readBoolEntry("EnableDPMS"); + screendata->dpms_standby_delay = display_config->readNumEntry("DPMSStandbyDelay"); + screendata->dpms_suspend_delay = display_config->readNumEntry("DPMSSuspendDelay"); + screendata->dpms_off_delay = display_config->readNumEntry("DPMSPowerDownDelay"); } } @@ -699,6 +711,7 @@ bool KRandrSimpleAPI::applySystemwideDisplayConfiguration(TQPtrList sc } } +void KRandrSimpleAPI::applySystemwideDisplayDPMS(TQPtrList screenInfoArray) { + int i; + Display *randr_display; + XRROutputInfo *output_info; + ScreenInfo *randr_screen_info; + XRRCrtcGamma *gamma; + + SingleScreenData *screendata; + + if (isValid() == true) { + randr_display = qt_xdisplay(); + randr_screen_info = read_screen_info(randr_display); + for (i = 0; i < randr_screen_info->n_output; i++) { + screendata = screenInfoArray.at(i); + output_info = randr_screen_info->outputs[i]->info; + CrtcInfo *current_crtc = randr_screen_info->outputs[i]->cur_crtc; + if (!current_crtc) { + continue; + } + if (!screendata->has_dpms) { + continue; + } + if (screendata->enable_dpms) { + DPMSSetTimeouts(randr_display, screendata->dpms_standby_delay, screendata->dpms_suspend_delay, screendata->dpms_off_delay); + DPMSEnable(randr_display); + } + else { + DPMSDisable(randr_display); + } + } + freeScreenInfoStructure(randr_screen_info); + } +} + void KRandrSimpleAPI::freeScreenInfoStructure(ScreenInfo* screen_info) { int i; @@ -946,6 +993,29 @@ TQPtrList KRandrSimpleAPI::readCurrentDisplayConfiguration() { } } + // Get DPMS information + if (screendata->has_dpms) { + CARD16 dpms_standby_delay; + CARD16 dpms_suspend_delay; + CARD16 dpms_off_delay; + screendata->has_dpms = DPMSGetTimeouts(randr_display, &dpms_standby_delay, &dpms_suspend_delay, &dpms_off_delay); + screendata->dpms_standby_delay = dpms_standby_delay; + screendata->dpms_suspend_delay = dpms_suspend_delay; + screendata->dpms_off_delay = dpms_off_delay; + if (screendata->has_dpms) { + CARD16 power_level; + BOOL enable_dpms; + screendata->has_dpms = DPMSInfo(randr_display, &power_level, &enable_dpms); + screendata->enable_dpms = enable_dpms; + } + } + if (!screendata->has_dpms) { + screendata->enable_dpms = false; + screendata->dpms_standby_delay = 0; + screendata->dpms_suspend_delay = 0; + screendata->dpms_off_delay = 0; + } + if (cur_screen) { screendata->screen_connected = true; for (int j = 0; j < cur_screen->numSizes(); j++) { diff --git a/krandr/libkrandr.h b/krandr/libkrandr.h index 6ef7a4b8d..f2a60340a 100644 --- a/krandr/libkrandr.h +++ b/krandr/libkrandr.h @@ -201,6 +201,11 @@ class KRANDR_EXPORT KRandrSimpleAPI : public RandRDisplay */ void applySystemwideDisplayGamma(TQPtrList screenInfoArray); + /** + * Applies the DPMS settings contained within the systemwide display configuration screenInfoArray to the hardware + */ + void applySystemwideDisplayDPMS(TQPtrList screenInfoArray); + /** * Destroys a screen information object */ diff --git a/krandr/randr.h b/krandr/randr.h index 9faf9b366..5e77016f2 100644 --- a/krandr/randr.h +++ b/krandr/randr.h @@ -59,6 +59,12 @@ struct SingleScreenData { int absolute_y_position; int current_x_pixel_count; int current_y_pixel_count; + + bool has_dpms; + bool enable_dpms; + unsigned int dpms_standby_delay; + unsigned int dpms_suspend_delay; + unsigned int dpms_off_delay; }; class RandRScreen : public TQObject