Merge lp:~jonas-drange/ubuntu-system-settings/displays-mir into lp:ubuntu-system-settings

Proposed by Jonas G. Drange
Status: Work in progress
Proposed branch: lp:~jonas-drange/ubuntu-system-settings/displays-mir
Merge into: lp:ubuntu-system-settings
Prerequisite: lp:~jonas-drange/ubuntu-system-settings/displays-stub
Diff against target: 1995 lines (+1080/-214) (has conflicts)
28 files modified
debian/control (+1/-0)
plugins/brightness/CMakeLists.txt (+25/-5)
plugins/brightness/PageComponent.qml (+43/-26)
plugins/brightness/brightness.cpp (+91/-12)
plugins/brightness/brightness.h (+16/-3)
plugins/brightness/displays/display.cpp (+155/-39)
plugins/brightness/displays/display.h (+76/-52)
plugins/brightness/displays/displaymodel.cpp (+64/-14)
plugins/brightness/displays/displaymodel.h (+16/-5)
plugins/brightness/displays/helpers.cpp (+131/-0)
plugins/brightness/displays/helpers.h (+25/-0)
plugins/brightness/displays/mirclient.h (+25/-0)
plugins/brightness/displays/mirclient_impl.cpp (+86/-0)
plugins/brightness/displays/mirclient_impl.h (+26/-0)
plugins/brightness/plugin.cpp (+2/-2)
plugins/brightness/plugin/brightness-plugin.cpp (+2/-18)
tests/mocks/Ubuntu/SystemSettings/Brightness/CMakeLists.txt (+4/-5)
tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.cpp (+11/-1)
tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.h (+10/-4)
tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplay.h (+32/-13)
tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplayModel.h (+3/-3)
tests/mocks/Ubuntu/SystemSettings/Brightness/plugin.cpp (+2/-1)
tests/mocks/plugins/brightness/fakemirclient.h (+36/-0)
tests/plugins/CMakeLists.txt (+1/-0)
tests/plugins/brightness/CMakeLists.txt (+25/-0)
tests/plugins/brightness/tst_BrightnessPageComponent.qml (+99/-11)
tests/plugins/brightness/tst_brightness.cpp (+41/-0)
tests/plugins/brightness/tst_displayplugin_displaymodel.cpp (+32/-0)
Text conflict in debian/changelog
To merge this branch: bzr merge lp:~jonas-drange/ubuntu-system-settings/displays-mir
Reviewer Review Type Date Requested Status
system-apps-ci-bot continuous-integration Needs Fixing
Ubuntu Touch System Settings Pending
Review via email: mp+309943@code.launchpad.net

Commit message

implement display config for mir displays

To post a comment you must log in.
1742. By Jonas G. Drange

