From a1b07fe204eedb3e311fa81e9a348f8417f97db7 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Sun, 21 Mar 2021 17:18:44 +0100 Subject: [PATCH] Improve screen brightness control --- .../generic/screenhelper.cpp | 62 ++++++++++++++----- .../generic/screenhelper.h | 4 ++ .../debian/nymea-app-kiosk-wayland.postinst | 17 +++++ 3 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 packaging/ubuntu/debian/nymea-app-kiosk-wayland.postinst diff --git a/nymea-app/platformintegration/generic/screenhelper.cpp b/nymea-app/platformintegration/generic/screenhelper.cpp index 2e99c0de..96b234a9 100644 --- a/nymea-app/platformintegration/generic/screenhelper.cpp +++ b/nymea-app/platformintegration/generic/screenhelper.cpp @@ -90,12 +90,20 @@ ScreenHelper::ScreenHelper(QObject *parent) : QObject(parent) } QSettings settings; - m_screenOffTimer.setInterval(settings.value("screenOffTimeout", 15000).toInt()); + + m_currentBrightness = settings.value("screenBrightness", 80).toInt(); + + + m_screenDimTimer.setInterval(settings.value("screenOffTimeout", 30000).toInt()); + m_screenDimTimer.setSingleShot(true); + connect(&m_screenDimTimer, &QTimer::timeout, this, &ScreenHelper::dimScreen); + if (m_screenDimTimer.interval() > 0) { + m_screenDimTimer.start(); + } + + m_screenOffTimer.setInterval(5000); m_screenOffTimer.setSingleShot(true); connect(&m_screenOffTimer, &QTimer::timeout, this, &ScreenHelper::screenOff); - if (m_screenOffTimer.interval() > 0) { - m_screenOffTimer.start(); - } // Hide the mouse cursor right away, it'll be restored on mouse move events QApplication::setOverrideCursor(Qt::BlankCursor); @@ -109,18 +117,18 @@ bool ScreenHelper::active() const int ScreenHelper::screenTimeout() const { - return m_screenOffTimer.interval(); + return m_screenDimTimer.interval(); } void ScreenHelper::setScreenTimeout(int timeout) { - m_screenOffTimer.setInterval(timeout); + m_screenDimTimer.setInterval(timeout); QSettings settings; settings.setValue("screenOffTimeout", timeout); if (timeout > 0) { - m_screenOffTimer.start(); + m_screenDimTimer.start(); } else { - m_screenOffTimer.stop(); + m_screenDimTimer.stop(); } } @@ -131,9 +139,10 @@ int ScreenHelper::screenBrightness() const void ScreenHelper::setScreenBrightness(int percent) { + QSettings settings; + settings.setValue("screenBrightness", percent); m_currentBrightness = percent; - m_brightnessFile.write(QString("%1\n").arg(percent * m_maxBrightness / 100).toUtf8()); - m_brightnessFile.flush(); + applyBrightness(m_currentBrightness); } bool ScreenHelper::eventFilter(QObject *watched, QEvent *event) @@ -181,20 +190,26 @@ bool ScreenHelper::eventFilter(QObject *watched, QEvent *event) m_cursorHidden = false; } - - if (!m_screenOffTimer.isActive()) { + // No timer is active, means we've off already => turn on and start dim timer, eating the input event + if (!m_screenDimTimer.isActive() && !m_screenOffTimer.isActive()) { screenOn(); - m_screenOffTimer.start(); + m_screenDimTimer.start(); return true; } - m_screenOffTimer.start( ); + // Screen off timer is active, means we've dimmed down already => dim up again and stop offTimer + if (m_screenOffTimer.isActive()) { + m_screenOffTimer.stop(); + applyBrightness(m_currentBrightness); + } + // restart dim timer + m_screenDimTimer.start(); return QObject::eventFilter(watched, event); } void ScreenHelper::screenOn() { qCInfo(dcPlatformIntegration()) << "Turning screen on"; - int ret = m_powerFile.write("0\n"); + qint64 ret = m_powerFile.write("0\n"); m_powerFile.flush(); if (ret < 0) { qCWarning(dcPlatformIntegration()) << "Failed to power on screen"; @@ -204,9 +219,24 @@ void ScreenHelper::screenOn() void ScreenHelper::screenOff() { qCInfo(dcPlatformIntegration()) << "Turning screen off"; - int ret = m_powerFile.write("1\n"); + qint64 ret = m_powerFile.write("1\n"); m_powerFile.flush(); if (ret < 0) { qCWarning(dcPlatformIntegration()) << "Failed to power off screen"; } + applyBrightness(m_currentBrightness); +} + +void ScreenHelper::dimScreen() +{ + applyBrightness(qRound(m_currentBrightness * 0.5)); + m_screenOffTimer.start(); +} + +void ScreenHelper::applyBrightness(int percent) +{ + int absolue = percent * m_maxBrightness / 100; + qCDebug(dcPlatformIntegration()) << "Setting screen brightness to" << absolue << "(" << percent << "%)"; + m_brightnessFile.write(QString("%1\n").arg(absolue).toUtf8()); + m_brightnessFile.flush(); } diff --git a/nymea-app/platformintegration/generic/screenhelper.h b/nymea-app/platformintegration/generic/screenhelper.h index 138bdec5..956b45ca 100644 --- a/nymea-app/platformintegration/generic/screenhelper.h +++ b/nymea-app/platformintegration/generic/screenhelper.h @@ -53,9 +53,13 @@ public: private slots: void screenOn(); void screenOff(); + void dimScreen(); + + void applyBrightness(int percent); private: QTimer m_screenOffTimer; + QTimer m_screenDimTimer; QFile m_powerFile; QFile m_brightnessFile; diff --git a/packaging/ubuntu/debian/nymea-app-kiosk-wayland.postinst b/packaging/ubuntu/debian/nymea-app-kiosk-wayland.postinst new file mode 100644 index 00000000..9aad2334 --- /dev/null +++ b/packaging/ubuntu/debian/nymea-app-kiosk-wayland.postinst @@ -0,0 +1,17 @@ +#!/bin/sh + +# Restart nymea-app after update if it's running +systemctl daemon-reload +systemctl status nymea-app-kiosk > /dev/null 2>&1 +if [ $? -eq 0 ]; then + systemctl restart nymea-app-kiosk + if [ $? -eq 0 ]; then + echo "Successfully restarted nymea app kiosk." + else + echo "FAILED to restart nymea app kiosk." + fi +fi + +#DEBHELPER# + +exit 0