[platforms/hwcomposer] Reset old brightness when turning screen back on

Summary:
Now powerdevil can adjust brightness using leds subsystem, however, kwin
as well sets brightness to 0 for turning off screen and 0xff when
turning screen back on. This resets the brightness set by the powerdevil
to 100%.

As a solution now kwin listens to brightnessChanged dbus signal of
brightnesscontrol and book-keeps the changed brightness, if screen is
turned off it sets brightness to 0 and when turning screen on, it resets
to old brightness.

If powermanagement service doesn't appear on dbus by default it restores
100% brightness.

Test Plan:
Appearantly this still doesn't work as-it-is on phone, because powerdevil
doesn't emit brightnessChanged dbus signal because of bug in the driver of
backlight control, driver doesn't seem to trigger uevents for changes in
backlight. But with hack in powerdevil to emit brightnessChanged when setting
brightness, this works

Reviewers: broulik, #plasma_on_wayland, graesslin

Reviewed By: #plasma_on_wayland, graesslin

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D2468
This commit is contained in:
Bhushan Shah 2016-08-17 14:39:58 +05:30
parent e40344c6bb
commit c04e764369
2 changed files with 13 additions and 1 deletions

View file

@ -31,6 +31,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <KWayland/Server/seat_interface.h>
// Qt
#include <QKeyEvent>
#include <QDBusConnection>
// hybris/android
#include <hardware/hardware.h>
#include <hardware/hwcomposer.h>
@ -143,6 +144,13 @@ void BacklightInputEventFilter::toggleBacklight()
HwcomposerBackend::HwcomposerBackend(QObject *parent)
: Platform(parent)
{
if (!QDBusConnection::sessionBus().connect(QStringLiteral("org.kde.Solid.PowerManagement"),
QStringLiteral("/org/kde/Solid/PowerManagement/Actions/BrightnessControl"),
QStringLiteral("org.kde.Solid.PowerManagement.Actions.BrightnessControl"),
QStringLiteral("brightnessChanged"), this,
SLOT(screenBrightnessChanged(int)))) {
qCWarning(KWIN_HWCOMPOSER) << "Failed to connect to brightness control";
}
handleOutputs();
}
@ -321,7 +329,7 @@ void HwcomposerBackend::toggleScreenBrightness()
if (!m_lights) {
return;
}
const int brightness = m_outputBlank ? 0 : 0xFF;
const int brightness = m_outputBlank ? 0 : m_oldScreenBrightness;
struct light_state_t state;
state.flashMode = LIGHT_FLASH_NONE;
state.brightnessMode = BRIGHTNESS_MODE_USER;

View file

@ -86,6 +86,9 @@ Q_SIGNALS:
private Q_SLOTS:
void toggleBlankOutput();
void screenBrightnessChanged(int brightness) {
m_oldScreenBrightness = brightness;
}
private:
void initLights();
@ -96,6 +99,7 @@ private:
bool m_outputBlank = true;
int m_refreshRate = 60000;
int m_vsyncInterval = 16;
int m_oldScreenBrightness = 0xff;
bool m_hasVsync = false;
QMutex m_vsyncMutex;
QWaitCondition m_vsyncWaitCondition;