make config work well for rotation and resolution (mode9

1743. By Jonas G. Drange

minor tweaks

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

FAILED: Continuous integration, rev:1739
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-system-settings-ci/222/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/system-apps/job/build/1925/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1926
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1765/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1765
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1765/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1765
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1765/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1765/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1765
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1765/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1765
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1765/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1765/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1765
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1765/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1765/console

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-system-settings-ci/222/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

PASSED: Continuous integration, rev:1743
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-system-settings-ci/223/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build/1927
    SUCCESS: https://jenkins.canonical.com/system-apps/job/test-0-autopkgtest/label=phone-armhf,release=vivid+overlay,testname=default/462
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1928
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=yakkety/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=yakkety/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1767/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1767
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=yakkety/1767/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-system-settings-ci/223/rebuild

review: Approve (continuous-integration)
1744. By Jonas G. Drange

create namespace for displayplugin

1745. By Jonas G. Drange

consume new namespace DisplayPlugin

1746. By Jonas G. Drange

rename mirdisplays to less ambiguous mirclient

1747. By Jonas G. Drange

add framework for testing brightness and displayplugin classes

Revision history for this message
system-apps-ci-bot (system-apps-ci-bot) wrote :

FAILED: Continuous integration, rev:1747
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-system-settings-ci/224/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/system-apps/job/build/1936/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-0-fetch/1937
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=vivid+overlay/1776/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1776
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=xenial+overlay/1776/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=zesty/1776
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=amd64,release=zesty/1776/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=vivid+overlay/1776/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1776
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=xenial+overlay/1776/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=zesty/1776
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=armhf,release=zesty/1776/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=vivid+overlay/1776/console
    SUCCESS: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1776
        deb: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=xenial+overlay/1776/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/system-apps/job/build-2-binpkg/arch=i386,release=zesty/1776/console

Click here to trigger a rebuild:
https://jenkins.canonical.com/system-apps/job/lp-ubuntu-system-settings-ci/224/rebuild

review: Needs Fixing (continuous-integration)

Unmerged revisions

1747. By Jonas G. Drange

add framework for testing brightness and displayplugin classes

1746. By Jonas G. Drange

rename mirdisplays to less ambiguous mirclient

1745. By Jonas G. Drange

consume new namespace DisplayPlugin

1744. By Jonas G. Drange

create namespace for displayplugin

1743. By Jonas G. Drange

minor tweaks

1742. By Jonas G. Drange

make config work well for rotation and resolution (mode9

1741. By Jonas G. Drange

working changed filter

1740. By Jonas G. Drange

add mdoes

1739. By Jonas G. Drange

add mir specific read of config, add helpers

1738. By Jonas G. Drange

merge prereq

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/control'
--- debian/control 2016-11-04 18:56:02 +0000
+++ debian/control 2016-11-04 18:56:02 +0000
@@ -17,6 +17,7 @@
17 libglib2.0-dev (>= 2.37.92),17 libglib2.0-dev (>= 2.37.92),
18 libevdev-dev,18 libevdev-dev,
19 libicu-dev,19 libicu-dev,
20 libmirclient-dev (>= 0.24),
20 libnm-glib-dev,21 libnm-glib-dev,
21 libpolkit-agent-1-dev,22 libpolkit-agent-1-dev,
22 libqmenumodel-dev,23 libqmenumodel-dev,
2324
=== modified file 'plugins/brightness/CMakeLists.txt'
--- plugins/brightness/CMakeLists.txt 2016-11-04 18:56:02 +0000
+++ plugins/brightness/CMakeLists.txt 2016-11-04 18:56:02 +0000
@@ -1,6 +1,29 @@
1include_directories(${ANDR_PROP_INCLUDE_DIRS})1include_directories(${ANDR_PROP_INCLUDE_DIRS})
2add_subdirectory(plugin)2add_subdirectory(plugin)
33
4pkg_search_module(MIR REQUIRED mirclient)
5find_package(Qt5Gui)
6include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS} ${MIR_INCLUDE_DIRS})
7
8add_library(uss-displays SHARED
9 displays/helpers.h
10
11 displays/display.h
12 displays/displaymodel.h
13
14 displays/mirclient.h
15 displays/mirclient_impl.h
16
17 displays/helpers.cpp
18 displays/display.cpp
19 displays/displaymodel.cpp
20 displays/mirclient_impl.cpp
21 ../../src/i18n.cpp
22)
23qt5_use_modules(uss-displays Quick)
24set_target_properties(uss-displays PROPERTIES VERSION 0.0 SOVERSION 0.0)
25target_link_libraries(uss-displays ${Qt5Gui_PRIVATE_LDFLAGS} ${MIR_LDFLAGS})
26
4set(QML_SOURCES27set(QML_SOURCES
5 PageComponent.qml28 PageComponent.qml
6 WifiDisplays.qml29 WifiDisplays.qml
@@ -16,8 +39,6 @@
16 aethercast/displays.h39 aethercast/displays.h
17 aethercast/freedesktop_properties.h40 aethercast/freedesktop_properties.h
18 aethercast/freedesktop_objectmanager.h41 aethercast/freedesktop_objectmanager.h
19 displays/display.h
20 displays/displaymodel.h
21 plugin.h42 plugin.h
22 brightness.h43 brightness.h
23 aethercast/aethercast_device.cpp44 aethercast/aethercast_device.cpp
@@ -27,15 +48,14 @@
27 aethercast/displays.cpp48 aethercast/displays.cpp
28 aethercast/freedesktop_properties.cpp49 aethercast/freedesktop_properties.cpp
29 aethercast/freedesktop_objectmanager.cpp50 aethercast/freedesktop_objectmanager.cpp
30 displays/display.cpp
31 displays/displaymodel.cpp
32 plugin.cpp51 plugin.cpp
33 brightness.cpp52 brightness.cpp
34 ${QML_SOURCES})53 ${QML_SOURCES})
35qt5_use_modules(UbuntuBrightnessPanel Quick Qml DBus)54qt5_use_modules(UbuntuBrightnessPanel Quick Qml DBus)
36target_link_libraries(UbuntuBrightnessPanel SystemSettings ${ANDR_PROP_LDFLAGS})55target_link_libraries(UbuntuBrightnessPanel SystemSettings ${ANDR_PROP_LDFLAGS} uss-displays)
3756
38set(PLUG_DIR ${PLUGIN_PRIVATE_MODULE_DIR}/Ubuntu/SystemSettings/Brightness)57set(PLUG_DIR ${PLUGIN_PRIVATE_MODULE_DIR}/Ubuntu/SystemSettings/Brightness)
58install(TARGETS uss-displays DESTINATION ${PLUGIN_MODULE_DIR})
39install(TARGETS UbuntuBrightnessPanel DESTINATION ${PLUG_DIR})59install(TARGETS UbuntuBrightnessPanel DESTINATION ${PLUG_DIR})
40install(FILES qmldir.in DESTINATION ${PLUG_DIR} RENAME qmldir)60install(FILES qmldir.in DESTINATION ${PLUG_DIR} RENAME qmldir)
41install(FILES brightness.settings DESTINATION ${PLUGIN_MANIFEST_DIR})61install(FILES brightness.settings DESTINATION ${PLUGIN_MANIFEST_DIR})
4262
=== modified file 'plugins/brightness/PageComponent.qml'
--- plugins/brightness/PageComponent.qml 2016-11-04 18:56:02 +0000
+++ plugins/brightness/PageComponent.qml 2016-11-04 18:56:02 +0000
@@ -36,14 +36,6 @@
36 title: brightnessPanel.widiSupported ? i18n.tr("Brightness & Display") : i18n.tr("Brightness")36 title: brightnessPanel.widiSupported ? i18n.tr("Brightness & Display") : i18n.tr("Brightness")
37 flickable: scrollWidget37 flickable: scrollWidget
3838
39 function formatMode(mode) {
40 mode = mode.split("x");
41 /* TRANSLATORS: %1 refer to the amount of horizontal pixels in a
42 display resolution, and %2 to the vertical pixels. E.g. 1200x720.
43 %3 is the refresh rate in hz. */
44 return i18n.tr("%1×%2 @ %3hz").arg(mode[0]).arg(mode[1]).arg(mode[2]);
45 }
46
47 GSettings {39 GSettings {
48 id: gsettings40 id: gsettings
49 schema.id: "com.ubuntu.touch.system"41 schema.id: "com.ubuntu.touch.system"
@@ -53,7 +45,7 @@
53 id: aethercastDisplays45 id: aethercastDisplays
54 objectName: "aethercastDisplays"46 objectName: "aethercastDisplays"
55 onEnabledChanged: {47 onEnabledChanged: {
56 /* This is a hack to ensure the aethercast enabled switch stays 48 /* This is a hack to ensure the aethercast enabled switch stays
57 * in sync with the enabled property49 * in sync with the enabled property
58 */50 */
59 enabledCheck.serverChecked = enabled;51 enabledCheck.serverChecked = enabled;
@@ -181,7 +173,7 @@
181173
182 Repeater {174 Repeater {
183 objectName: "displayConfigurationRepeater"175 objectName: "displayConfigurationRepeater"
184 model: brightnessPanel.allDisplays176 model: brightnessPanel.connectedDisplays
185177
186 Column {178 Column {
187 objectName: "displayConfiguration_" + displayName179 objectName: "displayConfiguration_" + displayName
@@ -190,15 +182,29 @@
190 right: parent.right182 right: parent.right
191 }183 }
192184
185 Item {
186 width: units.gu(1)
187 height: units.gu(1)
188 }
189
193 Label {190 Label {
194 visible: brightnessPanel.allDisplays.count > 1
195 anchors {
196 left: parent.left
197 right: parent.right
198 margins: units.gu(2)
199 }
200
201 text: displayName191 text: displayName
192
193 anchors {
194 left: parent.left
195 right: parent.right
196 margins: units.gu(2)
197 }
198
199 Switch {
200 objectName: "enabledSwitch"
201 anchors {
202 right: parent.right
203 verticalCenter: parent.verticalCenter
204 }
205 checked: model.enabled
206 onCheckedChanged: model.enabled = checked
207 }
202 }208 }
203209
204 SettingsItemTitle {210 SettingsItemTitle {
@@ -216,6 +222,8 @@
216 }222 }
217 containerHeight: itemHeight * 4223 containerHeight: itemHeight * 4
218 model: [224 model: [
225 /* TRANSLATORS: None means no rotation, or
226 0 degrees. */
219 i18n.tr("None"),227 i18n.tr("None"),
220 i18n.tr("90° clockwise"),228 i18n.tr("90° clockwise"),
221 i18n.tr("180°"),229 i18n.tr("180°"),
@@ -223,15 +231,19 @@
223 ]231 ]
224 onDelegateClicked: {232 onDelegateClicked: {
225 expanded = !currentlyExpanded;233 expanded = !currentlyExpanded;
234 orientation = index;
226 }235 }
236 selectedIndex: orientation
227 }237 }
228238
229 SettingsItemTitle {239 SettingsItemTitle {
230 text: availableModes.length > 1 ?240 objectName: "resolutionLabel"
241 text: modes.length > 1 ?
231 i18n.tr("Resolution:") :242 i18n.tr("Resolution:") :
232 /* TRANSLATORS: %1 is a display mode, e.g.243 /* TRANSLATORS: %1 is a display resolution, e.g.
233 1200x720x24. */244 1200x720x24. Unknown refers to an unknown
234 i18n.tr("Resolution: %1").arg(formatMode(mode))245 resolution (in case of an error). */
246 i18n.tr("Resolution: %1").arg(modes[mode] || i18n.tr("Unknown"))
235 }247 }
236248
237 OptionSelector {249 OptionSelector {
@@ -243,13 +255,17 @@
243 right: parent.right255 right: parent.right
244 margins: units.gu(2)256 margins: units.gu(2)
245 }257 }
246 visible: availableModes.length > 1258 visible: modes.length > 1
247 containerHeight: itemHeight * availableModes.length259 containerHeight: itemHeight * modes.length
248 model: availableModes260 model: modes
249 onDelegateClicked: expanded = !currentlyExpanded261 onDelegateClicked: {
262 expanded = !currentlyExpanded;
263 mode = index;
264 }
250 delegate: OptionSelectorDelegate {265 delegate: OptionSelectorDelegate {
251 text: formatMode(modelData)266 text: modelData
252 }267 }
268 selectedIndex: mode
253 }269 }
254270
255 SettingsItemTitle {271 SettingsItemTitle {
@@ -282,6 +298,7 @@
282298
283 visible: brightnessPanel.allDisplays.count > 0299 visible: brightnessPanel.allDisplays.count > 0
284 height: units.gu(6)300 height: units.gu(6)
301
285 Button {302 Button {
286 id: applyButton303 id: applyButton
287 objectName: "applyButton"304 objectName: "applyButton"
288305
=== modified file 'plugins/brightness/brightness.cpp'
--- plugins/brightness/brightness.cpp 2016-11-04 18:56:02 +0000
+++ plugins/brightness/brightness.cpp 2016-11-04 18:56:02 +0000
@@ -19,6 +19,10 @@
19 */19 */
2020
21#include "brightness.h"21#include "brightness.h"
22#include "displays/display.h"
23#include "displays/helpers.h"
24#include "displays/mirclient_impl.h"
25
22#include <hybris/properties/properties.h>26#include <hybris/properties/properties.h>
2327
24#include <QDBusArgument>28#include <QDBusArgument>
@@ -26,6 +30,8 @@
26#include <QDBusMetaType>30#include <QDBusMetaType>
27#include <QDebug>31#include <QDebug>
28#include <QQmlEngine>32#include <QQmlEngine>
33#include <QSharedPointer>
34#include <QScopedPointer>
2935
30// Returned data from getBrightnessParams36// Returned data from getBrightnessParams
31struct BrightnessParams {37struct BrightnessParams {
@@ -55,16 +61,32 @@
55 return argument;61 return argument;
56}62}
5763
58Brightness::Brightness(QObject *parent) :64Brightness::Brightness(QDBusConnection dbus,
59 QObject(parent),65 DisplayPlugin::MirClient *mirClient,
60 m_systemBusConnection (QDBusConnection::systemBus()),66 QObject *parent)
61 m_powerdIface ("com.canonical.powerd",67 : QObject(parent)
62 "/com/canonical/powerd",68 , m_systemBusConnection(dbus)
63 "com.canonical.powerd",69 , m_mirClient(mirClient)
64 m_systemBusConnection),70 , m_powerdIface("com.canonical.powerd",
65 m_powerdRunning(false),71 "/com/canonical/powerd",
66 m_autoBrightnessAvailable(false)72 "com.canonical.powerd",
73 m_systemBusConnection)
74 , m_powerdRunning(false)
75 , m_autoBrightnessAvailable(false)
76
67{77{
78 m_changedDisplays.filterOnUncommittedChanges(true);
79 m_changedDisplays.setSourceModel(&m_displays);
80
81 m_connectedDisplays.filterOnConnected(true);
82 m_connectedDisplays.setSourceModel(&m_displays);
83
84 if (m_mirClient->isConnected()) {
85 refreshMirDisplays();
86 connect(m_mirClient, SIGNAL(configurationChanged()),
87 this, SLOT(refreshMirDisplays()));
88 }
89
68 qRegisterMetaType<BrightnessParams>();90 qRegisterMetaType<BrightnessParams>();
69 m_powerdRunning = m_powerdIface.isValid();91 m_powerdRunning = m_powerdIface.isValid();
7092
@@ -82,8 +104,14 @@
82 QDBusArgument result(reply.arguments()[0].value<QDBusArgument>());104 QDBusArgument result(reply.arguments()[0].value<QDBusArgument>());
83 BrightnessParams params = qdbus_cast<BrightnessParams>(result);105 BrightnessParams params = qdbus_cast<BrightnessParams>(result);
84 m_autoBrightnessAvailable = params.automatic;106 m_autoBrightnessAvailable = params.automatic;
85 m_changedDisplays.filterOnUncommittedChanges(true);107
86 m_changedDisplays.setSourceModel(&m_displays);108 m_mirClient->setParent(this);
109}
110
111Brightness::Brightness(QObject *parent) :
112 Brightness(QDBusConnection::systemBus(),
113 new DisplayPlugin::MirClientImpl(), parent)
114{
87}115}
88116
89bool Brightness::getAutoBrightnessAvailable() const117bool Brightness::getAutoBrightnessAvailable() const
@@ -95,7 +123,7 @@
95 return m_powerdRunning;123 return m_powerdRunning;
96}124}
97125
98bool Brightness::getWidiSupported() const 126bool Brightness::getWidiSupported() const
99{127{
100 char widi[PROP_VALUE_MAX];128 char widi[PROP_VALUE_MAX];
101 property_get("ubuntu.widi.supported", widi, "0");129 property_get("ubuntu.widi.supported", widi, "0");
@@ -115,3 +143,54 @@
115 QQmlEngine::setObjectOwnership(ret, QQmlEngine::CppOwnership);143 QQmlEngine::setObjectOwnership(ret, QQmlEngine::CppOwnership);
116 return ret;144 return ret;
117}145}
146
147
148QAbstractItemModel* Brightness::connectedDisplays()
149{
150 auto ret = &m_connectedDisplays;
151 QQmlEngine::setObjectOwnership(ret, QQmlEngine::CppOwnership);
152 return ret;
153}
154
155void Brightness::applyDisplayConfiguration()
156{
157 auto conf = m_mirClient->getConfiguration();
158
159 if (!conf) {
160 qWarning() << __PRETTY_FUNCTION__ << "config invalid";
161 return;
162 }
163
164 for(uint i = 0; i < conf->num_outputs; ++i) {
165 MirDisplayOutput output = conf->outputs[i];
166 auto display = m_displays.getById(output.output_id);
167 if (display) {
168 output.current_mode = display->mode();
169 output.used = display->enabled();
170 output.orientation =
171 DisplayPlugin::Helpers::orientationToMirOrientation(
172 display->orientation()
173 );
174 }
175 conf->outputs[i] = output;
176 }
177 m_mirClient->applyConfiguration(conf);
178}
179
180void Brightness::refreshMirDisplays()
181{
182 auto conf = m_mirClient->getConfiguration();
183
184 if (!conf) {
185 qWarning() << __PRETTY_FUNCTION__ << "config invalid";
186 return;
187 }
188
189 for(uint i = 0; i < conf->num_outputs; ++i) {
190 MirDisplayOutput output = conf->outputs[i];
191 auto display = QSharedPointer<DisplayPlugin::Display>(
192 new DisplayPlugin::Display(output)
193 );
194 m_displays.addDisplay(display);
195 }
196}
118197
=== modified file 'plugins/brightness/brightness.h'
--- plugins/brightness/brightness.h 2016-11-04 18:56:02 +0000
+++ plugins/brightness/brightness.h 2016-11-04 18:56:02 +0000
@@ -22,6 +22,7 @@
22#define BRIGHTNESS_H22#define BRIGHTNESS_H
2323
24#include "displays/displaymodel.h"24#include "displays/displaymodel.h"
25#include "displays/mirclient.h"
2526
26#include <QAbstractItemModel>27#include <QAbstractItemModel>
27#include <QDBusInterface>28#include <QDBusInterface>
@@ -45,23 +46,35 @@
45 Q_PROPERTY (QAbstractItemModel* changedDisplays46 Q_PROPERTY (QAbstractItemModel* changedDisplays
46 READ changedDisplays47 READ changedDisplays
47 CONSTANT)48 CONSTANT)
49 Q_PROPERTY (QAbstractItemModel* connectedDisplays
50 READ connectedDisplays
51 CONSTANT)
4852
49public:53public:
50 explicit Brightness(QObject *parent = 0);54 explicit Brightness(QObject *parent = 0);
55 explicit Brightness(QDBusConnection dbus,
56 DisplayPlugin::MirClient *mirClient, QObject *parent = 0);
51 bool getPowerdRunning() const;57 bool getPowerdRunning() const;
52 bool getAutoBrightnessAvailable() const;58 bool getAutoBrightnessAvailable() const;
53 bool getWidiSupported() const;59 bool getWidiSupported() const;
54 QAbstractItemModel* allDisplays();60 QAbstractItemModel* allDisplays();
55 QAbstractItemModel* changedDisplays();61 QAbstractItemModel* changedDisplays();
62 QAbstractItemModel* connectedDisplays();
63 Q_INVOKABLE void applyDisplayConfiguration();
5664
57private:65private:
58 QDBusConnection m_systemBusConnection;66 QDBusConnection m_systemBusConnection;
67 DisplayPlugin::MirClient *m_mirClient;
68 QDBusInterface m_powerdIface;
59 QString m_objectPath;69 QString m_objectPath;
60 QDBusInterface m_powerdIface;
61 bool m_powerdRunning;70 bool m_powerdRunning;
62 bool m_autoBrightnessAvailable;71 bool m_autoBrightnessAvailable;
63 DisplayModel m_displays;72 DisplayPlugin::DisplayModel m_displays;
64 DisplaysFilter m_changedDisplays;73 DisplayPlugin::DisplaysFilter m_changedDisplays;
74 DisplayPlugin::DisplaysFilter m_connectedDisplays;
75
76private slots:
77 void refreshMirDisplays();
65};78};
6679
67#endif // BRIGHTNESS_H80#endif // BRIGHTNESS_H
6881
=== modified file 'plugins/brightness/displays/display.cpp'
--- plugins/brightness/displays/display.cpp 2016-11-04 18:56:02 +0000
+++ plugins/brightness/displays/display.cpp 2016-11-04 18:56:02 +0000
@@ -1,12 +1,67 @@
1#include "display.h"1#include "display.h"
2#include "helpers.h"
3
4#include <QDebug>
5
6namespace DisplayPlugin
7{
8QString DisplayMode::toString() const
9{
10 /* TRANSLATORS: %1 refer to the amount of horizontal pixels in a
11 display resolution, and %2 to the vertical pixels. E.g. 1200x720.
12 %3 is the refresh rate in hz. */
13 return SystemSettings::_("%1×%2 @ %3hz")
14 .arg(horizontal_resolution)
15 .arg(vertical_resolution)
16 .arg(refresh_rate);
17}
18bool DisplayMode::operator==(const DisplayMode &other) const
19{
20 return (
21 horizontal_resolution == other.horizontal_resolution
22 && vertical_resolution == other.vertical_resolution
23 && refresh_rate == other.refresh_rate
24 );
25}
226
3Display::Display(QObject *parent)27Display::Display(QObject *parent)
4 : QObject(parent)28 : QObject(parent)
5{29{
6 QObject::connect(this, SIGNAL(nameChanged()),30 initialize();
7 this, SLOT(changedSlot()));31}
8 QObject::connect(this, SIGNAL(typeChanged()),32
9 this, SLOT(changedSlot()));33Display::Display(MirDisplayOutput &output, QObject *parent)
34 : Display(parent)
35{
36 m_type = DisplayPlugin::Helpers::mirTypeToString(output.type);
37 setConnected(output.connected);
38 setEnabled(output.used);
39
40 auto modes = QList<DisplayMode>();
41 for(uint j = 0; j < output.num_modes; j++) {
42 DisplayMode mode(output.modes[j]);
43 modes.append(mode);
44
45 if (j == output.current_mode)
46 m_mode = mode;
47 }
48 m_modes = modes;
49 m_orientation = DisplayPlugin::Helpers::mirOrientationToOritentation(output.orientation);
50 m_powerMode = DisplayPlugin::Helpers::mirPowerModeToPowerMode(output.power_mode);
51 m_id = output.output_id;
52
53 m_physicalWidthMm = output.physical_width_mm;
54 m_physicalHeightMm = output.physical_height_mm;
55 m_name = QString("%1").arg(DisplayPlugin::Helpers::mirTypeToString(output.type));
56 qWarning() << m_name << "current_mode" << mode();
57
58 changedSlot();
59 storeConfiguration();
60}
61
62
63void Display::initialize()
64{
10 QObject::connect(this, SIGNAL(mirroredChanged()),65 QObject::connect(this, SIGNAL(mirroredChanged()),
11 this, SLOT(changedSlot()));66 this, SLOT(changedSlot()));
12 QObject::connect(this, SIGNAL(connectedChanged()),67 QObject::connect(this, SIGNAL(connectedChanged()),
@@ -15,7 +70,7 @@
15 this, SLOT(changedSlot()));70 this, SLOT(changedSlot()));
16 QObject::connect(this, SIGNAL(modeChanged()),71 QObject::connect(this, SIGNAL(modeChanged()),
17 this, SLOT(changedSlot()));72 this, SLOT(changedSlot()));
18 QObject::connect(this, SIGNAL(availableModesChanged()),73 QObject::connect(this, SIGNAL(modesChanged()),
19 this, SLOT(changedSlot()));74 this, SLOT(changedSlot()));
20 QObject::connect(this, SIGNAL(orientationChanged()),75 QObject::connect(this, SIGNAL(orientationChanged()),
21 this, SLOT(changedSlot()));76 this, SLOT(changedSlot()));
@@ -25,6 +80,52 @@
25 this, SLOT(changedSlot()));80 this, SLOT(changedSlot()));
26}81}
2782
83void Display::storeConfiguration()
84{
85 m_storedConfig["name"] = QVariant(m_name);
86 m_storedConfig["type"] = QVariant(m_type);
87 m_storedConfig["mirrored"] = QVariant(m_mirrored);
88 m_storedConfig["enabled"] = QVariant(m_enabled);
89 m_storedConfig["mode"] = QVariant(mode());
90 m_storedConfig["orientation"] = QVariant::fromValue(m_orientation);
91 m_storedConfig["scale"] = QVariant(m_scale);
92}
93
94bool Display::hasChanged() const
95{
96 // qWarning()
97 // << m_storedConfig["name"].toString() << m_name
98 // << m_storedConfig["type"].toString() << m_type
99 // << m_storedConfig["mirrored"].toBool() << m_mirrored
100 // << m_storedConfig["enabled"].toBool() << m_enabled
101 // << m_storedConfig["mode"].toUInt() << mode()
102 // << (uint) m_storedConfig["orientation"].value<Orientation>() << (uint) m_orientation
103 // << m_storedConfig["scale"].toUInt() << m_scale
104 // << "truth values"
105 // << (m_storedConfig["name"].toString() != m_name)
106 // << (m_storedConfig["type"].toString() != m_type)
107 // << (m_storedConfig["mirrored"].toBool() != m_mirrored)
108 // << (m_storedConfig["enabled"].toBool() != m_enabled)
109 // << (m_storedConfig["mode"].toUInt() != mode())
110 // << (m_storedConfig["orientation"].value<Orientation>() != m_orientation)
111 // << (m_storedConfig["scale"].toUInt() != m_scale);
112
113 return (
114 m_storedConfig["name"].toString() != m_name
115 || m_storedConfig["type"].toString() != m_type
116 || m_storedConfig["mirrored"].toBool() != m_mirrored
117 || m_storedConfig["enabled"].toBool() != m_enabled
118 || m_storedConfig["mode"].toUInt() != mode()
119 || m_storedConfig["orientation"].value<Orientation>() != m_orientation
120 || m_storedConfig["scale"].toUInt() != m_scale
121 );
122}
123
124uint Display::id() const
125{
126 return m_id;
127}
128
28QString Display::name() const129QString Display::name() const
29{130{
30 return m_name;131 return m_name;
@@ -50,14 +151,23 @@
50 return m_enabled;151 return m_enabled;
51}152}
52153
53QString Display::mode() const154uint Display::mode() const
54{155{
55 return m_mode;156 return m_modes.empty() ? 0 : m_modes.indexOf(m_mode);
56}157}
57158
58QStringList Display::availableModes() const159QStringList Display::modes() const
59{160{
60 return m_availableModes;161 QStringList modes;
162 Q_FOREACH(const DisplayMode &mode, m_modes) {
163 modes.append(mode.toString());
164 }
165 return modes;
166}
167
168QList<DisplayMode> Display::availableModes() const
169{
170 return m_modes;
61}171}
62172
63Display::Orientation Display::orientation() const173Display::Orientation Display::orientation() const
@@ -75,67 +185,73 @@
75 return m_uncommittedChanges;185 return m_uncommittedChanges;
76}186}
77187
78void Display::setName(const QString &name)188uint Display::physicalWidthMm() const
79{189{
80 m_name = name;190 return m_physicalWidthMm;
81 Q_EMIT nameChanged();
82}191}
83192
84void Display::setType(const QString &type)193uint Display::physicalHeightMm() const
85{194{
86 m_type = type;195 return m_physicalHeightMm;
87 Q_EMIT typeChanged();
88}196}
89197
90void Display::setMirrored(const bool &mirrored)198void Display::setMirrored(const bool &mirrored)
91{199{
92 m_mirrored = mirrored;200 if (m_mirrored != mirrored) {
93 Q_EMIT mirroredChanged();201 m_mirrored = mirrored;
202 Q_EMIT mirroredChanged();
203 }
94}204}
95205
96void Display::setConnected(const bool &connected)206void Display::setConnected(const bool &connected)
97{207{
98 m_connected = connected;208 if (m_connected != connected) {
99 Q_EMIT connectedChanged();209 m_connected = connected;
210 Q_EMIT connectedChanged();
211 }
100}212}
101213
102void Display::setEnabled(const bool &enabled)214void Display::setEnabled(const bool &enabled)
103{215{
104 m_enabled = enabled;216 if (m_enabled != enabled) {
105 Q_EMIT enabledChanged();217 m_enabled = enabled;
218 Q_EMIT enabledChanged();
219 }
106}220}
107221
108void Display::setMode(const QString &mode)222void Display::setMode(const uint &mode)
109{223{
110 m_mode = mode;224 m_mode = m_modes.value(mode);
111 Q_EMIT modeChanged();225 Q_EMIT modeChanged();
112}226}
113227
114void Display::setAvailableModes(const QStringList &availableModes)
115{
116 m_availableModes = availableModes;
117 Q_EMIT availableModesChanged();
118}
119
120void Display::setOrientation(const Display::Orientation &orientation)228void Display::setOrientation(const Display::Orientation &orientation)
121{229{
122 m_orientation = orientation;230 if (m_orientation != orientation) {
123 Q_EMIT orientationChanged();231 m_orientation = orientation;
232 Q_EMIT orientationChanged();
233 }
124}234}
125235
126void Display::setScale(const double &scale)236void Display::setScale(const double &scale)
127{237{
128 m_scale = scale;238 if (m_scale != scale) {
129 Q_EMIT scaleChanged();239 m_scale = scale;
240 Q_EMIT scaleChanged();
241 }
130}242}
131243
132void Display::setUncommitedChanges(const bool uncommittedChanges)244void Display::setUncommitedChanges(const bool uncommittedChanges)
133{245{
134 m_uncommittedChanges = uncommittedChanges;246 if (m_uncommittedChanges != uncommittedChanges) {
135 Q_EMIT uncommittedChangesChanged();247 m_uncommittedChanges = uncommittedChanges;
248 Q_EMIT uncommittedChangesChanged();
249 }
136}250}
137251
138void Display::changedSlot()252void Display::changedSlot()
139{253{
254 setUncommitedChanges(hasChanged());
140 Q_EMIT displayChanged(this);255 Q_EMIT displayChanged(this);
141}256}
257} // DisplayPlugin
142258
=== modified file 'plugins/brightness/displays/display.h'
--- plugins/brightness/displays/display.h 2016-11-04 18:56:02 +0000
+++ plugins/brightness/displays/display.h 2016-11-04 18:56:02 +0000
@@ -1,57 +1,62 @@
1#ifndef DISPLAY_H1#ifndef DISPLAY_H
2#define DISPLAY_H2#define DISPLAY_H
33
4#include "../../../src/i18n.h"
5
6#include <mir_toolkit/mir_client_library.h>
7
8#include <QList>
4#include <QObject>9#include <QObject>
5#include <QString>10#include <QString>
6#include <QStringList>11#include <QStringList>
12#include <QVariantMap>
13
14namespace DisplayPlugin
15{
16class DisplayMode
17{
18public:
19 DisplayMode() {}
20 explicit DisplayMode(const MirDisplayMode &mirMode)
21 : vertical_resolution(mirMode.vertical_resolution)
22 , horizontal_resolution(mirMode.horizontal_resolution)
23 , refresh_rate(mirMode.refresh_rate) {}
24 uint vertical_resolution = 0;
25 uint horizontal_resolution = 0;
26 double refresh_rate = 0.0;
27 Q_INVOKABLE QString toString() const;
28 bool operator==(const DisplayMode &other) const;
29};
730
8class Display : public QObject31class Display : public QObject
9{32{
10 Q_OBJECT33 Q_OBJECT
11 Q_PROPERTY(QString name34 Q_PROPERTY(uint id READ id CONSTANT)
12 READ name35 Q_PROPERTY(QString name READ name CONSTANT)
13 NOTIFY nameChanged)36 Q_PROPERTY(QString type READ type CONSTANT)
14 Q_PROPERTY(QString type37 Q_PROPERTY(bool mirrored READ mirrored WRITE setMirrored
15 READ type
16 NOTIFY typeChanged)
17 Q_PROPERTY(bool mirrored
18 READ mirrored
19 WRITE setMirrored
20 NOTIFY mirroredChanged)38 NOTIFY mirroredChanged)
21 Q_PROPERTY(bool connected39 Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
22 READ connected40 Q_PROPERTY(bool enabled READ enabled WRITE setEnabled
23 NOTIFY connectedChanged)
24 Q_PROPERTY(bool enabled
25 READ enabled
26 WRITE setEnabled
27 NOTIFY enabledChanged)41 NOTIFY enabledChanged)
28 Q_PROPERTY(QString mode42 Q_PROPERTY(uint mode READ mode WRITE setMode
29 READ mode
30 WRITE setMode
31 NOTIFY modeChanged)43 NOTIFY modeChanged)
32 Q_PROPERTY(QStringList availableModes44 Q_PROPERTY(QStringList modes READ modes
33 READ availableModes45 NOTIFY modesChanged)
34 NOTIFY availableModesChanged)46 Q_PROPERTY(Orientation orientation READ orientation WRITE setOrientation
35 Q_PROPERTY(Orientation orientation
36 READ orientation
37 WRITE setOrientation
38 NOTIFY orientationChanged)47 NOTIFY orientationChanged)
39 Q_PROPERTY(double scale48 Q_PROPERTY(double scale READ scale WRITE setScale NOTIFY scaleChanged)
40 READ scale49 Q_PROPERTY(bool uncommittedChanges READ uncommittedChanges
41 WRITE setScale
42 NOTIFY scaleChanged)
43 Q_PROPERTY(bool uncommittedChanges
44 READ uncommittedChanges
45 NOTIFY uncommittedChangesChanged)50 NOTIFY uncommittedChangesChanged)
51 Q_PROPERTY(uint physicalWidthMm READ physicalWidthMm CONSTANT)
52 Q_PROPERTY(uint physicalHeightMm READ physicalHeightMm CONSTANT)
4653
47Q_SIGNALS:54Q_SIGNALS:
48 void nameChanged();
49 void typeChanged();
50 void mirroredChanged();55 void mirroredChanged();
51 void connectedChanged();56 void connectedChanged();
52 void enabledChanged();57 void enabledChanged();
53 void modeChanged();58 void modeChanged();
54 void availableModesChanged();59 void modesChanged();
55 void orientationChanged();60 void orientationChanged();
56 void scaleChanged();61 void scaleChanged();
57 void uncommittedChangesChanged();62 void uncommittedChangesChanged();
@@ -59,54 +64,73 @@
5964
60public:65public:
61 explicit Display(QObject *parent = nullptr);66 explicit Display(QObject *parent = nullptr);
67 explicit Display(MirDisplayOutput &output, QObject *parent = nullptr);
62 ~Display() {};68 ~Display() {};
69
63 enum class Orientation : uint {70 enum class Orientation : uint {
64 Normal, PortraitMode, LandscapeInvertedMode,71 NormalOrientation, PortraitModeOrientation,
65 PortraitInvertedMode72 LandscapeInvertedModeOrientation,
66 };73 PortraitInvertedModeOrientation
67 enum class DisplayType : uint {74 };
68 PhysicalType, AethercastType75 enum class PowerMode : uint {
69 };76 OnMode, StandbyMode, SuspendMode, OffMode
70 Q_ENUMS(Orientation DisplayType)77 };
78 Q_ENUMS(Orientation PowerMode)
7179
80 uint id() const;
72 QString name() const;81 QString name() const;
73 QString type() const;82 QString type() const;
74 bool mirrored() const;83 bool mirrored() const;
75 bool connected() const;84 bool connected() const;
76 bool enabled() const;85 bool enabled() const;
77 QString mode() const;86 uint mode() const;
78 QStringList availableModes() const;87 QList<DisplayMode> availableModes() const;
88 QStringList modes() const;
79 Orientation orientation() const;89 Orientation orientation() const;
80 double scale() const;90 double scale() const;
81 bool uncommittedChanges() const;91 bool uncommittedChanges() const;
92 uint physicalWidthMm() const;
93 uint physicalHeightMm() const;
8294
83 void setMirrored(const bool &mirrored);95 void setMirrored(const bool &mirrored);
84 void setEnabled(const bool &enabled);96 void setEnabled(const bool &enabled);
85 void setMode(const QString &mode);97 void setMode(const uint &mode);
86 void setOrientation(const Orientation &orientation);98 void setOrientation(const Orientation &orientation);
87 void setScale(const double &scale);99 void setScale(const double &scale);
88100
89protected:101protected:
90 void setName(const QString &name);102 void setUncommitedChanges(const bool uncommittedChanges);
91 void setAvailableModes(const QStringList &availableModes);
92 void setConnected(const bool &connected);103 void setConnected(const bool &connected);
93 void setType(const QString &type);104 void storeConfiguration();
94 void setUncommitedChanges(const bool uncommittedChanges);105
106 uint m_id = 0;
95 QString m_name = QString::null;107 QString m_name = QString::null;
96 QString m_type = QString::null;108 QString m_type = QString::null;
97 bool m_mirrored = false;109 bool m_mirrored = false;
98 bool m_connected = false;110 bool m_connected = false;
99 bool m_enabled = false;111 bool m_enabled = false;
100 QString m_mode = QString::null;112 DisplayMode m_mode;
101 QStringList m_availableModes = QStringList();113 QList<DisplayMode> m_modes;
102 Orientation m_orientation = Orientation::Normal;114 Orientation m_orientation = Orientation::NormalOrientation;
103 double m_scale = 1;115 double m_scale = 1;
104 bool m_uncommittedChanges = false;116 bool m_uncommittedChanges = false;
117 uint m_physicalWidthMm = 0;
118 uint m_physicalHeightMm = 0;
119 PowerMode m_powerMode = PowerMode::OffMode;
105120
106private slots:121protected slots:
107 void changedSlot();122 void changedSlot();
123
124private:
125 void initialize();
126 bool hasChanged() const;
127
128 QVariantMap m_storedConfig;
108};129};
109130
110Q_DECLARE_METATYPE(Display*)131} // DisplayPlugin
132
133Q_DECLARE_METATYPE(DisplayPlugin::Display*)
134Q_DECLARE_METATYPE(DisplayPlugin::Display::Orientation)
111135
112#endif // DISPLAY_H136#endif // DISPLAY_H
113137
=== modified file 'plugins/brightness/displays/displaymodel.cpp'
--- plugins/brightness/displays/displaymodel.cpp 2016-11-04 18:56:02 +0000
+++ plugins/brightness/displays/displaymodel.cpp 2016-11-04 18:56:02 +0000
@@ -2,6 +2,8 @@
22
3#include <QDebug>3#include <QDebug>
44
5namespace DisplayPlugin
6{
5DisplayModel::DisplayModel(QObject *parent)7DisplayModel::DisplayModel(QObject *parent)
6{8{
7}9}
@@ -42,8 +44,8 @@
42 case ModeRole:44 case ModeRole:
43 ret = display->mode();45 ret = display->mode();
44 break;46 break;
45 case AvailableModesRole:47 case ModesRole:
46 ret = display->availableModes();48 ret = display->modes();
47 break;49 break;
48 case OrientationRole:50 case OrientationRole:
49 ret = (uint) display->orientation();51 ret = (uint) display->orientation();
@@ -64,11 +66,9 @@
64 int role)66 int role)
65{67{
66 if ((0 <= index.row()) && (index.row() < m_displays.size())) {68 if ((0 <= index.row()) && (index.row() < m_displays.size())) {
67
68 auto display = m_displays[index.row()];69 auto display = m_displays[index.row()];
6970
70 switch (role) {71 switch (role) {
71
72 case MirroredRole:72 case MirroredRole:
73 display->setMirrored(value.toBool());73 display->setMirrored(value.toBool());
74 break;74 break;
@@ -76,7 +76,7 @@
76 display->setEnabled(value.toBool());76 display->setEnabled(value.toBool());
77 break;77 break;
78 case ModeRole:78 case ModeRole:
79 display->setMode(value.toString());79 display->setMode(value.toUInt());
80 break;80 break;
81 case OrientationRole:81 case OrientationRole:
82 display->setOrientation((Display::Orientation) value.toUInt());82 display->setOrientation((Display::Orientation) value.toUInt());
@@ -87,7 +87,7 @@
87 case Qt::DisplayRole:87 case Qt::DisplayRole:
88 case TypeRole:88 case TypeRole:
89 case ConnectedRole:89 case ConnectedRole:
90 case AvailableModesRole:90 case ModesRole:
91 case UncommittedChangesRole:91 case UncommittedChangesRole:
92 default:92 default:
93 return false;93 return false;
@@ -108,7 +108,7 @@
108 names[ConnectedRole] = "connected";108 names[ConnectedRole] = "connected";
109 names[EnabledRole] = "enabled";109 names[EnabledRole] = "enabled";
110 names[ModeRole] = "mode";110 names[ModeRole] = "mode";
111 names[AvailableModesRole] = "availableModes";111 names[ModesRole] = "modes";
112 names[OrientationRole] = "orientation";112 names[OrientationRole] = "orientation";
113 names[ScaleRole] = "scale";113 names[ScaleRole] = "scale";
114 names[UncommittedChangesRole] = "uncommittedChanges";114 names[UncommittedChangesRole] = "uncommittedChanges";
@@ -118,8 +118,7 @@
118118
119void DisplayModel::addDisplay(const QSharedPointer<Display> &display)119void DisplayModel::addDisplay(const QSharedPointer<Display> &display)
120{120{
121 // TODO: find display121 int row = findRowFromId(display->id());
122 int row = -1;
123122
124 if (row >= 0) { // update existing display123 if (row >= 0) { // update existing display
125 m_displays[row] = display;124 m_displays[row] = display;
@@ -131,7 +130,7 @@
131 endInsertRows();130 endInsertRows();
132 }131 }
133132
134 if (display) {133 if (display) {
135 QObject::connect(display.data(), SIGNAL(displayChanged(const Display*)),134 QObject::connect(display.data(), SIGNAL(displayChanged(const Display*)),
136 this, SLOT(displayChangedSlot(const Display*)));135 this, SLOT(displayChangedSlot(const Display*)));
137 }136 }
@@ -143,7 +142,7 @@
143{142{
144 if (0 <= row && row < m_displays.size()) {143 if (0 <= row && row < m_displays.size()) {
145 QModelIndex qmi = index(row, 0);144 QModelIndex qmi = index(row, 0);
146 Q_EMIT(dataChanged(qmi, qmi));145 Q_EMIT dataChanged(qmi, qmi);
147 }146 }
148}147}
149148
@@ -160,6 +159,32 @@
160 emitRowChanged(row);159 emitRowChanged(row);
161}160}
162161
162QSharedPointer<Display> DisplayModel::getById(const uint &id)
163{
164 Q_FOREACH(auto display, m_displays) {
165 if (display->id() == id)
166 return display;
167 }
168 return QSharedPointer<Display>(nullptr);
169}
170
171int DisplayModel::findRowFromId(const uint &id)
172{
173 for (int i = 0; i < m_displays.size(); i++) {
174 if (m_displays[i]->id() == id)
175 return i;
176 }
177 return -1;
178}
179
180DisplaysFilter::DisplaysFilter()
181{
182 connect(this, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
183 this, SLOT(rowsChanged(const QModelIndex&, int, int)));
184 connect(this, SIGNAL(rowsRemoved(const QModelIndex&, int, int)),
185 this, SLOT(rowsChanged(const QModelIndex&, int, int)));
186}
187
163bool DisplaysFilter::lessThan(const QModelIndex &left,188bool DisplaysFilter::lessThan(const QModelIndex &left,
164 const QModelIndex &right) const189 const QModelIndex &right) const
165{190{
@@ -168,13 +193,20 @@
168 return a < b;193 return a < b;
169}194}
170195
171void DisplaysFilter::filterOnUncommittedChanges(const bool apply)196void DisplaysFilter::filterOnUncommittedChanges(const bool uncommitted)
172{197{
173 m_uncommittedChanges = apply;198 m_uncommittedChanges = uncommitted;
174 m_uncommittedChangesEnabled = true;199 m_uncommittedChangesEnabled = true;
175 invalidateFilter();200 invalidateFilter();
176}201}
177202
203void DisplaysFilter::filterOnConnected(const bool connected)
204{
205 m_connected = connected;
206 m_connectedEnabled = true;
207 invalidateFilter();
208}
209
178bool DisplaysFilter::filterAcceptsRow(int sourceRow,210bool DisplaysFilter::filterAcceptsRow(int sourceRow,
179 const QModelIndex &sourceParent) const211 const QModelIndex &sourceParent) const
180{212{
@@ -182,9 +214,27 @@
182 QModelIndex childIndex = sourceModel()->index(sourceRow, 0, sourceParent);214 QModelIndex childIndex = sourceModel()->index(sourceRow, 0, sourceParent);
183215
184 if (accepts && m_uncommittedChangesEnabled) {216 if (accepts && m_uncommittedChangesEnabled) {
185 const bool uncommittedChanges = childIndex.model()->data(childIndex, DisplayModel::UncommittedChangesRole).value<bool>();217 const bool uncommittedChanges = childIndex.model()->data(
218 childIndex, DisplayModel::UncommittedChangesRole
219 ).value<bool>();
186 accepts = (m_uncommittedChanges == uncommittedChanges);220 accepts = (m_uncommittedChanges == uncommittedChanges);
187 }221 }
188222
223 if (accepts && m_connectedEnabled) {
224 const bool connected = childIndex.model()->data(
225 childIndex, DisplayModel::ConnectedRole
226 ).value<bool>();
227 accepts = (m_connected == connected);
228 }
229
189 return accepts;230 return accepts;
190}231}
232
233void DisplaysFilter::rowsChanged(const QModelIndex &parent, int first, int last)
234{
235 Q_UNUSED(parent)
236 Q_UNUSED(first)
237 Q_UNUSED(last)
238 Q_EMIT countChanged();
239}
240} // DisplayPlugin
191241
=== modified file 'plugins/brightness/displays/displaymodel.h'
--- plugins/brightness/displays/displaymodel.h 2016-11-04 18:56:02 +0000
+++ plugins/brightness/displays/displaymodel.h 2016-11-04 18:56:02 +0000
@@ -12,6 +12,8 @@
12#include <QSortFilterProxyModel>12#include <QSortFilterProxyModel>
13#include <QVariant>13#include <QVariant>
1414
15namespace DisplayPlugin
16{
15class DisplayModel : public QAbstractListModel17class DisplayModel : public QAbstractListModel
16{18{
17 Q_OBJECT19 Q_OBJECT
@@ -28,7 +30,7 @@
28 ConnectedRole,30 ConnectedRole,
29 EnabledRole,31 EnabledRole,
30 ModeRole,32 ModeRole,
31 AvailableModesRole,33 ModesRole,
32 OrientationRole,34 OrientationRole,
33 ScaleRole,35 ScaleRole,
34 UncommittedChangesRole,36 UncommittedChangesRole,
@@ -40,13 +42,15 @@
40 bool setData(const QModelIndex &index, const QVariant &value,42 bool setData(const QModelIndex &index, const QVariant &value,
41 int role = Qt::EditRole);43 int role = Qt::EditRole);
42 QHash<int,QByteArray> roleNames() const;44 QHash<int,QByteArray> roleNames() const;
45 void addDisplay(const QSharedPointer<Display> &display);
46 QSharedPointer<Display> getById(const uint &id);
47 int findRowFromId(const uint &id);
4348
44Q_SIGNALS:49Q_SIGNALS:
45 void countChanged();50 void countChanged();
4651
47protected:52protected:
48 void emitRowChanged(const int &row);53 void emitRowChanged(const int &row);
49 void addDisplay(const QSharedPointer<Display> &display);
5054
51private:55private:
52 QList<QSharedPointer<Display> > m_displays;56 QList<QSharedPointer<Display> > m_displays;
@@ -61,13 +65,14 @@
61 Q_PROPERTY(int count READ rowCount NOTIFY countChanged)65 Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
6266
63public:67public:
64 DisplaysFilter() {}68 DisplaysFilter();
65 virtual ~DisplaysFilter() {}69 virtual ~DisplaysFilter() {}
6670
67 void filterOnUncommittedChanges(const bool apply);71 void filterOnUncommittedChanges(const bool uncommitted);
72 void filterOnConnected(const bool connected);
6873
69Q_SIGNALS:74Q_SIGNALS:
70 void countChanged(int count);75 void countChanged();
7176
72protected:77protected:
73 virtual bool filterAcceptsRow(int, const QModelIndex&) const;78 virtual bool filterAcceptsRow(int, const QModelIndex&) const;
@@ -77,6 +82,12 @@
77 bool m_uncommittedChanges = false;82 bool m_uncommittedChanges = false;
78 bool m_uncommittedChangesEnabled = false;83 bool m_uncommittedChangesEnabled = false;
7984
85 bool m_connected = false;
86 bool m_connectedEnabled = false;
87
88private slots:
89 void rowsChanged(const QModelIndex &parent, int first, int last);
80};90};
91} // DisplayPlugin
8192
82#endif // DISPLAY_MODEL_H93#endif // DISPLAY_MODEL_H
8394
=== added file 'plugins/brightness/displays/helpers.cpp'
--- plugins/brightness/displays/helpers.cpp 1970-01-01 00:00:00 +0000
+++ plugins/brightness/displays/helpers.cpp 2016-11-04 18:56:02 +0000
@@ -0,0 +1,131 @@
1#include "helpers.h"
2
3namespace DisplayPlugin
4{
5Display::Orientation Helpers::mirOrientationToOritentation(const MirOrientation &mirOrientation)
6{
7 Display::Orientation orientation;
8 switch (mirOrientation) {
9 case mir_orientation_normal:
10 orientation = Display::Orientation::NormalOrientation;
11 break;
12 case mir_orientation_left:
13 orientation = Display::Orientation::PortraitModeOrientation;
14 break;
15 case mir_orientation_inverted:
16 orientation = Display::Orientation::LandscapeInvertedModeOrientation;
17 break;
18 case mir_orientation_right:
19 orientation = Display::Orientation::PortraitInvertedModeOrientation;
20 break;
21 default:
22 orientation = Display::Orientation::NormalOrientation;
23 }
24 return orientation;
25}
26
27MirOrientation Helpers::orientationToMirOrientation(const Display::Orientation &orientation)
28{
29 MirOrientation mirOrientation;
30 switch (orientation) {
31 case Display::Orientation::NormalOrientation:
32 mirOrientation = mir_orientation_normal;
33 break;
34 case Display::Orientation::PortraitModeOrientation:
35 mirOrientation = mir_orientation_left;
36 break;
37 case Display::Orientation::LandscapeInvertedModeOrientation:
38 mirOrientation = mir_orientation_inverted;
39 break;
40 case Display::Orientation::PortraitInvertedModeOrientation:
41 mirOrientation = mir_orientation_right;
42 break;
43 default:
44 mirOrientation = mir_orientation_normal;
45 }
46 return mirOrientation;
47}
48
49QString Helpers::mirTypeToString(const MirDisplayOutputType &type)
50{
51 QString ret;
52 switch (type) {
53 default:
54 case mir_display_output_type_unknown:
55 ret = "";
56 break;
57 case mir_display_output_type_vga:
58 ret = "vga";
59 break;
60 case mir_display_output_type_dvii:
61 ret = "dvii";
62 break;
63 case mir_display_output_type_dvid:
64 ret = "dvid";
65 break;
66 case mir_display_output_type_dvia:
67 ret = "dvia";
68 break;
69 case mir_display_output_type_composite:
70 ret = "composite";
71 break;
72 case mir_display_output_type_svideo:
73 ret = "svideo";
74 break;
75 case mir_display_output_type_lvds:
76 ret = "lvds";
77 break;
78 case mir_display_output_type_component:
79 ret = "component";
80 break;
81 case mir_display_output_type_ninepindin:
82 ret = "ninepindin";
83 break;
84 case mir_display_output_type_displayport:
85 ret = "displayport";
86 break;
87 case mir_display_output_type_hdmia:
88 ret = "hdmia";
89 break;
90 case mir_display_output_type_hdmib:
91 ret = "hdmib";
92 break;
93 case mir_display_output_type_tv:
94 ret = "tv";
95 break;
96 case mir_display_output_type_edp:
97 ret = "edp";
98 break;
99 }
100
101 return ret;
102}
103
104Display::PowerMode Helpers::mirPowerModeToPowerMode(const MirPowerMode &mode)
105{
106 switch(mode) {
107 case mir_power_mode_on:
108 return Display::PowerMode::OnMode;
109 case mir_power_mode_standby:
110 return Display::PowerMode::StandbyMode;
111 case mir_power_mode_suspend:
112 return Display::PowerMode::SuspendMode;
113 case mir_power_mode_off:
114 return Display::PowerMode::OffMode;
115 }
116}
117
118MirPowerMode Helpers::powerModeToMirPowerMode(const Display::PowerMode &mode)
119{
120 switch(mode) {
121 case Display::PowerMode::OnMode:
122 return mir_power_mode_on;
123 case Display::PowerMode::StandbyMode:
124 return mir_power_mode_standby;
125 case Display::PowerMode::SuspendMode:
126 return mir_power_mode_suspend;
127 case Display::PowerMode::OffMode:
128 return mir_power_mode_off;
129 }
130}
131} // DisplayPlugin
0132
=== added file 'plugins/brightness/displays/helpers.h'
--- plugins/brightness/displays/helpers.h 1970-01-01 00:00:00 +0000
+++ plugins/brightness/displays/helpers.h 2016-11-04 18:56:02 +0000
@@ -0,0 +1,25 @@
1#ifndef DISPLAY_PLUGIN_HELPERS_H
2#define DISPLAY_PLUGIN_HELPERS_H
3
4#include "display.h"
5
6#include <mir_toolkit/mir_client_library.h>
7
8namespace DisplayPlugin
9{
10struct Helpers
11{
12public:
13 static Display::Orientation mirOrientationToOritentation(const MirOrientation &mirOrientation);
14 static MirOrientation orientationToMirOrientation(const Display::Orientation &orientation);
15 static QString mirTypeToString(const MirDisplayOutputType &type);
16 static QString mirModeToString(const MirDisplayOutputType &type);
17 static Display::PowerMode mirPowerModeToPowerMode(const MirPowerMode &mode);
18 static MirPowerMode powerModeToMirPowerMode(const Display::PowerMode &mode);
19
20 // Return a sorted list of modes in horizontalxverticalxrate format.
21 // static QString mirModesToStringList(const MirDisplayOutputType &type);
22};
23} // DisplayPlugin
24
25#endif // DISPLAY_PLUGIN_HELPERS_H
026
=== added file 'plugins/brightness/displays/mirclient.h'
--- plugins/brightness/displays/mirclient.h 1970-01-01 00:00:00 +0000
+++ plugins/brightness/displays/mirclient.h 2016-11-04 18:56:02 +0000
@@ -0,0 +1,25 @@
1#ifndef MIRCLIENT_H
2#define MIRCLIENT_H
3
4#include <mir_toolkit/mir_client_library.h>
5#include <QObject>
6
7namespace DisplayPlugin
8{
9class MirClient : public QObject
10{
11 Q_OBJECT
12public:
13 explicit MirClient(QObject *parent = 0) : QObject(parent) {}
14 virtual ~MirClient() {};
15 virtual MirDisplayConfiguration* getConfiguration() const = 0;
16 virtual void setConfiguration(MirDisplayConfiguration *conf) = 0;
17 virtual bool applyConfiguration(MirDisplayConfiguration *conf) = 0;
18 virtual bool isConnected() = 0;
19
20Q_SIGNALS:
21 void configurationChanged() const;
22};
23} // DisplayPlugin
24
25#endif // MIRCLIENT_H
026
=== added file 'plugins/brightness/displays/mirclient_impl.cpp'
--- plugins/brightness/displays/mirclient_impl.cpp 1970-01-01 00:00:00 +0000
+++ plugins/brightness/displays/mirclient_impl.cpp 2016-11-04 18:56:02 +0000
@@ -0,0 +1,86 @@
1#include "mirclient_impl.h"
2
3#include <QDebug>
4#include <QQmlEngine>
5#include <QGuiApplication>
6#include <qpa/qplatformnativeinterface.h>
7
8namespace DisplayPlugin
9{
10static void mir_display_change_callback(MirConnection *connection, void *context) {
11 MirDisplayConfiguration *conf = mir_connection_create_display_config(
12 connection);
13 static_cast<MirClientImpl*>(context)->setConfiguration(conf);
14}
15
16MirClientImpl::MirClientImpl(QObject *parent)
17 : MirClient(parent)
18 , m_mir_connection(nullptr)
19 , m_configuration(nullptr)
20{
21 connect();
22 if (isConnected()) {
23 setConfiguration(
24 mir_connection_create_display_config(m_mir_connection)
25 );
26 }
27}
28
29MirClientImpl::~MirClientImpl() {
30 mir_display_config_destroy(m_configuration);
31 mir_connection_release(m_mir_connection);
32}
33
34MirDisplayConfiguration* MirClientImpl::getConfiguration() const {
35 return m_configuration;
36}
37
38bool MirClientImpl::isConnected() {
39 return mir_connection_is_valid(m_mir_connection);
40}
41
42void MirClientImpl::setConfiguration(MirDisplayConfiguration *conf) {
43 if (m_configuration != conf) {
44 m_configuration = conf;
45 Q_EMIT configurationChanged();
46 }
47}
48
49bool MirClientImpl::applyConfiguration(MirDisplayConfiguration *conf) {
50 MirWaitHandle* handle = mir_connection_set_base_display_config(
51 m_mir_connection, conf
52 );
53
54 if (!handle) {
55 qWarning() << __PRETTY_FUNCTION__ << "Failed to get handle.";
56 return false;
57 }
58
59 mir_wait_for(handle);
60 QString error(mir_connection_get_error_message(m_mir_connection));
61 if (error.isEmpty()) {
62 qWarning() << "Mir apply config successfully.";
63 } else {
64 qWarning() << "Mir configuration error:" << error;
65 }
66 return error.isEmpty();
67}
68
69void MirClientImpl::connect() {
70 qWarning() << "Connecting to a Mir server...";
71 m_mir_connection = static_cast<MirConnection*>(
72 QGuiApplication::platformNativeInterface()
73 ->nativeResourceForIntegration("mirConnection")
74 );
75 if (m_mir_connection == nullptr || !isConnected()) {
76 const char *error = "Unknown error";
77 if (m_mir_connection != nullptr)
78 error = mir_connection_get_error_message(m_mir_connection);
79 qWarning() << __PRETTY_FUNCTION__ << "Could not connect to Mir:" << error;
80 } else {
81 qWarning() << "Using a Mir server.";
82 mir_connection_set_display_config_change_callback(
83 m_mir_connection, mir_display_change_callback, this);
84 }
85}
86} // DisplayPlugin
087
=== added file 'plugins/brightness/displays/mirclient_impl.h'
--- plugins/brightness/displays/mirclient_impl.h 1970-01-01 00:00:00 +0000
+++ plugins/brightness/displays/mirclient_impl.h 2016-11-04 18:56:02 +0000
@@ -0,0 +1,26 @@
1#ifndef MIRCLIENT_IMPL_H
2#define MIRCLIENT_IMPL_H
3
4#include "mirclient.h"
5
6namespace DisplayPlugin
7{
8class MirClientImpl : public MirClient
9{
10 Q_OBJECT
11public:
12 explicit MirClientImpl(QObject *parent = 0);
13 ~MirClientImpl();
14 virtual MirDisplayConfiguration* getConfiguration() const;
15 virtual void setConfiguration(MirDisplayConfiguration *conf) override;
16 virtual bool applyConfiguration(MirDisplayConfiguration *conf) override;
17 virtual bool isConnected() override;
18
19private:
20 void connect();
21 MirConnection *m_mir_connection;
22 MirDisplayConfiguration *m_configuration;
23};
24} // DisplayPlugin
25
26#endif // MIRCLIENT_IMPL_H
027
=== modified file 'plugins/brightness/plugin.cpp'
--- plugins/brightness/plugin.cpp 2016-11-04 18:56:02 +0000
+++ plugins/brightness/plugin.cpp 2016-11-04 18:56:02 +0000
@@ -43,8 +43,8 @@
43 qmlRegisterType<Device>(uri, 1, 0, "AethercastDevice");43 qmlRegisterType<Device>(uri, 1, 0, "AethercastDevice");
44 qmlRegisterType<Displays>(uri, 1, 0, "AethercastDisplays");44 qmlRegisterType<Displays>(uri, 1, 0, "AethercastDisplays");
4545
46 qmlRegisterType<DisplayModel>(uri, 1, 0, "DisplayModel");46 qmlRegisterType<DisplayPlugin::DisplayModel>(uri, 1, 0, "DisplayModel");
47 qmlRegisterType<Display>(uri, 1, 0, "Display");47 qmlRegisterUncreatableType<DisplayPlugin::Display>(uri, 1, 0, "Display", "Use UbuntuBrightnessPanel.");
48}48}
4949
50void BackendPlugin::initializeEngine(QQmlEngine *engine, const char *uri)50void BackendPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
5151
=== modified file 'plugins/brightness/plugin/brightness-plugin.cpp'
--- plugins/brightness/plugin/brightness-plugin.cpp 2016-04-27 16:55:42 +0000
+++ plugins/brightness/plugin/brightness-plugin.cpp 2016-11-04 18:56:02 +0000
@@ -48,24 +48,8 @@
48BrightnessItem::BrightnessItem(const QVariantMap &staticData, QObject *parent):48BrightnessItem::BrightnessItem(const QVariantMap &staticData, QObject *parent):
49 ItemBase(staticData, parent)49 ItemBase(staticData, parent)
50{50{
51 QDBusInterface m_powerdIface ("com.canonical.powerd",51 setVisibility(true);
52 "/com/canonical/powerd",52 setDisplayName(_("Brightness"));
53 "com.canonical.powerd",
54 QDBusConnection::systemBus());
55
56 // Hide the plugin if powerd isn't running; it's currently redundant
57 setVisibility(m_powerdIface.isValid());
58
59 char widi[PROP_VALUE_MAX] = "";
60 property_get("ubuntu.widi.supported", widi, "0");
61 // We want to log this property to help aid debugging
62 qWarning() << Q_FUNC_INFO << "ubuntu.widi.supported:" << widi;
63
64 if (strcmp(widi, "0") == 0) {
65 setDisplayName(_("Brightness"));
66 } else {
67 setDisplayName(_("Brightness & Display"));
68 }
69}53}
7054
71void BrightnessItem::setDisplayName(const QString &name)55void BrightnessItem::setDisplayName(const QString &name)
7256
=== modified file 'tests/mocks/Ubuntu/SystemSettings/Brightness/CMakeLists.txt'
--- tests/mocks/Ubuntu/SystemSettings/Brightness/CMakeLists.txt 2016-11-04 18:56:02 +0000
+++ tests/mocks/Ubuntu/SystemSettings/Brightness/CMakeLists.txt 2016-11-04 18:56:02 +0000
@@ -1,7 +1,10 @@
1pkg_search_module(MIR REQUIRED mirclient)
2
1include_directories(3include_directories(
2 ${CMAKE_CURRENT_BINARY_DIR}4 ${CMAKE_CURRENT_BINARY_DIR}
3 ${CMAKE_SOURCE_DIR}/plugins/brightness/5 ${CMAKE_SOURCE_DIR}/plugins/brightness/
4 ${CMAKE_SOURCE_DIR}/plugins/brightness/displays6 ${CMAKE_SOURCE_DIR}/plugins/brightness/displays
7 ${MIR_INCLUDE_DIRS}
5)8)
69
7set(MOCK_BRIGHTNESS_SRCS10set(MOCK_BRIGHTNESS_SRCS
@@ -10,18 +13,14 @@
10 MockAethercastDisplays.cpp13 MockAethercastDisplays.cpp
11 MockBrightness.cpp14 MockBrightness.cpp
1215
13 ${CMAKE_SOURCE_DIR}/plugins/brightness/displays/display.h
14 ${CMAKE_SOURCE_DIR}/plugins/brightness/displays/displaymodel.h
15 MockDisplay.h16 MockDisplay.h
16 MockDisplayModel.h17 MockDisplayModel.h
17 ${CMAKE_SOURCE_DIR}/plugins/brightness/displays/display.cpp
18 ${CMAKE_SOURCE_DIR}/plugins/brightness/displays/displaymodel.cpp
19 plugin.cpp18 plugin.cpp
20)19)
2120
22add_library(MockBrightnessPanel MODULE ${MOCK_BRIGHTNESS_SRCS})21add_library(MockBrightnessPanel MODULE ${MOCK_BRIGHTNESS_SRCS})
2322
24target_link_libraries(MockBrightnessPanel)23target_link_libraries(MockBrightnessPanel ${MIR_LDFLAGS} uss-displays)
25qt5_use_modules(MockBrightnessPanel Qml Quick Core)24qt5_use_modules(MockBrightnessPanel Qml Quick Core)
2625
27add_uss_mock(Ubuntu.SystemSettings.Brightness 1.0 Ubuntu/SystemSettings/Brightness26add_uss_mock(Ubuntu.SystemSettings.Brightness 1.0 Ubuntu/SystemSettings/Brightness
2827
=== modified file 'tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.cpp'
--- tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.cpp 2016-11-04 18:56:02 +0000
+++ tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.cpp 2016-11-04 18:56:02 +0000
@@ -27,6 +27,9 @@
27{27{
28 m_changedDisplays.filterOnUncommittedChanges(true);28 m_changedDisplays.filterOnUncommittedChanges(true);
29 m_changedDisplays.setSourceModel(&m_displays);29 m_changedDisplays.setSourceModel(&m_displays);
30
31 m_connectedDisplays.filterOnConnected(true);
32 m_connectedDisplays.setSourceModel(&m_displays);
30}33}
3134
32bool MockBrightness::getPowerdRunning() const35bool MockBrightness::getPowerdRunning() const
@@ -76,9 +79,16 @@
76 return ret;79 return ret;
77}80}
7881
82QAbstractItemModel* MockBrightness::connectedDisplays()
83{
84 auto ret = &m_connectedDisplays;
85 QQmlEngine::setObjectOwnership(ret, QQmlEngine::CppOwnership);
86 return ret;
87}
88
79void MockBrightness::applyDisplayConfiguration()89void MockBrightness::applyDisplayConfiguration()
80{90{
8191 Q_EMIT applied();
82}92}
8393
84MockDisplayModel* MockBrightness::displayModel()94MockDisplayModel* MockBrightness::displayModel()
8595
=== modified file 'tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.h'
--- tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.h 2016-11-04 18:56:02 +0000
+++ tests/mocks/Ubuntu/SystemSettings/Brightness/MockBrightness.h 2016-11-04 18:56:02 +0000
@@ -43,6 +43,9 @@
43 Q_PROPERTY (QAbstractItemModel* changedDisplays43 Q_PROPERTY (QAbstractItemModel* changedDisplays
44 READ changedDisplays44 READ changedDisplays
45 CONSTANT)45 CONSTANT)
46 Q_PROPERTY (QAbstractItemModel* connectedDisplays
47 READ connectedDisplays
48 CONSTANT)
4649
47public:50public:
48 explicit MockBrightness(QObject *parent = 0);51 explicit MockBrightness(QObject *parent = 0);
@@ -54,20 +57,23 @@
54 Q_INVOKABLE void setWidiSupported(const bool supported);57 Q_INVOKABLE void setWidiSupported(const bool supported);
55 QAbstractItemModel* allDisplays();58 QAbstractItemModel* allDisplays();
56 QAbstractItemModel* changedDisplays();59 QAbstractItemModel* changedDisplays();
60 QAbstractItemModel* connectedDisplays();
57 Q_INVOKABLE void applyDisplayConfiguration();61 Q_INVOKABLE void applyDisplayConfiguration();
58 Q_INVOKABLE MockDisplayModel* displayModel(); // mock only62 Q_INVOKABLE MockDisplayModel* displayModel(); // mock only
5963
60Q_SIGNALS:64Q_SIGNALS:
61 void powerdRunningChanged(); // mock only65 void powerdRunningChanged();
62 void autoBrightnessAvailableChanged(); // mock only66 void autoBrightnessAvailableChanged();
63 void widiSupportedChanged(); // mock only67 void widiSupportedChanged();
68 void applied(); // mock only
6469
65private:70private:
66 bool m_powerdRunning = false;71 bool m_powerdRunning = false;
67 bool m_autoBrightnessAvailable = false;72 bool m_autoBrightnessAvailable = false;
68 bool m_widiSupported = false;73 bool m_widiSupported = false;
69 MockDisplayModel m_displays;74 MockDisplayModel m_displays;
70 DisplaysFilter m_changedDisplays;75 DisplayPlugin::DisplaysFilter m_changedDisplays;
76 DisplayPlugin::DisplaysFilter m_connectedDisplays;
71};77};
7278
73#endif // MOCK_BRIGHTNESS_H79#endif // MOCK_BRIGHTNESS_H
7480
=== modified file 'tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplay.h'
--- tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplay.h 2016-11-04 18:56:02 +0000
+++ tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplay.h 2016-11-04 18:56:02 +0000
@@ -6,7 +6,8 @@
6#include <QObject>6#include <QObject>
7#include <QDebug>7#include <QDebug>
88
9struct MockDisplay : public Display9
10struct MockDisplay : public DisplayPlugin::Display
10{11{
11 Q_OBJECT12 Q_OBJECT
12public:13public:
@@ -22,31 +23,49 @@
22 Q_EMIT typeChanged();23 Q_EMIT typeChanged();
23 }24 }
2425
26 Q_INVOKABLE void setEnabled(const bool &enabled) // mock only
27 {
28 m_enabled = enabled;
29 Q_EMIT enabledChanged();
30 }
31
25 Q_INVOKABLE void setConnected(const bool &connected) // mock only32 Q_INVOKABLE void setConnected(const bool &connected) // mock only
26 {33 {
27 m_connected = connected;34 m_connected = connected;
28 Q_EMIT connectedChanged();35 Q_EMIT connectedChanged();
29 }36 }
3037
31 Q_INVOKABLE void setAvailableModes(const QStringList &availableModes) // mock only
32 {
33 m_availableModes = availableModes;
34 Q_EMIT availableModesChanged();
35 }
36
37 Q_INVOKABLE void setUncommitedChanges(const bool uncommittedChanges) // mock only38 Q_INVOKABLE void setUncommitedChanges(const bool uncommittedChanges) // mock only
38 {39 {
39 m_uncommittedChanges = uncommittedChanges;40 m_uncommittedChanges = uncommittedChanges;
40 Q_EMIT uncommittedChangesChanged();41 Q_EMIT uncommittedChangesChanged();
41 }42 }
4243
43 Q_INVOKABLE void addMode(const QString &mode) // mock only44 // Return at what index the new mode was placed.
44 {45 Q_INVOKABLE uint addMode(const uint &horizontal, const uint &vertical,
45 m_availableModes.append(mode);46 const uint &refresh) // mock only
46 Q_EMIT availableModesChanged();47 {
47 }48 DisplayPlugin::DisplayMode mode;
49 mode.vertical_resolution = vertical;
50 mode.horizontal_resolution = horizontal;
51 mode.refresh_rate = refresh;
52
53 m_modes.append(mode);
54 Q_EMIT modesChanged();
55 return m_modes.indexOf(mode);
56 }
57
58 // Mark a display as unchanged, and save the current config.
59 Q_INVOKABLE void save()
60 {
61 storeConfiguration();
62 setUncommitedChanges(false);
63 }
64Q_SIGNALS:
65 void nameChanged();
66 void typeChanged();
48};67};
4968
50Q_DECLARE_METATYPE(MockDisplay*)69// Q_DECLARE_METATYPE(MockDisplay*)
5170
52#endif // MOCK_DISPLAY_H71#endif // MOCK_DISPLAY_H
5372
=== modified file 'tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplayModel.h'
--- tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplayModel.h 2016-11-04 18:56:02 +0000
+++ tests/mocks/Ubuntu/SystemSettings/Brightness/MockDisplayModel.h 2016-11-04 18:56:02 +0000
@@ -7,12 +7,12 @@
7#include <QObject>7#include <QObject>
8#include <QQmlEngine>8#include <QQmlEngine>
99
10class MockDisplayModel : public DisplayModel10class MockDisplayModel : public DisplayPlugin::DisplayModel
11{11{
12 Q_OBJECT12 Q_OBJECT
13public:13public:
14 MockDisplayModel(QObject *parent = 0) : DisplayModel(parent) {14 MockDisplayModel(QObject *parent = 0)
15 };15 : DisplayPlugin::DisplayModel(parent) {};
16 ~MockDisplayModel() {};16 ~MockDisplayModel() {};
17 Q_INVOKABLE MockDisplay* mockAddDisplay() // mock only17 Q_INVOKABLE MockDisplay* mockAddDisplay() // mock only
18 {18 {
1919
=== modified file 'tests/mocks/Ubuntu/SystemSettings/Brightness/plugin.cpp'
--- tests/mocks/Ubuntu/SystemSettings/Brightness/plugin.cpp 2016-11-04 18:56:02 +0000
+++ tests/mocks/Ubuntu/SystemSettings/Brightness/plugin.cpp 2016-11-04 18:56:02 +0000
@@ -34,6 +34,7 @@
34 qmlRegisterType<MockAethercastDevice>(uri, 1, 0, "AethercastDevice");34 qmlRegisterType<MockAethercastDevice>(uri, 1, 0, "AethercastDevice");
35 qmlRegisterType<MockAethercastDisplays>(uri, 1, 0, "AethercastDisplays");35 qmlRegisterType<MockAethercastDisplays>(uri, 1, 0, "AethercastDisplays");
3636
37 qmlRegisterUncreatableType<MockDisplay>(uri, 1, 0, "Display", "Not to be instantiated directly.");
38 qmlRegisterType<MockDisplayModel>(uri, 1, 0, "DisplayModel");37 qmlRegisterType<MockDisplayModel>(uri, 1, 0, "DisplayModel");
38 qmlRegisterUncreatableType<MockDisplay>(uri, 1, 0, "Display",
39 "Not to be instantiated directly.");
39}40}
4041
=== added file 'tests/mocks/plugins/brightness/fakemirclient.h'
--- tests/mocks/plugins/brightness/fakemirclient.h 1970-01-01 00:00:00 +0000
+++ tests/mocks/plugins/brightness/fakemirclient.h 2016-11-04 18:56:02 +0000
@@ -0,0 +1,36 @@
1#ifndef FAKEMIRCLIENT_H
2#define FAKEMIRCLIENT_H
3
4#include "mirclient.h"
5
6#include <mir_toolkit/mir_client_library.h>
7#include <QObject>
8
9class FakeMirClient : public DisplayPlugin::MirClient
10{
11 Q_OBJECT
12public:
13 explicit FakeMirClient(QObject *parent = 0)
14 : DisplayPlugin::MirClient(parent) {}
15 virtual ~FakeMirClient() {}
16 virtual MirDisplayConfiguration* getConfiguration() const override
17 {
18
19 }
20 virtual void setConfiguration(MirDisplayConfiguration *conf) override
21 {
22
23 }
24 virtual bool applyConfiguration(MirDisplayConfiguration *conf) override
25 {
26
27 }
28 virtual bool isConnected() override
29 {
30 return connected;
31 }
32
33 bool connected = false;
34};
35
36#endif // FAKEMIRCLIENT_H
037
=== modified file 'tests/plugins/CMakeLists.txt'
--- tests/plugins/CMakeLists.txt 2016-11-04 18:56:02 +0000
+++ tests/plugins/CMakeLists.txt 2016-11-04 18:56:02 +0000
@@ -4,6 +4,7 @@
4add_subdirectory(security-privacy)4add_subdirectory(security-privacy)
5add_subdirectory(system-update)5add_subdirectory(system-update)
6add_subdirectory(bluetooth)6add_subdirectory(bluetooth)
7add_subdirectory(brightness)
7add_subdirectory(wifi)8add_subdirectory(wifi)
8add_subdirectory(notifications)9add_subdirectory(notifications)
910
1011
=== added file 'tests/plugins/brightness/CMakeLists.txt'
--- tests/plugins/brightness/CMakeLists.txt 1970-01-01 00:00:00 +0000
+++ tests/plugins/brightness/CMakeLists.txt 2016-11-04 18:56:02 +0000
@@ -0,0 +1,25 @@
1include_directories(
2 ${CMAKE_CURRENT_BINARY_DIR}
3 ${CMAKE_SOURCE_DIR}/plugins/brightness
4 ${CMAKE_SOURCE_DIR}/plugins/brightness/displays
5 ${CMAKE_SOURCE_DIR}/tests/mocks/plugins/brightness
6 ${QTDBUSMOCK_INCLUDE_DIRS}
7 # ${QTDBUSTEST_INCLUDE_DIRS}
8 ${MIR_INCLUDE_DIRS}
9 ${ANDR_PROP_INCLUDE_DIRS}
10)
11
12pkg_search_module(MIR REQUIRED mirclient)
13find_package(Qt5Test REQUIRED)
14find_package(Qt5DBus REQUIRED)
15
16#set(CMAKE_AUTOMOC ON)
17#set(CMAKE_INCLUDE_CURRENT_DIR ON)
18set(PLUGIN_LIBS uss-displays Qt5::Test Qt5::DBus)
19
20add_executable(tst-brightness
21 ${CMAKE_SOURCE_DIR}/tests/mocks/plugins/brightness/fakemirclient.h
22 tst_brightness.cpp
23 ${CMAKE_SOURCE_DIR}/plugins/brightness/brightness.cpp)
24add_test(tst-brightness tst-brightness)
25target_link_libraries(tst-brightness ${PLUGIN_LIBS} ${ANDR_PROP_LDFLAGS} ${QTDBUSMOCK_LIBRARIES} ${QTDBUSTEST_LIBRARIES})
026
=== modified file 'tests/plugins/brightness/tst_BrightnessPageComponent.qml'
--- tests/plugins/brightness/tst_BrightnessPageComponent.qml 2016-11-04 18:56:02 +0000
+++ tests/plugins/brightness/tst_BrightnessPageComponent.qml 2016-11-04 18:56:02 +0000
@@ -87,25 +87,113 @@
87 compare(entry.value, i18n.tr("Not connected"));87 compare(entry.value, i18n.tr("Not connected"));
88 }88 }
8989
90 // Test that everything is hidden if only aethercast devices (or none)90 function test_no_mir_displays() {
91 function test_no_displays() {
92 var repeater = findChild(instance, "displayConfigurationRepeater");91 var repeater = findChild(instance, "displayConfigurationRepeater");
93 compare(repeater.count, 0);92 compare(repeater.count, 0);
94 }93 }
9594
96 // Test that there's a UI when we have some display available.95 function test_one_mir_display() {
97 function test_one_display() {
98 var displayModel = get_panel_plugin().displayModel();96 var displayModel = get_panel_plugin().displayModel();
99 var display = displayModel.mockAddDisplay();97 var display = displayModel.mockAddDisplay();
100 display.setName("Foo")98 display.setConnected(true);
101 display.addMode("1600x1200x60")
102 display.addMode("1280x1024x60")
103 display.mode = "1600x1200x60"
104
105 var repeater = findChild(instance, "displayConfigurationRepeater");99 var repeater = findChild(instance, "displayConfigurationRepeater");
106 var panel = findChild(instance, "displayConfiguration_" + display.name);
107 verify(panel.visible);
108 compare(repeater.count, 1);100 compare(repeater.count, 1);
109 }101 }
110 }102 }
103
104
105 UbuntuTestCase {
106 name: "BrightnessPageComponent for one Mir display"
107 when: windowShown
108
109 SignalSpy {
110 id: signalSpy
111 signalName: ""
112 target: null
113 }
114
115 property var instance: null
116 property var display: null
117
118 function init() {
119 instance = pageComponent.createObject(testRoot, {});
120 var displayModel = get_panel_plugin().displayModel();
121 display = displayModel.mockAddDisplay();
122 display.setConnected(true);
123 display.setName("test");
124 display.save();
125 }
126
127 function cleanup() {
128 instance.destroy();
129 signalSpy.target = null;
130 }
131
132 function get_panel_plugin() {
133 return findInvisibleChild(instance, "brightnessPanel");
134 }
135
136 function test_no_changes_disables_apply() {
137 var obj = findChild(instance, "applyButton");
138 verify(!obj.enabled);
139 }
140
141 function test_a_change_enables_apply() {
142 var obj = findChild(instance, "enabledSwitch");
143 var apply = findChild(instance, "applyButton");
144 mouseClick(obj, obj.width / 2, obj.height / 2);
145 }
146
147 function test_apply() {
148 signalSpy.target = get_panel_plugin();
149 signalSpy.signalName = "applied";
150
151 display.setEnabled(true);
152 var obj = findChild(instance, "applyButton");
153 mouseClick(obj, obj.width / 2, obj.height / 2);
154
155 signalSpy.wait();
156 }
157
158 function test_default_rotation() {
159 var obj = findChild(instance, "rotationSelector");
160 compare(obj.selectedIndex, 0);
161 }
162
163 function test_other_rotation() {
164 display.orientation = 1;
165 var obj = findChild(instance, "rotationSelector");
166 compare(obj.selectedIndex, 1);
167 }
168
169 function test_change_rotation() {
170 var obj = findChild(instance, "rotationSelector");
171 obj.delegateClicked(2);
172 compare(display.orientation, 2);
173 }
174
175 function test_one_resolution() {
176 display.mode = display.addMode(1024, 768, 60);
177 var obj = findChild(instance, "resolutionLabel");
178 var res = i18n.tr("%1×%2 @ %3hz").arg(1024).arg(768).arg(60);
179 compare(obj.text, i18n.tr("Resolution: %1").arg(res));
180 }
181
182 function test_many_resolutions() {
183 display.addMode(1024, 768, 60);
184 display.addMode(640, 320, 40);
185 display.mode = 1;
186 var obj = findChild(instance, "resolutionSelector");
187 compare(obj.selectedIndex, 1);
188 }
189
190 function test_change_resolution() {
191 display.addMode(1024, 768, 60);
192 display.addMode(640, 320, 40);
193 display.mode = 1;
194 var obj = findChild(instance, "resolutionSelector");
195 obj.delegateClicked(0);
196 compare(display.mode, 0);
197 }
198 }
111}199}
112200
=== added file 'tests/plugins/brightness/tst_brightness.cpp'
--- tests/plugins/brightness/tst_brightness.cpp 1970-01-01 00:00:00 +0000
+++ tests/plugins/brightness/tst_brightness.cpp 2016-11-04 18:56:02 +0000
@@ -0,0 +1,41 @@
1#include "brightness.h"
2#include "fakemirclient.h"
3
4#include <QSignalSpy>
5#include <QTest>
6
7using namespace DisplayPlugin;
8
9class TstBrightness : public QObject
10{
11 Q_OBJECT
12private slots:
13 void initTestCase()
14 {
15 }
16 void cleanupTestCase()
17 {
18 }
19 void init()
20 {
21 m_mirClient = new FakeMirClient();
22 m_instance = new Brightness(QDBusConnection::systemBus(), m_mirClient);
23 }
24 void cleanup()
25 {
26 QSignalSpy destroyedSpy(m_instance, SIGNAL(destroyed(QObject*)));
27 m_instance->deleteLater();
28 QTRY_COMPARE(destroyedSpy.count(), 1);
29 }
30 void test_foo()
31 {
32
33 }
34private:
35 MirClient *m_mirClient = nullptr;
36 Brightness *m_instance = nullptr;
37};
38
39QTEST_GUILESS_MAIN(TstBrightness)
40#include "tst_brightness.moc"
41
042
=== added file 'tests/plugins/brightness/tst_displayplugin_display.cpp'
=== added file 'tests/plugins/brightness/tst_displayplugin_displaymodel.cpp'
--- tests/plugins/brightness/tst_displayplugin_displaymodel.cpp 1970-01-01 00:00:00 +0000
+++ tests/plugins/brightness/tst_displayplugin_displaymodel.cpp 2016-11-04 18:56:02 +0000
@@ -0,0 +1,32 @@
1#include <QSignalSpy>
2#include <QTest>
3
4using namespace DisplayPlugin;
5
6class TstDisplayModel : public QObject
7{
8 Q_OBJECT
9private slots:
10 void initTestCase()
11 {
12 }
13 void cleanupTestCase()
14 {
15 }
16 void init()
17 {
18 m_instance = nullptr;
19 }
20 void cleanup()
21 {
22 // QSignalSpy destroyedSpy(m_instance, SIGNAL(destroyed(QObject*)));
23 // m_instance->deleteLater();
24 // QTRY_COMPARE(destroyedSpy.count(), 1);
25 }
26private:
27 QObject *m_instance = nullptr;
28};
29
30QTEST_GUILESS_MAIN(TstDisplayModel)
31#include "tst_displayplugin_displaymodel.moc"
32

Subscribers

People subscribed via source and target branches