diff --git a/applets/batterymonitor/package/contents/ui/BrightnessItem.qml b/applets/batterymonitor/package/contents/ui/BrightnessItem.qml --- a/applets/batterymonitor/package/contents/ui/BrightnessItem.qml +++ b/applets/batterymonitor/package/contents/ui/BrightnessItem.qml @@ -23,12 +23,16 @@ import org.kde.plasma.core 2.0 as PlasmaCore import org.kde.plasma.components 2.0 as Components +import org.kde.plasma.components 3.0 as Components3 RowLayout { + id: item property alias icon: brightnessIcon.source property alias label: brightnessLabel.text property alias value: brightnessSlider.value - property alias maximumValue: brightnessSlider.maximumValue + property alias maximumValue: brightnessSlider.to + property alias stepSize: brightnessSlider.stepSize + signal moved() spacing: units.gridUnit @@ -51,13 +55,14 @@ height: paintedHeight } - Components.Slider { + Components3.Slider { id: brightnessSlider width: parent.width // Don't allow the slider to turn off the screen // Please see https://git.reviewboard.kde.org/r/122505/ for more information - minimumValue: maximumValue > 100 ? 1 : 0 + from: to > 100 ? 1 : 0 stepSize: 1 + onMoved: item.moved() } } } diff --git a/applets/batterymonitor/package/contents/ui/PopupDialog.qml b/applets/batterymonitor/package/contents/ui/PopupDialog.qml --- a/applets/batterymonitor/package/contents/ui/PopupDialog.qml +++ b/applets/batterymonitor/package/contents/ui/PopupDialog.qml @@ -38,18 +38,6 @@ signal powermanagementChanged(bool checked) - Component.onCompleted: { - // setup handler on slider value manually to avoid change on creation - - brightnessSlider.valueChanged.connect(function() { - batterymonitor.screenBrightness = brightnessSlider.value - }) - - keyboardBrightnessSlider.valueChanged.connect(function() { - batterymonitor.keyboardBrightness = keyboardBrightnessSlider.value - }) - } - Column { id: settingsColumn anchors.horizontalCenter: parent.horizontalCenter @@ -82,6 +70,9 @@ maximumValue: batterymonitor.maximumScreenBrightness KeyNavigation.tab: keyboardBrightnessSlider KeyNavigation.backtab: batteryList + stepSize: batterymonitor.maximumScreenBrightness/100 + + onMoved: batterymonitor.screenBrightness = value // Manually dragging the slider around breaks the binding Connections { @@ -102,6 +93,8 @@ KeyNavigation.tab: pmSwitch KeyNavigation.backtab: brightnessSlider + onMoved: batterymonitor.keyboardBrightness = value + // Manually dragging the slider around breaks the binding Connections { target: batterymonitor diff --git a/applets/batterymonitor/package/contents/ui/batterymonitor.qml b/applets/batterymonitor/package/contents/ui/batterymonitor.qml --- a/applets/batterymonitor/package/contents/ui/batterymonitor.qml +++ b/applets/batterymonitor/package/contents/ui/batterymonitor.qml @@ -105,6 +105,7 @@ readonly property var kcm_energyinfo: ["kcm_energyinfo.desktop"] readonly property bool kcmEnergyInformationAuthorized: KCMShell.authorize(kcm_energyinfo).length > 0 + property QtObject updateScreenBrightnessJob onScreenBrightnessChanged: { if (disableBrightnessUpdate) { return; @@ -114,17 +115,25 @@ operation.brightness = screenBrightness; // show OSD only when the plasmoid isn't expanded since the moving slider is feedback enough operation.silent = plasmoid.expanded - service.startOperationCall(operation); + updateScreenBrightnessJob = service.startOperationCall(operation); + updateScreenBrightnessJob.finished.connect(function(job) { + Logic.updateBrightness(batterymonitor, pmSource); + }); } + + property QtObject updateKeyboardBrightnessJob onKeyboardBrightnessChanged: { if (disableBrightnessUpdate) { return; } var service = pmSource.serviceForSource("PowerDevil"); var operation = service.operationDescription("setKeyboardBrightness"); operation.brightness = keyboardBrightness; operation.silent = plasmoid.expanded - service.startOperationCall(operation); + updateKeyboardBrightnessJob = service.startOperationCall(operation); + updateKeyboardBrightnessJob.finished.connect(function(job) { + Logic.updateBrightness(batterymonitor, pmSource); + }); } function action_powerdevilkcm() { diff --git a/applets/batterymonitor/package/contents/ui/logic.js b/applets/batterymonitor/package/contents/ui/logic.js --- a/applets/batterymonitor/package/contents/ui/logic.js +++ b/applets/batterymonitor/package/contents/ui/logic.js @@ -50,6 +50,9 @@ } function updateBrightness(rootItem, source) { + if (rootItem.updateScreenBrightnessJob || rootItem.updateKeyboardBrightnessJob) + return; + if (!source.data["PowerDevil"]) { return; } diff --git a/dataengines/powermanagement/powermanagementjob.h b/dataengines/powermanagement/powermanagementjob.h --- a/dataengines/powermanagement/powermanagementjob.h +++ b/dataengines/powermanagement/powermanagementjob.h @@ -22,9 +22,10 @@ // plasma #include +class QDBusPendingCall; + class PowerManagementJob : public Plasma::ServiceJob { - Q_OBJECT public: @@ -37,8 +38,8 @@ private: void requestShutDown(); - void setScreenBrightness(int value, bool silent); - void setKeyboardBrightness(int value, bool silent); + QDBusPendingCall setScreenBrightness(int value, bool silent); + QDBusPendingCall setKeyboardBrightness(int value, bool silent); }; #endif // POWERMANAGEMENTJOB_H diff --git a/dataengines/powermanagement/powermanagementjob.cpp b/dataengines/powermanagement/powermanagementjob.cpp --- a/dataengines/powermanagement/powermanagementjob.cpp +++ b/dataengines/powermanagement/powermanagementjob.cpp @@ -41,6 +41,16 @@ { } +static void callWhenFinished(const QDBusPendingCall& pending, std::function func, QObject* parent) +{ + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(pending, parent); + QObject::connect(watcher, &QDBusPendingCallWatcher::finished, + parent, [func](QDBusPendingCallWatcher* watcher) { + watcher->deleteLater(); + func(); + }); +} + void PowerManagementJob::start() { const QString operation = operationName(); @@ -92,37 +102,37 @@ setResult(Solid::PowerManagement::stopSuppressingScreenPowerManagement(parameters().value(QStringLiteral("cookie")).toInt())); return; } else if (operation == QLatin1String("setBrightness")) { - setScreenBrightness(parameters().value(QStringLiteral("brightness")).toInt(), parameters().value(QStringLiteral("silent")).toBool()); - setResult(true); + auto pending = setScreenBrightness(parameters().value(QStringLiteral("brightness")).toInt(), parameters().value(QStringLiteral("silent")).toBool()); + callWhenFinished(pending, [this] { setResult(true); }, this); return; } else if (operation == QLatin1String("setKeyboardBrightness")) { - setKeyboardBrightness(parameters().value(QStringLiteral("brightness")).toInt(), parameters().value(QStringLiteral("silent")).toBool()); - setResult(true); + auto pending = setKeyboardBrightness(parameters().value(QStringLiteral("brightness")).toInt(), parameters().value(QStringLiteral("silent")).toBool()); + callWhenFinished(pending, [this] { setResult(true); }, this); return; } qDebug() << "don't know what to do with " << operation; setResult(false); } -void PowerManagementJob::setScreenBrightness(int value, bool silent) +QDBusPendingCall PowerManagementJob::setScreenBrightness(int value, bool silent) { QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.Solid.PowerManagement"), QStringLiteral("/org/kde/Solid/PowerManagement/Actions/BrightnessControl"), QStringLiteral("org.kde.Solid.PowerManagement.Actions.BrightnessControl"), silent ? "setBrightnessSilent" : "setBrightness"); msg << value; - QDBusConnection::sessionBus().asyncCall(msg); + return QDBusConnection::sessionBus().asyncCall(msg); } -void PowerManagementJob::setKeyboardBrightness(int value, bool silent) +QDBusPendingCall PowerManagementJob::setKeyboardBrightness(int value, bool silent) { QDBusMessage msg = QDBusMessage::createMethodCall(QStringLiteral("org.kde.Solid.PowerManagement"), QStringLiteral("/org/kde/Solid/PowerManagement/Actions/KeyboardBrightnessControl"), QStringLiteral("org.kde.Solid.PowerManagement.Actions.KeyboardBrightnessControl"), silent ? "setKeyboardBrightnessSilent" : "setKeyboardBrightness"); msg << value; - QDBusConnection::sessionBus().asyncCall(msg); + return QDBusConnection::sessionBus().asyncCall(msg); } void PowerManagementJob::requestShutDown()