on xenial help sign in
1774 files changed+217643−56570
since splitsnapshots
unifiedsplit
.bazaar/Makefile−6 .bazaar/plugins/makecheck_unity_phablet.py−43 .bzr-builddeb/default.conf−2 .bzrignore−7 .crossbuilder/post_deploy+1 .gitignore+7 tests/autopilot/.project → .project+1−1 tests/autopilot/.pydevproject → .pydevproject+3−1 .settings/Autopilot List.launch+14 .settings/Autopilot Run.launch+14 CMakeLists.txt+94−13 CODING+60−69 Jenkinsfile+2 README.md+31 build−89 build.sh+82 clickable.yaml+153 cmake/modules/Plugins.cmake−68 cmake/modules/QmlTest.cmake+469−101 cmake/modules/autopilot.cmake+2−1 data/51-unity8-greeter.conf+2 data/CMakeLists.txt+22−3 data/com.canonical.Unity.gschema.xml+255 data/com.canonical.Unity8.gschema.xml+75 data/devices.conf+30 data/indicators-client.desktop.in+9 data/test.sensors+12 data/unity-mock-indicator-service.conf+7 data/unity-scope-tool.desktop.in−8 data/unity8-filewatcher.conf+13 data/unity8-greeter-init.conf+12 data/unity8-greeter-logrotate.conf+14 data/unity8-greeter-wrapper+109 data/unity8-greeter.desktop.in+7 data/unity8-greeter.pkla+44 data/unity8.conf+84−18 data/unity8.desktop.in+1−1 debian/bileto_pre_release_hook+5 debian/changelog+5097−16 debian/control+231−114 debian/copyright+21 debian/indicators-client.install+1 debian/rules+26−15 debian/scopes-recommends-generator−27 debian/shlibs.local+1 debian/source/format−1 debian/tests/autopilot.sh+13 debian/tests/control+11 debian/tests/qmluitests.sh+11 debian/unity-scope-tool.install−3 debian/unity8-autopilot.install+1 debian/unity8-common.install+5 debian/unity8-common.udev+2 debian/unity8-doc.install+1 debian/unity8-fake-env.install−3 debian/unity8-greeter.install+5 debian/unity8-private.install+9−4 debian/unity8-schemas.install+1 debian/unity8-tests.install+9 debian/unity8-tests.lintian-overrides+1 debian/unity8.install+13−9 doc/CMakeLists.txt+2 doc/devices.conf+45 include/paths.h.in+86−39 plugins/AccountsService/50-com.canonical.unity.AccountsService.pkla−6 plugins/AccountsService/AccountsService.cpp+365−47 plugins/AccountsService/AccountsService.h+91−12 plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+56−30 plugins/AccountsService/AccountsServiceDBusAdaptor.h+10−6 plugins/AccountsService/CMakeLists.txt+6−15 plugins/AccountsService/com.canonical.unity.AccountsService.policy−24 plugins/AccountsService/com.canonical.unity.AccountsService.xml+43−6 plugins/AccountsService/plugin.cpp+1 plugins/AccountsService/plugin.h+1−1 plugins/AccountsService/qmldir+1−1 plugins/CMakeLists.txt+21−2 plugins/Cursor/3rd_party/CMakeLists.txt+1 plugins/Cursor/3rd_party/xcursor/CMakeLists.txt+15 plugins/Cursor/3rd_party/xcursor/xcursor.c+968 plugins/Cursor/3rd_party/xcursor/xcursor.h+65 plugins/Cursor/CMakeLists.txt+32 plugins/Cursor/Cursor.qml+62 plugins/Cursor/CursorImageInfo.cpp+115 plugins/Cursor/CursorImageInfo.h+82 plugins/Cursor/CursorImageProvider.cpp+337 plugins/Cursor/CursorImageProvider.h+103 plugins/Cursor/MousePointer.cpp+235 plugins/Cursor/MousePointer.h+92 plugins/Cursor/plugin.cpp+41 plugins/Cursor/plugin.h+33 plugins/Cursor/qmldir+3 plugins/DashViews/CMakeLists.txt−46 plugins/DashViews/abstractdashview.cpp−388 plugins/DashViews/abstractdashview.h−146 plugins/DashViews/horizontaljournal.cpp−254 plugins/DashViews/horizontaljournal.h−67 plugins/DashViews/listviewwithpageheader.cpp−1300 plugins/DashViews/listviewwithpageheader.h−217 plugins/DashViews/organicgrid.cpp−268 plugins/DashViews/organicgrid.h−95 plugins/DashViews/qmldir−3 plugins/DashViews/verticaljournal.cpp−281 plugins/DashViews/verticaljournal.h−104 plugins/GlobalShortcut/CMakeLists.txt+10 plugins/GlobalShortcut/globalshortcut.cpp+91 plugins/GlobalShortcut/globalshortcut.h+81 plugins/GlobalShortcut/globalshortcutregistry.cpp+125 plugins/GlobalShortcut/globalshortcutregistry.h+70 plugins/GlobalShortcut/plugin.cpp+27 plugins/GlobalShortcut/plugin.h+32 plugins/GlobalShortcut/qmldir+2 plugins/Greeter/CMakeLists.txt+6 plugins/Greeter/Unity/CMakeLists.txt+1 plugins/Greeter/Unity/Launcher/CMakeLists.txt+35 plugins/Greeter/Unity/Launcher/launcheritem.cpp+218 plugins/Greeter/Unity/Launcher/launcheritem.h+84 plugins/Greeter/Unity/Launcher/launchermodelas.cpp+303 plugins/Greeter/Unity/Launcher/launchermodelas.h+77 plugins/Greeter/Unity/Launcher/plugin.cpp+46 tests/mocks/Unity/fake_unity_plugin.h → plugins/Greeter/Unity/Launcher/plugin.h+6−8 plugins/Greeter/Unity/Launcher/qmldir+3 plugins/Unity/Launcher/common/quicklistentry.cpp → plugins/Greeter/Unity/Launcher/quicklistentry.cpp+1−4 plugins/Unity/Launcher/common/quicklistentry.h → plugins/Greeter/Unity/Launcher/quicklistentry.h+1−4 plugins/Greeter/Unity/Launcher/quicklistmodel.cpp+72 plugins/Greeter/Unity/Launcher/quicklistmodel.h+55 plugins/HudClient/CMakeLists.txt−43 plugins/HudClient/hudclient.cpp−294 plugins/HudClient/hudclient.h−71 plugins/HudClient/hudtoolbarmodel.cpp−98 plugins/HudClient/qmldir−3 plugins/HudClient/volumepeakdetector.cpp−223 plugins/HudClient/volumepeakdetector.h−78 plugins/LightDM/CMakeLists.txt+10−26 plugins/LightDM/DBusGreeter.cpp+50 plugins/LightDM/DBusGreeter.h+52 plugins/LightDM/DBusGreeterList.cpp+9−30 plugins/LightDM/DBusGreeterList.h+4−8 plugins/LightDM/FullLightDM/CMakeLists.txt+32 plugins/LightDM/FullLightDM/qmldir+3 plugins/LightDM/Greeter.cpp+182−37 plugins/LightDM/Greeter.h+30−13 tools/registry-tracker.h → plugins/LightDM/GreeterPrivate.h+22−21 plugins/LightDM/IntegratedLightDM/CMakeLists.txt+33 qml/Panel/PanelBackground.qml → plugins/LightDM/IntegratedLightDM/QLightDM/Greeter+2−6 tests/mocks/Unity/Indicators/qml/fake_menu_widget1.qml → plugins/LightDM/IntegratedLightDM/QLightDM/SessionsModel+2−8 tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml → plugins/LightDM/IntegratedLightDM/QLightDM/UsersModel+2−8 plugins/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txt+54 tests/mocks/LightDM/Greeter.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.cpp+29−14 tests/mocks/LightDM/Greeter.h → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.h+9−6 plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cpp+309 tests/mocks/LightDM/GreeterPrivate.h → plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.h+4−2 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cpp+87 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.h+72 tests/mocks/LightDM/single/GreeterPrivate.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.cpp+13−23 plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.h+54 tests/mocks/LightDM/UsersModel.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.cpp+14−21 tests/mocks/LightDM/UsersModel.h → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.h+10−6 plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.cpp+94 plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.h+72 plugins/LightDM/IntegratedLightDM/qmldir+3 plugins/LightDM/PromptsModel.cpp+97 plugins/LightDM/PromptsModel.h+70 plugins/LightDM/SessionsModel.cpp+135 plugins/LightDM/SessionsModel.h+66 plugins/LightDM/UsersModel.cpp+183−15 plugins/LightDM/UsersModel.h+8−10 plugins/LightDM/plugin.cpp+41−15 plugins/LightDM/plugin.h+4−6 plugins/LightDM/qmldir+3−3 plugins/Lights/CMakeLists.txt+23 plugins/Lights/HfdLights.cpp+62 plugins/Lights/HfdLights.h+42 plugins/Lights/LegacyLights.cpp+91 plugins/Lights/LegacyLights.h+45 plugins/Lights/Lights.cpp+101 plugins/Lights/Lights.h+71 plugins/Lights/android-hardware.h+19 plugins/Lights/plugin.cpp+54 plugins/Lights/plugin.h+34 plugins/Lights/qmldir+3 plugins/Powerd/CMakeLists.txt+8−4 plugins/Powerd/Powerd.cpp+67−13 plugins/Powerd/Powerd.h+25−9 plugins/Powerd/plugin.h+1−1 plugins/Powerd/qmldir+1−1 plugins/ScreenshotDirectory/CMakeLists.txt+9 plugins/ScreenshotDirectory/ScreenGrabber.qmltypes+17 plugins/ScreenshotDirectory/ScreenshotDirectory.cpp+64 plugins/ScreenshotDirectory/ScreenshotDirectory.h+39 tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp → plugins/ScreenshotDirectory/plugin.cpp+7−14 plugins/ScreenshotDirectory/plugin.h+31 plugins/ScreenshotDirectory/qmldir+2 plugins/SessionBroadcast/CMakeLists.txt+6−5 plugins/SessionBroadcast/SessionBroadcast.cpp+40−10 plugins/SessionBroadcast/SessionBroadcast.h+13−3 plugins/SessionBroadcast/plugin.h+1−1 plugins/SessionBroadcast/qmldir+1−1 plugins/UInput/CMakeLists.txt+7 plugins/UInput/plugin.cpp+26 plugins/UInput/plugin.h+32 plugins/UInput/qmldir+3 plugins/UInput/uinput.cpp+182 plugins/UInput/uinput.h+61 plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt+7−9 plugins/Ubuntu/DownloadDaemonListener/DownloadTracker.cpp+9−8 plugins/Ubuntu/DownloadDaemonListener/DownloadTracker.h+3−2 plugins/Ubuntu/DownloadDaemonListener/interface/downloadtrackeradaptor.cpp+2−2 plugins/Ubuntu/DownloadDaemonListener/interface/downloadtrackeradaptor.h+82−15 plugins/Ubuntu/DownloadDaemonListener/interface/metatypes.h+3−6 plugins/Ubuntu/DownloadDaemonListener/plugin.h+2−2 plugins/Ubuntu/DownloadDaemonListener/qmldir+1−1 plugins/Ubuntu/Gestures/AxisVelocityCalculator.cpp+1−1 plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+6−6 plugins/Ubuntu/Gestures/CMakeLists.txt+31−11 plugins/Ubuntu/Gestures/Damper.h−87 plugins/Ubuntu/Gestures/Direction.cpp+11−4 plugins/Ubuntu/Gestures/Direction.h+8−5 plugins/Ubuntu/Gestures/DirectionalDragArea.cpp−697 plugins/Ubuntu/Gestures/DirectionalDragArea.h−288 plugins/Ubuntu/Gestures/MouseEventGenerator.cpp+64 plugins/Ubuntu/Gestures/MouseEventGenerator.h+48 plugins/Ubuntu/Gestures/PressedOutsideNotifier.h+1−1 plugins/Ubuntu/Gestures/TimeSource.cpp−49 plugins/Ubuntu/Gestures/TimeSource.h−54 plugins/Ubuntu/Gestures/TouchDispatcher.cpp+398 plugins/Ubuntu/Gestures/TouchDispatcher.h+96 plugins/Ubuntu/Gestures/TouchGate.cpp+290 plugins/Ubuntu/Gestures/TouchGate.h+125 plugins/Ubuntu/Gestures/TouchGestureArea.cpp+879 plugins/Ubuntu/Gestures/TouchGestureArea.h+229 plugins/Ubuntu/Gestures/UbuntuGesturesGlobal.h → plugins/Ubuntu/Gestures/UbuntuGesturesQmlGlobal.h+3−3 plugins/Ubuntu/Gestures/plugin.cpp+9−4 plugins/Ubuntu/Gestures/plugin.h+2−2 plugins/Ubuntu/Gestures/qmldir+2−2 plugins/Unity/ApplicationMenu/CMakeLists.txt+19 plugins/Unity/ApplicationMenu/applicationmenuregistry.cpp+141 plugins/Unity/ApplicationMenu/applicationmenuregistry.h+83 plugins/Unity/ApplicationMenu/com.ubuntu.MenuRegistrar.xml+83 plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.cpp+44 plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.h+34 plugins/Unity/ApplicationMenu/plugin.cpp+42 plugins/Unity/ApplicationMenu/plugin.h+32 plugins/Unity/ApplicationMenu/qmldir+3 plugins/Unity/CMakeLists.txt+5 plugins/Unity/Connectivity/CMakeLists.txt+10 plugins/Unity/Connectivity/Connectivity.cpp+33 plugins/Unity/Connectivity/Connectivity.h+34 plugins/Unity/Connectivity/plugin.cpp+34 plugins/Unity/Connectivity/plugin.h+31 plugins/Unity/Connectivity/qmldir+3 plugins/Unity/Indicators/CMakeLists.txt+14−27 plugins/Unity/Indicators/actionrootstate.cpp+97 plugins/Unity/Indicators/actionrootstate.h+55 plugins/Unity/Indicators/indicator.cpp+27−13 plugins/Unity/Indicators/indicator.h+6−2 plugins/Unity/Indicators/indicators.h+6−9 plugins/Unity/Indicators/indicatorsmanager.cpp+45−55 plugins/Unity/Indicators/indicatorsmanager.h+9−5 plugins/Unity/Indicators/indicatorsmodel.cpp+50−20 plugins/Unity/Indicators/indicatorsmodel.h+21−8 plugins/Unity/Indicators/menucontentactivator.cpp+6−7 plugins/Unity/Indicators/menucontentactivator.h+2−2 plugins/Unity/Indicators/modelactionrootstate.cpp+204 plugins/Unity/Indicators/modelactionrootstate.h+72 plugins/Unity/Indicators/modelprinter.cpp+30−15 plugins/Unity/Indicators/modelprinter.h+4−3 plugins/Unity/Indicators/plugin.cpp+17−13 plugins/Unity/Indicators/plugin.h+2−2 plugins/Unity/Indicators/qml/CMakeLists.txt−5 plugins/Unity/Indicators/qml/CachedUnityMenuModel.qml−60 plugins/Unity/Indicators/qml/MenuItemFactory.qml−500 plugins/Unity/Indicators/qml/MessageMenuItemFactory.qml−253 plugins/Unity/Indicators/qml/RemoveBackground.qml−55 plugins/Unity/Indicators/qml/qmldir−10 plugins/Unity/Indicators/qmldir+3 plugins/Unity/Indicators/resources/artwork/messaging/default_app.svg−42 plugins/Unity/Indicators/resources/artwork/messaging/default_contact.png plugins/Unity/Indicators/resources/indicators.qrc−6 plugins/Unity/Indicators/rootactionstate.cpp−299 plugins/Unity/Indicators/rootstateparser.cpp+231 plugins/Unity/Indicators/rootactionstate.h → plugins/Unity/Indicators/rootstateparser.h+22−37 plugins/Unity/Indicators/sharedunitymenumodel.cpp+96 plugins/Unity/Indicators/sharedunitymenumodel.h+66 plugins/Unity/Indicators/unitymenumodelcache.cpp+32−9 plugins/Unity/Indicators/unitymenumodelcache.h+12−6 plugins/Unity/Indicators/unitymenumodelstack.cpp+8−8 plugins/Unity/Indicators/unitymenumodelstack.h+1−1 plugins/Unity/Indicators/visibleindicatorsmodel.cpp−92 plugins/Unity/Indicators/visibleindicatorsmodel.h−56 plugins/Unity/InputInfo/CMakeLists.txt+38 plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux.cpp+296 plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux_p.h+96 plugins/Unity/InputInfo/plugin.cpp+32 tests/qmltests/Dash/Previews/MockPreviewWidget.qml → plugins/Unity/InputInfo/plugin.h+13−10 plugins/Unity/InputInfo/qdeclarativeinputdevicemodel.cpp+196 plugins/Unity/InputInfo/qdeclarativeinputdevicemodel_p.h+102 plugins/Unity/InputInfo/qinputinfo.cpp+270 plugins/Unity/InputInfo/qinputinfo.h+142 plugins/Unity/InputInfo/qmldir+3 plugins/Unity/Launcher/CMakeLists.txt+29−12 plugins/Unity/Launcher/appdrawermodel.cpp+192 plugins/Unity/Launcher/appdrawermodel.h+64 plugins/Unity/Launcher/asadapter.cpp+67 plugins/Unity/Launcher/asadapter.h+46 plugins/Unity/Launcher/backend/launcherbackend.cpp−320 plugins/Unity/Launcher/backend/launcherbackend.h−148 plugins/Unity/Launcher/dbusinterface.cpp+226 plugins/Unity/Launcher/dbusinterface.h+49 plugins/Unity/Launcher/gsettings.cpp+80 plugins/Unity/Launcher/gsettings.h+47 plugins/Unity/Launcher/launcheritem.cpp+133−6 plugins/Unity/Launcher/launcheritem.h+36−22 plugins/Unity/Launcher/launchermodel.cpp+365−67 plugins/Unity/Launcher/launchermodel.h+41−25 plugins/Unity/Launcher/plugin.cpp+7−6 plugins/Unity/Launcher/plugin.h+1−1 plugins/Unity/Launcher/qmldir+1−1 plugins/Unity/Launcher/quicklistentry.cpp+85 plugins/Unity/Launcher/quicklistentry.h+56 plugins/Unity/Launcher/quicklistmodel.cpp+23−1 plugins/Unity/Launcher/quicklistmodel.h+7−4 plugins/Unity/Launcher/ualwrapper.cpp+74 plugins/Unity/Launcher/ualwrapper.h+36 plugins/Unity/Launcher/xdgwatcher.cpp+129 plugins/Unity/Launcher/xdgwatcher.h+46 plugins/Unity/Platform/CMakeLists.txt+11 plugins/Unity/Platform/platform.cpp+66 plugins/Unity/Platform/platform.h+64 tests/mocks/LightDM/single-passphrase/UsersModelPrivate.cpp → plugins/Unity/Platform/plugin.cpp+7−13 tests/mocks/Unity/fake_applications_scope.h → plugins/Unity/Platform/plugin.h+9−10 plugins/Unity/Platform/qmldir+2 plugins/Unity/Session/CMakeLists.txt+29 plugins/Unity/Session/dbusunitysessionservice.cpp+647 plugins/Unity/Session/dbusunitysessionservice.h+377 plugins/Unity/Session/orientationlock.cpp+74 plugins/Unity/Session/orientationlock.h+60 plugins/Unity/Session/plugin.cpp+48 plugins/Unity/Session/plugin.h+34 plugins/Unity/Session/qmldir+3 plugins/Utils/CMakeLists.txt+33−17 plugins/Utils/EdgeBarrierSettings.qml+66 plugins/Utils/ElapsedTimer.h+51 tests/plugins/DashViews/organicgridtest.qml → plugins/Utils/Style.js+16−22 plugins/Utils/Timer.cpp+62 plugins/Utils/Timer.h+78 plugins/Utils/URLDispatcher.cpp+80 plugins/Utils/URLDispatcher.h+47 plugins/Utils/WindowInputMonitor.cpp+126 plugins/Utils/WindowInputMonitor.h+97 plugins/Utils/activefocuslogger.cpp+61 tests/plugins/Ubuntu/Gestures/tst_Damper.cpp → plugins/Utils/activefocuslogger.h+15−18 plugins/Utils/albumartprovider.cpp−234 plugins/Utils/albumartprovider.h−56 plugins/Utils/appdrawerproxymodel.cpp+189 plugins/Utils/appdrawerproxymodel.h+87 plugins/Utils/applicationsfiltermodel.cpp+101 plugins/Utils/applicationsfiltermodel.h+69 plugins/Utils/bottombarvisibilitycommunicatorshell.cpp−49 plugins/Utils/bottombarvisibilitycommunicatorshell.h−59 plugins/Utils/constants.cpp+32 plugins/Utils/constants.h+43 plugins/Utils/deviceconfigparser.cpp+176 plugins/Utils/deviceconfigparser.h+66 plugins/Utils/easingcurve.cpp+73 plugins/Utils/easingcurve.h+69 plugins/Utils/expressionfiltermodel.cpp+49 plugins/Utils/expressionfiltermodel.h+42 plugins/Utils/globalfunctions.cpp+58 plugins/Utils/globalfunctions.h+44 plugins/Utils/inputeventgenerator.cpp+34 plugins/Utils/inputeventgenerator.h+40 plugins/Utils/inputwatcher.cpp+118 plugins/Utils/inputwatcher.h+58 plugins/Utils/mediaartcache.cpp−178 plugins/Utils/mediaartcache.h−54 plugins/Utils/plugin.cpp+58−37 plugins/Utils/plugin.h+1−2 plugins/Utils/qlimitproxymodelqml.cpp+17−17 plugins/Utils/qlimitproxymodelqml.h+2−2 plugins/Utils/qmldir+3−1 plugins/Utils/quicklistproxymodel.cpp+72 plugins/Utils/quicklistproxymodel.h+52 plugins/Utils/qvariantlistmodel.h+6−6 plugins/Utils/tabfocusfence.cpp+72 plugins/Utils/tabfocusfence.h+38 plugins/Utils/timeformatter.cpp−201 plugins/Utils/timeformatter.h−66 plugins/Utils/timezoneFormatter.cpp+45 plugins/Utils/timezoneFormatter.h+33 plugins/Utils/unitysortfilterproxymodelqml.cpp+167 plugins/Utils/unitysortfilterproxymodelqml.h+68 plugins/Utils/windowinputfilter.cpp+70 plugins/Utils/windowinputfilter.h+58 plugins/Utils/windowstatestorage.cpp+383 plugins/Utils/windowstatestorage.h+74 plugins/WindowManager/AvailableDesktopArea.cpp+50 plugins/WindowManager/AvailableDesktopArea.h+38 plugins/WindowManager/CMakeLists.txt+26 plugins/WindowManager/InputMethodManager.cpp+56 plugins/WindowManager/InputMethodManager.h+55 plugins/WindowManager/TopLevelWindowModel.cpp+782 plugins/WindowManager/TopLevelWindowModel.h+308 plugins/WindowManager/Window.cpp+277 plugins/WindowManager/Window.h+176 qml/Components/Circle.qml → plugins/WindowManager/WindowManagerGlobal.h+7−6 plugins/WindowManager/WindowManagerPlugin.cpp+44 plugins/WindowManager/WindowManagerPlugin.h+32 plugins/WindowManager/WindowMargins.cpp+74 plugins/WindowManager/WindowMargins.h+59 plugins/WindowManager/qmldir+2 plugins/Wizard/50-com.canonical.unity.wizard.pkla+6 plugins/Wizard/CMakeLists.txt+23 plugins/Wizard/Changelog.cpp+58 plugins/Wizard/Changelog.h+52 plugins/Wizard/LocalePlugin.cpp+291 plugins/Wizard/LocalePlugin.h+58 plugins/Wizard/PageList.cpp+127 plugins/Wizard/PageList.h+53 plugins/Wizard/Status.cpp+143 plugins/Wizard/Status.h+60 plugins/Wizard/System.cpp+182 plugins/Wizard/System.h+75 plugins/Wizard/Unity/Application/CMakeLists.txt+3 tests/mocks/Unity/Application/OSKController.qml → plugins/Wizard/Unity/Application/OSKController.qml plugins/Wizard/Unity/Application/qmldir+2 plugins/Wizard/Unity/CMakeLists.txt+1 plugins/Wizard/Utils/CMakeLists.txt+27 plugins/DashViews/plugin.cpp → plugins/Wizard/Utils/plugin.cpp+19−13 plugins/DashViews/plugin.h → plugins/Wizard/Utils/plugin.h+4−4 plugins/Wizard/Utils/qmldir+2 plugins/Utils/qsortfilterproxymodelqml.cpp → plugins/Wizard/Utils/qsortfilterproxymodelqml.cpp plugins/Utils/qsortfilterproxymodelqml.h → plugins/Wizard/Utils/qsortfilterproxymodelqml.h plugins/Wizard/keyboardLayoutsModel.cpp+163 plugins/Wizard/keyboardLayoutsModel.h+66 plugins/Wizard/main.cpp+93 plugins/Wizard/plugin.cpp+38 qml/Components/RatingStars.qml → plugins/Wizard/plugin.h+13−7 plugins/Wizard/qmldir+2 plugins/Wizard/timezonemodel.cpp+244 plugins/Wizard/timezonemodel.h+80 plugins/Wizard/ubuntu-system-settings-wizard-cleanup.conf+20 plugins/Wizard/ubuntu-system-settings-wizard-set-lang.conf+30 plugins/Wizard/ubuntu-system-settings-wizard.conf+75 po/aa.po+880 po/am.po+1350−114 po/ar.po+1221−135 po/ast.po+1350−114 po/az.po+909−112 po/be.po+1253 po/bg.po+819−114 po/bn.po+1062 po/br.po+1348 po/bs.po+1061−86 po/ca.po+1397−117 po/ca@valencia.po+1125 po/ce.po+816 po/ckb.po+809−109 po/co.po+1061 po/cs.po+1276−115 po/cy.po+1165 po/da.po+1135−89 po/de.po+1393−113 po/el.po+1275−114 po/en_AU.po+1384−111 po/en_GB.po+1345−111 po/en_US.po+814 po/eo.po+837−83 po/es.po+1383−115 po/et.po+816 po/eu.po+1168−94 po/fa.po+1385−102 po/fi.po+1380−113 po/fo.po+829−89 po/fr.po+1411−109 po/ga.po+1109 po/gd.po+1400−118 po/gl.po+1378−113 po/gu.po+814 po/gv.po+918 po/he.po+1037−117 po/hi.po+775−95 po/hr.po+1324−113 po/hu.po+1379−115 po/hy.po+876−95 po/ia.po+1409 po/id.po+920−82 po/is.po+936−108 po/it.po+1390−116 po/ja.po+942−100 po/kk.po+841 po/km.po+1015−117 po/kn.po+747−85 po/ko.po+1188−113 po/ku.po+978 po/ky.po+747−85 po/lo.po+754−90 po/lt.po+976−117 po/lv.po+1127−96 po/ml.po+810−111 po/mr.po+783−89 po/ms.po+1316−110 po/my.po+837−102 po/nb.po+1367−112 po/ne.po+834 po/nl.po+1378−111 po/nn.po+816 po/oc.po+1276 po/or.po+816 po/pa.po+1153 po/pl.po+1374−117 po/pt.po+1375−110 po/pt_BR.po+1174−114 po/ro.po+1172−90 po/ru.po+1386−125 po/sc.po+904 po/shn.po+727−81 po/si.po+797−82 po/sk.po+1352 po/sl.po+1347−119 po/sq.po+971−94 po/sr.po+1344−102 po/sv.po+1375−114 po/sw.po+1005−88 po/ta.po+809−110 po/te.po+780−81 po/th.po+709−112 po/tr.po+1370−113 po/ug.po+1200−104 po/uk.po+1375−116 po/unity8.pot+719−82 po/update-unity-pot+31−5 po/ur.po+819 po/uz.po+816 po/vi.po+725−79 po/wo.po+1232 po/xh.po+725−79 po/zh_CN.po+1325−115 po/zh_HK.po+837−109 po/zh_TW.po+1273−115 qml/ApplicationMenus/ApplicationMenuItemFactory.qml+135 qml/ApplicationMenus/ApplicationMenusLimits.qml+24 qml/ApplicationMenus/MenuBar.qml+513 qml/ApplicationMenus/MenuItem.qml+146 qml/ApplicationMenus/MenuNavigator.qml+101 qml/ApplicationMenus/MenuPopup.qml+510 qml/ApplicationMenus/RegisteredApplicationMenuModel.qml+56 qml/ApplicationMenus/qmldir+1 qml/Bottombar/Bottombar.qml−227 qml/Bottombar/HudButton.qml−64 qml/Bottombar/graphics/hud@20.png qml/Bottombar/graphics/hud_invoke_button_active@20.png qml/CMakeLists.txt+6−5 qml/Components/AnimationControllerWithSignals.qml−64 qml/Components/ApplicationManagerWrapper.qml−169 qml/Components/ApplicationScreenshot.qml−61 qml/Components/ApplicationsModelStageFiltered.qml−49 qml/Components/Background.qml+87 tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml → qml/Components/BlurLayer.qml+18−14 qml/Components/BrightnessControl.qml+54 qml/Components/Carousel.qml−339 qml/Components/Dialogs.qml+328 qml/Components/DragHandle.qml+74−56 qml/Components/DraggingArea.qml+6−2 qml/Components/EdgeBarrier.qml+114 qml/Components/EdgeBarrierController.qml+74 qml/Components/EdgeDemo.qml−239 qml/Components/EdgeDemoOverlay.qml−273 qml/Components/EdgeDragArea.qml−44 qml/Components/EdgeDragEvaluator.qml+20−11 qml/Components/FadingLabel.qml+42 qml/Components/FilterGrid.qml−110 qml/Components/Flickable.qml+24 qml/Components/FloatingFlickable.qml+63 qml/Components/GridView.qml+24 qml/Components/Handle.qml+44 qml/Components/InputMethod.qml+58 qml/Components/ItemGrabber.qml+86 qml/Components/ItemSnapshot.qml+45 qml/Components/KeyboardShortcutsOverlay.qml+336 qml/Components/KeymapSwitcher.qml+102 qml/Components/LazyImage.qml+32−15 qml/Components/ListItems/Base.qml−125 qml/Components/ListItems/Header.qml−84 qml/Components/ListItems/Highlight.qml−46 qml/Components/ListItems/VerticalThinDivider.qml−26 qml/Components/ListItems/graphics/ListItemDividerHorizontal@18.png qml/Components/ListItems/graphics/ListItemDividerVertical@18.png qml/Components/ListView.qml+24 qml/Components/ListViewOSKScroller.qml+53 qml/Components/Lockscreen.qml+256 qml/Components/MediaServices/MediaServices.qml+386 qml/Components/MediaServices/MediaServicesControls.qml+192 qml/Components/MediaServices/MediaServicesHeader.qml+71 qml/Components/MediaServices/VideoPlayer.qml+155 qml/Components/MediaServices/VideoPlayerControls.qml+158 qml/Components/ModeSwitchWarningDialog.qml+101 qml/Components/NotificationAudio.qml+60 qml/Components/OpenEffect.qml−138 qml/Components/Orientations.qml+57 qml/Components/PageHeader.qml−387 qml/Components/PanelState/PanelState.qml+36 qml/Components/PanelState/qmldir+1 qml/Components/PassphraseLockscreen.qml+150 qml/Components/PhysicalKeysMapper.qml+163 qml/Components/PinLockscreen.qml+258 qml/Components/PinPadButton.qml+45−42 qml/Components/Rating.qml+3−2 qml/Components/RatingStyle.qml+5−2 qml/Components/ResponsiveFlowView.qml−81 qml/Components/ResponsiveGridView.qml−94 qml/Components/Revealer.qml−241 qml/Components/ScrollCalculator.qml+100 qml/Components/SearchHistoryModel.qml → qml/Components/SearchHistoryModel/SearchHistoryModel.qml+2−1 qml/Components/SearchHistoryModel/qmldir+1 qml/Components/SeeMore.qml−68 qml/Components/SharingPicker.qml+102 qml/Components/ShellDialog.qml+68 qml/Components/Showable.qml+37−11 qml/Components/Stage.qml−563 qml/Components/StandardAnimation.qml+1−1 qml/Components/TileStyle.qml−81 qml/Components/UbuntuShapeForItem.qml−46 qml/Components/VirtualTouchPad.qml+406 qml/Components/VolumeControl.qml+28−8 qml/Components/Wallpaper.qml+96 qml/Components/WallpaperResolver.qml+60 qml/Components/WindowControlButtons.qml+121 qml/Components/WrongPasswordAnimation.qml+1−1 qml/Components/ZoomableImage.qml+157 tests/mocks/Unity/Notifications/notification.js → qml/Components/flickableUtils.js+11−6 qml/Components/graphics/PageHeaderBaseDivider@18.png qml/Components/graphics/PageHeaderBaseDivider@18.sci−5 qml/Components/graphics/close@20.png qml/Components/graphics/icon_star_empty@20.png qml/Components/graphics/icon_star_full@20.png qml/Components/graphics/icon_star_half@20.png qml/Components/graphics/icon_star_off@20.png qml/Components/graphics/icon_star_on@20.png qml/Components/graphics/non-selected@18.png qml/Components/graphics/window-close.svg+164 qml/Components/graphics/window-maximize.svg+164 qml/Components/graphics/window-minimize.svg+164 qml/Components/graphics/window-window.svg+41 qml/Dash/Apps/AppPreview.qml−167 qml/Dash/Apps/CloseIcon.qml−62 qml/Dash/Apps/DashPluginFilterGrid.qml−47 qml/Dash/Apps/FrequentlyUsedAppsModel.qml−110 qml/Dash/Apps/RunningApplicationTile.qml−139 qml/Dash/Apps/RunningApplicationsGrid.qml−120 qml/Dash/Apps/graphics/close_btn@9.png qml/Dash/Card.qml−146 qml/Dash/CardHeader.qml−140 qml/Dash/CardTool.qml−140 qml/Dash/Dash.qml−78 qml/Dash/DashApps.qml−56 qml/Dash/DashCarousel.qml−47 qml/Dash/DashContent.qml−219 qml/Dash/DashContentOpenEffect.qml−57 qml/Dash/DashContentTabBarStyle.qml−21 qml/Dash/DashFilterGrid.qml−65 qml/Dash/DashPreview.qml−208 qml/Dash/DashRenderer.qml−65 qml/Dash/Generic/FlatTileStyle.qml−79 qml/Dash/Generic/GenericCarousel.qml−53 qml/Dash/Generic/GenericFilterGrid.qml−46 qml/Dash/Generic/GenericFilterGridPotrait.qml−28 qml/Dash/Generic/GenericPreview.qml−197 qml/Dash/Generic/WeatherFilterGrid.qml−47 qml/Dash/GenericScopeView.qml−400 qml/Dash/Movie/MoviePreview.qml−71 qml/Dash/Music/MusicFilterGrid.qml−48 qml/Dash/Music/MusicPreview.qml−203 qml/Dash/Music/MusicTileStyle.qml−102 qml/Dash/PreviewDelegateMapper.qml−38 qml/Dash/PreviewListView.qml−218 qml/Dash/Previews/Header.qml−109 qml/Dash/Previews/Preview.qml−104 qml/Dash/Previews/PreviewActionCombo.qml−66 qml/Dash/Previews/PreviewActions.qml−64 qml/Dash/Previews/PreviewAudioPlayback.qml−204 qml/Dash/Previews/PreviewImageGallery.qml−58 qml/Dash/Previews/PreviewProgress.qml−64 qml/Dash/Previews/PreviewRating.qml−160 qml/Dash/Previews/PreviewTextSummary.qml−83 qml/Dash/Previews/PreviewVideoPlayback.qml−72 qml/Dash/Previews/PreviewWidgetFactory.qml−69 qml/Dash/Previews/Reviews.qml−194 qml/Dash/Previews/graphics/music_progress_bg.png qml/Dash/SearchableResultModel.qml−44 qml/Dash/Video/VideoCarousel.qml−34 qml/Dash/Video/VideoFilterGrid.qml−47 qml/Dash/Video/VideoTileStyle.qml−87 qml/Dash/Video/graphics/icon_button_amazon@20.png qml/Dash/Video/graphics/icon_button_u1@20.png qml/Dash/Video/graphics/movie_icon_holder@27.png qml/Dash/graphics/checkers.png qml/Dash/graphics/header_handlearrow2@20.png qml/Dash/graphics/header_handlearrow@20.png qml/Dash/graphics/icon_clear@20.png qml/Dash/graphics/icon_listview_clear@20.png qml/Dash/graphics/icon_search_active@20.png qml/Dash/graphics/icon_search_inactive@20.png qml/Dash/graphics/phone/screenshots/browser@12.png qml/Dash/graphics/phone/screenshots/camera@12.png qml/Dash/graphics/phone/screenshots/facebook@12.png qml/Dash/graphics/phone/screenshots/map@12.png qml/Dash/graphics/phone/screenshots/music@12.png qml/Dash/graphics/phone/screenshots/phone@12.png qml/Dash/graphics/phone/screenshots/settings@12.png qml/Dash/graphics/phone/screenshots/twitter@12.png qml/Dash/graphics/play_button@18.png qml/Dash/graphics/play_button_active@18.png qml/Dash/graphics/play_button_active_big@20.png qml/Dash/graphics/play_button_big@20.png qml/Dash/graphics/tabbarchevron@27.png qml/Dash/graphics/tablet/icon_close_preview@20.png qml/Dash/graphics/tooltip_arrow@27.png qml/DeviceConfiguration.qml+161 qml/DisabledScreenNotice.qml+81 qml/Greeter/ButtonPrompt.qml+51 qml/Greeter/Circle.qml+57 qml/Greeter/Clock.qml+25−19 qml/Greeter/CoverPage.qml+271 qml/Greeter/DelayedLockscreen.qml+86 qml/Greeter/Dot.qml+1−1 qml/Greeter/FullLightDMImpl.qml+31 qml/Greeter/Greeter.qml+580−70 qml/Greeter/GreeterContent.qml−166 qml/Greeter/GreeterPrompt.qml+127 qml/Greeter/GreeterView.qml+534 qml/Greeter/Infographics.qml+108−134 qml/Greeter/IntegratedLightDMImpl.qml+30 qml/Greeter/LightDMService.qml+54 qml/Greeter/Lockscreen.qml−156 qml/Greeter/LoginAreaContainer.qml+38 qml/Greeter/LoginList.qml+174−186 qml/Greeter/ObjectPositioner.qml+2−2 qml/Greeter/PassphraseLockscreen.qml−88 qml/Greeter/PinLockscreen.qml−216 qml/Greeter/PinPrompt.qml+184 qml/Greeter/PromptList.qml+151 qml/Greeter/SessionIcon.qml+47 qml/Greeter/SessionsList.qml+205 qml/Greeter/ShimGreeter.qml+47 qml/Greeter/TextPrompt.qml+198 qml/Greeter/graphics/dot_empty.png qml/Greeter/graphics/dot_filled.png qml/Greeter/graphics/dot_pointer.png qml/Greeter/graphics/icon_arrow.png qml/Greeter/graphics/infographic_circle_back.png qml/Greeter/graphics/session_icons/gnome_badge.png qml/Greeter/graphics/session_icons/kde_badge.png qml/Greeter/graphics/session_icons/recovery_console_badge.png qml/Greeter/graphics/session_icons/ubuntu_badge.png qml/Greeter/graphics/session_icons/unknown_badge.png qml/Greeter/qmldir+1 qml/Hud/Hud.qml−496 qml/Hud/HudParametrizedActionsPage.qml−172 qml/Hud/Result.qml−84 qml/Hud/ResultList.qml−106 qml/Hud/SearchBar.qml−100 qml/Hud/ShowingAnimation.qml−54 qml/Hud/SliderLabel.qml−76 qml/Hud/SoundAmplitudeDelegate.qml−52 qml/Hud/SoundAmplitudeVisual.qml−146 qml/Hud/graphics/divider@20.png qml/Hud/graphics/divider@20.sci−5 qml/Hud/graphics/dropshadow_right@20.png qml/Hud/graphics/help@20.png qml/Hud/graphics/hud_bg@20.png qml/Hud/graphics/hud_handlearrow@20.png qml/Hud/graphics/hud_handlebar@20.png qml/Hud/graphics/icon_arrow@20.png qml/Hud/graphics/icon_clear@20.png qml/Hud/graphics/icon_search@20.png qml/Hud/graphics/microphone@20.png qml/Hud/graphics/popup_triangle@20.png qml/Hud/graphics/settings@20.png qml/Hud/graphics/undo@20.png qml/Hud/graphics/view-fullscreen@20.png qml/Launcher/BackgroundBlur.qml+81 qml/Launcher/Drawer.qml+413 qml/Launcher/DrawerGridView.qml+85 qml/Launcher/FoldingLauncherDelegate.qml+2−2 qml/Launcher/Launcher.qml+479−71 qml/Launcher/LauncherDelegate.qml+167−55 qml/Launcher/LauncherPanel.qml+509−126 qml/Launcher/PullToRefreshScopeStyle.qml+83 qml/Launcher/Tooltip.qml+72 qml/Launcher/graphics/divider-line.png qml/Launcher/graphics/focused_app_arrow@30.png qml/Launcher/graphics/highlight@18.png qml/Launcher/graphics/home.svg+243 qml/Launcher/graphics/home@18.png qml/Launcher/graphics/launcher_bg@30.png qml/Launcher/graphics/launcher_bg@30.sci−5 qml/Launcher/graphics/non-selected@18.png qml/Launcher/graphics/non-selected@18.sci−5 qml/Launcher/graphics/notification@30.png qml/Launcher/graphics/notification@30.sci−5 qml/Launcher/graphics/progressbar-fill@30.png qml/Launcher/graphics/progressbar-fill@30.sci−5 qml/Launcher/graphics/progressbar-trough@30.png qml/Launcher/graphics/progressbar-trough@30.sci−5 qml/Launcher/graphics/quicklist_tooltip@30.png qml/Launcher/graphics/selected@18.png qml/Launcher/graphics/selected@18.sci−5 qml/Launcher/graphics/triangle@18.png qml/Notifications/Notification.qml+396−131 qml/Notifications/NotificationButton.qml+73 qml/Notifications/NotificationMenuItemFactory.qml+133−19 qml/Notifications/Notifications.qml+46−11 qml/Notifications/OptionToggle.qml+125 qml/Notifications/ShapedIcon.qml+8−5 qml/Notifications/SwipeToAct.qml+275 qml/OrientedShell.qml+336 qml/Panel/ActiveCallHint.qml+211 tests/qmltests/Dash/qml/fake_scopeView1.qml → qml/Panel/FakePanelMenu.qml+8−6 qml/Panel/IndicatorItem.qml−55 qml/Panel/IndicatorRow.qml−162 qml/Panel/Indicators.qml−436 qml/Panel/Indicators/DefaultIndicatorPage.qml−222 qml/Panel/Indicators/DefaultIndicatorWidget.qml−127 plugins/Unity/Indicators/qml/IndicatorBase.qml → qml/Panel/Indicators/IndicatorBase.qml+10−13 qml/Panel/Indicators/IndicatorDelegate.qml+4−13 qml/Panel/Indicators/IndicatorItem.qml+310 qml/Panel/Indicators/IndicatorMenuItemFactory.qml+1113 qml/Panel/Indicators/IndicatorsLight.qml+234 qml/Panel/Indicators/MessageMenuItemFactory.qml+244 qml/Panel/Indicators/VisibleIndicators.qml−84 qml/Panel/Indicators/client/IndicatorRepresentation.qml+121 qml/Panel/Indicators/client/IndicatorsClient.qml+14−4 qml/Panel/Indicators/client/IndicatorsList.qml+23−21 qml/Panel/Indicators/client/IndicatorsPage.qml−91 qml/Panel/Indicators/client/IndicatorsTree.qml+12−36 qml/Panel/MenuContent.qml+42−116 qml/Panel/Panel.qml+459−109 qml/Panel/PanelBar.qml+330 qml/Panel/PanelItemRow.qml+270 qml/Panel/PanelMenu.qml+414 qml/Panel/PanelMenuPage.qml+226 qml/Panel/PanelVelocityCalculator.qml+54 qml/Panel/SearchIndicator.qml−82 qml/Panel/graphics/Battery@18.png qml/Panel/graphics/Bluetooth@18.png qml/Panel/graphics/Clock@18.png qml/Panel/graphics/Location@18.png qml/Panel/graphics/Messages@18.png qml/Panel/graphics/Network@18.png qml/Panel/graphics/Sound@18.png qml/Panel/graphics/Sync@18.png qml/Panel/graphics/System@18.png qml/Panel/graphics/Time@18.png qml/Panel/graphics/VerticalDivider@18.png qml/Panel/graphics/handle@12.png qml/Panel/graphics/handle@12.sci−5 qml/Panel/graphics/rectangular_dropshadow@30.png qml/Panel/graphics/search@12.png qml/Panel/graphics/time_and_date@18.png qml/Rotation/HalfLoopRotationAnimation.qml+47 tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml → qml/Rotation/ImmediateRotationAction.qml+14−15 qml/Rotation/NinetyRotationAnimation.qml+88 qml/Rotation/RotationStates.qml+289 qml/Rotation/UpdateShellTransformations.qml+42 qml/ScopeTool.qml−175 qml/Shell.qml+754−612 qml/SideStage/SideStage.qml−73 qml/SideStage/graphics/sidestage_handle@20.png qml/Stage/ApplicationWindow.qml+416 qml/Stage/ChildWindow.qml+203 qml/Stage/ChildWindowRepeater.qml+39 qml/Stage/ChildWindowTree.qml+138 qml/Stage/DecoratedWindow.qml+319 qml/Stage/FakeMaximizeDelegate.qml+233 qml/Stage/MainViewStyle.qml+87 qml/Stage/MoveHandler.qml+201 qml/Stage/OrientationChangeAnimation.qml+265 qml/Stage/PromptSurfaceAnimations.qml+80 qml/Dash/Video/CarouselDelegateVideo.qml → qml/Stage/ResizeGrip.qml+25−21 qml/Stage/SideStage.qml+121 qml/Stage/Splash.qml+150 qml/Stage/Spread/BezierCurve.qml+45 qml/Stage/Spread/KeySpline.js+66 qml/Stage/Spread/MathUtils.js+95 qml/Stage/Spread/OpacityMask.qml+82 qml/Stage/Spread/Spread.qml+173 qml/Stage/Spread/SpreadDelegateInputArea.qml+189 qml/Stage/Spread/SpreadMaths.qml+78 qml/Stage/Spread/StagedRightEdgeMaths.qml+174 qml/Stage/Spread/WindowedRightEdgeMaths.qml+96 qml/Stage/Spread/cubic-bezier.js+39 qml/Stage/Stage.qml+2241 qml/Stage/StageMaths.qml+93 qml/Stage/StagedFullscreenPolicy.qml+50 qml/Stage/SurfaceContainer.qml+108 qml/Stage/TabletSideStageTouchGesture.qml+157 qml/Stage/WindowControlsOverlay.qml+254 qml/Stage/WindowDecoration.qml+163 qml/Stage/WindowInfoItem.qml+69 qml/Stage/WindowResizeArea.qml+300 qml/Stage/WindowStateSaver.qml+64 qml/Dash/ScopeDelegateMapper.qml → qml/Stage/WindowedFullscreenPolicy.qml+11−12 qml/Stage/graphics/PageHeaderBaseDividerBottom@18.png qml/Stage/graphics/PageHeaderBaseDividerLight@18.png qml/Stage/graphics/PageHeaderBaseDividerLight@18.sci+5 qml/Stage/graphics/arrows-centre.png qml/Stage/graphics/arrows.png qml/Stage/graphics/sidestage_drag.svg+207 qml/Stage/graphics/sidestage_handle@20.png qml/SideStage/graphics/sidestage_handle@20.sci → qml/Stage/graphics/sidestage_handle@20.sci qml/Stage/graphics/sidestage_open.svg+181 qml/Stage/graphics/window-close.svg+64 qml/Tutorial/InactivityTimer.qml+78 qml/Tutorial/Tutorial.qml+105 qml/Tutorial/TutorialContent.qml+225 qml/Tutorial/TutorialLeft.qml+54 qml/Tutorial/TutorialLeftLong.qml+56 qml/Tutorial/TutorialPage.qml+121 qml/Tutorial/TutorialRight.qml+61 qml/Tutorial/TutorialTop.qml+60 qml/Tutorial/graphics/arrow.svg+19 qml/Tutorial/graphics/background1.png qml/Tutorial/graphics/background2.png qml/Wizard/CheckableSetting.qml+92 qml/Wizard/Components/InputMethod.qml+113 qml/Wizard/Page.qml+340 qml/Wizard/Pages.qml+269 qml/Wizard/Pages/10-welcome-update.qml+137 qml/Wizard/Pages/10-welcome.qml+197 qml/Wizard/Pages/11-changelog.qml+95 qml/Wizard/Pages/20-keyboard.qml+161 qml/Wizard/Pages/30-wifi.qml+219 qml/Wizard/Pages/50-timezone.qml+278 qml/Wizard/Pages/60-account.qml+76 qml/Wizard/Pages/70-passwd-type.qml+168 qml/Wizard/Pages/78-firmware-update.qml.disabled+246 qml/Wizard/Pages/79-system-update.qml+148 qml/Wizard/Pages/80-finished.qml+137 qml/Wizard/Pages/data/Desktop_header_bkg.png qml/Wizard/Pages/data/Desktop_splash_screen_bkg.png qml/Wizard/Pages/data/Phone_header_bkg.png qml/Wizard/Pages/data/Phone_splash_screen_bkg.png qml/Wizard/Pages/data/Tick@30.png qml/Wizard/Pages/data/timezonemap/map.png qml/Wizard/Pages/data/timezonemap/pin.png qml/Wizard/Pages/data/timezonemap/timezone_-1.png qml/Wizard/Pages/data/timezonemap/timezone_-10.png qml/Wizard/Pages/data/timezonemap/timezone_-11.png qml/Wizard/Pages/data/timezonemap/timezone_-2.png qml/Wizard/Pages/data/timezonemap/timezone_-3.5.png qml/Wizard/Pages/data/timezonemap/timezone_-3.png qml/Wizard/Pages/data/timezonemap/timezone_-4.5.png qml/Wizard/Pages/data/timezonemap/timezone_-4.png qml/Wizard/Pages/data/timezonemap/timezone_-5.png qml/Wizard/Pages/data/timezonemap/timezone_-6.png qml/Wizard/Pages/data/timezonemap/timezone_-7.png qml/Wizard/Pages/data/timezonemap/timezone_-8.png qml/Wizard/Pages/data/timezonemap/timezone_-9.5.png qml/Wizard/Pages/data/timezonemap/timezone_-9.png qml/Wizard/Pages/data/timezonemap/timezone_0.png qml/Wizard/Pages/data/timezonemap/timezone_1.png qml/Wizard/Pages/data/timezonemap/timezone_10.5.png qml/Wizard/Pages/data/timezonemap/timezone_10.png qml/Wizard/Pages/data/timezonemap/timezone_11.png qml/Wizard/Pages/data/timezonemap/timezone_12.75.png qml/Wizard/Pages/data/timezonemap/timezone_12.png qml/Wizard/Pages/data/timezonemap/timezone_13.png qml/Wizard/Pages/data/timezonemap/timezone_2.png qml/Wizard/Pages/data/timezonemap/timezone_3.5.png qml/Wizard/Pages/data/timezonemap/timezone_3.png qml/Wizard/Pages/data/timezonemap/timezone_4.5.png qml/Wizard/Pages/data/timezonemap/timezone_4.png qml/Wizard/Pages/data/timezonemap/timezone_5.5.png qml/Wizard/Pages/data/timezonemap/timezone_5.75.png qml/Wizard/Pages/data/timezonemap/timezone_5.png qml/Wizard/Pages/data/timezonemap/timezone_6.5.png qml/Wizard/Pages/data/timezonemap/timezone_6.png qml/Wizard/Pages/data/timezonemap/timezone_7.png qml/Wizard/Pages/data/timezonemap/timezone_8.5.png qml/Wizard/Pages/data/timezonemap/timezone_8.png qml/Wizard/Pages/data/timezonemap/timezone_9.5.png qml/Wizard/Pages/data/timezonemap/timezone_9.png qml/Wizard/Pages/passcode-confirm.qml+69 qml/Wizard/Pages/passcode-desktop.qml+159 qml/Wizard/Pages/passcode-set.qml+78 qml/Wizard/Pages/password-set.qml+158 qml/Wizard/Pages/sim.qml+108 qml/Wizard/PasswordMeter.qml+108 qml/Components/Tile.qml → qml/Wizard/StackButton.qml+19−16 qml/Wizard/Wizard.qml+58 qml/Wizard/WizardItemSelector.qml+129 qml/Wizard/WizardTextField.qml+25 qml/graphics/12_10_background_wide@12.png qml/graphics/applicationIcons/browser@18.png qml/graphics/applicationIcons/calendar@18.png qml/graphics/applicationIcons/camera@18.png qml/graphics/applicationIcons/contacts-app@18.png qml/graphics/applicationIcons/dash@18.png qml/graphics/applicationIcons/evernote@18.png qml/graphics/applicationIcons/facebook@18.png qml/graphics/applicationIcons/gallery@18.png qml/graphics/applicationIcons/gmail@18.png qml/graphics/applicationIcons/map@18.png qml/graphics/applicationIcons/messages-app@18.png qml/graphics/applicationIcons/notepad@18.png qml/graphics/applicationIcons/phone-app@18.png qml/graphics/applicationIcons/pinterest@18.png qml/graphics/applicationIcons/soundcloud@18.png qml/graphics/applicationIcons/system-settings@18.png qml/graphics/applicationIcons/twitter@18.png qml/graphics/applicationIcons/weather@18.png qml/graphics/applicationIcons/wikipedia@18.png qml/graphics/applicationIcons/youtube@18.png qml/graphics/avatars/amanda@12.png qml/graphics/avatars/anna_olsson@12.png qml/graphics/avatars/funky@12.png qml/graphics/clock@18.png qml/graphics/dropshadow2gu@30.png qml/graphics/dropshadow2gu@30.sci+5 qml/graphics/dropshadow_left@20.png qml/graphics/dropshadow_right@20.png qml/graphics/phone_background.jpg qml/graphics/tablet_background.jpg run−75 run_on_device−165 runtests.sh+4−1 src/ApplicationArguments.cpp+22 src/ApplicationArguments.h+23−14 src/CMakeLists.txt+37−12 src/CachingNetworkManagerFactory.cpp+54 src/CachingNetworkManagerFactory.h+47 src/DebuggingController.cpp+92 src/DebuggingController.h+57 src/MouseTouchAdaptor.cpp+293−27 src/MouseTouchAdaptor.h+31−8 src/Panel/CMakeLists.txt−1 src/Panel/Indicators/CMakeLists.txt−1 src/SecondaryWindow.cpp+40 qml/Components/ListItems/ThinDivider.qml → src/SecondaryWindow.h+13−10 src/ShellApplication.cpp+231 src/ShellApplication.h+61 src/ShellView.cpp+85 src/ShellView.h+34 src/UnityCommandLineParser.cpp+130 src/UnityCommandLineParser.h+60 src/UnixSignalHandler.cpp+139 src/UnixSignalHandler.h+54 src/libunity8-private/CMakeLists.txt+27 src/libunity8-private/abstractdbusservicemonitor.cpp+100 src/libunity8-private/abstractdbusservicemonitor.h+70 src/libunity8-private/unitydbusobject.cpp+86 src/libunity8-private/unitydbusobject.h+46 src/libunity8-private/unitydbusvirtualobject.cpp+83 src/libunity8-private/unitydbusvirtualobject.h+47 src/main.cpp+30−152 qml/Hud/ToolBar.qml → src/qmldebuggerutils.h+14−14 tests/CMakeLists.txt+148−9 tests/autopilot/setup.py+2−2 tests/autopilot/unity8/__init__.py+11−4 tests/autopilot/unity8/application_lifecycle/tests/__init__.py+49 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+87−79 tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+12−77 tests/autopilot/unity8/fixture_setup.py+329 tests/autopilot/unity8/greeter/__init__.py+97 tests/autopilot/unity8/shell/emulators/__init__.py → tests/autopilot/unity8/greeter/tests/__init__.py+8−12 tests/autopilot/unity8/greeter/tests/test_args.py+49 tests/autopilot/unity8/indicators/__init__.py+203 tests/autopilot/unity8/indicators/tests/__init__.py+42 tests/autopilot/unity8/indicators/tests/test_action_latency.py+237 tests/autopilot/unity8/indicators/tests/test_display_indicator.py+52 tests/autopilot/unity8/indicators/tests/test_indicators.py+57−19 tests/autopilot/unity8/launcher.py+66 tests/autopilot/unity8/process_helpers.py+107−77 tests/autopilot/unity8/sensors.py+93 tests/autopilot/unity8/shell/__init__.py+230−27 tests/autopilot/unity8/shell/emulators/create_interactive_notification.py → tests/autopilot/unity8/shell/create_interactive_notification.py+3−4 tests/autopilot/unity8/shell/emulators/launcher.py → tests/autopilot/unity8/shell/emulators.py+27−15 tests/autopilot/unity8/shell/emulators/dash.py−214 tests/autopilot/unity8/shell/emulators/greeter.py−40 tests/autopilot/unity8/shell/emulators/hud.py−87 tests/autopilot/unity8/shell/emulators/main_window.py−119 tests/autopilot/unity8/shell/fixture_setup.py+35−23 tests/autopilot/unity8/shell/tests/__init__.py+178−200 tests/autopilot/unity8/shell/tests/test_emulators.py−215 tests/autopilot/unity8/shell/tests/test_greeter.py−38 tests/autopilot/unity8/shell/tests/test_helpers.py+44 tests/autopilot/unity8/shell/tests/test_hud.py−188 tests/autopilot/unity8/shell/tests/test_lock_screen.py+55−88 tests/autopilot/unity8/shell/tests/test_notifications.py+192−203 tests/autopilot/unity8/shell/tests/test_rotation.py+113 tests/autopilot/unity8/shell/tests/test_system_integration.py+16−8 tests/autopilot/unity8/shell/tests/test_upstart.py+58−20 tests/copyright/CMakeLists.txt+1−1 tests/copyright/check_copyright.sh+35−4 tests/data/unity/backgrounds/20x30.png tests/data/unity/backgrounds/black.png tests/data/unity/backgrounds/blue.png tests/data/unity/backgrounds/red.png tests/graphics/applicationIcons/browser@18.png tests/graphics/applicationIcons/calendar@18.png tests/graphics/applicationIcons/camera@18.png tests/graphics/applicationIcons/contacts-app@18.png tests/graphics/applicationIcons/dash@18.png tests/graphics/applicationIcons/dialer-app@18.png tests/graphics/applicationIcons/evernote@18.png tests/graphics/applicationIcons/facebook@18.png tests/graphics/applicationIcons/gallery@18.png tests/graphics/applicationIcons/gmail@18.png tests/graphics/applicationIcons/libreoffice@18.png tests/graphics/applicationIcons/map@18.png tests/graphics/applicationIcons/messages-app@18.png tests/graphics/applicationIcons/notepad@18.png tests/graphics/applicationIcons/pinterest@18.png tests/graphics/applicationIcons/soundcloud@18.png tests/graphics/applicationIcons/system-settings@18.png tests/graphics/applicationIcons/twitter@18.png tests/graphics/applicationIcons/weather@18.png tests/graphics/applicationIcons/wikipedia@18.png tests/graphics/applicationIcons/youtube@18.png tests/graphics/avatars/amanda@12.png tests/graphics/avatars/anna_olsson@12.png tests/graphics/avatars/funky@12.png tests/graphics/clock@18.png qml/Dash/graphics/phone/screenshots/gallery@12.png → tests/graphics/screenshots/gallery@12.png tests/imports/CMakeLists.txt+5 tests/imports/check_imports.py+183 tests/mocks/AccountsService/AccountsService.cpp+156−10 tests/mocks/AccountsService/AccountsService.h+86−8 tests/mocks/AccountsService/CMakeLists.txt+15−12 tests/mocks/AccountsService/plugin.cpp+1 tests/mocks/AccountsService/plugin.h+1−1 tests/mocks/AccountsService/qmldir+1 tests/mocks/Biometryd/CMakeLists.txt+14 tests/mocks/Biometryd/MockBiometryd.cpp+43 tests/mocks/Biometryd/MockBiometryd.h+50 tests/mocks/Biometryd/MockDevice.cpp+29 tests/mocks/Biometryd/MockDevice.h+40 tests/mocks/Biometryd/MockIdentifier.cpp+28 tests/mocks/Biometryd/MockIdentifier.h+36 tests/mocks/Biometryd/MockObserver.cpp+22 tests/mocks/Unity/iconutils.h → tests/mocks/Biometryd/MockObserver.h+17−9 tests/mocks/Biometryd/MockOperation.cpp+56 tests/mocks/Biometryd/MockOperation.h+47 qml/Dash/Previews/PreviewWidget.qml → tests/mocks/Biometryd/plugin.cpp+19−17 tests/mocks/Biometryd/plugin.h+31 tests/mocks/Biometryd/qmldir+3 tests/mocks/CMakeLists.txt+40−2 tests/mocks/Cursor/CMakeLists.txt+1 tests/mocks/Cursor/Cursor.qml+34 tests/mocks/Cursor/qmldir+2 tests/mocks/GSettings.1.0/CMakeLists.txt+2−6 tests/mocks/GSettings.1.0/fake_gsettings.cpp+335−20 tests/mocks/GSettings.1.0/fake_gsettings.h+103−13 tests/mocks/GSettings.1.0/plugin.h+1−1 tests/mocks/GSettings.1.0/qmldir+1 tests/mocks/HudClient/CMakeLists.txt−41 tests/mocks/HudClient/fake_hud_plugin.cpp−39 tests/mocks/HudClient/fake_libhud_client.cpp−240 tests/mocks/HudClient/libhud_client_stub.cpp−93 tests/mocks/HudClient/libhud_client_stub.h−64 tests/mocks/HudClient/qmldir−1 tests/mocks/LightDM/CMakeLists.txt−57 tests/mocks/LightDM/QLightDM/Greeter−1 tests/mocks/LightDM/QLightDM/InfographicModel−1 tests/mocks/LightDM/QLightDM/UsersModel−1 tests/mocks/LightDM/full/CMakeLists.txt−18 tests/mocks/LightDM/full/UsersModelPrivate.cpp−52 tests/mocks/LightDM/single-passphrase/CMakeLists.txt−19 tests/mocks/LightDM/single-passphrase/GreeterPrivate.cpp−53 tests/mocks/LightDM/single-pin/CMakeLists.txt−19 tests/mocks/LightDM/single-pin/GreeterPrivate.cpp−53 tests/mocks/LightDM/single/CMakeLists.txt−18 tests/mocks/LightDMController/CMakeLists.txt+14 tests/mocks/LightDMController/plugin.cpp+35 tests/mocks/HudClient/fake_hud_plugin.h → tests/mocks/LightDMController/plugin.h+6−8 tests/mocks/LightDMController/qmldir+2 tests/mocks/Lights/CMakeLists.txt+8 tests/mocks/Lights/Lights.cpp+84 tests/mocks/Lights/Lights.h+66 plugins/HudClient/plugin.cpp → tests/mocks/Lights/plugin.cpp+12−15 tests/mocks/Lights/plugin.h+32 tests/mocks/Lights/qmldir+3 tests/mocks/MeeGo/CMakeLists.txt+1 tests/mocks/MeeGo/QOfono/CMakeLists.txt+11 tests/mocks/MeeGo/QOfono/MockOfonoSimManager.qml+53 tests/mocks/MeeGo/QOfono/MockQOfono.cpp+90 tests/mocks/MeeGo/QOfono/MockQOfono.h+61 tests/mocks/MeeGo/QOfono/MockQOfonoManager.cpp+66 tests/mocks/MeeGo/QOfono/MockQOfonoManager.h+49 qml/Dash/Previews/PreviewZoomableImage.qml → tests/mocks/MeeGo/QOfono/plugin.cpp+15−21 plugins/HudClient/plugin.h → tests/mocks/MeeGo/QOfono/plugin.h+7−7 tests/mocks/MeeGo/QOfono/qmldir+3 tests/mocks/Powerd/CMakeLists.txt+2−13 tests/mocks/Powerd/Powerd.cpp+15−1 tests/mocks/Powerd/Powerd.h+17−8 tests/mocks/Powerd/plugin.h+1−1 tests/mocks/Powerd/qmldir+1 tests/mocks/QMenuModel/CMakeLists.txt+5−14 tests/mocks/QMenuModel/QDBusActionGroup.qml+30−5 tests/mocks/QMenuModel/UnityMenuAction.qml+1−1 tests/mocks/QMenuModel/actiondata.h+54 tests/mocks/QMenuModel/dbus-enums.h+51 tests/mocks/QMenuModel/plugin.cpp+13 tests/mocks/QMenuModel/plugin.h+1−1 tests/mocks/QMenuModel/qmldir+1 tests/mocks/QMenuModel/unitymenumodel.cpp+92−24 tests/mocks/QMenuModel/unitymenumodel.h+28−9 tests/mocks/QtMultimedia/CMakeLists.txt+10−14 tests/mocks/QtMultimedia/VideoSurface.qml+111 tests/mocks/QtMultimedia/audio.cpp−107 tests/mocks/QtMultimedia/audio.h−78 tests/mocks/QtMultimedia/declarativeplaylist.cpp+73 tests/mocks/QtMultimedia/declarativeplaylist.h+54 tests/mocks/QtMultimedia/mediaplayer.cpp+319 tests/mocks/QtMultimedia/mediaplayer.h+224 tests/mocks/QtMultimedia/plugin.cpp+9−2 tests/mocks/QtMultimedia/plugin.h+1−1 tests/mocks/QtMultimedia/qmldir+1 tests/mocks/QtMultimedia/videooutput.cpp+127 tests/mocks/QtMultimedia/videooutput.h+52 tests/mocks/SessionBroadcast/CMakeLists.txt+8 tests/mocks/SessionBroadcast/SessionBroadcast.cpp+34 tests/mocks/SessionBroadcast/SessionBroadcast.h+39 tests/mocks/SessionBroadcast/plugin.cpp+31 tests/mocks/SessionBroadcast/plugin.h+32 tests/mocks/SessionBroadcast/qmldir+2 tests/mocks/UInput/CMakeLists.txt+7 tests/mocks/UInput/mockuinput.cpp+73 tests/mocks/UInput/mockuinput.h+63 tests/mocks/UInput/plugin.cpp+26 tests/mocks/UInput/plugin.h+32 tests/mocks/UInput/qmldir+2 tests/mocks/Ubuntu/CMakeLists.txt+5 tests/mocks/Ubuntu/Connectivity/CMakeLists.txt+10 tests/mocks/Ubuntu/Connectivity/networking-status.cpp+70 tests/mocks/Ubuntu/Connectivity/networking-status.h+74 tests/mocks/Ubuntu/Connectivity/plugin.cpp+47 tests/mocks/Ubuntu/Connectivity/plugin.h+35 tests/mocks/Ubuntu/Connectivity/qmldir+2 tests/mocks/Ubuntu/DownloadDaemonListener/CMakeLists.txt+2−10 tests/mocks/Ubuntu/DownloadDaemonListener/MockDownloadTracker.cpp+3−1 tests/mocks/Ubuntu/DownloadDaemonListener/MockDownloadTracker.h+2−1 tests/mocks/Ubuntu/DownloadDaemonListener/plugin.h+1−1 tests/mocks/Ubuntu/DownloadDaemonListener/qmldir+1 tests/mocks/Ubuntu/SystemSettings/CMakeLists.txt+5 tests/mocks/Ubuntu/SystemSettings/Diagnostics/CMakeLists.txt+1 qml/Dash/DashPreviewPlaceholder.qml → tests/mocks/Ubuntu/SystemSettings/Diagnostics/MockDiagnostics.qml+6−7 tests/mocks/Ubuntu/SystemSettings/Diagnostics/qmldir+2 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/CMakeLists.txt+1 tests/mocks/Unity/Application/InputFilterArea.qml → tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockKeyboardPlugin.qml+3−3 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockLanguagePlugin.qml+24 tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/qmldir+3 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/CMakeLists.txt+10 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.cpp+35 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.h+50 tests/mocks/LightDM/single/UsersModelPrivate.cpp → tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/plugin.cpp+7−14 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/plugin.h+31 tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/qmldir+2 tests/mocks/Ubuntu/SystemSettings/TimeDate/CMakeLists.txt+1 qml/Dash/DashHome.qml → tests/mocks/Ubuntu/SystemSettings/TimeDate/MockTimeDate.qml+14−16 tests/mocks/Ubuntu/SystemSettings/TimeDate/qmldir+2 tests/mocks/Ubuntu/SystemSettings/Update/CMakeLists.txt+1 qml/Dash/ScopeListView.qml → tests/mocks/Ubuntu/SystemSettings/Update/MockSystemImage.qml+11−9 tests/mocks/Ubuntu/SystemSettings/Update/qmldir+2 tests/mocks/Ubuntu/Telephony/CMakeLists.txt+14 qml/Dash/Previews/PreviewHeader.qml → tests/mocks/Ubuntu/Telephony/ContactWatcherData.cpp+22−17 tests/mocks/Ubuntu/Telephony/ContactWatcherData.h+46 tests/mocks/Ubuntu/Telephony/MockCallEntry.cpp+91 tests/mocks/Ubuntu/Telephony/MockCallEntry.h+65 tests/mocks/Ubuntu/Telephony/MockCallManager.cpp+80 tests/mocks/Ubuntu/Telephony/MockCallManager.h+60 tests/mocks/Ubuntu/Telephony/MockContactWatcher.cpp+50 tests/mocks/Ubuntu/Telephony/MockContactWatcher.h+49 tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.cpp+62 tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.h+58 tests/mocks/Ubuntu/Telephony/plugin.cpp+52 tests/mocks/Ubuntu/Telephony/plugin.h+37 tests/mocks/Ubuntu/Telephony/qmldir+2 tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txt+1 tests/mocks/Ubuntu/Thumbnailer/qmldir+4 tests/mocks/Ubuntu/Web/CMakeLists.txt+1 qml/Components/BaseCarouselDelegate.qml → tests/mocks/Ubuntu/Web/WebView.qml+7−5 tests/mocks/Ubuntu/Web/qmldir+4 tests/mocks/Unity/Application/ApplicationImage.cpp−123 tests/mocks/Unity/Application/ApplicationImage.h−79 tests/mocks/Unity/Application/ApplicationInfo.cpp+362−47 tests/mocks/Unity/Application/ApplicationInfo.h+123−63 tests/mocks/Unity/Application/ApplicationManager.cpp+321−238 tests/mocks/Unity/Application/ApplicationManager.h+55−66 tests/mocks/Unity/Application/CMakeLists.txt+23−24 tests/mocks/Unity/Application/MirMock.cpp+62 tests/mocks/Unity/Application/MirMock.h+43 tests/mocks/Unity/Application/MirSurface.cpp+559 tests/mocks/Unity/Application/MirSurface.h+237 tests/mocks/Unity/Application/MirSurfaceItem.cpp+415 tests/mocks/Unity/Application/MirSurfaceItem.h+138 tests/mocks/Unity/Application/MirSurfaceListModel.cpp+136 tests/mocks/Unity/Application/MirSurfaceListModel.h+54 tests/mocks/Unity/Application/ObjectListModel.h+108 tests/mocks/Unity/Application/SurfaceManager.cpp+281 tests/mocks/Unity/Application/SurfaceManager.h+116 tests/mocks/Unity/Application/VirtualKeyboard.cpp+58 tests/mocks/Unity/Application/VirtualKeyboard.h+37 tests/mocks/Unity/Application/plugin.cpp+38−9 tests/mocks/Unity/Application/plugin.h+2−1 tests/mocks/Unity/Application/qmldir+1−2 tests/mocks/Unity/Application/resources/Kate.qml+49 tests/mocks/Unity/Application/resources/KateDialog.qml+48 qml/Dash/Music/CarouselDelegateMusic.qml → tests/mocks/Unity/Application/resources/KateMenu.qml+20−21 tests/mocks/Unity/Application/resources/MirSurfaceItem.qml+126 tests/mocks/Unity/Application/resources/VirtualKeyboard.qml+41 tests/mocks/Unity/Application/resources/screenshots/browser@12.png tests/mocks/Unity/Application/resources/screenshots/camera@12.png tests/mocks/Unity/Application/resources/screenshots/dialer@12.png tests/mocks/Unity/Application/resources/screenshots/facebook@12.png tests/mocks/Unity/Application/resources/screenshots/gallery@12.png tests/mocks/Unity/Application/resources/screenshots/gmail-webapp.svg+343 tests/mocks/Unity/Application/resources/screenshots/libreoffice@12.png tests/mocks/Unity/Application/resources/screenshots/map@12.png tests/mocks/Unity/Application/resources/screenshots/music@12.png tests/mocks/Unity/Application/resources/screenshots/twitter@12.png tests/mocks/Unity/Application/resources/screenshots/ubuntu-weather-app.svg+201 tests/mocks/Unity/Application/resources/screenshots/unity8-dash@12.png tests/mocks/Unity/Application/resources/screenshots/vkb_portrait.png tests/mocks/Unity/Application/resources/surfaces.qrc+23 tests/mocks/Unity/Application/resources/vkb_portrait.png tests/mocks/Unity/ApplicationMenu/CMakeLists.txt+18 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cpp+47 tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.h+41 tests/mocks/Unity/ApplicationMenu/plugin.cpp+42 tests/mocks/Unity/ApplicationMenu/plugin.h+32 tests/mocks/Unity/ApplicationMenu/qmldir+3 tests/mocks/Unity/CMakeLists.txt+5−49 tests/mocks/Unity/Connectivity/CMakeLists.txt+10 tests/qmltests/Dash/qml/fake_scopeView2.qml → tests/mocks/Unity/Connectivity/MockConnectivity.cpp+9−6 qml/Dash/Previews/PreviewActionButton.qml → tests/mocks/Unity/Connectivity/MockConnectivity.h+18−12 tests/mocks/Unity/Connectivity/plugin.cpp+34 tests/mocks/Unity/Connectivity/plugin.h+31 tests/mocks/Unity/Connectivity/qmldir+3 tests/mocks/Unity/Indicators/RootActionState.qml → tests/mocks/Unity/Indicators/ActionRootState.qml+14−9 tests/mocks/Unity/Indicators/CMakeLists.txt+11−24 tests/mocks/Unity/Indicators/IndicatorsModel.qml+241−42 tests/mocks/Unity/Indicators/ModelActionRootState.qml+81 tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp+157 tests/mocks/Unity/Indicators/fakeindicatorsmodel.h+70 tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.js+1328 tests/mocks/Unity/Indicators/fakeplugin.cpp+22−3 tests/mocks/Unity/Indicators/fakeplugin.h+1−1 tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cpp+59 tests/mocks/Unity/Indicators/fakeunitymenumodelcache.h+45 tests/mocks/Unity/Indicators/indicators_fake.qrc−14 tests/mocks/Unity/Indicators/qml/FakeMenuPage.qml−37 tests/mocks/Unity/Indicators/qml/fake_menu_page4.qml−35 tests/mocks/Unity/Indicators/qml/fake_menu_page5.qml−35 tests/mocks/Unity/Indicators/qml/fake_menu_widget4.qml−23 tests/mocks/Unity/Indicators/qml/fake_menu_widget5.qml−23 tests/mocks/Unity/Indicators/qmldir+3−5 tests/mocks/Unity/InputInfo/CMakeLists.txt+31 tests/mocks/Unity/InputInfo/mockcontroller.cpp+35 tests/mocks/Unity/InputInfo/mockcontroller.h+34 tests/mocks/Unity/InputInfo/plugin.cpp+46 tests/mocks/Unity/InputInfo/plugin.h+30 tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cpp+56 tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock_p.h+58 tests/mocks/Unity/InputInfo/qmldir+2 tests/mocks/Unity/Launcher/CMakeLists.txt+7−10 tests/mocks/Unity/Launcher/MockAppDrawerModel.cpp+98 tests/mocks/Unity/Launcher/MockAppDrawerModel.h+43 tests/mocks/Unity/Launcher/MockLauncherItem.cpp+79−1 tests/mocks/Unity/Launcher/MockLauncherItem.h+34−17 tests/mocks/Unity/Launcher/MockLauncherModel.cpp+112−5 tests/mocks/Unity/Launcher/MockLauncherModel.h+22−11 tests/mocks/Unity/Launcher/MockQuickListModel.cpp+6−2 tests/mocks/Unity/Launcher/MockQuickListModel.h+4−2 tests/mocks/Unity/Launcher/plugin.cpp+4 tests/mocks/Unity/Launcher/plugin.h+1−1 tests/mocks/Unity/Launcher/qmldir+1 tests/mocks/Unity/Notifications/CMakeLists.txt+13−8 tests/mocks/Unity/Notifications/MockActionModel.cpp+74 tests/mocks/Unity/Notifications/MockActionModel.h+53 tests/mocks/Unity/Notifications/MockNotification.cpp+198 tests/mocks/Unity/Notifications/MockNotification.h+101 tests/mocks/Unity/Notifications/MockNotificationModel.cpp+169 tests/mocks/Unity/Notifications/MockNotificationModel.h+70 tests/mocks/Unity/Indicators/IndicatorBase.qml → tests/mocks/Unity/Notifications/plugin.cpp+13−18 tests/mocks/Unity/Indicators/MenuItemFactory.qml → tests/mocks/Unity/Notifications/plugin.h+13−17 tests/mocks/Unity/Notifications/qmldir+3−1 tests/mocks/Unity/Platform/CMakeLists.txt+1 tests/qmltests/Dash/qml/fake_generic_scopeView.qml → tests/mocks/Unity/Platform/MockPlatform.qml+7−6 tests/mocks/Unity/Platform/qmldir+2 tests/mocks/Unity/Screens/CMakeLists.txt+14 tests/mocks/Unity/Screens/plugin.cpp+29 tests/mocks/Unity/Screens/plugin.h+25 tests/mocks/Unity/Screens/qmldir+2 tests/mocks/Unity/Screens/screens.cpp+71 tests/mocks/Unity/Screens/screens.h+82 tests/mocks/Unity/categoryresults.cpp−121 tests/mocks/Unity/categoryresults.h−68 tests/mocks/Unity/fake_applications_scope.cpp−76 tests/mocks/Unity/fake_categories.cpp−259 tests/mocks/Unity/fake_categories.h−75 tests/mocks/Unity/fake_preview.cpp−73 tests/mocks/Unity/fake_preview.h−65 tests/mocks/Unity/fake_scope.cpp−255 tests/mocks/Unity/fake_scope.h−127 tests/mocks/Unity/fake_scopes.cpp−152 tests/mocks/Unity/fake_scopes.h−80 tests/mocks/Unity/fake_unity_plugin.cpp−52 tests/mocks/Unity/iconutils.cpp−124 tests/mocks/Unity/qmldir−2 tests/mocks/Unity/scopes-ng/fake_preview_model.cpp−96 tests/mocks/Unity/scopes-ng/fake_preview_model.h−68 tests/mocks/Utils/CMakeLists.txt+61 tests/mocks/Utils/EdgeBarrierSettings.qml+22 tests/mocks/Utils/Style.js+37 tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml → tests/mocks/Utils/URLDispatcher.cpp+17−14 tests/mocks/Utils/URLDispatcher.h+47 qml/SideStage/SidestageHandle.qml → tests/mocks/Utils/WindowInputMonitor.qml+6−5 tests/mocks/Utils/constants.cpp+24 tests/mocks/Utils/constants.h+43 tests/mocks/Utils/plugin.cpp+93 tests/mocks/Utils/plugin.h+32 tests/mocks/Utils/qmldir+6 tests/mocks/Utils/windowstatestorage.cpp+100 tests/mocks/Utils/windowstatestorage.h+77 tests/mocks/Wizard/CMakeLists.txt+20 tests/mocks/Wizard/MockSystem.cpp+64 tests/mocks/Wizard/MockSystem.h+61 tests/mocks/Wizard/mockplugin.cpp+38 tests/mocks/Wizard/mockplugin.h+32 tests/mocks/Wizard/qmldir+3 tests/mocks/data/applications/camera-app.desktop → tests/mocks/data/applications/webbrowser-app.desktop tests/mocks/data/unity/indicators/com.canonical.indicator.mock+10 tests/mocks/indicator-service/CMakeLists.txt+19 tests/mocks/indicator-service/mock-indicator-service.c+325 tests/mocks/liblightdm/CMakeLists.txt+18 tests/mocks/LightDM/full/GreeterPrivate.cpp → tests/mocks/liblightdm/GreeterPrivate.cpp+44−10 tests/mocks/liblightdm/GreeterPrivate.h+54 tests/mocks/liblightdm/MockController.cpp+192 tests/mocks/liblightdm/MockController.h+106 tests/mocks/liblightdm/MockGreeter.cpp+316 tests/mocks/liblightdm/MockGreeter.h+102 tests/mocks/liblightdm/MockSessionsModel.cpp+118 tests/mocks/liblightdm/MockSessionsModel.h+64 tests/mocks/liblightdm/MockUsersModel.cpp+220 tests/mocks/liblightdm/MockUsersModel.h+61 tests/mocks/liblightdm/SessionsModelPrivate.cpp+83 tests/mocks/liblightdm/SessionsModelPrivate.h+63 tests/mocks/liblightdm/UsersModelPrivate.cpp+124 tests/mocks/LightDM/UsersModelPrivate.h → tests/mocks/liblightdm/UsersModelPrivate.h+8−3 tests/mocks/LightDM/demo/CMakeLists.txt → tests/mocks/liblightdm/demo/CMakeLists.txt+1−1 tests/mocks/LightDM/demo/GreeterPrivate.cpp → tests/mocks/liblightdm/demo/GreeterPrivate.cpp tests/mocks/LightDM/demo/UsersModelPrivate.cpp → tests/mocks/liblightdm/demo/UsersModelPrivate.cpp tests/mocks/LightDM/qmldir → tests/mocks/liblightdm/qmldir+1 tests/mocks/libusermetrics/CMakeLists.txt+2−1 tests/mocks/libusermetrics/ColorTheme.cpp+4 tests/mocks/libusermetrics/ColorTheme.h+2−1 tests/mocks/libusermetrics/UserMetrics.cpp+55−25 tests/mocks/libusermetrics/UserMetrics.h+2 tests/mocks/libusermetrics/libusermetricsoutput/ColorTheme.h−1 tests/mocks/libusermetrics/libusermetricsoutput/UserMetrics.h−1 tests/plugins/AccountsService/AccountsServer.cpp+28−6 tests/plugins/AccountsService/AccountsServer.h+5 tests/plugins/AccountsService/CMakeLists.txt+33−12 tests/plugins/AccountsService/PropertiesServer.cpp+104−7 tests/plugins/AccountsService/PropertiesServer.h+17−3 tests/plugins/AccountsService/UscServer.cpp+28 tests/plugins/AccountsService/UscServer.h+39 tests/plugins/AccountsService/client.cpp+303−9 tests/plugins/AccountsService/interfaces.xml+50 tests/plugins/AccountsService/server.cpp+17−6 tests/plugins/AccountsService/types.h+25 tests/plugins/CMakeLists.txt+6−1 tests/plugins/Cursor/CMakeLists.txt+8 tests/plugins/Cursor/TextEntry.qml+34 tests/plugins/Cursor/tst_Cursor.qml+151 tests/plugins/DashViews/CMakeLists.txt−84 tests/plugins/DashViews/horizontaljournaltest.cpp−491 tests/plugins/DashViews/horizontaljournaltest.qml−43 tests/plugins/DashViews/horizontaljournaltry.cpp−90 tests/plugins/DashViews/horizontaljournaltry.qml−99 tests/plugins/DashViews/listviewwithpageheadertest.cpp−1882 tests/plugins/DashViews/listviewwithpageheadertest.qml−96 tests/plugins/DashViews/listviewwithpageheadertestsection.cpp−2172 tests/plugins/DashViews/listviewwithpageheadertestsection.qml−106 tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.cpp−251 tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.qml−74 tests/plugins/DashViews/organicgridtest.cpp−531 tests/plugins/DashViews/organicgridtry.cpp−98 tests/plugins/DashViews/organicgridtry.qml−94 tests/plugins/DashViews/tst_listviewwithpageheaderqml.qml−138 tests/plugins/DashViews/verticaljournaltest.cpp−502 tests/plugins/DashViews/verticaljournaltest.qml−44 tests/plugins/DashViews/verticaljournaltry.cpp−90 tests/plugins/DashViews/verticaljournaltry.qml−100 tests/plugins/GlobalShortcut/CMakeLists.txt+19 tests/plugins/GlobalShortcut/GlobalShortcutTest.cpp+78 tests/qmltests/Components/tst_DragHandle/TestButton.qml → tests/plugins/GlobalShortcut/shortcut.qml+17−19 tests/plugins/Greeter/CMakeLists.txt+1 tests/plugins/Greeter/Unity/CMakeLists.txt+1 tests/plugins/Greeter/Unity/Launcher/CMakeLists.txt+42 tests/plugins/Greeter/Unity/Launcher/launchermodelastest.cpp+240 tests/plugins/LightDM/CMakeLists.txt+1−25 tests/plugins/LightDM/IntegratedLightDM/CMakeLists.txt+157 tests/plugins/LightDM/dbus.cpp → tests/plugins/LightDM/IntegratedLightDM/dbus.cpp+69−12 tests/plugins/LightDM/greeter.qml → tests/plugins/LightDM/IntegratedLightDM/greeter.qml+3−3 tests/plugins/LightDM/IntegratedLightDM/integrated.cpp+88 tests/plugins/LightDM/IntegratedLightDM/pam.cpp+54 tests/plugins/LightDM/IntegratedLightDM/promptsmodel.cpp+175 tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cpp+134 tests/plugins/LightDM/IntegratedLightDM/usersmodel.cpp+168 tests/plugins/SessionBroadcast/BroadcastServer.cpp+33 tests/plugins/SessionBroadcast/BroadcastServer.h+40 tests/plugins/SessionBroadcast/CMakeLists.txt+51 tests/plugins/SessionBroadcast/interfaces.xml+18 tests/plugins/SessionBroadcast/server.cpp+37 tests/plugins/SessionBroadcast/sessionbroadcasttest.cpp+111 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+48−37 tests/plugins/Ubuntu/Gestures/DownwardsLauncher.qml−79 tests/plugins/Ubuntu/Gestures/GestureTest.cpp+143−4 tests/plugins/Ubuntu/Gestures/GestureTest.h+58−2 tests/plugins/Ubuntu/Gestures/LeftwardsLauncher.qml−82 tests/plugins/Ubuntu/Gestures/RightwardsLauncher.qml−80 tests/plugins/Ubuntu/Gestures/TestItem.cpp+30 tests/plugins/Ubuntu/Gestures/TestItem.h+33 tests/plugins/Ubuntu/Gestures/UpwardsLauncher.qml−82 tests/plugins/Ubuntu/Gestures/empty.qml+22 tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml → tests/plugins/Ubuntu/Gestures/touchGateExample.qml+9−5 tests/plugins/Ubuntu/Gestures/tst_AxisVelocityCalculator.cpp+2−2 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp−709 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.qml−46 tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.cpp+131 tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.qml+81 tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.cpp+6−6 tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.qml+2−2 tests/plugins/Ubuntu/Gestures/tst_TouchDispatcher.cpp+148 tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+392 tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.cpp+300 tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.qml+90 tests/plugins/Unity/CMakeLists.txt+2 tests/plugins/Unity/Indicators/CMakeLists.txt+20−16 tests/plugins/Unity/Indicators/indicatorsmanagertest.cpp → tests/plugins/Unity/Indicators/IndicatorsManagerTest.cpp+32−9 tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp → tests/plugins/Unity/Indicators/IndicatorsModelTest.cpp+8−7 tests/plugins/Unity/Indicators/menucontentactivatortest.cpp → tests/plugins/Unity/Indicators/MenuContentActivatorTest.cpp+4−3 tests/plugins/Unity/Indicators/RootActionStateTest.cpp+95 tests/plugins/Unity/Indicators/SharedUnityMenuModelTest.cpp+102 tests/plugins/Unity/Indicators/unitymenumodelstacktest.cpp → tests/plugins/Unity/Indicators/UnityMenuModelStackTest.cpp+10−14 tests/plugins/Unity/Indicators/rootactionstatetest.cpp−58 tests/plugins/Unity/Launcher/CMakeLists.txt+78−44 tests/plugins/Unity/Launcher/appdrawermodeltest.cpp+68 tests/plugins/Unity/Launcher/abs-icon.desktop → tests/plugins/Unity/Launcher/applications/abs-icon.desktop+1 tests/plugins/Unity/Launcher/click-icon.desktop → tests/plugins/Unity/Launcher/applications/click-icon.desktop+1 tests/plugins/Unity/Launcher/click-icon.svg → tests/plugins/Unity/Launcher/applications/click-icon.svg tests/plugins/Unity/Launcher/no-name.desktop → tests/plugins/Unity/Launcher/applications/no-name.desktop+1 tests/plugins/Unity/Launcher/rel-icon.desktop → tests/plugins/Unity/Launcher/applications/rel-icon.desktop+1 tests/plugins/Unity/Launcher/rel-icon.svg → tests/plugins/Unity/Launcher/applications/rel-icon.svg tests/plugins/Unity/Launcher/gsettings.cpp+45 tests/plugins/Unity/Launcher/gsettings.h+47 tests/plugins/Unity/Launcher/launcherbackendtest.cpp−72 tests/plugins/Unity/Launcher/launchermodeltest.cpp+590−29 tests/plugins/Unity/Launcher/no-icon.desktop−2 tests/plugins/Unity/Launcher/ualwrapper.cpp+58 tests/plugins/Unity/Launcher/ualwrapper.h+55 tests/plugins/Unity/Launcher/xdgwatcher.cpp+45 plugins/HudClient/hudtoolbarmodel.h → tests/plugins/Unity/Launcher/xdgwatcher.h+17−22 tests/plugins/Unity/Platform/CMakeLists.txt+30 tests/plugins/Unity/Platform/platformtest.cpp+142 tests/plugins/Unity/Session/CMakeLists.txt+72 tests/plugins/Unity/Session/LightDMServer.cpp+29 tests/plugins/Unity/Session/LightDMServer.h+38 tests/plugins/Unity/Session/LogindServer.cpp+43 tests/plugins/Unity/Session/LogindServer.h+48 tests/plugins/Unity/Session/interfaces.xml+29 tests/plugins/Unity/Session/preload.c+43 tests/plugins/Unity/Session/server.cpp+50 tests/plugins/Unity/Session/sessionbackendtest.cpp+289 tests/plugins/Utils/CMakeLists.txt+34−20 tests/plugins/Utils/DeviceConfigParserTest.cpp+76 tests/plugins/Utils/modeltest.cpp → tests/plugins/Utils/ModelTest.cpp+25−42 tests/plugins/Utils/modeltest.h → tests/plugins/Utils/ModelTest.h tests/plugins/Utils/qlimitproxymodeltest.cpp → tests/plugins/Utils/QLimitProxyModelTest.cpp+31−31 tests/plugins/Utils/URLDispatcherTest.cpp+78 tests/plugins/Utils/qsortfilterproxymodeltest.cpp → tests/plugins/Utils/UnitySortFilterProxyModelTest.cpp+25−25 tests/plugins/Utils/WindowInputMonitorTest.cpp+461 tests/plugins/Utils/WindowStateStorageTest.cpp+121 tests/plugins/Utils/timeformattertest.cpp−68 tests/plugins/Utils/tst_UtilsStyle.qml+47 tests/plugins/WindowManager/CMakeLists.txt+36 tests/plugins/WindowManager/UnityApplicationMocks.h+211 tests/plugins/WindowManager/tst_TopLevelWindowModel.cpp+193 tests/plugins/Wizard/CMakeLists.txt+24 tests/plugins/Wizard/tst_pagelist.cpp+183 tests/plugins/Wizard/tst_system.cpp+124 tests/qmltests/ApplicationMenuDataLoader.qml+99 tests/qmltests/ApplicationMenus/tst_MenuBar.qml+437 tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+361 tests/qmltests/CMakeLists.txt+71−93 tests/qmltests/Components/CMakeLists.txt+40−13 tests/qmltests/Components/RevealingRectangle.qml−78 tests/qmltests/Components/tst_AnimationControllerWithSignals.qml−142 tests/qmltests/Components/tst_Background.qml+91 tests/qmltests/Components/tst_Carousel.qml−194 tests/qmltests/Components/tst_Dialogs.qml+112 tests/qmltests/Components/tst_DragHandle.cpp+110−55 tests/qmltests/Components/tst_DragHandle.qml+132−56 tests/qmltests/Components/tst_DragHandle/BidirectionalShowable.qml+69 tests/qmltests/Components/tst_DragHandle/BottomEdgeShowable.qml+108 tests/qmltests/Components/tst_DragHandle/LeftEdgeShowable.qml+7−7 tests/qmltests/Components/tst_DragHandle/RightEdgeShowable.qml+108 tests/qmltests/Components/tst_DragHandle/SimpleButton.qml+16−12 tests/qmltests/Components/tst_DragHandle/TopEdgeShowable.qml+14−14 tests/qmltests/Components/tst_DragHandle/UnityLogo.png tests/qmltests/Components/tst_DraggingArea.qml+7−7 tests/qmltests/Components/tst_EdgeDemoOverlay.qml−123 tests/qmltests/Components/tst_EdgeDragEvaluator.cpp+166 tests/qmltests/Components/tst_EdgeDragEvaluator.qml+9−7 tests/qmltests/Components/tst_FilterGrid.qml−190 tests/qmltests/Components/tst_LazyImage.qml+38−13 tests/qmltests/Components/tst_LazyImage/ImageControls.qml+2−2 tests/qmltests/Components/tst_LazyImage/portrait.png tests/qmltests/Components/tst_LazyImage/square.png tests/qmltests/Components/tst_LazyImage/wide.png tests/qmltests/Components/tst_Lockscreen.qml+474 tests/qmltests/Components/tst_MediaServices.qml+231 tests/qmltests/Components/tst_ModeSwitchWarningDialog.qml+75 tests/qmltests/Components/tst_OpenEffect.qml−71 tests/qmltests/Components/tst_PageHeaderLabel.qml−255 tests/qmltests/Components/tst_PhysicalKeysMapper.qml+174 tests/qmltests/Components/tst_Rating.qml+5−5 tests/qmltests/Components/tst_ResponsiveFlowView.qml−192 tests/qmltests/Components/tst_ResponsiveGridView.qml−193 tests/qmltests/Components/tst_Revealer.qml−262 tests/qmltests/Components/tst_SeeMore.qml−52 tests/qmltests/Components/tst_SharingPicker.qml+73 tests/qmltests/Components/tst_Showable.qml+15−2 tests/qmltests/Components/tst_Stage.qml−278 tests/qmltests/Components/tst_Stage/FakeApplicationScreenshot.qml−53 tests/qmltests/Components/tst_Tile.qml−71 tests/qmltests/Components/tst_VirtualTouchPad.qml+197 tests/qmltests/Components/tst_Wallpaper.qml+118 tests/qmltests/Components/tst_WallpaperResolver.qml+161 tests/qmltests/Components/tst_ZoomableImage.qml+204 tests/qmltests/Dash/Apps/tst_AppPreview.qml−276 tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml−263 tests/qmltests/Dash/CardHelpers.js−120 tests/qmltests/Dash/Movie/tst_MoviePreview.qml−86 tests/qmltests/Dash/Music/tst_MusicPreview.qml−174 tests/qmltests/Dash/Previews/tst_Preview.qml−120 tests/qmltests/Dash/Previews/tst_PreviewActions.qml−148 tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml−179 tests/qmltests/Dash/Previews/tst_PreviewHeader.qml−56 tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml−56 tests/qmltests/Dash/Previews/tst_PreviewProgress.qml−85 tests/qmltests/Dash/Previews/tst_PreviewRating.qml−182 tests/qmltests/Dash/Previews/tst_PreviewTextSummary.qml−101 tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−67 tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml−97 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml−57 tests/qmltests/Dash/artwork/avatar@12.png tests/qmltests/Dash/artwork/music-player-design.png tests/qmltests/Dash/qml/FakeScopeView.qml−50 tests/qmltests/Dash/qml/fake_scopeView3.qml−24 tests/qmltests/Dash/qml/fake_scopeView4.qml−24 tests/qmltests/Dash/tst_Card.qml−358 tests/qmltests/Dash/tst_CardHeader.qml−143 tests/qmltests/Dash/tst_CardTool.qml−306 tests/qmltests/Dash/tst_Dash.qml−137 tests/qmltests/Dash/tst_DashContent.qml−359 tests/qmltests/Dash/tst_DashPreview.qml−202 tests/qmltests/Dash/tst_FilterGrids.qml−143 tests/qmltests/Dash/tst_GenericPreview.qml−125 tests/qmltests/Dash/tst_GenericScopeView.qml−426 tests/qmltests/EdgeBarrierControls.qml+97 tests/qmltests/Greeter/TestView.qml+101 tests/qmltests/Greeter/tst_Clock.qml+52−37 tests/qmltests/Greeter/tst_Greeter.qml+683 tests/qmltests/Greeter/tst_GreeterView.qml+1366 tests/qmltests/Greeter/tst_Infographics.qml+81−16 tests/qmltests/Greeter/tst_Lockscreen.qml−278 tests/qmltests/Greeter/tst_Phone.qml−152 tests/qmltests/Greeter/tst_Tablet.qml−339 tests/qmltests/Hud/tst_Hud.qml−239 tests/qmltests/Hud/tst_Result.qml−98 tests/qmltests/Launcher/tst_Drawer.qml+520 tests/qmltests/Launcher/tst_Launcher.qml+1334−149 tests/qmltests/Notifications/Notification.qml+13−11 tests/qmltests/Notifications/tst_Notifications.qml+792−375 tests/qmltests/Notifications/tst_OptionToggle.qml+290 tests/qmltests/Notifications/tst_SwipeToAct.qml+326 tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+232 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml−175 tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml−97 tests/qmltests/Panel/Indicators/tst_IndicatorItem.qml+205 tests/qmltests/Panel/Indicators/tst_IndicatorMenuItemFactory.qml+369−86 tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml+292 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+44−59 tests/qmltests/Panel/PanelTest.qml+70 tests/qmltests/Panel/PanelUI.qml+286 tests/qmltests/Panel/tst_ActiveCallHint.qml+198 tests/qmltests/Panel/tst_IndicatorItem.qml−50 tests/qmltests/Panel/tst_IndicatorRow.qml−160 tests/qmltests/Panel/tst_Indicators.qml−241 tests/qmltests/Panel/tst_MenuContent.qml+36−82 tests/qmltests/Panel/tst_Panel.qml+593−180 tests/qmltests/Panel/tst_PanelBar.qml+240 tests/qmltests/Panel/tst_PanelItemRow.qml+318 tests/qmltests/Panel/tst_PanelMenu.qml+364 tests/qmltests/Panel/tst_PanelMenuPage.qml+200 tests/qmltests/Panel/tst_PanelSmallScreen.qml+133 tests/qmltests/Panel/tst_SearchIndicator.qml−62 tests/qmltests/SideStage/tst_SideStage.qml−52 tests/qmltests/Stage/ApplicationCheckBox.qml+189 tests/qmltests/Stage/SizeHintField.qml+15−16 tests/qmltests/Stage/SurfaceManagerControls.qml+32 tests/qmltests/Stage/SurfaceManagerField.qml+19−20 tests/qmltests/Stage/tst_ApplicationWindow.qml+513 tests/qmltests/Stage/tst_DecoratedWindow.qml+267 tests/qmltests/Stage/tst_DesktopStage.qml+1085 tests/qmltests/Stage/tst_PhoneStage.qml+624 tests/qmltests/Stage/tst_QMLTopLevelWindowModel.qml+191 tests/qmltests/Stage/tst_Splash.qml+131 tests/qmltests/Stage/tst_SurfaceContainer.qml+258 tests/qmltests/Stage/tst_TabletStage.qml+764 tests/qmltests/Stage/tst_WindowDecoration.qml+244 tests/qmltests/Stage/tst_WindowResizeArea.qml+465 tests/qmltests/Tutorial/tst_Tutorial.qml+813 tests/qmltests/UnityLogo.png tests/qmltests/Wizard/licenses/en_US.html+1 tests/qmltests/Wizard/licenses/fr_CA.html+1 tests/qmltests/Wizard/licenses/fr_FR.html+1 tests/qmltests/Wizard/tst_Wizard.qml+487 tests/qmltests/tst_DeviceConfiguration.qml+49 tests/qmltests/tst_DisabledScreenNotice.qml+133 tests/qmltests/tst_OrientedShell.qml+1705 tests/qmltests/tst_Shell.qml+3204−375 tests/qmltests/tst_ShellWithPin.qml+549 tests/qmltests/utils/Unity/Test/MockObjectForInstanceOfTest.qml+1−1 tests/qmltests/utils/Unity/Test/MockObjectForInstanceOfTestChild.qml+1−1 tests/qmltests/utils/Unity/Test/tst_UnityTest.qml+36−8 tests/scripts/README+9 tests/scripts/alert-launcher-icon.sh+19 tests/scripts/get-progress.sh+19 tests/scripts/list-launcher-icons.sh+19 tests/scripts/set-count-visible.sh+19 tests/scripts/set-count.sh+19 tests/scripts/set-progress.sh+19 tests/uqmlscene/CMakeLists.txt+17−3 tests/uqmlscene/README+3−1 tests/uqmlscene/main.cpp+39−12 tests/utils/modules/Unity/Test/CMakeLists.txt+23−7 tests/utils/modules/Unity/Test/MouseTouchEmulationCheckbox.qml+23−17 tests/utils/modules/Unity/Test/StageTestCase.qml+64 tests/utils/modules/Unity/Test/TouchEventSequenceWrapper.cpp+23−2 tests/utils/modules/Unity/Test/TouchEventSequenceWrapper.h+7−2 tests/utils/modules/Unity/Test/UnityTestCase.qml+441−132 tests/utils/modules/Unity/Test/plugin.cpp+25−2 tests/utils/modules/Unity/Test/plugin.h+1−1 tests/utils/modules/Unity/Test/qmldir+4 tests/utils/modules/Unity/Test/testutil.cpp+49−6 tests/utils/modules/Unity/Test/testutil.h+4−2 tests/whitespace/CMakeLists.txt+1−1 tests/whitespace/check_whitespace.py+22−12 tools/CMakeLists.txt+3−10 tools/indicatorsclient/CMakeLists.txt+1−3 tools/indicatorsclient/indicatorsclient.cpp+18−17 tools/indicatorsclient/indicatorsclient.h−2 tools/indicatorsclient/main.cpp tools/menutool/CMakeLists.txt+5 tools/menutool/README+11 tools/menutool/menutool.cpp+62 tools/menutool/menutool.qml+118 tools/registry-tracker.cpp−116 tools/scopetool.cpp−84 tools/unlock-device+51
.bazaar/Makefiledeleted−6
@@ -1,6 +0,0 @@
1−install:
2− mkdir -p ~/.bazaar/plugins
3− cp plugins/* ~/.bazaar/plugins
4−
5−uninstall:
6− rm ~/.bazaar/plugins/makecheck_unity_phablet.py*
.bazaar/plugins/makecheck_unity_phablet.pydeleted−43
@@ -1,43 +0,0 @@
1−#!/usr/bin/python
2−# Copyright 2013 Canonical Ltd.
3−#
4−# This program is free software; you can redistribute it and/or modify
5−# it under the terms of the GNU Lesser General Public License as published by
6−# the Free Software Foundation; version 3.
7−#
8−# This program is distributed in the hope that it will be useful,
9−# but WITHOUT ANY WARRANTY; without even the implied warranty of
10−# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11−# GNU Lesser General Public License for more details.
12−#
13−# You should have received a copy of the GNU Lesser General Public License
14−# along with this program. If not, see <http://www.gnu.org/licenses/>.
15−
16−import os, subprocess
17−from bzrlib import branch, errors
18−from bzrlib.urlutils import dirname, local_path_from_url
19−
20−def execute_makecheck(local_branch, master_branch, old_revision_number, old_revision_id, future_revision_number, future_revision_id, tree_delta, future_tree):
21− if not master_branch.basis_tree().has_filename("Shell.qml"):
22− return
23−
24− os.chdir(local_path_from_url(master_branch.base))
25−
26− print "Executing 'make -C builddir test'.."
27− os.environ['CTEST_OUTPUT_ON_FAILURE'] = "1"
28− if (subprocess.call("make -C builddir test", shell=True) != 0):
29−
30− print("\n\n*** Warning ***\n\nBasic tests failed. This commit will not pass continuous integration.")
31−
32− branch = local_branch or master_branch
33− revision = branch.repository.get_revision(future_revision_id)
34− msg_file = open('message.txt', 'w')
35− msg_file.write(revision.message)
36− msg_file.close()
37−
38− print("\n\nSaved commit message to $SRC_DIR/message.txt.")
39− print("You can uncommit this revision, fix the tests and reuse your message running:\n\nbzr commit -F message.txt\n\n")
40− elif os.path.isfile("message.txt"):
41− os.remove("message.txt")
42−
43−branch.Branch.hooks.install_named_hook('pre_commit', execute_makecheck, 'make check pre-commit')
.bzr-builddeb/default.confdeleted−2
@@ -1,2 +0,0 @@
1−[BUILDDEB]
2−split = True
.bzrignoredeleted−7
@@ -1,7 +0,0 @@
1−# default build dir
2−/builddir
3−# QtCreator project files
4−/*.user
5−# Eclipse project files
6−.settings
7−message.txt
.crossbuilder/post_deploynew file+1
@@ -0,0 +1 @@
1+restart unity8
.gitignore+7
@@ -2,8 +2,15 @@
22/builddir
33# QtCreator project files
44/*.user
5+*.qmlc
6+*.jsc
57# Eclipse project files
68/.project
79/.cproject
810/.settings
911/.pydevproject
12+# KDevelop project Files
13+/.kdev4/
14+/build/
15+/*.kdev4
16+.clickable/
tests/autopilot/.project → .projectrenamed+1−1
@@ -1,6 +1,6 @@
11<?xml version="1.0" encoding="UTF-8"?>
22<projectDescription>
3− <name>Unity8 Autopilot</name>
3+ <name>Unity8</name>
44 <comment></comment>
55 <projects>
66 </projects>
tests/autopilot/.pydevproject → .pydevprojectrenamed+3−1
@@ -1,7 +1,9 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22<?eclipse-pydev version="1.0"?><pydev_project>
33<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
4−<path>/Unity8 Autopilot</path>
4+<path>/Unity8/tests/autopilot</path>
5+<path>/Unity8/.bazaar</path>
6+<path>/Unity8/tests/whitespace</path>
57</pydev_pathproperty>
68<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
79<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
.settings/Autopilot List.launchnew file+14
@@ -0,0 +1,14 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
3+<stringAttribute key="bad_container_name" value="/Unity8/.pyd"/>
4+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
5+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
6+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
7+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
8+</listAttribute>
9+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/autopilot"/>
10+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
11+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="list unity8"/>
12+<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
13+<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="Unity8"/>
14+</launchConfiguration>
.settings/Autopilot Run.launchnew file+14
@@ -0,0 +1,14 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
3+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
4+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
5+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
6+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
7+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
8+</listAttribute>
9+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/autopilot"/>
10+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
11+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="run ${string_prompt:the test suite to run:unity8}"/>
12+<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
13+<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="Unity8"/>
14+</launchConfiguration>
CMakeLists.txt+94−13
@@ -13,8 +13,9 @@ endif()
1313
1414set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
1515
16−# Instruct CMake to run moc automatically when needed.
16+# Instruct CMake to run moc and rcc automatically when needed.
1717set(CMAKE_AUTOMOC ON)
18+set(CMAKE_AUTORCC ON)
1819
1920# enable QML debugging
2021string(TOLOWER "${CMAKE_BUILD_TYPE}" cmake_build_type_lower) # Build types should always be lowercase but sometimes they are not.
@@ -39,6 +40,19 @@ if(cmake_build_type_lower MATCHES coverage)
3940 ENABLE_COVERAGE_REPORT(TARGETS ${SHELL_APP} FILTER /usr/include ${CMAKE_SOURCE_DIR}/tests/* ${CMAKE_BINARY_DIR}/*)
4041endif()
4142
43+find_package (ECM 1.7.0 QUIET NO_MODULE)
44+if (ECM_FOUND)
45+ # Provides us with -DECM_ENABLE_SANITIZERS='X'
46+ # Where X can be address, thread, memory, leak, undefined
47+ include("${ECM_MODULE_DIR}/ECMEnableSanitizers.cmake")
48+endif()
49+
50+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
51+ if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0.0")
52+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsuggest-override" )
53+ endif()
54+endif()
55+
4256# Make sure we have all the needed symbols
4357set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,defs")
4458set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-z,defs")
@@ -48,29 +62,65 @@ add_custom_target(cppcheck COMMAND cppcheck --enable=all -q --error-exitcode=2
4862 ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/tests)
4963
5064include(FindPkgConfig)
51−find_package(Qt5Core)
52−find_package(Qt5Qml)
53−find_package(Qt5Quick)
54−find_package(Qt5Gui)
55−find_package(Qt5DBus)
65+find_package(Qt5Core 5.6 REQUIRED)
66+find_package(Qt5Qml 5.6 REQUIRED)
67+find_package(Qt5Quick 5.6 REQUIRED)
68+find_package(Qt5Gui 5.6 REQUIRED)
69+find_package(Qt5DBus 5.6 REQUIRED)
70+find_package(Qt5Concurrent 5.6 REQUIRED)
71+find_package(Qt5Sql 5.6 REQUIRED)
72+find_package(Qt5Test 5.6 REQUIRED)
73+find_package(Qt5Svg 5.6 REQUIRED)
74+find_package(Qt5Network 5.6 REQUIRED)
75+find_package(Qt5Xml 5.6 REQUIRED)
76+
77+pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application=27)
78+pkg_check_modules(GEONAMES REQUIRED geonames>=0.2)
79+pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
80+pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
81+pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=13)
82+pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
83+pkg_check_modules(GD3 REQUIRED gnome-desktop-3.0)
84+pkg_check_modules(UAL REQUIRED ubuntu-app-launch-2)
85+pkg_check_modules(UBUNTUGESTURES REQUIRED UbuntuGestures)
86+pkg_check_modules(QTDBUSTEST REQUIRED
87+ libqtdbustest-1
88+ libqtdbusmock-1
89+ )
90+
91+### Check UbuntuGestures private headers. No pkg-config (.pc) file is provided for them
92+find_path(UBUNTUGESTUREPRIV
93+ NAMES UbuntuGestures/private/damper_p.h UbuntuGestures/private/ucswipearea_p.h UbuntuGestures/private/ucswipearea_p_p.h
94+ PATHS ${UBUNTUGESTURES_INCLUDEDIR}/UbuntuGestures/${UBUNTUGESTURES_VERSION}
95+ NO_DEFAULT_PATH)
96+if (${UBUNTUGESTUREPRIV} STREQUAL UBUNTUGESTUREPRIV-NOTFOUND)
97+ message(FATAL_ERROR "UbuntuGestures private headers not found.")
98+endif()
99+# end of UbuntuGesture private headers check
56100
57101# Standard install paths
58102include(GNUInstallDirs)
59103
60104set(SHELL_APP_DIR ${CMAKE_INSTALL_DATADIR}/unity8)
105+set(SHELL_PRIVATE_LIBDIR ${CMAKE_INSTALL_LIBDIR}/unity8)
106+
107+execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugin_private_module_dir SystemSettings OUTPUT_VARIABLE USS_PRIVATE_PLUGINDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
108+if(USS_PRIVATE_PLUGINDIR STREQUAL "")
109+ message(FATAL_ERROR "Could not determine USS private plugin installation dir.")
110+endif()
61111
62112execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir_suffix unity-shell-api OUTPUT_VARIABLE SHELL_INSTALL_QML OUTPUT_STRIP_TRAILING_WHITESPACE)
63113if(SHELL_INSTALL_QML STREQUAL "")
64114 message(FATAL_ERROR "Could not determine plugin installation dir.")
65115endif()
66116
117+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
118+
67119execute_process(COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=plugindir unity-shell-api OUTPUT_VARIABLE SHELL_PLUGINDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
68120if(SHELL_PLUGINDIR STREQUAL "")
69121 message(FATAL_ERROR "Could not determine plugin import dir.")
70122endif()
71123
72−set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
73−
74124set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-permissive -pedantic -Wall -Wextra")
75125
76126if ("${CMAKE_BUILD_TYPE}" STREQUAL "release" OR "${CMAKE_BUILD_TYPE}" STREQUAL "relwithdebinfo")
@@ -87,28 +137,59 @@ endif()
87137# "signals" and "slots"
88138add_definitions(-DQT_NO_KEYWORDS)
89139
90−# Tests
91−include(CTest)
92−enable_testing()
140+# Save a few container detach and conversions
141+add_definitions(-DQT_STRICT_ITERATORS)
142+
143+# Use the fast string builder
144+add_definitions(-DQT_USE_QSTRINGBUILDER)
93145
94146# Autopilot tests
95147include(autopilot)
96148declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
97149
98150set(SHELL_APP unity8)
99−set(SCOPE_TOOL unity-scope-tool)
151+set(INDICATORS_CLIENT_APP indicators-client)
152+set(GREETER_APP unity8-greeter)
153+set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
100154
101155include_directories(
102156 ${CMAKE_SOURCE_DIR}/include
103157 ${CMAKE_BINARY_DIR}/include
158+ ${APPLICATION_API_INCLUDE_DIRS}
104159)
105160
161+# Quiet logger
162+set(QUIET_LOGGER OFF CACHE BOOL "Disable test output on stdout.")
163+if(NOT QUIET_LOGGER)
164+ set(STDOUT_LOGGER "-o" "-,txt")
165+endif()
166+
167+execute_process(COMMAND dpkg-architecture -qDEB_HOST_ARCH OUTPUT_VARIABLE ARCH)
168+if (NOT ARCH MATCHES "arm*")
169+ set(ENABLE_TOUCH_EMULATION true)
170+ add_definitions(-DUNITY8_ENABLE_TOUCH_EMULATION)
171+ pkg_check_modules(MOUSETOUCHADAPTOR_LIBS REQUIRED x11 xcb xi)
172+else()
173+ set(ENABLE_TOUCH_EMULATION false)
174+ message(STATUS "Touch emulation support disabled.")
175+endif()
176+
106177# add subdirectories to build
107178add_subdirectory(include)
108179add_subdirectory(src)
109180add_subdirectory(tools)
110181add_subdirectory(qml)
111−add_subdirectory(tests)
182+
183+# Tests
184+set(NO_TESTS OFF CACHE BOOL "Disable tests.")
185+if (NOT NO_TESTS)
186+ include(CTest)
187+ enable_testing()
188+ add_subdirectory(tests)
189+else()
190+ message(STATUS "Tests disabled")
191+endif()
192+
112193add_subdirectory(plugins)
113194
114195#
CODING+60−69
@@ -15,23 +15,17 @@ download source
1515 $ bzr branch lp:unity8 ~/unity8/trunk
1616 $ cd ~/unity8/trunk
1717
18−install dependencies
18+install dependencies and build Unity 8
1919--------------------
20−If its your first time, install build dependencies
2120
2221$ cd ~/unity8/trunk
23−$ ./build --setup
22+$ ./build.sh
2423
25− this will:
26− - install the required dependencies to build, as well as run on the desktop
27− - it should also install unity-scope-home and unity-lens-application which
28− are technically "recommends", not strict dependencies
29−
30−build Unity 8
31−-------------
24+ If its your first time, this will install the required dependencies to build and
25+ build it.
3226
33−$ cd ~/unity8/trunk
34−$ ./build
27+ You might want to also install unity-scope-home and unity-scope-click which
28+ are technically "recommends", not strict dependencies
3529
3630You may also rebuild with the -c for clean, which just deletes the build
3731directory.
@@ -43,17 +37,21 @@ Running Unity 8 on your desktop
4337run the Unity 8 shell
4438---------------------
4539$ cd ~/unity8/trunk
46−$ ./run
40+$ cd builddir
4741
48−Options can be passed to test the lock screen
49−$ ./run -p OR -k
42+Each component of unity8 can be ran independently for development and testing
43+For example:
44+$ make tryShell
45+$ make tryLauncher
46+$ make tryLockscreen
5047
51−-p is for pin lock, for which the default prompt answer is "1234"
52−-k is for keylock passphrase, for which the default prompt answer is "password"
48+Check out the tests/qmltests/ directory for a list of things that can be ran.
5349
5450Notes
5551-----
5652- to navigate, utilize the mouse left button as you would your finger
53+- a three point drag (for side stage operations) can be performed by using
54+ the Shift+Control+Alt (all together) keyboard modifiers while using the mouse.
5755- to get the translations work, currently you have to do make install to
5856 put the *.mo files into correct structure. We'll look for a better solution
5957 later.
@@ -68,50 +66,15 @@ Notes
6866
6967Running Unity 8 on devices
7068==========================
71−- Ubuntu Touch builds are currently only available in 14.04 flavour
72−- supported hardware should match one of those listed here
73− https://wiki.ubuntu.com/Touch/Devices#Running_fine
74−- follow the Ubuntu Touch install instructions for your chosen device
75− https://wiki.ubuntu.com/Touch/Install
76−- make sure your device is connected to a network
77−- also make sure you have your SSH key in ~/.ssh/id_rsa.pub (or install one
78− on the device yourself)
79−
80−$ cd ~/unity/trunk
81−$ ./run_on_device --setup
82− this will:
83− - install your public SSH key on the device
84− - install the needed dependencies
8569
86−$ ./run_on_device
87− this will:
88− - rsync the code to the device
89− - build on the device
90− - replace the running shell
91−
92−Options can be passed to test the lock screen
93−$ ./run_on_device -p OR -k
94−
95−-p is for pin lock, for which the default prompt answer is "1234"
96−-k is for keylock passphrase, for which the default prompt answer is "password"
97−
98−Notes
99−-----
100−- using adb over TCP has some advantages, Google will be of help here
101− - NOTE: this is not yet available for flipped images
102− - TL;DR: `adb tcpip 5555; adb connect $your_device_ip`
103− - you can persist the above via `adb shell setprop persist.adb.tcp.port 5555`
104− - it's unsafe - anyone can connect to your device
105− - with TCP the Nexus 10 doesn't drop the adb connection when locking
106− the screen
107−- exporting ANDROID_SERIAL=$your_device_serial or
108− ANDROID_SERIAL=$your_device_ip:5555 will make adb not complain about
109− multiple devices
110−- you can export TARGET_IP=$your_device_ip TARGET_SSH_PORT=22 for run_on_device
111− to not use adb forwarding - useful if you use multiple devices
112−- using Ninja (package ninja-build - run_on_device -s installs this now)
113− will improve build times (especially in the nothing-to-build case)
70+Running unity8 on a device should be done using crossbuilder.
71+Go to
72+* https://launchpad.net/crossbuilder and
73+* https://wiki.ubuntu.com/Touch/Crossbuilder
74+for more details on crossbuilder.
11475
76+unity8 will automatically restart on the phone once deployment
77+has finished due to post-build-steps set up in this repository.
11578
11679Coding guidelines
11780=================
@@ -131,7 +94,7 @@ Running tests
13194=============
13295
13396Tests are run from the build directory (which will be ./builddir if you used
134−the ./build script).
97+the ./build.sh script).
13598
13699To run the tests that do not require any graphical capability and therefore
137100are pretty fast run:
@@ -144,7 +107,7 @@ $ ctest
144107
145108To run all graphical tests, which can take a couple of minutes:
146109
147−$ make qmluitests
110+$ make uitests
148111
149112To run the tests for a single component/class:
150113
@@ -154,6 +117,14 @@ So, for the DragHandle component that would be:
154117
155118$ make testDragHandle
156119
120+To run the tests for a single component/class under gdb (so you can catch SEGFAULTS)
121+
122+$ make gdbtestComponentName
123+
124+To run a single test function of a single component/class:
125+
126+$ make testComponentName FUNCTION="TestCaseName::functionName"
127+
157128To run a test application that allow you to manually test or to simply try out
158129a given component:
159130
@@ -167,15 +138,11 @@ NB: Manual test or interation doesn't make sense for all components or classes,
167138particularly the non-graphical ones. In such cases no "tryFoo" make target is
168139provided.
169140
170−NB: The tests expect the locale to be the C locale, they may fail if run
171−under a different locale, if you get failures others can not reproduce
172−prepend 'LC_ALL=C' to the 'make test' command
173−
174141Running autopilot tests
175142=======================
176143
177144Autopilot tests are run from the build directory (which will be ./builddir if you used
178−the ./build script).
145+the ./build.sh script).
179146
180147$ make autopilot
181148
@@ -186,12 +153,36 @@ $ make install
186153
187154To see the list of existing autopilot tests you can do
188155
189−$ PYTHONPATH=../tests/autopilot autopilot list unity8
156+$ PYTHONPATH=../tests/autopilot autopilot3 list unity8
190157
191158And then run a single test with
192159
193−$ PYTHONPATH=../tests/autopilot autopilot run unity8.some.very.long.test.name
160+$ PYTHONPATH=../tests/autopilot autopilot3 run unity8.some.very.long.test.name
194161
195162or run them all with
196163
197−$ PYTHONPATH=../tests/autopilot autopilot run unity8
164+$ PYTHONPATH=../tests/autopilot autopilot3 run unity8
165+
166+Debugging techniques
167+====================
168+
169+Unity8 heavily uses Qt and with that Qt debugging techniques mostly apply in the
170+same fashion. There are, however, some additional unity8-specific notes:
171+
172+* Enable/disable Qt scenegraph visualizer on the fly:
173+
174+ $ qdbus com.canonical.Unity8.Debugging /com/canonical/Unity8/Debugging SetSceneGraphVisualizer <mode>
175+
176+ This is equivalent to exporting QSG_VISUALIZE=<mode> before running unity8, except it does it on the
177+ fly.
178+
179+* Toggle slow animations on the fly:
180+
181+ $ qdbus com.canonical.Unity8.Debugging /com/canonical/Unity8/Debugging SetSlowAnimations <true|false>
182+
183+* Change logging filter rules on the fly:
184+
185+ $ qdbus com.canonical.Unity8.Debugging /com/canonical/Unity8/Debugging SetLoggingFilterRules <filter>
186+
187+ This is equivalent to exporting QT_LOGGING_RULES or defining them in QT_LOGGING_CONF, except it does
188+ it on the fly.
Jenkinsfilenew file+2
@@ -0,0 +1,2 @@
1+@Library('ubports-build-tools') _
2+buildAndProvideDebianPackage()
README.mdnew file+31
@@ -0,0 +1,31 @@
1+# Lomiri
2+
3+Lomiri is the operating environment for everywhere. It is able to span the gaps between touch, mouse, and keyboard; between phones, tablets, and workstations; and look good doing it.
4+
5+If you want to contribute to Lomiri on Ubuntu Touch, you've come to the right place. If you want to package Lomiri for other operating systems, you'll be better served by the main branch on the repository that we're migrating to: https://gitlab.com/ubports/core/lomiri
6+
7+Lomiri has been renamed from Unity8. Most of the software on-device in Ubuntu Touch based on Ubuntu 16.04 is still called `unity8`.
8+
9+## Where to report issues
10+
11+Issues related to the version of Lomiri that currently runs on Ubuntu Touch devices may still be reported on this repository. We will move these reports to the GitLab repository as part of our final migration.
12+
13+## Developing Lomiri on Ubuntu Touch
14+
15+This repository contains the code for Lomiri currently running on Ubuntu Touch. If you would like to modify this version of Lomiri, follow the steps below. If you would like to modify Lomiri in another operating system, check out our new repository: https://gitlab.com/ubports/core/lomiri
16+
17+Lomiri can be built and its test suite run using [`clickable`](https://clickable-ut.dev). This is a convenient method to try out most graphical changes to Lomiri without an annoying redeployment process. If you wish to test your changes on your device or make changes that are more difficult to test without real hardware, check out [Making changes and testing locally on the UBports documentation](https://docs.ubports.com/en/latest/systemdev/testing-locally.html). If not, read on.
18+
19+Before you start, [install Clickable](https://clickable-ut.dev/en/latest/install.html).
20+
21+Now, clone this repository to your computer: `git clone https://github.com/ubports/unity8.git`
22+
23+Move into this directory: `cd unity8`
24+
25+Now you can use the full suite of tools provided by this repository's [clickable.yaml](clickable.yaml). For example:
26+
27+* `clickable ide qtcreator` will open QtCreator with this repository open as a project. You can edit and build the project this way, but running the tests will be a bit difficult.
28+* `clickable build --libs --verbose` will build Lomiri in the same environment as it would receive in Ubuntu Touch.
29+* `clickable test --libs` will run the entire Lomiri test suite. This test suite includes graphical tests (which are run on a virtual, invisible desktop) and non-graphical unit tests. These tests make sure Lomiri functions as prescribed and prevents new bugs from being added. You should run them before you create a PR on this repository. This command takes about 7 minutes on an Intel i7-8550U, so plan your time accordingly and use the next two options to reduce the number of times you need to run the whole test suite...
30+* `clickable ide 'cd build/x86_64-linux-gnu/unity8/ && make tryShell'` and similar commands that replace the `Shell` with another test target defined in [tests/qmltests/CMakeLists.txt](tests/qmltests/CMakeLists.txt) allow trying out some Lomiri components in a mock environment. You can use this to try out your changes to Lomiri as you develop.
31+* `clickable ide 'cd build/x86_64-linux-gnu/unity8/ && make xvfbtestShell'` and similar commands that replace the `Shell` with another test target defined in [tests/qmltests/CMakeLists.txt](tests/qmltests/CMakeLists.txt) allow running a single TestCase. You can remove the `xvfb` part of the make target to run the test case graphically, which might help you see what is causing the test to fail.
builddeleted−89
@@ -1,89 +0,0 @@
1−#!/bin/sh
2−
3−SETUP=false
4−CLEAN=false
5−NUM_JOBS=$(( `grep -c ^processor /proc/cpuinfo` + 1 ))
6−CODE_DIR=$( dirname `readlink -f $0` )
7−
8−usage() {
9− echo "usage: build [OPTIONS] [BUILD_TYPE]\n" >&2
10− echo "Script to build the shell. If BUILD_TYPE is not specified, it defaults to \"debug\".\n" >&2
11− echo "OPTIONS:" >&2
12− echo " -s, --setup Setup the build environment and branch Unity" >&2
13− echo " -c, --clean Clean the build tree before building" >&2
14− echo >&2
15− exit 1
16−}
17−
18−ARGS=`getopt -n$0 -u -a --longoptions="setup,clean,help" -o "sch" -- "$@"`
19−[ $? -ne 0 ] && usage
20−eval set -- "$ARGS"
21−
22−while [ $# -gt 0 ]
23−do
24− case "$1" in
25− -s|--setup) SETUP=true;;
26− -c|--clean) CLEAN=true;;
27− -h|--help) usage;;
28− --) shift;break;;
29− esac
30− shift
31−done
32−
33−[ $# -gt 1 ] && usage
34−
35−BUILD_TYPE="debug"
36−[ $# -eq 1 ] && BUILD_TYPE="$1"
37−
38−install_dependencies() {
39− sudo apt-get update || exit 4
40− echo "Installing Unity 8 dependencies.."
41− sudo apt-get install devscripts \
42− equivs \
43− gsettings-desktop-schemas \
44− qmenumodel-qml \
45− qtdeclarative5-dee-plugin \
46− qtdeclarative5-gsettings1.0 \
47− qtdeclarative5-ubuntu-ui-toolkit-plugin \
48− qtdeclarative5-ubuntu-settings-components \
49− unity-notifications-impl \
50− qtdeclarative5-xmllistmodel-plugin \
51− ubuntu-mobile-icons \
52− unity-scope-home \
53− unity-lens-applications \
54− unity-plugin-scopes \
55− || exit 5
56−}
57−
58−mk_build_deps() {
59− [ ! -f unity8-build-deps*deb -o $CODE_DIR/debian/control -nt unity8-build-deps*deb ] && mk-build-deps --install --root-cmd sudo $CODE_DIR/debian/control
60−}
61−
62−if [ -f "/usr/bin/ccache" ] ; then
63− if [ "x$CC" = "x" ]; then
64− export CC='ccache gcc'
65− fi
66− if [ "x$CXX" = "x" ] ; then
67− export CXX='ccache g++'
68− fi
69−fi
70−
71−if [ -f "/usr/bin/ninja" ] ; then
72− GENERATOR="-G Ninja"
73− # Ninja does not need -j, it parallelizes automatically.
74− BUILD_COMMAND="ninja"
75−else
76− GENERATOR=
77− BUILD_COMMAND="make -j$NUM_JOBS"
78−fi
79−
80−if $SETUP; then
81− install_dependencies
82−else
83− if $CLEAN; then rm -rf builddir; fi
84− mkdir -p builddir
85− cd builddir
86− mk_build_deps
87− cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE $CODE_DIR ${GENERATOR} || exit 6
88− ${BUILD_COMMAND} || exit 7
89−fi
build.shnew file+82
@@ -0,0 +1,82 @@
1+#!/bin/sh
2+
3+#
4+# Copyright (C) 2017 Canonical Ltd
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License version 3 as
8+# published by the Free Software Foundation.
9+#
10+# This program is distributed in the hope that it will be useful,
11+# but WITHOUT ANY WARRANTY; without even the implied warranty of
12+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+# GNU General Public License for more details.
14+#
15+# You should have received a copy of the GNU General Public License
16+# along with this program. If not, see <http://www.gnu.org/licenses/>.
17+#
18+
19+SETUP=false
20+CLEAN=false
21+NUM_JOBS=$(( `grep -c ^processor /proc/cpuinfo` + 1 ))
22+CODE_DIR=$( dirname `readlink -f $0` )
23+
24+usage() {
25+ echo "usage: build [OPTIONS] [BUILD_TYPE]\n" >&2
26+ echo "Script to build the shell. If BUILD_TYPE is not specified, it defaults to \"debug\".\n" >&2
27+ echo "OPTIONS:" >&2
28+ echo " -c, --clean Clean the build tree before building" >&2
29+ echo >&2
30+ exit 1
31+}
32+
33+ARGS=`getopt -n$0 -u -a --longoptions="setup,clean,help" -o "sch" -- "$@"`
34+[ $? -ne 0 ] && usage
35+eval set -- "$ARGS"
36+
37+while [ $# -gt 0 ]
38+do
39+ case "$1" in
40+ -c|--clean) CLEAN=true;;
41+ -h|--help) usage;;
42+ --) shift;break;;
43+ esac
44+ shift
45+done
46+
47+[ $# -gt 1 ] && usage
48+
49+BUILD_TYPE="debug"
50+[ $# -eq 1 ] && BUILD_TYPE="$1"
51+
52+mk_build_deps() {
53+ if [ ! -f control -o $CODE_DIR/debian/control -nt control ]; then
54+ sed 's/\:native//g' $CODE_DIR/debian/control > control
55+ mk-build-deps --install --root-cmd sudo control
56+ fi
57+}
58+
59+if [ -f "/usr/bin/ccache" ] ; then
60+ if [ "x$CC" = "x" ]; then
61+ export CC='ccache gcc'
62+ fi
63+ if [ "x$CXX" = "x" ] ; then
64+ export CXX='ccache g++'
65+ fi
66+fi
67+
68+if [ -f "/usr/bin/ninja" ] ; then
69+ GENERATOR="-G Ninja"
70+ # Ninja does not need -j, it parallelizes automatically.
71+ BUILD_COMMAND="ninja"
72+else
73+ GENERATOR=
74+ BUILD_COMMAND="make -j$NUM_JOBS"
75+fi
76+
77+if $CLEAN; then rm -rf builddir; fi
78+mkdir -p builddir
79+cd builddir
80+mk_build_deps
81+cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE $CODE_DIR ${GENERATOR} || exit 6
82+${BUILD_COMMAND} || exit 7
clickable.yamlnew file+153
@@ -0,0 +1,153 @@
1+clickable_minimum_required: '7'
2+builder: custom
3+build: echo Run \'clickable build --libs --verbose\' to build && false
4+restrict_arch: amd64
5+libraries:
6+ unity8:
7+ builder: cmake
8+ src_dir: "${ROOT}"
9+ test: make xvfballtests -j${NUM_PROCS}
10+ dependencies_host:
11+ - android-headers
12+ - cmake
13+ - cmake-extras
14+ - dbus-test-runner
15+ - debhelper
16+ - dh-apparmor
17+ - doxyqml
18+ - g++:native
19+ - gdb
20+ - graphviz
21+ - gsettings-ubuntu-schemas
22+ - libandroid-properties-dev
23+ - libconnectivity-qt1-dev
24+ - libevdev-dev
25+ - libgeonames-dev
26+ - libgl1-mesa-dev
27+ - libgl1-mesa-dri
28+ - libgles2-mesa-dev
29+ - libglib2.0-dev
30+ - libgnome-desktop-3-12
31+ - libgnome-desktop-3-dev
32+ - libgsettings-qt-dev
33+ - libhardware-dev
34+ - liblightdm-qt5-3-dev
35+ - libpam0g-dev
36+ - libpulse-dev
37+ - libqmenumodel-dev
38+ - libqt5sql5-sqlite
39+ - libqt5svg5-dev
40+ - libqt5xmlpatterns5-dev
41+ - libqtdbusmock1-dev
42+ - libqtdbustest1-dev
43+ - libsystemsettings-dev
44+ - libubuntu-app-launch2-dev
45+ - libubuntu-download-manager-common-dev
46+ - libubuntugestures5-dev
47+ - libubuntugestures5-private-dev
48+ - libudev-dev
49+ - libudm-common-dev
50+ - libunity-api-dev
51+ - libusermetricsoutput1-dev
52+ - libx11-dev
53+ - libxcb1-dev
54+ - libxi-dev
55+ - pkg-config
56+ - python3-all:any
57+ - python3-setuptools:native
58+ - qml-module-qt-labs-folderlistmodel
59+ - qml-module-qt-labs-settings
60+ - qml-module-qtmultimedia
61+ - qml-module-qtqml-statemachine
62+ - qml-module-qtquick-layouts
63+ - qml-module-qtquick-xmllistmodel
64+ - qml-module-qtquick2
65+ - qml-module-qtsysteminfo
66+ - qml-module-qttest
67+ - qml-module-ubuntu-components
68+ - qml-module-ubuntu-layouts
69+ - qml-module-ubuntu-settings-components
70+ - qml-module-ubuntu-test
71+ - qtbase5-dev
72+ - qtbase5-dev-tools
73+ - qtbase5-private-dev
74+ - qtdbustest-runner
75+ - qtdeclarative5-dev
76+ - qtdeclarative5-dev-tools
77+ - qtdeclarative5-private-dev
78+ - qtdeclarative5-ubuntu-content1
79+ - ttf-ubuntu-font-family
80+ - ubports-wallpapers
81+ - xvfb
82+dependencies_target:
83+ - android-headers
84+ - cmake
85+ - cmake-extras
86+ - dbus-test-runner
87+ - debhelper
88+ - dh-apparmor
89+ - doxyqml
90+ - g++:native
91+ - gdb
92+ - graphviz
93+ - gsettings-ubuntu-schemas
94+ - libandroid-properties-dev
95+ - libconnectivity-qt1-dev
96+ - libevdev-dev
97+ - libgeonames-dev
98+ - libgl1-mesa-dev
99+ - libgl1-mesa-dri
100+ - libgles2-mesa-dev
101+ - libglib2.0-dev
102+ - libgnome-desktop-3-12
103+ - libgnome-desktop-3-dev
104+ - libgsettings-qt-dev
105+ - libhardware-dev
106+ - liblightdm-qt5-3-dev
107+ - libpam0g-dev
108+ - libpulse-dev
109+ - libqmenumodel-dev
110+ - libqt5sql5-sqlite
111+ - libqt5svg5-dev
112+ - libqt5xmlpatterns5-dev
113+ - libqtdbusmock1-dev
114+ - libqtdbustest1-dev
115+ - libsystemsettings-dev
116+ - libubuntu-app-launch2-dev
117+ - libubuntu-download-manager-common-dev
118+ - libubuntugestures5-dev
119+ - libubuntugestures5-private-dev
120+ - libudev-dev
121+ - libudm-common-dev
122+ - libunity-api-dev
123+ - libusermetricsoutput1-dev
124+ - libx11-dev
125+ - libxcb1-dev
126+ - libxi-dev
127+ - pkg-config
128+ - python3-all:any
129+ - python3-setuptools:native
130+ - qml-module-qt-labs-folderlistmodel
131+ - qml-module-qt-labs-settings
132+ - qml-module-qtmultimedia
133+ - qml-module-qtqml-statemachine
134+ - qml-module-qtquick-layouts
135+ - qml-module-qtquick-xmllistmodel
136+ - qml-module-qtquick2
137+ - qml-module-qtsysteminfo
138+ - qml-module-qttest
139+ - qml-module-ubuntu-components
140+ - qml-module-ubuntu-layouts
141+ - qml-module-ubuntu-settings-components
142+ - qml-module-ubuntu-test
143+ - qtbase5-dev
144+ - qtbase5-dev-tools
145+ - qtbase5-private-dev
146+ - qtdbustest-runner
147+ - qtdeclarative5-dev
148+ - qtdeclarative5-dev-tools
149+ - qtdeclarative5-private-dev
150+ - qtdeclarative5-ubuntu-content1
151+ - ttf-ubuntu-font-family
152+ - ubports-wallpapers
153+ - xvfb
cmake/modules/Plugins.cmakedeleted−68
@@ -1,68 +0,0 @@
1−find_program(qmlplugindump_exe qmlplugindump)
2−
3−if(NOT qmlplugindump_exe)
4− msg(FATAL_ERROR "Could not locate qmlplugindump.")
5−endif()
6−
7−# Creates target for copying and installing qmlfiles
8−#
9−# export_qmlfiles(plugin sub_path)
10−#
11−#
12−# Target to be created:
13−# - plugin-qmlfiles - Copies the qml files (*.qml, *.js, qmldir) into the shadow build folder.
14−
15−macro(export_qmlfiles PLUGIN PLUGIN_SUBPATH)
16−
17− file(GLOB QMLFILES
18− *.qml
19− *.js
20− qmldir
21− )
22−
23− # copy the qmldir file
24− add_custom_target(${PLUGIN}-qmlfiles ALL
25− COMMAND cp ${QMLFILES} ${CMAKE_BINARY_DIR}/plugins/${PLUGIN_SUBPATH}
26− DEPENDS ${QMLFILES}
27− SOURCES ${QMLFILES}
28− )
29−
30− # install the qmlfiles file.
31− install(FILES ${QMLFILES}
32− DESTINATION ${SHELL_INSTALL_QML}/${PLUGIN_SUBPATH}
33− )
34−endmacro(export_qmlfiles)
35−
36−
37−# Creates target for generating the qmltypes file for a plugin and installs plugin files
38−#
39−# export_qmlplugin(plugin version sub_path [TARGETS target1 [target2 ...]])
40−#
41−# TARGETS additional install targets (eg the plugin shared object)
42−#
43−# Target to be created:
44−# - plugin-qmltypes - Generates the qmltypes file in the shadow build folder.
45−
46−macro(export_qmlplugin PLUGIN VERSION PLUGIN_SUBPATH)
47− set(multi_value_keywords TARGETS)
48− cmake_parse_arguments(qmlplugin "" "" "${multi_value_keywords}" ${ARGN})
49−
50− # Only try to generate .qmltypes if not cross compiling
51− if(NOT CMAKE_CROSSCOMPILING)
52− # create the plugin.qmltypes file
53− add_custom_target(${PLUGIN}-qmltypes ALL
54− COMMAND ${qmlplugindump_exe} -notrelocatable ${PLUGIN} ${VERSION} ${CMAKE_BINARY_DIR}/plugins > ${CMAKE_BINARY_DIR}/plugins/${PLUGIN_SUBPATH}/plugin.qmltypes
55− )
56− add_dependencies(${PLUGIN}-qmltypes ${PLUGIN}-qmlfiles ${qmlplugin_TARGETS})
57−
58− # install the qmltypes file.
59− install(FILES ${CMAKE_BINARY_DIR}/plugins/${PLUGIN_SUBPATH}/plugin.qmltypes
60− DESTINATION ${SHELL_INSTALL_QML}/${PLUGIN_SUBPATH}
61− )
62− endif()
63−
64− # install the additional targets
65− install(TARGETS ${qmlplugin_TARGETS}
66− DESTINATION ${SHELL_INSTALL_QML}/${PLUGIN_SUBPATH}
67− )
68−endmacro(export_qmlplugin)
cmake/modules/QmlTest.cmake+469−101
@@ -1,121 +1,489 @@
1−# add_qml_test(path component_name [NO_ADD_TEST] [NO_TARGETS]
2−# [TARGETS target1 [target2 [...]]]
3−# [IMPORT_PATHS import_path1 [import_path2 [...]]
4−# [PROPERTIES prop1 value1 [prop2 value2 [...]]])
1+# If you need to override the qmlscene or qmltestrunner executables,
2+# create the corresponding executable target.
3+
4+# These functions respect the global STDOUT_LOGGER and ARTIFACTS_DIR variables.
5+
6+# You can use those with cmake_parse_arguments
7+# if you need to wrap and mangle arguments.
8+set(QMLTEST_OPTIONS ADD_TEST CACHE INTERNAL "")
9+set(QMLTEST_SINGLE ITERATIONS ARG_PREFIX CACHE INTERNAL "")
10+set(QMLTEST_MULTI ARGS ENVIRONMENT DEPENDS IMPORT_PATHS TARGETS CACHE INTERNAL "")
11+
12+# import_executables(name1 [name2 [...]]
13+# [OPTIONAL] # continue when not found
14+# )
515#
6−# NO_ADD_TEST will prevent adding the test to the "test" target
7−# NO_TARGETS will prevent adding the test to any targets
8−# TARGETS lists the targets the test should be added to
9−# IMPORT_PATHS will pass those paths to qmltestrunner as "-import" arguments
10−# PROPERTIES will be set on the target and test target. See CMake's set_target_properties()
16+# This will find the named executables and import them
17+# to an imported target of the same name.
18+
19+function(import_executables)
20+ cmake_parse_arguments(QMLTEST "OPTIONAL" "" "" ${ARGN})
21+
22+ foreach(NAME ${QMLTEST_UNPARSED_ARGUMENTS})
23+ if(NOT TARGET ${NAME})
24+ add_executable(${NAME} IMPORTED GLOBAL)
25+ find_program(${NAME}_exe ${NAME})
26+
27+ if(NOT QMLTEST_OPTIONAL AND NOT ${NAME}_exe)
28+ message(FATAL_ERROR "Could not locate ${NAME}.")
29+ elseif(NOT ${NAME}_exe)
30+ message(STATUS "Could not locate ${NAME}, skipping.")
31+ else()
32+ set_target_properties(${NAME} PROPERTIES IMPORTED_LOCATION ${${NAME}_exe})
33+ endif()
34+ endif()
35+ endforeach()
36+endfunction()
37+
38+
39+# add_qml_test(path component_name
40+# [...]
41+# )
1142#
12−# Two targets will be created:
13−# - testComponentName - Runs the test with qmltestrunner
14−# - tryComponentName - Runs the test with uqmlscene, for manual interaction
43+# Add test targets for ${component_name} under ${path}. It's assumed
44+# that the test file is named ${path}/tst_${component_name}.qml.
45+#
46+# This function wraps add_manual_qml_test and add_qml_unittest,
47+# see below for available arguments.
48+
49+function(add_qml_test PATH COMPONENT_NAME)
50+ cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
51+ mangle_arguments()
52+
53+ add_qml_unittest(${ARGV})
54+ add_manual_qml_test(${ARGV})
55+endfunction()
56+
57+
58+# add_qml_test_data(path component_name
59+# [...]
60+# )
61+#
62+# Install file called ${component_name} (or ${component_name}.qml) under
63+# ${path}.
64+
65+function(add_qml_test_data PATH COMPONENT_NAME)
66+ cmake_parse_arguments(TEST "" "DESTINATION" "" ${ARGN})
67+
68+ set(filename "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/${COMPONENT_NAME}")
69+
70+ if (IS_DIRECTORY "${filename}")
71+ # As a convenience, allow specifying a directory and we will install
72+ # all files in the dir. We do it this way rather than passing
73+ # DIRECTORY to install() because we want to process any qml files.
74+ file(GLOB subfiles RELATIVE "${filename}" "${filename}/*")
75+ foreach(subfile ${subfiles})
76+ add_qml_test_data("${PATH}/${COMPONENT_NAME}" "${subfile}")
77+ endforeach()
78+ return()
79+ endif()
80+
81+ if (NOT EXISTS "${filename}")
82+ set(filename "${filename}.qml")
83+ set(COMPONENT_NAME "${COMPONENT_NAME}.qml")
84+ endif()
85+
86+ if ("${filename}" MATCHES "\\.qml$")
87+ file(READ "${filename}" contents)
88+ string(REGEX REPLACE "(\"[./]*)/qml(/|\")" "\\1\\2" contents "${contents}")
89+ # this is for (at least) cardcreatortest which pulls in an architecture-specific
90+ # import into the plugins directory (which is a 'qml' once installed).
91+ string(REGEX REPLACE "(import \"[./]*)/plugins(/|\")" "\\1/qml\\2" contents "${contents}")
92+ set(filename "${CMAKE_CURRENT_BINARY_DIR}/${PATH}/${COMPONENT_NAME}")
93+ file(WRITE "${filename}" "${contents}")
94+ endif()
95+
96+ if (TEST_DESTINATION)
97+ set(DESTINATION "${TEST_DESTINATION}")
98+ else()
99+ file(RELATIVE_PATH relcurpath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
100+ set(DESTINATION "${SHELL_APP_DIR}/${relcurpath}/${PATH}")
101+ endif()
102+
103+ install(FILES "${filename}" DESTINATION "${DESTINATION}")
104+endfunction()
105+
106+
107+# add_qml_unittest(path component_name
108+# [...]
109+# )
110+#
111+# Add test targets for ${component_name} under ${path}. It's assumed
112+# that the test file is named ${path}/tst_${component_name}.qml.
15113#
16−# To change/set a default value for the whole test suite, prior to calling add_qml_test, set:
17−# qmltest_DEFAULT_NO_ADD_TEST (default: FALSE)
18−# qmltest_DEFAULT_TARGETS
19−# qmltest_DEFAULT_IMPORT_PATHS
20−# qmltest_DEFAULT_PROPERTIES
21−
22−find_program(qmltestrunner_exe qmltestrunner)
23−
24−if(NOT qmltestrunner_exe)
25− msg(FATAL_ERROR "Could not locate qmltestrunner.")
26−endif()
27−
28−set(qmlscene_exe ${CMAKE_BINARY_DIR}/tests/uqmlscene/uqmlscene)
29−
30−macro(add_manual_qml_test SUBPATH COMPONENT_NAME)
31− set(options NO_ADD_TEST NO_TARGETS)
32− set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT)
33−
34− cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN})
35−
36− set(qmlscene_TARGET try${COMPONENT_NAME})
37− set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
38−
39− set(qmlscene_imports "")
40− if(NOT "${qmltest_IMPORT_PATHS}" STREQUAL "")
41− foreach(IMPORT_PATH ${qmltest_IMPORT_PATHS})
42− list(APPEND qmlscene_imports "-I")
43− list(APPEND qmlscene_imports ${IMPORT_PATH})
44− endforeach(IMPORT_PATH)
45− elseif(NOT "${qmltest_DEFAULT_IMPORT_PATHS}" STREQUAL "")
46− foreach(IMPORT_PATH ${qmltest_DEFAULT_IMPORT_PATHS})
47− list(APPEND qmlscene_imports "-I")
48− list(APPEND qmlscene_imports ${IMPORT_PATH})
49− endforeach(IMPORT_PATH)
50− endif()
51−
52− set(qmlscene_command
53− env ${qmltest_ENVIRONMENT}
54− ${qmlscene_exe} ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
55− ${qmlscene_imports}
114+# This function wraps add_executable_test, see below for available arguments.
115+
116+function(add_qml_unittest PATH COMPONENT_NAME)
117+ import_executables(qmltestrunner)
118+
119+ add_executable_test(${COMPONENT_NAME} qmltestrunner
120+ ${ARGN}
121+ ARGS -input ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
56122 )
57− add_custom_target(${qmlscene_TARGET} ${qmlscene_command})
58123
59−endmacro(add_manual_qml_test)
124+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml")
125+ add_qml_test_data("${PATH}" "tst_${COMPONENT_NAME}.qml")
126+ endif()
127+endfunction()
128+
60129
61−macro(add_qml_test SUBPATH COMPONENT_NAME)
62− set(options NO_ADD_TEST NO_TARGETS)
63− set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT)
130+# add_manual_qml_test(path component_name
131+# [...]
132+# )
133+#
134+# Add manual test targets for ${component_name} under ${path}. It's assumed
135+# that the test file is named ${path}/tst_${component_name}.qml.
136+#
137+# This function wraps add_manual_test, see below for available arguments.
64138
65− cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN})
139+function(add_manual_qml_test PATH COMPONENT_NAME)
140+ import_executables(qmlscene)
141+ cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
66142
67− set(qmltest_TARGET test${COMPONENT_NAME})
68− set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
143+ add_manual_test(${COMPONENT_NAME} qmlscene
144+ ${ARGN}
145+ ARGS ${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml ${QMLTEST_ARGS}
146+ )
69147
70− set(qmltestrunner_imports "")
71− if(NOT "${qmltest_IMPORT_PATHS}" STREQUAL "")
72− foreach(IMPORT_PATH ${qmltest_IMPORT_PATHS})
73− list(APPEND qmltestrunner_imports "-import")
74− list(APPEND qmltestrunner_imports ${IMPORT_PATH})
75− endforeach(IMPORT_PATH)
76− elseif(NOT "${qmltest_DEFAULT_IMPORT_PATHS}" STREQUAL "")
77− foreach(IMPORT_PATH ${qmltest_DEFAULT_IMPORT_PATHS})
78− list(APPEND qmltestrunner_imports "-import")
79− list(APPEND qmltestrunner_imports ${IMPORT_PATH})
80− endforeach(IMPORT_PATH)
148+ if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PATH}/tst_${COMPONENT_NAME}.qml")
149+ add_qml_test_data("${PATH}" "tst_${COMPONENT_NAME}.qml")
81150 endif()
151+endfunction()
152+
153+
154+# add_executable_test(target component_name
155+# [...] # see doc for add_manual_qml_test for common arguments
156+# [ADD_TEST] # whether to add to the "test" target
157+# [ARG_PREFIX arg_prefix] # prefix logging arguments with this string
158+# [ARGS] arg1 [arg2 [...]] # pass these arguments to the test executable
159+# [TARGETS target1 [target2 [...]]] # make the listed targets depend on this test
160+# # if a corresponding xvfbtarget1, xvfbtarget2 etc. exists,
161+# # this test running under xvfb will be added as a dependency
162+# # of those targets
163+# [ITERATIONS count] # run this test as a benchmark for ${count} iterations
164+# )
165+#
166+# Logging options in the standard form of "-o filename,format"
167+# will be appended to the arguments list, prefixed with ARG_PREFIX.
168+# XUnitXML files will be stored in current binary dir.
169+#
170+# Three targets will be created:
171+# - test${component_name} - Runs the test
172+# - xvfbtest${component_name} - Runs the test under xvfb
173+# - gdbtest${component_name} - Runs the test under gdb
174+
175+function(add_executable_test COMPONENT_NAME TARGET)
176+ import_executables(gdb xvfb-run OPTIONAL)
177+
178+ cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
179+ mangle_arguments()
180+
181+ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
182+ set(file_logger -o ${CMAKE_CURRENT_BINARY_DIR}/test${COMPONENT_NAME}.xml,xunitxml)
183+
184+ bake_arguments("${QMLTEST_ARG_PREFIX}" args ${iterations} ${file_logger} ${STDOUT_LOGGER})
82185
83186 set(qmltest_command
84− env ${qmltest_ENVIRONMENT}
85− ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
86− ${qmltestrunner_imports}
87− -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
88− -o -,txt
187+ $<TARGET_FILE:${TARGET}>
188+ ${QMLTEST_ARGS}
189+ ${args}
89190 )
90− add_custom_target(${qmltest_TARGET} ${qmltest_command})
91191
92− if(NOT "${qmltest_PROPERTIES}" STREQUAL "")
93− set_target_properties(${qmltest_TARGET} PROPERTIES ${qmltest_PROPERTIES})
94− elseif(NOT "${qmltest_DEFAULT_PROPERTIES}" STREQUAL "")
95− set_target_properties(${qmltest_TARGET} PROPERTIES ${qmltest_DEFAULT_PROPERTIES})
192+ add_qmltest_target(test${COMPONENT_NAME} ${TARGET}
193+ COMMAND ${qmltest_command}
194+ ${depends}
195+ ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
196+ ${add_test}
197+ ${targets}
198+ )
199+
200+ if(TARGET xvfb-run)
201+ add_qmltest_target(xvfbtest${COMPONENT_NAME} ${TARGET}
202+ COMMAND $<TARGET_FILE:xvfb-run> --server-args "-screen 0 1024x768x24" --auto-servernum ${qmltest_command}
203+ ${depends}
204+ ENVIRONMENT QT_QPA_PLATFORM=xcb QML2_IMPORT_PATH=${imports} LD_PRELOAD=/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/mesa/libGL.so.1 ${QMLTEST_ENVIRONMENT}
205+ TARGETS ${xvfb_targets}
206+ )
207+ endif()
208+
209+ if(TARGET gdb)
210+ add_qmltest_target(gdbtest${COMPONENT_NAME} ${TARGET}
211+ COMMAND $<TARGET_FILE:gdb> -ex run -args ${qmltest_command}
212+ ${depends}
213+ ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
214+ )
96215 endif()
216+endfunction()
217+
218+
219+# add_manual_test(target component_name
220+# [DEPENDS target1 [target2 [...]]] # make this test depend on the specified targets
221+# [IMPORT_PATHS import_path1 [import_path2 [...]] # use these QML import paths
222+# # (they're searched first to last)
223+# [ENVIRONMENT var1=value1 [var2=value2 [...]]] # set these environment variables
224+# )
225+#
226+# Two targets will be created:
227+# - try${component_name} - Runs the test for manual interaction
228+# - gdbtry${component_name} - Runs the test under gdb
97229
98− if("${qmltest_NO_ADD_TEST}" STREQUAL FALSE AND NOT "${qmltest_DEFAULT_NO_ADD_TEST}" STREQUAL "TRUE")
99− add_test(${qmltest_TARGET} ${qmltest_command})
230+function(add_manual_test COMPONENT_NAME TARGET)
231+ import_executables(gdb OPTIONAL)
100232
101− if(NOT "${qmltest_UNPARSED_ARGUMENTS}" STREQUAL "")
102− set_tests_properties(${qmltest_TARGET} PROPERTIES ${qmltest_PROPERTIES})
103− elseif(NOT "${qmltest_DEFAULT_PROPERTIES}" STREQUAL "")
104− set_tests_properties(${qmltest_TARGET} PROPERTIES ${qmltest_DEFAULT_PROPERTIES})
233+ cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "${QMLTEST_MULTI}" ${ARGN})
234+ mangle_arguments()
235+
236+ bake_arguments("${QMLTEST_ARG_PREFIX}" args -qmljsdebugger=port:3768,3800)
237+
238+ set(qmltry_command
239+ $<TARGET_FILE:${TARGET}>
240+ ${QMLTEST_ARGS}
241+ ${args}
242+ )
243+
244+ add_qmltest_target(try${COMPONENT_NAME} ${TARGET}
245+ COMMAND ${qmltry_command}
246+ ${depends}
247+ ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
248+ )
249+
250+ if(TARGET gdb)
251+ add_qmltest_target(gdbtry${COMPONENT_NAME} ${TARGET}
252+ COMMAND $<TARGET_FILE:gdb> -ex run -args ${qmltry_command}
253+ ${depends}
254+ ENVIRONMENT QML2_IMPORT_PATH=${imports} ${QMLTEST_ENVIRONMENT}
255+ )
256+ endif()
257+endfunction()
258+
259+
260+# add_meta_test(target)
261+#
262+# Adds a test target that will run one of our "meta" test targets, like
263+# xvfbuitests. This script will run the specified suite of tests on an
264+# installed system.
265+
266+function(add_meta_test TARGET_NAME)
267+ cmake_parse_arguments(TEST "SERIAL" "" "DEPENDS" ${ARGN})
268+
269+ add_custom_target(${TARGET_NAME})
270+
271+ set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${TARGET_NAME}.sh")
272+ if(TEST_SERIAL)
273+ file(WRITE "${filename}" "#!/bin/sh\n\n")
274+ else()
275+ file(WRITE "${filename}" "#!/usr/bin/parallel --shebang --no-notice\n\n")
276+ endif()
277+
278+ add_meta_dependencies(${TARGET_NAME} DEPENDS ${TEST_DEPENDS})
279+ # else we will write the rest of the script as we add cmake targets
280+
281+ install(FILES "${filename}"
282+ PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE
283+ GROUP_EXECUTE GROUP_READ
284+ WORLD_EXECUTE WORLD_READ
285+ DESTINATION "${SHELL_PRIVATE_LIBDIR}/tests/scripts"
286+ )
287+endfunction()
288+
289+
290+################### INTERNAL ####################
291+
292+function(install_test_script TARGET_NAME)
293+ cmake_parse_arguments(TEST "" "" "COMMAND;ENVIRONMENT" ${ARGN})
294+
295+ # Now write the above test into a shell script that we can run on an
296+ # installed system.
297+ set(script "#!/bin/sh\n\nset -x\n\n")
298+ foreach(ONE_ENV ${TEST_ENVIRONMENT})
299+ set(script "${script}export ${ONE_ENV}\n")
300+ endforeach()
301+ set(script "${script}export UNITY_TESTING_DATADIR=\"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}\"\n")
302+ set(script "${script}export UNITY_TESTING_LIBDIR=\"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\"\n")
303+ set(script "${script}\n")
304+ set(script "${script}XML_ARGS=\n")
305+ set(script "${script}if [ -n \"\$ARTIFACTS_DIR\" ]; then\n")
306+ set(script "${script} XML_ARGS=\"@XML_ARGS@\"\n")
307+ set(script "${script} mkdir -p \"@XML_DIR@\"\n")
308+ set(script "${script} touch \"@XML_FILE@\"\n")
309+ set(script "${script}fi\n")
310+ set(script "${script}\n")
311+ foreach(ONE_CMD ${TEST_COMMAND})
312+ set(script "${script}'${ONE_CMD}' ")
313+ endforeach()
314+ set(script "${script}\"\$@\"") # Allow passing arguments if desired
315+
316+ set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${TARGET_NAME}.sh")
317+
318+ # Generate script to file then read it back to resolve any generator
319+ # expressions before we try to replace paths.
320+ file(GENERATE
321+ OUTPUT "${filename}"
322+ CONTENT "${script}"
323+ )
324+
325+ # Do replacement at install time to save needless work and to make sure
326+ # we are modifying file after generate step above (which doesn't happen
327+ # immediately). We can't use a custom-defined function or macro here...
328+ # So instead we use a giant ugly code block.
329+
330+ # START OF CODE BLOCK --------------------------------------------------
331+ install(CODE "
332+ file(READ \"${filename}\" replacestr)
333+
334+ # Now some replacements...
335+ # tests like to write xml output to our builddir; we don't need that, but we do want them in ARTIFACTS_DIR
336+ string(REGEX MATCH \"( '--parameter')? '-o'( '--parameter')? '[^']*,xunitxml' \" xmlargs \"\${replacestr}\")
337+ string(REGEX REPLACE \"( '--parameter')? '-o'( '--parameter')? '[^']*,xunitxml' \" \" \\\$XML_ARGS \" replacestr \"\${replacestr}\")
338+ string(REGEX REPLACE \"'[^']*/tests/\" \"'\\\$ARTIFACTS_DIR/tests/\" xmlargs \"\${xmlargs}\")
339+ string(REGEX REPLACE \".*'([^']*),xunitxml'.*\" \"\\\\1\" xmlfile \"\${xmlargs}\")
340+ string(REGEX REPLACE \"(.*)/[^/]*\" \"\\\\1\" xmldir \"\${xmlfile}\")
341+ string(REGEX REPLACE \"'\" \"\" xmlargs \"\${xmlargs}\") # strip single quotes
342+ string(REGEX REPLACE \"@XML_ARGS@\" \"\${xmlargs}\" replacestr \"\${replacestr}\")
343+ string(REGEX REPLACE \"@XML_DIR@\" \"\${xmldir}\" replacestr \"\${replacestr}\")
344+ string(REGEX REPLACE \"@XML_FILE@\" \"\${xmlfile}\" replacestr \"\${replacestr}\")
345+ # replace build/source roots with their install paths
346+ string(REPLACE \"${CMAKE_BINARY_DIR}/libs\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\" replacestr \"\${replacestr}\")
347+ string(REPLACE \"${CMAKE_BINARY_DIR}/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}\" replacestr \"\${replacestr}\")
348+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/libs\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/libs\" replacestr \"\${replacestr}\")
349+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/mocks\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}/mocks\" replacestr \"\${replacestr}\")
350+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/plugins\" replacestr \"\${replacestr}\")
351+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/qmltests\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/qmltests\" replacestr \"\${replacestr}\")
352+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/uqmlscene\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}\" replacestr \"\${replacestr}\")
353+ string(REPLACE \"${CMAKE_BINARY_DIR}/tests/utils/modules\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_INSTALL_QML}/utils\" replacestr \"\${replacestr}\")
354+ string(REPLACE \"${CMAKE_SOURCE_DIR}/tests/plugins\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}/tests/plugins\" replacestr \"\${replacestr}\")
355+ string(REPLACE \"${CMAKE_SOURCE_DIR}/tests/qmltests\" \"${CMAKE_INSTALL_PREFIX}/${SHELL_APP_DIR}/tests/qmltests\" replacestr \"\${replacestr}\")
356+
357+ file(WRITE \"${filename}\" \"\${replacestr}\")
358+ ")
359+ # END OF CODE BLOCK --------------------------------------------------
360+
361+ install(FILES "${filename}"
362+ PERMISSIONS OWNER_EXECUTE OWNER_READ OWNER_WRITE
363+ GROUP_EXECUTE GROUP_READ
364+ WORLD_EXECUTE WORLD_READ
365+ DESTINATION "${SHELL_PRIVATE_LIBDIR}/tests/scripts"
366+ )
367+endfunction()
368+
369+function(add_meta_dependencies UPSTREAM_TARGET)
370+ cmake_parse_arguments(TEST "" "" "DEPENDS" ${ARGN})
371+
372+ foreach(depend ${TEST_DEPENDS})
373+ add_dependencies(${UPSTREAM_TARGET} ${depend})
374+
375+ # add depend to the meta test script that we will install on system
376+ set(filename "${CMAKE_BINARY_DIR}/tests/scripts/${UPSTREAM_TARGET}.sh")
377+ if (EXISTS "${filename}")
378+ file(APPEND "${filename}" "${CMAKE_INSTALL_PREFIX}/${SHELL_PRIVATE_LIBDIR}/tests/scripts/${depend}.sh \"\$@\" 2>&1\n")
105379 endif()
106− endif("${qmltest_NO_ADD_TEST}" STREQUAL FALSE AND NOT "${qmltest_DEFAULT_NO_ADD_TEST}" STREQUAL "TRUE")
107−
108− if("${qmltest_NO_TARGETS}" STREQUAL "FALSE")
109− if(NOT "${qmltest_TARGETS}" STREQUAL "")
110− foreach(TARGET ${qmltest_TARGETS})
111− add_dependencies(${TARGET} ${qmltest_TARGET})
112− endforeach(TARGET)
113− elseif(NOT "${qmltest_DEFAULT_TARGETS}" STREQUAL "")
114− foreach(TARGET ${qmltest_DEFAULT_TARGETS})
115− add_dependencies(${TARGET} ${qmltest_TARGET})
116− endforeach(TARGET)
380+ endforeach()
381+endfunction()
382+
383+# add_qmltest_target(target_name target
384+# COMMAND test_exe [arg1 [...]] # execute this test with arguments
385+# [...] # see above for available arguments:
386+# # ADD_TEST, ENVIRONMENT, DEPENDS and TARGETS
387+# )
388+
389+function(add_qmltest_target TARGET_NAME TARGET)
390+ cmake_parse_arguments(QMLTEST "${QMLTEST_OPTIONS}" "${QMLTEST_SINGLE}" "COMMAND;${QMLTEST_MULTI}" ${ARGN})
391+ mangle_arguments()
392+
393+ # Additional arguments
394+ string(TOLOWER "${CMAKE_GENERATOR}" cmake_generator_lower)
395+ if(cmake_generator_lower STREQUAL "unix makefiles")
396+ set(function "$(FUNCTION)")
397+ endif()
398+
399+ add_custom_target(${TARGET_NAME}
400+ env ${QMLTEST_ENVIRONMENT}
401+ ${QMLTEST_COMMAND} ${function}
402+ DEPENDS ${TARGET} ${QMLTEST_DEPENDS}
403+ )
404+
405+ install_test_script(${TARGET_NAME}
406+ ENVIRONMENT ${QMLTEST_ENVIRONMENT}
407+ COMMAND ${QMLTEST_COMMAND}
408+ )
409+
410+ if(QMLTEST_ADD_TEST)
411+ add_test(
412+ NAME ${TARGET_NAME}
413+ COMMAND ${QMLTEST_COMMAND}
414+ )
415+
416+ foreach(ENV ${QMLTEST_ENVIRONMENT})
417+ set_property(TEST ${TARGET_NAME} APPEND PROPERTY ENVIRONMENT ${ENV})
418+ endforeach()
419+
420+ set_property(TEST ${TARGET_NAME} APPEND PROPERTY DEPENDS ${TARGET})
421+ foreach(DEPEND ${DEPENDS})
422+ set_property(TEST ${TARGET_NAME} APPEND PROPERTY DEPENDS ${DEPEND})
423+ endforeach()
424+ endif()
425+
426+ foreach(UPSTREAM_TARGET ${QMLTEST_TARGETS})
427+ add_meta_dependencies(${UPSTREAM_TARGET} DEPENDS ${TARGET_NAME})
428+ endforeach()
429+endfunction()
430+
431+
432+# mangle_arguments(${ARGN})
433+#
434+# Verify there were no unparsed arguments and
435+# mangle the known ones for further processing.
436+
437+macro(mangle_arguments)
438+ if(QMLTEST_UNPARSED_ARGUMENTS)
439+ message(FATAL_ERROR "Unexpected arguments: ${QMLTEST_UNPARSED_ARGUMENTS}")
440+ endif()
441+
442+ if(QMLTEST_ADD_TEST)
443+ set(add_test ADD_TEST)
444+ endif()
445+
446+ if(QMLTEST_IMPORT_PATHS)
447+ string(REPLACE ";" ":" imports "${QMLTEST_IMPORT_PATHS}")
448+ endif()
449+
450+ if(QMLTEST_ITERATIONS)
451+ set(iterations -iterations ${QMLTEST_ITERATIONS})
452+ endif()
453+
454+ if(QMLTEST_DEPENDS)
455+ set(depends DEPENDS ${QMLTEST_DEPENDS})
456+ endif()
457+
458+ if(QMLTEST_TARGETS)
459+ set(targets TARGETS ${QMLTEST_TARGETS})
460+ endif()
461+
462+ set(xvfb_targets "")
463+ foreach(target ${QMLTEST_TARGETS})
464+ if(TARGET xvfb${target})
465+ list(APPEND xvfb_targets xvfb${target})
117466 endif()
118− endif("${qmltest_NO_TARGETS}" STREQUAL "FALSE")
467+ endforeach()
468+ set(xvfb_targets "${xvfb_targets}" PARENT_SCOPE)
469+endmacro()
470+
119471
120− add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
121−endmacro(add_qml_test)
472+# bake_arguments(prefix output
473+# arg1 [arg2 [...]]
474+# )
475+#
476+# If set, add the argument prefix before every passed
477+# argument and store the result in ${OUTPUT} variable.
478+
479+function(bake_arguments PREFIX OUTPUT)
480+ set(args "${ARGN}")
481+ if(PREFIX)
482+ set(args "")
483+ foreach(arg ${ARGN})
484+ list(APPEND args ${PREFIX})
485+ list(APPEND args ${arg})
486+ endforeach()
487+ endif()
488+ set(${OUTPUT} "${args}" PARENT_SCOPE)
489+endfunction()
cmake/modules/autopilot.cmake+2−1
@@ -2,7 +2,7 @@ add_custom_target(autopilot)
22
33function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
44 add_custom_target(autopilot-${TEST_NAME}
5− COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks autopilot run ${TEST_SUITE}
5+ COMMAND UNITY_TESTING=1 LANG=C QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python3 -m autopilot.run run ${TEST_SUITE}
66 WORKING_DIRECTORY ${WORKING_DIR}
77 DEPENDS fake_install
88 )
@@ -12,4 +12,5 @@ function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
1212 )
1313
1414 add_dependencies(autopilot autopilot-${TEST_NAME})
15+
1516endfunction()
data/51-unity8-greeter.confnew file+2
@@ -0,0 +1,2 @@
1+[Seat:*]
2+greeter-session=unity8-greeter
data/CMakeLists.txt+22−3
@@ -1,8 +1,27 @@
1−# generate desktop file
1+# generate desktop files
22configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3−configure_file(${SCOPE_TOOL}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop @ONLY)
3+configure_file(${INDICATORS_CLIENT_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop @ONLY)
4+configure_file(${GREETER_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop @ONLY)
45
56# install desktop files
6−install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop
7+install(FILES
8+ ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
9+ ${CMAKE_CURRENT_BINARY_DIR}/${INDICATORS_CLIENT_APP}.desktop
710 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
811 )
12+
13+install(FILES
14+ ${CMAKE_CURRENT_BINARY_DIR}/${GREETER_APP}.desktop
15+ DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/greeters
16+ )
17+
18+install(FILES
19+ 51-unity8-greeter.conf
20+ DESTINATION ${CMAKE_INSTALL_DATADIR}/lightdm/lightdm.conf.d
21+ )
22+
23+add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
24+
25+install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
26+install(FILES com.canonical.Unity.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
27+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
data/com.canonical.Unity.gschema.xmlnew file+255
@@ -0,0 +1,255 @@
1+<schemalist>
2+ <enum id="form-factor-enum">
3+ <value nick="Automatic" value="0" />
4+ <value nick="Desktop" value="1" />
5+ <value nick="Netbook" value="2" />
6+ <value nick="TV" value="3" />
7+ </enum>
8+ <enum id="home-expanded-enum">
9+ <value nick="Not Expanded" value="0" />
10+ <value nick="Expanded" value="1" />
11+ </enum>
12+ <enum id="launcher-position-enum">
13+ <value nick="Left" value="0" />
14+ <value nick="Bottom" value="1" />
15+ </enum>
16+ <enum id="desktop-type-enum">
17+ <value nick="Ubuntu" value="0" />
18+ <value nick="UbuntuKylin" value="1" />
19+ </enum>
20+
21+ <schema path="/com/canonical/unity/" id="com.canonical.Unity" gettext-domain="unity">
22+ <key enum="form-factor-enum" name="form-factor">
23+ <default>"Automatic"</default>
24+ <summary>The form factor Unity should target.</summary>
25+ <description>The form factor chosen will affect the size and appearance of the Dash, Launcher and also the Window Management behaviour.</description>
26+ </key>
27+ <key enum="home-expanded-enum" name="home-expanded">
28+ <default>"Expanded"</default>
29+ <summary>Whether the home screen should be expanded.</summary>
30+ <description>Whether the home screen should be expanded.</description>
31+ </key>
32+ <key enum="desktop-type-enum" name="desktop-type">
33+ <default>"Ubuntu"</default>
34+ <summary>The current desktop name.</summary>
35+ <description>The current desktop name.</description>
36+ </key>
37+ <key type="i" name="minimize-count">
38+ <default>0</default>
39+ <summary>Number of times a normal window has been minimized.</summary>
40+ <description>This is used to adjust the animation speed by making it progressively faster the more it is used.</description>
41+ </key>
42+ <key type="i" name="minimize-fast-duration">
43+ <default>300</default>
44+ <summary>The duration for the minimize animation when it is at its fastest setting.</summary>
45+ <description>This is the duration that the minimize animation will have when it has been used more than an number of times equal minimize-speed-threshold.</description>
46+ </key>
47+ <key type="i" name="minimize-slow-duration">
48+ <default>800</default>
49+ <summary>The duration for the minimize animation when it is at its slowest setting.</summary>
50+ <description>This is the duration that the minimize animation will have when it has never been used.</description>
51+ </key>
52+ <key type="i" name="minimize-speed-threshold">
53+ <default>100</default>
54+ <summary>The number of minimizations required to reach maximum speed.</summary>
55+ <description>The speed of the minimize animation will progressively get faster as minimize-count approaches this value.</description>
56+ </key>
57+ <key type="b" name="double-click-activate">
58+ <default>true</default>
59+ <summary>Enable/Disable dash result double-click activation.</summary>
60+ <description>This is used to enable/disable double-click result activation in the dash. Double-click to activate, single click preview</description>
61+ </key>
62+ <key type="b" name="integrated-menus">
63+ <default>false</default>
64+ <summary>Enable/Disable the integrated menus in Unity.</summary>
65+ <description>When this is enabled, the application menus will be shown
66+ on the window decoration, otherwise they will be always shown on the
67+ unity top panel</description>
68+ </key>
69+ <key type="u" name="show-menus-now-delay">
70+ <default>180</default>
71+ <range min="0" max="5000"/>
72+ <summary>Delay (in ms) before showing the menus when pressing Alt</summary>
73+ <description>This allows tune the delay before presenting unity menus
74+ (in non always-show-menus mode).</description>
75+ </key>
76+ <key type="b" name="always-show-menus">
77+ <default>false</default>
78+ <summary>Toggle the menu visibility based on mouse hovering.</summary>
79+ <description>When this is enabled, the application menus will be always
80+ shown (on the window decoration or in the unity panel, depending whether
81+ integrated menus are enabled), otherwise they will be shown only when
82+ the mouse cursor is over the relative mouse area.</description>
83+ </key>
84+ <key type="as" name="whitelist-repeated-keys">
85+ <default>[
86+ 'XF86KbdBrightnessUp',
87+ 'XF86KbdBrightnessDown',
88+ 'XF86MonBrightnessUp',
89+ 'XF86MonBrightnessDown',
90+ 'XF86AudioRaiseVolume',
91+ 'XF86AudioLowerVolume'
92+ ]</default>
93+ <summary>List of keycodes that should be processed even if auto-repated.</summary>
94+ <description>These keycodes are processed even if they are auto-repeated.</description>
95+ </key>
96+ <key type="b" name="pam-check-account-type">
97+ <default>false</default>
98+ <summary>Enable/Disable PAM account checking</summary>
99+ <description>Whether PAM should check the result of account modules
100+ when authenticating. Only do this if you have account
101+ configured properly on your system.</description>
102+ </key>
103+ <key type="b" name="lowgfx">
104+ <default>false</default>
105+ <summary>Enable/Disable Low Graphics Mode</summary>
106+ <description>Whether Unity runs in Low Graphics Mode.</description>
107+ </key>
108+ </schema>
109+ <schema path="/com/canonical/unity/interface/" id="com.canonical.Unity.Interface" gettext-domain="unity">
110+ <key type="d" name="text-scale-factor">
111+ <default>1.0</default>
112+ <range min="0.5" max="3.0"/>
113+ <summary>Font scaling for unity and applications.</summary>
114+ <description>This value defines the global font scaling used by both
115+ unity and applications. It will match the current system font scaling.</description>
116+ </key>
117+ <key type="d" name="cursor-scale-factor">
118+ <default>1.0</default>
119+ <range min="0.5" max="3.0"/>
120+ <summary>Mouse cursor scaling.</summary>
121+ <description>This value defines the global mouse cursor scaling used by both
122+ unity and applications. Changing this value allows to use a custom scaling
123+ for the mouse cursor.</description>
124+ </key>
125+ <key type="s" name="app-scale-factor-monitor">
126+ <default>''</default>
127+ <summary>The name of the monitor that controls the global app scaling factor.</summary>
128+ <description>This value defines the monitor that unity will use (if found) as reference
129+ for scaling all the applications.</description>
130+ </key>
131+ <key type="b" name="app-fallback-to-maximum-scale-factor">
132+ <default>true</default>
133+ <summary>Use the maximum per-monitor scale-factor as application scale factor if no target monitor is found.</summary>
134+ <description>When this is enabled, the applications scale factor will match
135+ the scale factor of the monitor with the greater value, in case the monitor
136+ defined in 'app-scale-factor-monitor' is not provided or available.</description>
137+ </key>
138+ </schema>
139+ <schema path="/com/canonical/unity/launcher/" id="com.canonical.Unity.Launcher" gettext-domain="unity">
140+ <key type="as" name="favorites">
141+ <default>[
142+ 'application://ubiquity.desktop',
143+ 'application://org.gnome.Nautilus.desktop',
144+ 'application://firefox.desktop',
145+ 'application://libreoffice-writer.desktop',
146+ 'application://libreoffice-calc.desktop',
147+ 'application://libreoffice-impress.desktop',
148+ 'application://org.gnome.Software.desktop',
149+ 'application://ubuntu-amazon-default.desktop',
150+ 'application://unity-control-center.desktop',
151+ 'unity://running-apps',
152+ 'unity://expo-icon',
153+ 'unity://devices'
154+ ]</default>
155+ <summary>List of items that should be shown by default in the launcher</summary>
156+ <description>These items can be: application://desktop-id.desktop, device://uiid and unity://special-id (including: unity://running-apps (icons of running applications) unity://devices (icons of attached devices), unity://expo-icon (icon of the workspace switcher) and unity://desktop-icon (the show-desktop icon)); the order of this list determines the launcher item's position.</description>
157+ </key>
158+ <key type="as" name="items">
159+ <default>[
160+ 'application:///dialer-app.desktop',
161+ 'application:///messaging-app.desktop',
162+ 'application:///address-book-app.desktop',
163+ 'application:///ubuntu-system-settings.desktop',
164+ 'appid://openstore.openstore-team/openstore/current-user-version',
165+ 'appid://com.ubuntu.camera/camera/current-user-version',
166+ 'appid://com.ubuntu.gallery/gallery/current-user-version',
167+ 'application:///morph-browser.desktop'
168+ ]</default>
169+ <summary>List of items that should be shown by default in the launcher</summary>
170+ <description>These items can be: application:///desktop-id.desktop or appid://package/app/current-user-version.</description>
171+ </key>
172+ <key type="s" name="favorite-migration">
173+ <default>''</default>
174+ <summary>Version of last migration done</summary>
175+ <description>This is a detection key for the favorite migration script to know whether the needed migration is done or not.</description>
176+ </key>
177+ <key enum="launcher-position-enum" name="launcher-position">
178+ <default>"Left"</default>
179+ <summary>The position of launcher.</summary>
180+ <description>The position of launcher.</description>
181+ </key>
182+ </schema>
183+ <schema path="/com/canonical/unity/devices/" id="com.canonical.Unity.Devices" gettext-domain="unity">
184+ <key type="as" name="blacklist">
185+ <default>[]</default>
186+ <summary>List of device uuid blacklist from the launcher.</summary>
187+ <description>These devices are not shown in the launcher by default.</description>
188+ </key>
189+ </schema>
190+ <schema path="/com/canonical/unity/dash/" id="com.canonical.Unity.Dash" gettext-domain="unity">
191+ <key type="as" name="scopes">
192+ <default>[ 'home.scope', 'applications.scope', 'files.scope', 'video.scope', 'music.scope', 'photos.scope', 'social.scope' ]</default>
193+ <summary>List of scope ids specifying which scopes should be created and the order to display them in.</summary>
194+ <description>The scopes listed in the scope bar will be ordered according to this list.</description>
195+ </key>
196+ <key type="as" name="favorite-scopes">
197+ <default>[ 'scope://clickscope', 'scope://musicaggregator', 'scope://videoaggregator' ]</default>
198+ <summary>List of scope queries specifying what should be displayed in the dash.</summary>
199+ <description>List of favorite scopes displayed in the dash.</description>
200+ </key>
201+ </schema>
202+ <schema path="/com/canonical/unity/decorations/" id="com.canonical.Unity.Decorations" gettext-domain="unity">
203+ <key type="u" name="grab-wait">
204+ <default>175</default>
205+ <range min="0" max="1000"/>
206+ <summary>Milliseconds to wait before considering a mouse pressure a grab</summary>
207+ <description>The number of ms to wait before starting the window movement (and then
208+ showing the proper mouse cursor, and grabbing the window)</description>
209+ </key>
210+ </schema>
211+ <schema path="/com/canonical/unity/integrated-menus/" id="com.canonical.Unity.IntegratedMenus" gettext-domain="unity">
212+ <key type="u" name="click-movement-threshold">
213+ <default>15</default>
214+ <range min="0" max="30"/>
215+ <summary>Number of pixels to ignore on mouse pressure</summary>
216+ <description>This value define how many pixels the user can move the mouse
217+ when holding the mouse button, before we consider his action a movement
218+ (to grab the window).</description>
219+ </key>
220+ <key type="u" name="double-click-wait">
221+ <default>0</default>
222+ <range min="0" max="300"/>
223+ <summary>Milliseconds to wait before activating a menu after mouse release</summary>
224+ <description>The number of ms to wait after a mouse button release event before considering
225+ it a click. When this value is greater than 0, then it's possible to maximize
226+ a window by double-clicking on its menus if the second click happens before the
227+ specified value of ms is elapsed</description>
228+ </key>
229+ <key type="b" name="unfocused-windows-popup">
230+ <default>true</default>
231+ <summary>Whether to pop-up a menu when clicking over unfocused windows entries</summary>
232+ <description>By disabling this setting you can make unity to only focus a window
233+ when clicking over unfocused menu entries</description>
234+ </key>
235+ </schema>
236+ <schema path="/com/canonical/unity/gestures/" id="com.canonical.Unity.Gestures" gettext-domain="unity">
237+ <key type="b" name="launcher-drag">
238+ <default>true</default>
239+ <summary>Multi-touch gesture to reveal the launcher.</summary>
240+ <description>When this is enabled, a 4 finger swipe from left to right will reveal launcher,
241+ provided that the launcher is set to auto-hide.</description>
242+ </key>
243+ <key type="b" name="dash-tap">
244+ <default>true</default>
245+ <summary>Multi-touch gesture to open the dash.</summary>
246+ <description>When this is enabled, a 4 finger tap will open the dash.</description>
247+ </key>
248+ <key type="b" name="windows-drag-pinch">
249+ <default>true</default>
250+ <summary>Multi-touch gestures to manage the windows.</summary>
251+ <description>When this is enabled, 3 finger gestures such as drag, and pinch, will
252+ help manage the windows.</description>
253+ </key>
254+ </schema>
255+</schemalist>
data/com.canonical.Unity8.gschema.xmlnew file+75
@@ -0,0 +1,75 @@
1+<schemalist>
2+ <enum id="usage-mode-enum">
3+ <value nick="Staged" value="0" />
4+ <value nick="Windowed" value="1" />
5+ <value nick="Automatic" value="2" />
6+ </enum>
7+
8+ <schema path="/com/canonical/unity8/" id="com.canonical.Unity8" gettext-domain="unity8">
9+ <key enum="usage-mode-enum" name="usage-mode">
10+ <default>"Automatic"</default>
11+ <summary>The usage mode.</summary>
12+ <description>The usage mode chosen will affect the Window Management behaviour.</description>
13+ </key>
14+ <key type="u" name="edge-barrier-sensitivity">
15+ <default>50</default>
16+ <range min="1" max="100"/>
17+ <summary>Sensitivity of screen edge barriers for the mouse pointer.</summary>
18+ <description>Some UI actions like revealing the launcher or the applications spread are triggered by pushing the mouse pointer against a screen edge. This key defines how much you have to push in order to trigger the associated action.</description>
19+ </key>
20+ <key type="u" name="edge-barrier-min-push">
21+ <default>2</default>
22+ <summary>Minimum push needed to overcome edge barrier</summary>
23+ <description>How much you have to push (in grid units)the mouse against an edge barrier when sensibility is 100.</description>
24+ </key>
25+ <key type="u" name="edge-barrier-max-push">
26+ <default>120</default>
27+ <summary>Maximum push needed to overcome edge barrier</summary>
28+ <description>How much you have to push (in grid units) the mouse against an edge barrier when sensibility is 1.</description>
29+ </key>
30+ <key type="u" name="edge-drag-width">
31+ <default>2</default>
32+ <summary>The width of the edge drag areas</summary>
33+ <description>How big (in grid units) the edge-drag sensitive area should be.</description>
34+ </key>
35+ <key type="b" name="autohide-launcher">
36+ <default>false</default>
37+ <summary>Autohide the launcher</summary>
38+ <description>This will only be applied in windowed mode. In staged mode, the launcher will always hide.</description>
39+ </key>
40+ <key type="u" name="launcher-width">
41+ <default>8</default>
42+ <range min="6" max="12"/>
43+ <summary>Width of the launcher in grid units.</summary>
44+ <description>Changes the width of the launcher in all usage modes.</description>
45+ </key>
46+ <key type="b" name="enable-indicator-menu">
47+ <default>true</default>
48+ <summary>Enable or disable the indicator pull down menus</summary>
49+ <description>Toggle the availability of the indicator pull down menus</description>
50+ </key>
51+ <key type="s" name="appstore-uri">
52+ <default>'appid://openstore.openstore-team/openstore/current-user-version'</default>
53+ <summary>The uri to the app store</summary>
54+ <description>This will be used whenever the user triggers an action to open the app store.</description>
55+ </key>
56+ <key type="b" name="always-show-osk">
57+ <default>false</default>
58+ <summary>Force showing/hiding the OSK</summary>
59+ <description>Toggle the visibility of the On Screen Keyboard unconditionally</description>
60+ </key>
61+ <key type="b" name="osk-switch-visible">
62+ <default>false</default>
63+ <summary>Whether the OSK switch should be visible</summary>
64+ <description>Toggle the visibility of the OSK switch</description>
65+ </key>
66+ </schema>
67+
68+ <schema path="/com/canonical/unity8/greeter/" id="com.canonical.Unity8.Greeter" gettext-domain="unity8">
69+ <key type="x" name="locked-out-time">
70+ <default>0</default>
71+ <summary>When the greeter was last locked.</summary>
72+ <description>If too many unsuccessful login attempts have been made in a row, the greeter locks you out for a while. This unix timestamp indicates when you were locked out, so unity8 knows when to let you back in.</description>
73+ </key>
74+ </schema>
75+</schemalist>
data/devices.confnew file+30
@@ -0,0 +1,30 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+# [devicename]
24+# SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+# PrimaryOrientation=PrimaryOrienation
26+# PortraitOrientation=Portrait
27+# InvertedPortraitOrientation=InvertedPortrait
28+# LandscapeOrientation=Landscape
29+# InvertedLandscapeOrientation=InvertedLandscape
30+# Category=phone
data/indicators-client.desktop.innew file+9
@@ -0,0 +1,9 @@
1+[Desktop Entry]
2+Type=Application
3+Name=Indicators Client
4+Comment=Application for testing the Indicators system
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/indicators-client
6+Terminal=false
7+Icon=
8+NoDisplay=false
9+X-Ubuntu-Touch=true
data/test.sensorsnew file+12
@@ -0,0 +1,12 @@
1+create light 0 10 1
2+create accel 0 1000 0.1
3+create proximity
4+
5+200 proximity near
6+500 light 5
7+# simulate crash on the ground
8+500 accel 0.2 0.1 10
9+100 accel 0.2 0.2 1000
10+20 accel 0 0 0
11+10 proximity far
12+10 light 10
data/unity-mock-indicator-service.confnew file+7
@@ -0,0 +1,7 @@
1+description "Unity Shell v8 Mock Indicator"
2+author "Nick Dedekind <nick.dedekind@canonical.com>"
3+
4+respawn
5+respawn limit 2 10
6+
7+exec ${BINARY:-unity-mock-indicator-service} $ARGS
data/unity-scope-tool.desktop.indeleted−8
@@ -1,8 +0,0 @@
1−[Desktop Entry]
2−Type=Application
3−Name=Unity Scope Tool
4−Comment=Developer tool for Unity scopes.
5−Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity-scope-tool
6−Terminal=false
7−Icon=unity-scope-tool
8−X-Ubuntu-Touch=true
data/unity8-filewatcher.confnew file+13
@@ -0,0 +1,13 @@
1+description "File system watcher for unity8"
2+author "Michael Zanetti <michael.zanetti@canonical.com>"
3+
4+# This method of updating the launcher will not work in our new snappy world,
5+# neither for snaps installed in the system nor if we are running inside a snap.
6+# Plus it hardcodes the phablet user... To be replaced once bug 1630997 is
7+# fixed in ubuntu-app-launch.
8+
9+# Workaround for bug 1360208. ~ and * in one expression doesn't work currently
10+start on (file FILE=/home/phablet/.local/share/applications/*.desktop) or (file FILE=/usr/share/applications/*.desktop)
11+
12+exec dbus-send --type=method_call --dest=com.canonical.Unity.Launcher /com/canonical/Unity/Launcher com.canonical.Unity.Launcher.Refresh
13+
data/unity8-greeter-init.confnew file+12
@@ -0,0 +1,12 @@
1+description "Unity 8 Greeter initialization"
2+author "Michael Terry <mterry@ubuntu.com>"
3+
4+start on unity8-greeter-started
5+task
6+emits indicator-services-start
7+
8+script
9+ start --no-wait ofono-setup || true
10+ initctl emit --no-wait indicator-services-start || true
11+ start --no-wait maliit-server || true
12+end script
data/unity8-greeter-logrotate.confnew file+14
@@ -0,0 +1,14 @@
1+description "Unity 8 Greeter logrotate support"
2+author "Michael Terry <mterry@ubuntu.com>"
3+
4+start on unity8-greeter-started
5+task
6+
7+script
8+ # logrotate normally starts on startup and then sleeps for 60 seconds.
9+ # Otherwise, it skips that sleep. Since we can't emit the startup signal
10+ # for a unity8-greeter session, we have to trigger logrotate manually.
11+ # So we do the sleep ourselves in its stead.
12+ sleep 60
13+ initctl emit :sys:rotate-logs
14+end script
data/unity8-greeter-wrappernew file+109
@@ -0,0 +1,109 @@
1+#!/bin/sh
2+# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 4 -*-
3+#
4+# Copyright (C) 2011,2013,2016 Canonical Ltd
5+#
6+# This program is free software: you can redistribute it and/or modify it under
7+# the terms of the GNU General Public License as published by the Free Software
8+# Foundation, version 3 of the License.
9+#
10+# See http://www.gnu.org/copyleft/gpl.html the full text of the license.
11+
12+# This wrapper merely ensures that init and friends live only as long as this
13+# script does. Otherwise, it's very easy for some processes to not notice that
14+# the session died. We could try to do this in-process, but we want to do this
15+# cleanup even if the greeter aborts.
16+
17+trap cleanup TERM EXIT
18+
19+cleanup()
20+{
21+ trap - TERM EXIT
22+ # Kill upstart and indicators
23+ if [ -n "$INIT_PID" ]; then
24+ kill "$INIT_PID"
25+ fi
26+ if [ -n "$CMD_PID" ]; then
27+ kill "$CMD_PID"
28+ fi
29+ exit 0
30+}
31+
32+set_greeter_var()
33+{
34+ export "$1=$2"
35+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "{'$1': '$2'}"
36+ if [ -n "$INIT_PID" ]; then
37+ initctl set-env --global "$1=$2"
38+ fi
39+}
40+
41+SUB_SOCKET=$XDG_RUNTIME_DIR/mir_socket
42+rm -f $SUB_SOCKET # clear socket in case we were hard shut down
43+
44+echo "DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS}" >"$XDG_RUNTIME_DIR/dbus-session"
45+
46+# If touch session script (which sets up grid units and mir variables) is available, use it
47+TOUCH_WRAPPER=
48+if which ubuntu-touch-session >/dev/null; then
49+ TOUCH_WRAPPER=ubuntu-touch-session
50+fi
51+
52+# Advertise as a unity8 session, so that indicator-network will start.
53+export XDG_SESSION_DESKTOP=unity8
54+export DESKTOP_SESSION=$XDG_SESSION_DESKTOP
55+
56+set_greeter_var QT_IM_MODULE maliitphablet
57+set_greeter_var QT_QPA_PLATFORM ubuntumirclient
58+
59+# We disable ofono using pulse. It causes problems with racing with the user's
60+# pulse. We need to come up with a better long-term fix for this, because we
61+# eventually need the greeter to play ringtones for users that aren't logged in.
62+set_greeter_var PA_DISABLED 1
63+
64+# Normal unity8 sessions are entirely driven by Upstart. But greeters
65+# are special. They need access to the file descriptors that lightdm
66+# creates for them and don't want to start all the services that a normal
67+# session would. So it's inconvenient to live within an upstart session.
68+# But... we still want to use Upstart for some services. So launch here.
69+MIR_SOCKET=$SUB_SOCKET $TOUCH_WRAPPER upstart --user --no-startup-event &
70+INIT_PID=$!
71+while [ ! -e "$XDG_RUNTIME_DIR/upstart/sessions/$INIT_PID.session" ]; do sleep 0.1; done
72+. "$XDG_RUNTIME_DIR/upstart/sessions/$INIT_PID.session"
73+export UPSTART_SESSION
74+
75+# Connect upstart to system, but do first command in a loop to avoid any
76+# race condition between the session file above being written and upstart being
77+# ready to handle requests.
78+while ! initctl notify-dbus-address "$DBUS_SESSION_BUS_ADDRESS"; do sleep 0.1; done
79+initctl start notify-cgmanager
80+
81+# Start any pre-greeter tasks if needed (like wizard)
82+initctl emit unity8-greeter-starting
83+
84+# Define language here for phone if available. When phone user switches their
85+# language, they expect that to affect the greeter too. But the user doesn't
86+# have permission to switch system language, only their own. So we notice if
87+# the phablet user exists and use their language if so. TODO: talk to design
88+# about whether we should switch language on fly as users are selected (this
89+# is very hard to do technically).
90+#
91+# Do this after unity8-greeter-starting, in case a customization upstart job
92+# changes language.
93+if [ "$(id -u phablet 2>/dev/null)" = "32011" ]; then
94+ USER_LANG=$(gdbus call --system --dest org.freedesktop.Accounts --object-path /org/freedesktop/Accounts/User32011 --method org.freedesktop.DBus.Properties.Get org.freedesktop.Accounts.User Language | cut -d\' -f2)
95+ if [ -n "$USER_LANG" ]; then
96+ set_greeter_var LANGUAGE "$USER_LANG"
97+ fi
98+ USER_LOCALE=$(gdbus call --system --dest org.freedesktop.Accounts --object-path /org/freedesktop/Accounts/User32011 --method org.freedesktop.DBus.Properties.Get org.freedesktop.Accounts.User FormatsLocale | cut -d\' -f2)
99+ if [ -n "$USER_LOCALE" ]; then
100+ set_greeter_var LANG "$USER_LOCALE"
101+ set_greeter_var LC_ALL "$USER_LOCALE"
102+ fi
103+fi
104+
105+# And finally actually start the greeter
106+exec env MIR_SERVER_FILE=$SUB_SOCKET $TOUCH_WRAPPER $@ &
107+CMD_PID=$!
108+wait $CMD_PID
109+CMD_PID=
data/unity8-greeter.desktop.innew file+7
@@ -0,0 +1,7 @@
1+[Desktop Entry]
2+Type=Application
3+Name=Unity 8 Greeter
4+Comment=The converged Unity shell's Greeter
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8-greeter-wrapper @CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8 --mode=greeter
6+X-LightDM-Session-Type=mir
7+X-Ubuntu-Touch=true
data/unity8-greeter.pklanew file+44
@@ -0,0 +1,44 @@
1+# DO NOT EDIT THIS FILE, it will be overwritten on update
2+# Place your local configurations under /etc/polkit-1/localauthority/
3+
4+[Disable Controlling of Network Devices]
5+Identity=unix-user:lightdm
6+Action=org.freedesktop.NetworkManager.enable-disable-network;org.freedesktop.NetworkManager.enable-disable-wifi;org.freedesktop.NetworkManager.enable-disable-wwan;org.freedesktop.NetworkManager.enable-disable-wimax;
7+ResultActive=no
8+ResultInactive=no
9+ResultsAny=no
10+
11+[Disable Sleep and Wake]
12+Identity=unix-user:lightdm
13+Action=org.freedesktop.NetworkManager.sleep-wake
14+ResultActive=no
15+ResultInactive=no
16+ResultsAny=no
17+
18+[Disable WiFi Sharing]
19+Identity=unix-user:lightdm
20+Action=org.freedesktop.NetworkManager.wifi.share.protected;org.freedesktop.NetworkManager.wifi.share.open
21+ResultActive=no
22+ResultInactive=no
23+ResultsAny=no
24+
25+[Disable Settings Modifications]
26+Identity=unix-user:lightdm
27+Action=org.freedesktop.NetworkManager.settings.modify.own;org.freedesktop.NetworkManager.settings.modify.system;org.freedesktop.NetworkManager.settings.modify.hostname
28+ResultActive=no
29+ResultInactive=no
30+ResultsAny=no
31+
32+[Disable User Connections]
33+Identity=unix-user:lightdm
34+Action=org.freedesktop.NetworkManager.use-user-connections
35+ResultActive=no
36+ResultInactive=no
37+ResultsAny=no
38+
39+[Enable Controlling of Network Connections]
40+Identity=unix-user:lightdm
41+Action=org.freedesktop.NetworkManager.network-control
42+ResultActive=yes
43+ResultInactive=no
44+ResultsAny=no
data/unity8.conf+84−18
@@ -1,33 +1,99 @@
11description "Unity Shell v8"
22author "Ricardo Mendoza <ricmm@ubuntu.com>"
33
4−start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
4+emits indicator-services-start
5+emits indicator-services-end
6+
7+start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=unity8-mir) or (xsession SESSION=unity8)) and started dbus
58stop on desktop-end
69
7−kill timeout 30
10+kill timeout 120
11+
12+#
13+# Ensure the shell always gets unthrottled touch events, so that applications
14+# who want full speed low-latency input can get it (LP: #1497105) and so that
15+# apps can use QML touch compression safely (the QML touch compression
16+# algorithm does not support nesting well - LP: #1486341, LP: #1556763 - so
17+# must be fed by the raw input event stream from Unity8).
18+#
19+env QML_NO_TOUCH_COMPRESSION=1
820
921respawn
1022expect stop
1123
24+# FIXME Create an autopilot test that makes sure start+stop and restart
25+# work fine at least 2 times
26+
1227pre-start script
13− if [ -n "$MIR_SOCKET" ]; then
14− if [ -z "$UNITY_MIR_SOCKET" ]; then
15− # Save original value of MIR_SOCKET in case we are restarted,
16− # as we modify the variable for future jobs, including ourself.
17− UNITY_MIR_SOCKET=$MIR_SOCKET
18− initctl set-env --global UNITY_MIR_SOCKET=$UNITY_MIR_SOCKET
19− fi
20−
21− # Point unity8 at unity-system-compositor
28+ # Tell unity-mir to raise SIGSTOP after we start
29+ initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
30+
31+ # Save original value of MIR_SOCKET so that we can restore it when stopped,
32+ # as we modify the variable for future jobs, including ourself.
33+ initctl set-env UNITY_MIR_SOCKET=$MIR_SOCKET
34+
35+ # Decide where we are going to put our own socket file
36+ if [ -n "$SNAP" ]; then
37+ # In snappy, we want to hard code our path because our apparmor profile
38+ # only lets us put the socket in one place. And consumers expect it
39+ # there.
40+ MIR_SERVER_FILE=/run/user/$(id -u)/mir_socket
41+ else
2242 MIR_SERVER_FILE=$XDG_RUNTIME_DIR/mir_socket
23− initctl set-env MIR_SERVER_FILE=$MIR_SERVER_FILE
24− initctl set-env MIR_SERVER_HOST_SOCKET=$UNITY_MIR_SOCKET
43+ fi
44+ initctl set-env MIR_SERVER_FILE=$MIR_SERVER_FILE
45+
46+ # Point all future jobs in this session to our Mir socket instead of
47+ # unity-system-compositor's socket.
48+ initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
49+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
50+
51+ # Remove the normal and trusted sockets if still there
52+ if [ -S "$MIR_SERVER_FILE" ]; then
53+ rm "$MIR_SERVER_FILE"
54+ fi
55+
56+ if [ -S "${MIR_SERVER_FILE}_trusted" ]; then
57+ rm "${MIR_SERVER_FILE}_trusted"
58+ fi
59+
60+ initctl set-env --global MIR_SERVER_PROMPT_FILE=1
61+
62+ # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
63+ # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
64+ # the lag seen in the indicator panel pull-down (LP: #1488327) and also
65+ # reduces lag seen in apps:
66+ initctl set-env --global QML_NO_TOUCH_COMPRESSION=1
67+
68+ # Workaround for text not rendering correctly
69+ initctl set-env --global QT_ENABLE_GLYPH_CACHE_WORKAROUND=1
70+
71+ if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
72+ # On Ubuntu Touch, we currently use a trick where we auto-login the
73+ # user without a LightDM greeter at all. In this case, we want to
74+ # start with the lockscreen visible. Once we switch to using a
75+ # proper greeter for the first login, we can remove this code path.
76+ initctl set-env MODE=full-greeter
77+ else
78+ initctl set-env MODE=full-shell
79+ fi
2580
26− # Point all future jobs in this session to our Mir socket instead of
27− # unity-system-compositor's socket.
28− initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
29− gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
81+ # HACK! WORKAROUND FOR HALIUM MISSING UBUNTU_PLATFORM_API
82+ if [ ! -f /system/lib/libubuntu_application_api.so ]; then
83+ initctl set-env --global UBUNTU_PLATFORM_API_BACKEND=test.so.3
84+ initctl set-env --global UBUNTU_PLATFORM_API_SENSOR_TEST=/etc/ubuntusensors/test.sensors
3085 fi
3186end script
3287
33−exec ${BINARY:-unity8} $ARGS
88+exec ${BINARY:-unity8} --mode=$MODE $ARGS
89+
90+post-start script
91+ initctl emit --no-wait indicator-services-start
92+end script
93+
94+post-stop script
95+ initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
96+ initctl unset-env --global MIR_SERVER_PROMPT_FILE
97+ initctl emit application-end
98+ initctl emit indicator-services-end
99+end script
data/unity8.desktop.in+1−1
@@ -4,6 +4,6 @@ Name=Unity 8
44Comment=The converged Unity shell
55Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8
66Terminal=false
7−Icon=unity8
7+Icon=
88NoDisplay=true
99X-Ubuntu-Touch=true
debian/bileto_pre_release_hooknew file+5
@@ -0,0 +1,5 @@
1+#!/bin/sh
2+
3+set -eux
4+
5+sh ./po/update-unity-pot
debian/changelog+5097−16
@@ -1,3 +1,5079 @@
1+unity8 (8.20+ubports) xenial; urgency=medium
2+
3+ * Replace dependency on ubuntu-wallpapers with ubports-wallpapers
4+
5+ -- Dalton Durst <dalton@ubports.com> Fri, 5 Oct 2018 13:28:20 -0500
6+
7+unity8 (8.17+ubports3) xenial; urgency=medium
8+
9+ * Imported to UBports
10+
11+ -- UBports auto importer <infra@ubports.com> Mon, 31 Jul 2017 03:12:43 +0200
12+
13+unity8 (8.15+17.04.20170404.7-0ubuntu2) zesty; urgency=medium
14+
15+ [ Michael Zanetti ]
16+ * Make the default store uri point to gnome software center
17+
18+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Thu, 06 Apr 2017 10:49:29 +0300
19+
20+unity8 (8.15+17.04.20170404.7-0ubuntu1) zesty; urgency=medium
21+
22+ [ Albert Astals Cid ]
23+ * Tweak app drawer a bit (LP: #1667570)
24+
25+ [ Josh Arenson ]
26+ * Make some small changes to the greeter's session list
27+ * Handle a user in the greeter having never selected a session better
28+ (LP: #1673199)
29+
30+ [ Lukáš Tinkl ]
31+ * Do not occlude windows with an ongoing unmaximize transition (LP:
32+ #1666363)
33+ * Show and implement close buttons for child windows (LP: #1668053)
34+ * Sanitize the logic for pointer vs. touch menus, fixes hiding the
35+ window title in staged mode, when hovering the panel with mouse and
36+ no menus available.
37+
38+ [ Michael Zanetti ]
39+ * Don't hide the launcher on super press if it's locked visible (LP:
40+ #1675373)
41+ * fix searchfield selection in drawer (LP: #1677259)
42+ * make sure the stage has focus when going to spread (LP: #1672053,
43+ #1672673, #1676995)
44+ * don't autostart the dash app, but show its .desktop file instead
45+
46+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 04 Apr 2017 22:56:06 +0000
47+
48+unity8 (8.15+17.04.20170328.3-0ubuntu1) zesty; urgency=medium
49+
50+ [ Albert Astals Cid ]
51+ * mock: Remove empty property and move invokable
52+ * Tune quicklist item selection
53+ * Fix unminimizing going to the wrong position the second time (LP:
54+ #1671458)
55+ * Remove unclickable gaps on the menubar (LP: #1672722)
56+ * indicators client is a tool
57+ * Make sure we destroy the popups when the item goes away (LP:
58+ #1670338)
59+ * UnityApplicationMocks: Initialize m_state and m_requestedState
60+ * Don't use appInfo after checking it if is null
61+ * Initialize m_privateMode
62+ * Hook up aboutToShow for overflow menus (LP: #1676016)
63+
64+ [ Daniel d'Andrada ]
65+ * Give active focus to child surface qml items (LP: #1671072)
66+ * Satellite child windows (LP: #1673415)
67+ * Tell qtmir/miral about the available desktop area
68+
69+ [ Florian Boucault ]
70+ * WindowStateStorage: use a private QThreadPool to ensure that
71+ WindowStateStorage::saveValue always has a thread available to
72+ execute the query in. (LP: #1675424)
73+
74+ [ Lukáš Tinkl ]
75+ * Protect against loading invalid window geometry (LP: #1674262)
76+ * Remove usage of the deprecated (and non-functional) system-image-
77+ dbus service.
78+ * Implement Ctrl+Alt+T to launch the terminal app (LP: #1673500)
79+ * Only take normal and dialog surface types into account for launcher
80+ items (LP: #1669047)
81+ * Fix the shutdown dialog after recent refactoring in
82+ DBusUnitySessionService (LP: #1676426)
83+
84+ [ Michael Zanetti ]
85+ * drop the grey background behind icons in the drawer (LP: #1675688)
86+
87+ [ Pete Woods ]
88+ * Fix Unity/Platform::isPC, and add tests (LP: #1670657)
89+
90+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 28 Mar 2017 21:50:20 +0000
91+
92+unity8 (8.15+17.04.20170321-0ubuntu1) zesty; urgency=medium
93+
94+ [ Albert Astals Cid ]
95+ * Signal aboutToShow (LP: #1664578)
96+ * Support Panel top level items to be disabled (LP: #1670694)
97+ * Improve Launcher ←→ touch menu interaction (LP: #1667620, #1671069)
98+ * Fix real world submenus (e.g. kate) not getting their first item
99+ selected on open (LP: #1666859)
100+
101+ [ Daniel d'Andrada ]
102+ * Really disable the window decoration when in staged mode (LP:
103+ #1670361)
104+ * Don't let clients resize their surfaces while in staged
105+ (phone/tablet) mode (LP: #1670390)
106+ * TopLevelWindowModel: don't put hidden windows in the model (LP:
107+ #1665286)
108+
109+ [ Lukáš Tinkl ]
110+ * Reset always-show-osk gsetting on startup to default value (false
111+ atm)
112+ * Fix the restored-to position with Miral due to the state changes
113+ being async (LP: #1669819)
114+ * Add a cursor name fallback mapping "grabbing" -> "closedhand" for
115+ Breeze
116+ * Fix unsnapping a maximized window from the panel (LP: #1671721)
117+ * Disable altDrag feature outside windowed mode
118+
119+ [ Michael Terry ]
120+ * Don't lock the screen for guest users or users in the nopasswdlogin
121+ group. (LP: #1644237)
122+ * Support GNOME-style logout DBus API (making the Logout, Reboot, and
123+ Shutdown launcher commands work) (LP: #1673229)
124+
125+ [ Michael Zanetti ]
126+ * Add support for closing apps from the spread with "Q" (LP: #1670327)
127+ * hide "private" launcher quicklist entries when the greeter is locked
128+ (LP: #1667649)
129+ * add surface titles to launcher's quicklist (LP: #1661668)
130+ * properly reset the drawer state when cancelling a horizontal drag
131+ (LP: #1669536)
132+ * fix the focus moving correctly between launcher and drawer (LP:
133+ #1669880)
134+ * unfocus the drawer's textfield when it is moved (LP: #1669839)
135+
136+ [ Pete Woods ]
137+ * Fix up indicators-client after refactoring (LP: #1672797)
138+
139+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 21 Mar 2017 10:58:13 +0000
140+
141+unity8 (8.15+17.04.20170308-0ubuntu1) zesty; urgency=medium
142+
143+ [ Albert Astals Cid ]
144+ * Let's follow the keyboard order
145+ * Enable the license check (LP: #1590044)
146+ * Show a barebones error message if loading the QML doesn't work
147+ * Make sure cursor is back to normal when closing the window (LP:
148+ #1666158)
149+ * Fix small warning when sensitive is undefined
150+ * Remove unused member variable
151+ * Initialize m_msecsSinceReference
152+ * Add warning if registerService fails
153+ * Move menus Component {} out of the repeater
154+ * Add tool to browse menus of a running app
155+
156+ [ Daniel d'Andrada ]
157+ * Drag child windows with Alt+LeftMouseButton (LP: #1664947)
158+
159+ [ Gerry Boland ]
160+ * TopLevelWindowModel: connect to the OSK surface to know when it goes
161+ away so we can clean up after it. (LP: #1670681)
162+
163+ [ Josh Arenson ]
164+ * Initialize sessionMode to single when mock is reset (LP: #1667463)
165+
166+ [ Lukáš Tinkl ]
167+ * Make the menu string "Back" translatable
168+ * Let the OSK be driven by a switch in indicator-keyboard (LP:
169+ #1521518)
170+ * Disable the tutorial when there's no touchscreen (LP: #1661557)
171+ * Shell chrome fixes (LP: #1658117, #1665723, #1665724, #1669010)
172+ * Cancel the drag as soon as we're entering the spread (LP: #1668642)
173+ * Fix being unable to use window control buttons or menus with touch
174+ (LP: #1667604, #1668387)
175+
176+ [ Michael Terry ]
177+ * Set QT_IM_MODULE in the greeter so that the OSK can come up. (LP:
178+ #1670383)
179+ * Simplify our startup handling of Mir environment variables and set
180+ the right socket path in snappy.
181+
182+ [ Michael Zanetti ]
183+ * Cancel the home key activation if something else is pressed along
184+ with Meta (LP: #1670678)
185+ * close the drawer when something is launched from the launcher (LP:
186+ #1660367)
187+ * use a svg instead of a png for the Launcher's BFB (LP: #1668057)
188+ * change the default setting for the launcher autohiding (LP:
189+ #1670655)
190+
191+ [ Nick Dedekind ]
192+ * Split up Shell::test_spreadDisabled to ensure initial state for each
193+ test.
194+
195+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 08 Mar 2017 09:56:46 +0000
196+
197+unity8 (8.15+17.04.20170221-0ubuntu1) zesty; urgency=medium
198+
199+ * Handle ubuntu-app-launch API/ABI break
200+
201+ -- Ken VanDine <ken.vandine@canonical.com> Tue, 21 Feb 2017 13:23:23 +0000
202+
203+unity8 (8.15+17.04.20170216.1-0ubuntu1) zesty; urgency=medium
204+
205+ [ Albert Astals Cid ]
206+ * Make menus items close the menu when clicking on them (LP: #1657082,
207+ #1657399)
208+ * Clicking on an open menu closes it + test
209+ * Make the menus and submenus do not go outside the screen when
210+ popping out
211+ * Auto open submenus on hover (LP: #1657085)
212+ * Make the double click on a menu not be maximize the window below
213+ (LP: #1657079)
214+ * Make the MenuBar InverseMouseArea eat hover events when there's a
215+ popup open (LP: #1657763)
216+ * Make double click on the window decoration maximize (LP: #1657758)
217+ * Eat hover events when the launcher quicklist is open (LP: #1640776)
218+ * Remove TODO now that we require Qt > 5.5
219+ * Serialize two make targets that want to cp to the same target file
220+ (LP: #1660576)
221+ * Remove variable that is always false (LP: #1585910)
222+
223+ [ Daniel d'Andrada ]
224+ * Consolidate launcher API checks
225+
226+ [ Lukáš Tinkl ]
227+ * Fixes for activating minimized windows and restoring fullscreen ones
228+ (LP: #1656808, #1658937, #1658938)
229+
230+ [ Michael Zanetti ]
231+ * move right edge push area up some levels so it can be used on top of
232+ the indicators
233+ * fix minimizing/restoring transitions (LP: #1658936)
234+ * fix some glitches with spread positioning
235+ * fix jumpy animation when closing an item from the spread
236+ * Show the wallpaper while the focused app is moving in staged mode
237+ (LP: #1648251)
238+ * Update the tutorial to mention the app drawer instead of the dash on
239+ long left edge swipe (LP: #1658932)
240+ * prevent hiding the launcher when the mouse hover event is eaten by
241+ the EdgePushArea (LP: #1657045)
242+ * properly invalidate the whole model (LP: #1658190)
243+ * stabilize OrientedShell test (LP: #1658994)
244+
245+ [ Nick Dedekind ]
246+ * Added overflow support to application menus.
247+ * Updated menu colors
248+
249+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 16 Feb 2017 13:49:18 +0000
250+
251+unity8 (8.15+17.04.20170206-0ubuntu1) zesty; urgency=medium
252+
253+ [ Daniel d'Andrada ]
254+ * Initial support for child windows (menus, dialogs, tooltips) (LP:
255+ #1543467, #1591384, #1656727)
256+
257+ -- Albert Astals Cid <albert.astals@canonical.com> Mon, 06 Feb 2017 09:12:23 +0000
258+
259+unity8 (8.15+17.04.20170131.1-0ubuntu1) zesty; urgency=medium
260+
261+ [ Rodney Dawes ]
262+ * Remove dependencies on clickscope.
263+
264+ -- Albert Astals Cid <albert.astals@canonical.com> Tue, 31 Jan 2017 14:40:33 +0000
265+
266+unity8 (8.15+17.04.20170124-0ubuntu1) zesty; urgency=medium
267+
268+ [ Albert Astals Cid ]
269+ * Limit tab-focus travelling on dialogs with a fence
270+ * Restore focus to where it was when our ShellDialogs get unloaded
271+ * Update current session after changing the user
272+ * Add keyboard navigation for Indicators
273+ * a window -> the current window
274+ * There's no spreadDelegate_ anymore
275+
276+ [ Daniel d'Andrada ]
277+ * Simplify DecoratedWindow
278+ * Remove unnecessary warning message
279+
280+ [ Josh Arenson ]
281+ * Add a test for the session chooser icon in the greeter's sessions
282+ list
283+
284+ [ Lukáš Tinkl ]
285+ * Fix keymap not being applied on the shell itself (LP: #1626435)
286+ * Shell dialog improvements (kbd focus, mouse eater)
287+ * Start searching directly as you type, w/o having to first
288+ focus/click the search field.
289+ * Add a test for the real implementation of WindowStateStorage
290+ * Use a four finger gesture to open the drawer, much like in u7
291+
292+ [ Michael Terry ]
293+ * Simplify the lightdm mock to make future greeter improvements easier
294+ to test.
295+ * Add support for guest sessions in unity8-greeter.
296+ * Use a model for PAM prompts, supporting more possible interactions.
297+ * Fix grouping of autopkg output and allow optionally passing
298+ arguments to installed test scripts.
299+ * Add support for LightDM hints for manual logins and hiding normal
300+ users.
301+
302+ [ Michael Zanetti ]
303+ * hint the launcher to indicate a successful size change to the user
304+ (LP: #1646457)
305+ * Improvements for the appdrawer (LP: #1648173)
306+ * Adjust home key to still focus the dash instead of messing with the
307+ drawer
308+ * allow 4 finger simulation with mousetouchadaptor
309+
310+ [ Nick Dedekind ]
311+ * Added Alt+F10 shortcut to open app menus. (LP: #1656896)
312+ * Fixed menu layout width calculations. (LP: #1657050)
313+ * Skip Panel::test_drag_indicator_item_down_shows_menu
314+
315+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 24 Jan 2017 07:46:58 +0000
316+
317+unity8 (8.15+17.04.20170110.4-0ubuntu1) zesty; urgency=medium
318+
319+ [ Albert Astals Cid ]
320+ * Give focus to one of the buttons of the dialog
321+ * tst_WindowResizeArea: Use default values for mouseFlick speed and
322+ iterations (LP: #1651580)
323+ * Require Qt 5.6 & misc fixes
324+
325+ [ Daniel van Vugt ]
326+ * Deprecate usage of Mir's input resampling, instead opting for: (LP:
327+ #1497105, #1591328)
328+
329+ [ Josh Arenson ]
330+ * Allow the scopes list to automatically scroll when a scope is being
331+ dragged past the bounds of the screen. (LP: #1575319)
332+
333+ [ Lukáš Tinkl ]
334+ * Fix touch window controls being unreachable when the overlay is
335+ being displayed (LP: #1648167)
336+ * Fixup paths for window state storage in snappy environment
337+ * Add Unity.Platform mock for our tests (LP: #1655336)
338+
339+ [ Michael Zanetti ]
340+ * PreviewRatingInput: Use displayText instead of text to
341+ enable/disable the Send button (LP: #1595910)
342+ * Add a D-Bus interface to control some debug facilities on the fly
343+ * some launcher workarounds for the snapping
344+
345+ [ Michał Sawicz ]
346+ * Nuke leftover Platform in IndicatorsManager
347+
348+ [ Nick Dedekind ]
349+ * Added registry for application menus
350+
351+ [ Michael Terry, Nick Dedekind ]
352+ * Run the qmluitests.sh autopkg test against the installed package.
353+
354+ [ Michał Sawicz, Nick Dedekind ]
355+ * Application menus
356+
357+ [ Rodney Dawes ]
358+ * Remove the payments widget and dependency on libpay as no longer
359+ needed.
360+
361+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 10 Jan 2017 14:48:42 +0000
362+
363+unity8 (8.15+17.04.20161215-0ubuntu2~1) zesty; urgency=medium
364+
365+ * No change rebuild
366+
367+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Wed, 04 Jan 2017 10:54:32 +0200
368+
369+unity8 (8.15+17.04.20161215-0ubuntu1) zesty; urgency=medium
370+
371+ * Let the model deal with some window management decisions (LP:
372+ #1346633)
373+
374+ -- Daniel d'Andrada <daniel.dandrada@canonical.com> Thu, 15 Dec 2016 16:17:29 +0000
375+
376+unity8 (8.15+17.04.20161207.1-0ubuntu1) zesty; urgency=medium
377+
378+ [ Albert Astals Cid ]
379+ * Add the Wsuggest-override flag to gcc
380+ * Add support for compiler sanitizers via ECM
381+ * Use timeStep as delay time (LP: #1642919)
382+ * Bring back fix for 1517830 (LP: #1517830)
383+ * Fix compile warnings in mocks
384+ * Do not hide panel when launching an application if the mouse is on
385+ the panel (LP: #1591311)
386+
387+ [ Daniel d'Andrada ]
388+ * Fix "make tryApplicationWindow"
389+ * Take save/restore functions out of WindowResizeArea
390+
391+ [ Josh Arenson ]
392+ * Enable the greeter to remember which session the user last logged
393+ into (LP: #1631365)
394+
395+ [ Lukáš Tinkl ]
396+ * Fix the Super key not invoking the dash scope home (LP: #1607427)
397+
398+ [ Michael Zanetti ]
399+ * Add the ApplicationDrawer
400+ * tune right edge push (LP: #1646094)
401+ * improve close button visiblity when hovering with the mouse
402+ * Update virtual touchpad visuals and add a tutorial. (LP: #1585220)
403+
404+ [ Pete Woods ]
405+ * MenuItemFactory: Add subtitle support to SwitchItem widget
406+
407+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 07 Dec 2016 13:49:24 +0000
408+
409+unity8 (8.15+17.04.20161129-0ubuntu1) zesty; urgency=medium
410+
411+ [ Albert Astals Cid ]
412+ * Fix PreviewProgress implicitHeight (LP: #1641943)
413+ * Adapt to dummy notification being gone
414+ * Fix autopilot test_lock_screen tests
415+ * Autopilot: Add more applications to the list for wider screens
416+ * Fix autopilot DashHelperTestCase.test_search
417+ * Also install the Screens mock
418+ * Give default value to gu-px size
419+
420+ [ Andrea Azzarone ]
421+ * Set Mir.cursorName to "grabbing" on first mouse press on a window
422+ decoration. Don't wait for press+motion. (LP: #1618078)
423+ * Do not show a divider between each quicklist entry but just between
424+ each section, similar to how unity7 does. (LP: #1637478)
425+
426+ [ Andrea Cimitan ]
427+ * Fix white text (LP: #1644468)
428+ * Make MascotLoader in CardCreator flat
429+ * Make the remaining UbuntuShape flat
430+ * added dropshadow from panel indicators to dash page header extra
431+ panel, so there is right shadow when the extra panel is narrow
432+ * Look up for expandable template dash category flag
433+
434+ [ Brian Douglass ]
435+ * Added a setting to enable/disable the indicator dropdown menu.
436+
437+ [ Daniel d'Andrada ]
438+ * There's no need for WindowDecoration to access the appDelegate
439+
440+ [ Lukáš Tinkl ]
441+ * Enable brightness (laptop backlight) handling on desktop/laptop PCs
442+ (LP: #1595947)
443+
444+ [ Michael Zanetti ]
445+ * disable spread interaction while locked (LP: #1641578)
446+
447+ [ Andrea Azzarone, Michał Sawicz ]
448+ * Implement launcher tooltips.
449+
450+ [ Olivier Tilloy ]
451+ * Remove dependency on transitional package. (LP: #1583079)
452+
453+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 29 Nov 2016 09:43:33 +0000
454+
455+unity8 (8.15+17.04.20161116.1-0ubuntu1) zesty; urgency=medium
456+
457+ [ Marco Trevisan (Treviño) ]
458+ * MenuItemFactory: bind calendar backend properties to calendarMenu item
459+
460+ Adds support for showing the calendar at the requested date, marking days
461+ with events properly and toggling the visibility of the week number.
462+
463+ * MenuItemFactory: use Menus.RadioMenu and Menus.ButtonMenu
464+
465+ * Bump version as USC breaks with unity8 << 8.14
466+
467+ [ Albert Astals Cid ]
468+ * [Hopefully] Fix infinite loop in some of the GSV tests (LP:
469+ #1599301)
470+
471+ [ Marco Trevisan (Treviño) ]
472+ * testLauncher: use tryCompare to check launcher contentY
473+
474+ [ Michael Zanetti ]
475+ * Stabilize OrientedShell tests
476+
477+ -- Marco Trevisan (Treviño) <mail@3v1n0.net> Wed, 16 Nov 2016 10:44:59 +0000
478+
479+unity8 (8.14+17.04.20161109-0ubuntu1) zesty; urgency=medium
480+
481+ [ Albert Astals Cid ]
482+ * Make more CardTool properties readonly
483+ * Make the > in Dash Section Header be after text (LP: #1508905)
484+ * Rework Dash Preview column margins
485+ * Improve LVWPH <-> GenericScopeView interaction (LP: #1508905,
486+ #1622423)
487+ * Make the PreviewButtons be of the width of the button and not half
488+ the total width
489+ * Fix first column of the preview table to be 25%
490+
491+ [ Andrea Cimitan ]
492+ * Remove background under header pagination dots, update dots assets,
493+ remove dash paper background, update bottom edge asset
494+ * Few styling changes for cards
495+ * various tweaks to fonts inside previews
496+ * More visual tweaks
497+
498+ [ Brian Douglass ]
499+ * Add a new setting to enable/disable the launcher
500+
501+ [ Lukáš Tinkl ]
502+ * Stabilize test_doubleTapToMaximizeWindow()
503+ * Enable loading the main Qt catalog which in turn allows for using
504+ RTL languages
505+ * Fix the pixelated notification icon by setting sourceSize (LP:
506+ #1637712)
507+
508+ [ Michael Terry ]
509+ * More path lookup fixes for running inside of a snap. (LP: #1629009)
510+
511+ [ Michael Zanetti ]
512+ * Added blur and darkening to wallpaper while in spread
513+ * Fixes in the spread after design review (LP: #1637502, #1638848)
514+ * More fixes to the unified stages code (LP: #1637205, #1637249,
515+ #1637258)
516+ * Delay alt tab for tiny bit in order to avoid flickering on quick alt-
517+ tabs
518+
519+ [ Tomás Tormo ]
520+ * Reload Infographics userdata when the day changes (LP: #1378814)
521+
522+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 09 Nov 2016 15:10:32 +0000
523+
524+unity8 (8.14+17.04.20161027-0ubuntu1) zesty; urgency=medium
525+
526+ * MenuItemFactory: activate item on calendar selection change (LP:
527+ #1541125)
528+
529+ -- Marco Trevisan (Treviño) <mail@3v1n0.net> Thu, 27 Oct 2016 12:32:25 +0000
530+
531+unity8 (8.14+17.04.20161024-0ubuntu1) zesty; urgency=medium
532+
533+ [ Albert Astals Cid ]
534+ * Make PreviewProgress be thicker again (LP: #1629382)
535+ * tst_PreviewZoomableImage: Wait for LazyImage transitions on init()
536+ (LP: #1630136)
537+
538+ [ Andrea Azzarone ]
539+ * Remove UbuntuShapeForItem and replace its use with the more standard
540+ Ubuntu.Components.UbuntuShape.
541+
542+ [ Lukáš Tinkl ]
543+ * Restore the double tap decoration to maximize feature (LP: #1627281)
544+ * Hide the cursor for fullscreen apps after 3 seconds of inactivity
545+ * Implement moving windows by Alt + left mouse button
546+
547+ [ Marco Trevisan (Treviño) ]
548+ * MenuItemFactory: use more features from SlotsLayout based settings
549+ components
550+
551+ [ Michael Terry ]
552+ * Grab launcher icon information from ubuntu-app-launch, not directly
553+ from desktop files.
554+ * Adjust root paths if we're running inside a snap. (LP: #1629009)
555+
556+ [ Michael Zanetti ]
557+ * Merge all Stages into one single codebase. Apply new spread visuals.
558+ (LP: #1489517, #1603914, #1635800)
559+
560+ -- Michael Zanetti <michael.zanetti@canonical.com> Mon, 24 Oct 2016 11:37:28 +0000
561+
562+unity8 (8.14+16.10.20160922-0ubuntu2) yakkety; urgency=medium
563+
564+ * debian/control:
565+ - Drop unity-scope-mediascanner2 to a Suggests rather than a Recommends,
566+ to ease our transition to main. It's already seeded directly in
567+ Touch, so this will only affect the Desktop variant of unity8.
568+
569+ -- Michael Terry <mterry@ubuntu.com> Mon, 03 Oct 2016 10:43:25 -0400
570+
571+unity8 (8.14+16.10.20160922-0ubuntu1) yakkety; urgency=medium
572+
573+ [ Albert Astals Cid ]
574+ * LVWPH: update clipItem height when list height changes (LP:
575+ #1606935)
576+ * Put the touchdown shape inside a loader
577+ * No need for the touchdown in the card for the cardtool
578+ * Add bottom gradient to the Show Less floating button
579+ * Remove artShapeSize from non cardtool cards
580+ * LVWPH: Fix case in which header was shown incorrectly
581+ * LVWPH: Fix items cut on top in the dash (or at least some instances
582+ of it)
583+ * Reduce calls to CardCreatorCache.getCardComponent while the
584+ component is being created (LP: #1615675)
585+ * Dash::test_cardIconStyle change compare into tryCompareFunction
586+ * Make PreviewActionsTest::test_comboButton more stable
587+ * Adapt onShiftedContentXChanged to work when the content changes very
588+ abruptly
589+ * Make tryGenericScopeView show the scope correctly
590+ * Make sure the spinner does not get too close to the title text (LP:
591+ #1597392)
592+ * Show "Pull to refresh" in white when overlaid in low luminance
593+ colors (LP: #1596849)
594+ * Make test_Shell non ultra slow again (LP: #1597366)
595+ * Improve findChild calls inside tryCompareFunction.
596+
597+ [ Andrea Cimitan ]
598+ * override some Qt Components definitions so we can have sane default
599+ values for flick speeds
600+ * Elide the label text inside recent searches panel (LP: #1611796)
601+ * Add a PreviewSingleton module to store some data for previews (LP:
602+ #1595235)
603+ * Use PreviewSingleton for PreviewRatingInput and PreviewCommentInput
604+ (LP: #1595235)
605+ * rework GenericScopeView PullToRefresh test
606+ * use mouseFlick instead touchFlick for manage_dash_move_current
607+ * add a couple of waiting tricks for a flaky dash test
608+
609+ [ Daniel d'Andrada ]
610+ * Set progress bar indeterminate when processing signal received. (LP:
611+ #1249349)
612+ * Implement cursor confinement (LP: #1590099)
613+
614+ [ Josh Arenson ]
615+ * Add a frontend to the sessions model and enable a session chooser in
616+ the greeter.
617+
618+ [ Lukáš Tinkl ]
619+ * Implement edge maximizing (aka window snapping) (LP: #1602628)
620+ * On the PC platform (as opposed to running on $devices), use the
621+ "mute" action instead of silent mode
622+ * Respect Fitt's law wrt the window control buttons in panel (LP:
623+ #1611959)
624+ * Fix 2 failing color-related tests
625+
626+ [ Marco Trevisan (Treviño) ]
627+ * Indicators, mocks: add fake indicators menuitem to populate mocks
628+ with different menu types
629+ * IndicatorsClient: use PageHeader and ListItemLayout's
630+
631+ [ Michael Terry ]
632+ * Support launching apps inside a unity8 session from the greeter and
633+ support emergency dialing inside the greeter.
634+ * Fix tryShell to actually show appropriate backgrounds for each mock
635+ user.
636+ * Add an indicator to the greeter when a user is logged in (only shown
637+ if we have more than one user)
638+ * Hide the greeter OSK if indicators are open and don't show the edge
639+ tutorial during an emergency call.
640+ * Switch from lockscreen PIN pad to a passcode entry box that uses the
641+ OSK.
642+ * Use the default system wallpaper instead of our custom one.
643+ * Update look of infographic a bit
644+ * Make infographic bubbles white even on the default wallpaper.
645+
646+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 22 Sep 2016 07:46:57 +0000
647+
648+unity8 (8.14+16.10.20160831.3-0ubuntu1) yakkety; urgency=medium
649+
650+ [ Daniel d'Andrada ]
651+ * Added implementation for MirSurfaceInterface::persistentId
652+
653+ -- Ken VanDine <ken.vandine@canonical.com> Wed, 31 Aug 2016 11:56:09 +0000
654+
655+unity8 (8.14+16.10.20160826-0ubuntu1) yakkety; urgency=medium
656+
657+ * Make sure we emit sounds when taking a screenshot even after media-
658+ hub (LP: #1544477)
659+
660+ -- Alfonso Sanchez-Beato <alfonso.sanchez-beato@canonical.com> Fri, 26 Aug 2016 08:14:14 +0000
661+
662+unity8 (8.14+16.10.20160819-0ubuntu1) yakkety; urgency=medium
663+
664+ [ Lukáš Tinkl ]
665+ * Reset topmostIsFullscreen to correctly rotate the shell when
666+ dismissing SIM PIN screen (LP: #1614070)
667+
668+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 19 Aug 2016 14:16:54 +0000
669+
670+unity8 (8.14+16.10.20160811.1-0ubuntu1) yakkety; urgency=medium
671+
672+ [ Albert Astals Cid ]
673+ * Take into account carousel selectedItemScaleFactor when setting card
674+ fixedArtShapeSize (LP: #1599238)
675+ * Remove unused LimitProxyModel
676+ * Do not calculate implicitHeight for Cards in a CardGrid
677+ * Small clazy fixes
678+
679+ [ Daniel d'Andrada ]
680+ * Remove stage property from Application
681+
682+ [ Larry Price ]
683+ * Allow libertine-scope to show empty search result hint unmodified.
684+ (LP: #1606693)
685+
686+ [ Lukáš Tinkl ]
687+ * Open the quicklist (context) menu also using the Menu key (LP:
688+ #1608265)
689+ * Fix incorrect SIM PIN dialog position when entering a wrong PIN (LP:
690+ #1596076)
691+ * Apply the correct keymap also on prompt surfaces (LP: #1610124)
692+ * Implement an optional system update feature during OOBE wizard (LP:
693+ #1580785)
694+ * Implement a page for choosing HW keyboard layout in OOBE wizard
695+
696+ [ Michael Zanetti ]
697+ * Clean up some build script legacy
698+ * Add a crossbuilder_post file to make crossbuilder restart unity8
699+ after deploying
700+ * fixes for the automatic switching between usage modes (LP: #1590944)
701+
702+ [ Omer Akram ]
703+ * Add object names for setup wizard
704+
705+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 11 Aug 2016 06:28:20 +0000
706+
707+unity8 (8.14+16.10.20160803-0ubuntu1) yakkety; urgency=medium
708+
709+ [ Albert Astals Cid ]
710+ * Fix DisabledScreenNotice::test_rotation
711+ * Make the delegate of DashNavigationList an async Loader
712+ * unity-scope-tool: Use parse instead of process
713+ * VerticalJournal improvements regarding model insertions and item
714+ height changes (LP: #1599754)
715+ * Add math.h includes for compilation in yakkety (LP: #1605502)
716+
717+ [ Andrea Cimitan ]
718+ * Unfocus the search text field in the dash page header when requested
719+ (LP: #1590820)
720+ * Use binding for filter popover contentWidth (LP: #1595116)
721+ * Add few sourceSize for Image we forgot (LP: #1595113)
722+ * Replace Flickable with an Item inside DashPageHeader for
723+ headerContainer (LP: #1599235)
724+
725+ [ Albert Astals Cid, Andrea Cimitan ]
726+ * Unbox the artshapeLoader
727+
728+ [ Daniel d'Andrada ]
729+ * Fix splashscreen orientation when app rotates own contents (LP:
730+ #1586050)
731+ * tst_PreviewIconActions: Make test name match filename
732+ * Cursor: make its size grid unit based (LP: #1604014)
733+ * TouchEventSequenceWrapper: item might get deleted when touch
734+ sequence is committed (LP: #1607686)
735+
736+ [ Lukáš Tinkl ]
737+ * Implement frontend support for running keyboard indicator
738+ * Provide window/surface close shortcuts across all the stages (LP:
739+ #1578392, #1606528)
740+ * Restart the location trust prompt service when exiting the wizard
741+ (LP: #1594430)
742+ * Implement clearing the search and closing the panel on pressing
743+ Escape key in the dash header
744+ * Fix log timestamps (LP: #1602196)
745+ * Don't display the mode switch warning dialog on tablets (LP:
746+ #1600290)
747+
748+ [ Michael Terry ]
749+ * Fix indicator profile bug that caused sound indicator to say Mute
750+ instead of Silent Mode. (LP: #1604205)
751+ * Fix lockscreen appearing right after unlocking a locked session on
752+ the desktop. (LP: #1604374)
753+
754+ [ Michał Sawicz ]
755+ * Add arm64 support, drop unnecessary B-D on web plugin
756+
757+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 03 Aug 2016 15:56:27 +0000
758+
759+unity8 (8.14+16.10.20160728-0ubuntu1) yakkety; urgency=medium
760+
761+ [ Zoltán Balogh ]
762+ * Bump the version to secure UITK compatibility
763+
764+ [ Albert Astals Cid ]
765+ * Pass the correct number of arguments to mapToItem (LP: #1606835)
766+
767+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 28 Jul 2016 08:17:13 +0000
768+
769+unity8 (8.13+16.10.20160714+fix1-0ubuntu2~1) yakkety; urgency=medium
770+
771+ * Rebuild against Qt 5.6.
772+ * Add https://code.launchpad.net/~aacid/unity8/floor_includes/+merge/300850
773+
774+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Fri, 22 Jul 2016 09:03:54 +0300
775+
776+unity8 (8.13+16.10.20160714-0ubuntu1) yakkety; urgency=medium
777+
778+ [ Daniel d'Andrada ]
779+ * Make use of MirSurface::inputBounds and drop UbuntuKeyboardInfo hack
780+
781+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 14 Jul 2016 07:09:29 +0000
782+
783+unity8 (8.12+16.10.20160711-0ubuntu1) yakkety; urgency=medium
784+
785+ [ Josh Arenson ]
786+ * Add a SessionsModel to lightdm to support the greeter's session
787+ chooser
788+ * Add unity8-greeter package which contains a basic, but usable
789+ LightDM greeter. (LP: #1324602)
790+
791+ [ Michael Terry ]
792+ * Make sure indicators and launcher hide when power button is pressed
793+ on greeter. (LP: #1595569)
794+ * Fix tablet greeter focus to be always-on, no longer hiding the OSK
795+ or forcing a mouse click to type a password. (LP: #1435923)
796+
797+ -- Michael Terry <michael.terry@canonical.com> Mon, 11 Jul 2016 17:24:20 +0000
798+
799+unity8 (8.12+16.10.20160707-0ubuntu1) yakkety; urgency=medium
800+
801+ [ Michael Zanetti ]
802+ * emit the correct role changed signal on count visible changed (LP:
803+ #1599925)
804+
805+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 07 Jul 2016 16:49:32 +0000
806+
807+unity8 (8.12+16.10.20160705-0ubuntu1) yakkety; urgency=medium
808+
809+ [ Michael Zanetti ]
810+ * don't displace windows if the OSK is on another screen (LP:
811+ #1598917)
812+
813+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 05 Jul 2016 10:00:57 +0000
814+
815+unity8 (8.12+16.10.20160627.5-0ubuntu1) yakkety; urgency=medium
816+
817+ [ Albert Astals Cid ]
818+ * Stop watching the old header item height once it's not our header
819+ anymore
820+ * LVWPH: cull the header item when not on view to save some painting
821+ * Adapt test to new mock behaviour
822+ * Don't let the mouse go outside the parentItem (LP: #1525350)
823+ * Use non deprecated package names
824+ * Mark system includes as such
825+ * Fix initialization order warning
826+ * Do not rely on deleteLater not crashing on null pointers
827+ * Add more headers of classes we use for automoc to be run
828+ * CardTool: Fix the fallback value to be a size and not an integer
829+ * CardTool: Include Ubuntu Components since we're using units.gu
830+ * Rework tst_PreviewRatingDisplayCreationRanges
831+
832+ [ Daniel d'Andrada ]
833+ * Cursor: Let AnimatedSprite run only on animated cursors and while
834+ the display is on (LP: #1588873, #1594358)
835+ * Fix missing screenshot when orientation changes while shell rotation
836+ ongoing (LP: #1587796)
837+
838+ [ Josh Arenson ]
839+ * Make PreviewRatingSingleDisplay visible again after editing a
840+ review. (LP: #1587097)
841+ * Correct errors in all png images to prevent libpng warnings.
842+
843+ [ Lukáš Tinkl ]
844+ * Fix some smaller issues with OOBE wizard password pages (LP:
845+ #1590467)
846+ * Prevent mouse wheel events from going through shell elements (LP:
847+ #1536268)
848+ * Do not let mouse and wheel events pass thru the titlebar (LP:
849+ #1588424)
850+ * Hide the maximize window button based on size restrictions (LP:
851+ #1541982)
852+
853+ [ Marco Trevisan (Treviño) ]
854+ * Unity8.conf: ensure MIR_SOCKET is set for future customers (such as
855+ the dash)
856+ * ClientIndicator: be more informative about loading failures for
857+ dynamically created objects
858+
859+ [ Michael Terry ]
860+ * Stop unity8 from getting in a "switch-to-greeter" loop when locking
861+ on a desktop. (LP: #1593718)
862+
863+ [ Michael Zanetti ]
864+ * set minimum window sizes on dash
865+ * displace application windows when the OSK would cover them
866+
867+ [ Nick Dedekind ]
868+ * Force dash to always stay in the main stage. (lp:#1592404) (LP:
869+ #1592404)
870+ * Save the last surface stage on stage drop. (LP: #1579003)
871+ * Default portrait only apps to the side stage. (LP: #1573153)
872+
873+ [ Albert Astals Cid, Andrea Cimitan, Michał Sawicz, Nick Dedekind ]
874+ * Added live video playback in dash previews
875+
876+ -- Michael Zanetti <michael.zanetti@canonical.com> Mon, 27 Jun 2016 18:48:59 +0000
877+
878+unity8 (8.12+16.10.20160620.3-0ubuntu1) yakkety; urgency=medium
879+
880+ [ Michael Terry, Michał Sawicz ]
881+ * Support unlocking via fingerprint, if one is registered.
882+
883+ -- Michael Terry <michael.terry@canonical.com> Mon, 20 Jun 2016 20:25:25 +0000
884+
885+unity8 (8.12+16.10.20160617-0ubuntu1) yakkety; urgency=medium
886+
887+ [ Michael Terry ]
888+ * Do not create Label/Icon if we don't need it
889+ * Fix Z-ordering of prompt surfaces (LP: #1586219)
890+ * Drop bottom edge tutorials completely and small fixes for other
891+ edges. (LP: #1565103)
892+ * Redo visuals for greeter prompt box. (LP: #1435923)
893+ * Make tutorial qmltests more robust. (LP: #1590810)
894+ * Stop showing an extra lockscreen in desktop unity8 sessions. (LP:
895+ #1582987)
896+
897+ [ Albert Astals Cid ]
898+ * Improve dash plugin mock
899+ * Stabilize PreviewExpandableTest::test_all_widgets_height
900+ * Workaround QTBUG-53460
901+ * Split artShape code for cardTool card and regular card
902+ * Simplify the code since fixedArtSize code is mandatory for regular
903+ cards
904+ * Desktop stage: Support rotatesWindowContents (LP: #1547481)
905+ * Turn if if else into if elseif else
906+ * Fix leaks in QInputDeviceManagerPrivate::addDevice
907+ * Do not call |= on uninitialized sigterm.sa_flags
908+ * initialize udevMonitor
909+ * Make notifier and notifierFd function local variables
910+ * Fix crash if a component that is not an Item is given to
911+ sectionDelegate
912+ * Tests: Do not use dynamic_cast if we're not going to test it anyway
913+ * Minor coverity fixes
914+ * Fix warning about anchors.fill in ProportionalShape (LP: #1590963)
915+ * Make wait in cleanup() wait for snapTo animation to have finished
916+
917+ [ Alexandros Frantzis ]
918+ * Improve the way notifications interact with power management (LP:
919+ #1570922)
920+
921+ [ Andrea Cimitan ]
922+ * Correctly refresh cardcreator cache on artshapestyle changes (LP:
923+ #1588335)
924+ * Same tweaks we have for click scope now for libertine
925+ * add a timer to pull to refresh to work on small windows (LP:
926+ #1589060)
927+
928+ [ Daniel d'Andrada ]
929+ * Clean up debug leftovers
930+ * Ensure mouse and window movement are pixel-aligned (LP: #1510382)
931+ * Fix SpreadDelegate rotation animations
932+ * No point in version-controlling files that are automatically
933+ generated
934+ * Center cursor on screen when it's first shown
935+ * Custom cursor name just have to start with "custom"
936+ * Work around AnimatedSprite infinite loop bug (LP: #1588929)
937+
938+ [ Josh Arenson ]
939+ * Disable showDash when it is already shown. (LP: #1506708)
940+ * Add a timestamp to the dash log (LP: #1580074)
941+ * Add timestamp to unity8 log (LP: #1498169)
942+
943+ [ Lukáš Tinkl ]
944+ * Implement keyboard shortcuts info panel
945+ * Implement window controls overlay activatable with 3 fingers tap
946+ (LP: #1489020)
947+ * Select correct Chinese input method for OSK in the wizard (LP:
948+ #1588633)
949+
950+ [ Michael Zanetti ]
951+ * Add support for the launcher surface pips displaying the correct
952+ number of surfaces
953+ * Add support for the persistent alert state. (LP: #1575147, #1584348,
954+ #1586621)
955+ * send a Alt-release event on alt+tab instead of delaying it
956+ completely and invoking it later (LP: #1565236)
957+
958+ [ Stephen M. Webb ]
959+ * added a new upstart $SESSION for unity8-desktop-session (LP:
960+ #1376715)
961+
962+ -- Michael Terry <michael.terry@canonical.com> Fri, 17 Jun 2016 01:22:57 +0000
963+
964+unity8 (8.12+16.10.20160601.1-0ubuntu1) yakkety; urgency=medium
965+
966+ [ Pawel Stolowski ]
967+ * Added apparmor profile for unity8-dash.
968+
969+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 01 Jun 2016 20:59:03 +0000
970+
971+unity8 (8.12+16.10.20160527-0ubuntu1) yakkety; urgency=medium
972+
973+ [ Albert Astals Cid ]
974+ * Activate on click for SimpleMessages (LP: #1421696)
975+ * Add override
976+ * Change the art back to the cardData value if it changes from broken
977+ to valid image (LP: #1533577)
978+ * Concierge mode generated code optimization
979+ * Don't use context properties but properties of the delegates
980+ * Listen to contentItem::widthChanged instead of
981+ Flickable::contentWidthChanged (LP: #1565763)
982+ * Make some AP code faster
983+ * Make tests a bit more stable
984+ * Make unity8 and unity8-dash handle termination signals
985+ * Remove workaround not needed anymore (LP: #1475643)
986+ * Resolve cardArtStyle on compile time
987+ * Set the theme earlier (LP: #1574048)
988+
989+ [ Albert Astals Cid, Daniel d'Andrada ]
990+ * Remove DirectionalDragArea and libs/UbuntuGestures and port to SDK
991+ equivalents
992+
993+ [ Andrea Cimitan ]
994+ * Hide the preview review input field when a rating is required (LP:
995+ #1541971)
996+
997+ [ CI Train Bot ]
998+ * Resync trunk.
999+
1000+ [ Daniel d'Andrada ]
1001+ * Fix DragHandle so it works in all directions
1002+ * Support animated cursors
1003+ * WindowInputMonitor - also map Qt::Key_HomePage to our home key
1004+ * plugins/Cursor: properly register to the screen's QPlatformCursor
1005+ when screen changes (LP: #1579742)
1006+
1007+ [ Josh Arenson ]
1008+ * Close the PageHeaderExtraPanel when a filter option is selected (LP:
1009+ #1569498)
1010+ * Wrap primaryFilter in a flickable to make it behave nicely. (LP:
1011+ #1569492)
1012+
1013+ [ Lukáš Tinkl ]
1014+ * First snap decision should always be expanded, unless user decides
1015+ otherwise (LP: #1580090, #1575045)
1016+ * Fullscreen notification bug fixes (LP: #1583944, #1581498, #1422711)
1017+ * Implement maximizing windows horizontally/vertically
1018+ * Lock the session when putting the laptop into sleep (LP: #1581063)
1019+
1020+ [ Lukáš Tinkl, Michael Terry ]
1021+ * With a maximized window, "dragging" the panel down should restore it
1022+
1023+ [ Michael Terry ]
1024+ * Change some dash button colors from orange to green. (LP: #1581047)
1025+ * Use PageHeader instead Ambiance's PageHeadStyle
1026+ * Use new setTimeZone method to set user-friendly timezone name in the
1027+ wizard. (LP: #1566295)
1028+
1029+ [ Michael Zanetti ]
1030+ * Remove the background dimming when the launcher is revealed by a
1031+ drag (LP: #1575137)
1032+ * reenable or drop disabled tests
1033+
1034+ -- Michael Terry <michael.terry@canonical.com> Fri, 27 May 2016 13:54:44 +0000
1035+
1036+unity8 (8.12+16.10.20160520.1-0ubuntu1) yakkety; urgency=medium
1037+
1038+ [ Lukáš Tinkl ]
1039+ * Don't dim screen when the indicators are open (LP: #1564342)
1040+ * Fix upcoming alarms ETA labels (LP: #1576741)
1041+ * Stabilize flaky wizard tests (LP: #1582994)
1042+
1043+ [ Michael Zanetti ]
1044+ * fix the SIM PIN darkening after it got removed accidentally (LP:
1045+ #1577147)
1046+
1047+ [ Michał Sawicz, Nick Dedekind ]
1048+ * Fixed saving current stage and loss of surface focus when switching
1049+ stages
1050+
1051+ [ Nick Dedekind ]
1052+ * Fixed incorrect osk surface item resizing the surface.
1053+
1054+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 20 May 2016 08:44:19 +0000
1055+
1056+unity8 (8.12+16.04.20160518.1-0ubuntu1) xenial; urgency=medium
1057+
1058+ [ CI Train Bot ]
1059+ * Resync trunk.
1060+
1061+ [ Daniel d'Andrada, Michał Sawicz ]
1062+ * Move prompt surfaces from MirSurface to Application
1063+
1064+ -- Nick Dedekind <ci-train-bot@canonical.com> Wed, 18 May 2016 11:20:04 +0000
1065+
1066+unity8 (8.12+16.04.20160504.2-0ubuntu1) xenial; urgency=medium
1067+
1068+ [ Albert Astals Cid ]
1069+ * Expandable Filter Widget
1070+ * Pass the category correctly
1071+
1072+ [ Albert Astals Cid, CI Train Bot ]
1073+ * Make the previewActions react to the actions model changing (LP:
1074+ #1485887)
1075+ * Reload Preview Zoomable Image source if it gets updated
1076+ * Update the icon also to the original one if that's what the scope
1077+ wants
1078+
1079+ [ Andrea Cimitan ]
1080+ * Add social actions to cards
1081+
1082+ [ CI Train Bot ]
1083+ * Resync trunk.
1084+
1085+ -- Pawel Stolowski <ci-train-bot@canonical.com> Wed, 04 May 2016 18:09:33 +0000
1086+
1087+unity8 (8.12+16.04.20160429.2-0ubuntu1) xenial; urgency=medium
1088+
1089+ [ CI Train Bot ]
1090+ * Resync trunk.
1091+
1092+ [ Daniel d'Andrada ]
1093+ * Ensure shell transformations use bindings as OrientedShell can get
1094+ resized
1095+ * Make shell rotation animation work on multimonitor scenarios.
1096+ * Refactor screenshotting code and make it work in multimonitor
1097+ scenarios
1098+
1099+ [ Gerry Boland, Nick Dedekind ]
1100+ * Indicators: set menu height binding while fully open/closed, fixes
1101+ dynamic grid unit bug.
1102+
1103+ [ Michael Zanetti ]
1104+ * Call the dash sizing hack when units.gu changes
1105+ * Temporary means to override GUs on the internal screen
1106+ * reduce some paint layers.
1107+
1108+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 29 Apr 2016 20:07:37 +0000
1109+
1110+unity8 (8.12+16.04.20160427.3-0ubuntu1) xenial; urgency=medium
1111+
1112+ [ Albert Astals Cid ]
1113+ * Add env var to enable js debugging/profiling even if not built on
1114+ debug mode
1115+ * Better error message if the item does not exist
1116+ * CardCreator: Remove ShaderEffectSource (LP: #1544875)
1117+ * Compile with Qt 5.6 (LP: #1565632)
1118+ * LVWPH: Account for contentHeight not really being "all" of the
1119+ content height (LP: #1569976)
1120+ * NotificationAudio: We don't need weird "ifdef" for multimedia 5.6 vs
1121+ 5.0 roles anymore
1122+ * See all/less -> Show all/less (LP: #1349471)
1123+ * Stabilize test_superTabToCycleLauncher
1124+ * Take into account that sectionItem height can change
1125+ * Turn verify intro tryCompareFunction
1126+ * forceLayout before calling positionViewAtIndex (LP: #1553475)
1127+ * rootObject can be null for a small moment after setSource is called
1128+ (LP: #1560501)
1129+
1130+ [ CI Train Bot ]
1131+ * Resync trunk.
1132+
1133+ [ Daniel van Vugt ]
1134+ * Reinstate the touch performance/smoothness fix (LP: #1486341, LP:
1135+ #1556763). (LP: #1556763, #1486341)
1136+
1137+ [ Josh Arenson ]
1138+ * Change the color of the activity pulse to blue (LP: #1568082)
1139+ * Make scope filter settings button the same color as other foreground
1140+ elements (LP: #1563357)
1141+
1142+ [ Lukáš Tinkl ]
1143+ * Drop OOBE wizard autopilot tests
1144+ * Fix labels in desktop spread
1145+ * Fix upcoming event ETAs falling out of sync (LP: #1557571)
1146+ * Hide the close button for dash (LP: #1550056, #1564347)
1147+ * Notifications visual update, close button on mouse hover (LP:
1148+ #1564343)
1149+ * Shell visual update
1150+ * Stabilize wizard tests
1151+ * Unity8 windows now cascade instead of opening all in the top left
1152+ corner (LP: #1513813)
1153+
1154+ [ Michael Terry ]
1155+ * Fix some unreliable test code.
1156+ * Ignore Home Key presses when the greeter is up. (LP: #1565818)
1157+
1158+ [ Michael Zanetti ]
1159+ * Drop the rotation lock for the dash (LP: #1465331, #1574165)
1160+ * improve the pin lockscreen
1161+ * install devices.conf by default
1162+
1163+ [ Ted Gould ]
1164+ * Switch to using uid/pwdent for getting username
1165+
1166+ -- Michael Terry <michael.terry@canonical.com> Wed, 27 Apr 2016 15:01:28 +0000
1167+
1168+unity8 (8.12+16.04.20160421.1-0ubuntu1) xenial; urgency=medium
1169+
1170+ [ Daniel d'Andrada ]
1171+ * Refactor keymap switching code
1172+ * Surface-based window management
1173+ * Use Item.grabToImage() instead of qtmir's ApplicationScreenshot
1174+ provider
1175+
1176+ [ Michael Zanetti ]
1177+ * Fixes for programmatically closing Applications
1178+
1179+ [ Robert Bruce Park ]
1180+ * Use new bileto_pre_release_hook
1181+
1182+ -- Gerry Boland <ci-train-bot@canonical.com> Thu, 21 Apr 2016 13:48:02 +0000
1183+
1184+unity8 (8.12+16.04.20160414.1-0ubuntu1) xenial; urgency=medium
1185+
1186+ [ Michael Terry ]
1187+ * Make sure that usageMode is set on startup, fixing a problem with
1188+ the tutorial not noticing that it is running on a desktop. (LP:
1189+ #1564351)
1190+
1191+ [ Michael Zanetti ]
1192+ * make the edge drag area width configurable (LP: #1559512)
1193+
1194+ -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 14 Apr 2016 21:20:28 +0000
1195+
1196+unity8 (8.12+16.04.20160401-0ubuntu1) xenial; urgency=medium
1197+
1198+ * Add missing Testsuite header
1199+ * Skip the failing test until we have a working solution for bug
1200+ #1564571 (LP: #1564571)
1201+
1202+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 01 Apr 2016 08:32:16 +0000
1203+
1204+unity8 (8.12+16.04.20160330-0ubuntu1) xenial; urgency=medium
1205+
1206+ [ Albert Astals Cid ]
1207+ * Use tutorialLeftLoader instead of tutorialLeft
1208+
1209+ [ CI Train Bot ]
1210+ * Update translation template
1211+
1212+ [ Lukáš Tinkl ]
1213+ * Fix the last chance popup colors/theme
1214+
1215+ [ Michael Terry ]
1216+ * Adjust text for desktop right edge tutorial to be accurate. (LP:
1217+ #1563103)
1218+ * Fix OOBE wizard not setting your name. (LP: #1562872)
1219+ * Fix showing "Retry" in password prompt when turning on screen in
1220+ tablet mode.
1221+
1222+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 30 Mar 2016 07:46:51 +0000
1223+
1224+unity8 (8.12+16.04.20160323.2-0ubuntu1) xenial; urgency=medium
1225+
1226+ [ Michael Terry ]
1227+ *
1228+ * Fix setting OSK layout in OOBE wizard
1229+ * Stop the left edge tutorial from being shown when the bottom edge
1230+ tutorial wants to be shown after receiving a call.
1231+
1232+ [ Albert Astals Cid ]
1233+ * Filter implementation with Option Selector filter as the only filter
1234+ * Get the engine from the parent context
1235+ * Implement the API changes due to filters
1236+ * Match design visuals for the new dash navigation/page header popup
1237+ * New Dash Navigation UX
1238+ * Range Input filter
1239+ * Value slider filter
1240+ * Workaround SDK ListItem bug
1241+
1242+ [ Albert Astals Cid, Lukáš Tinkl ]
1243+ * Fix various tests
1244+
1245+ [ CI Train Bot ]
1246+ * Resync trunk.
1247+ * Update translation template
1248+
1249+ [ Lukáš Tinkl, Michael Terry ]
1250+ * New first-run wizard for the phone (part of the OOBE effort) (LP:
1251+ #1536688, #1536617, #1543790, #1555222)
1252+
1253+ [ Lukáš Tinkl, Michał Sawicz ]
1254+ * Keymap switching support (LP: #1524400, #1412492, #1491340)
1255+
1256+ [ Michael Terry, Michael Zanetti ]
1257+ * Redesign the first-boot edge tutorial
1258+
1259+ [ Michael Zanetti ]
1260+ * disabling some tests that are flaky in adt but can't be made fail on
1261+ our machines
1262+
1263+ [ Michael Zanetti, Michał Sawicz ]
1264+ * Change the behavior alond with the switch in indicator-display (LP:
1265+ #1538591)
1266+
1267+ [ Michael Zanetti, Michał Sawicz, Nick Dedekind ]
1268+ * Add support for low shell chrome. (LP: #1535397)
1269+ * Sidestage load/unload redesign (LP: #1544479)
1270+
1271+ -- Michael Zanetti <michael.zanetti@canonical.com> Wed, 23 Mar 2016 09:53:17 +0000
1272+
1273+unity8 (8.11+16.04.20160318.1-0ubuntu1) xenial; urgency=medium
1274+
1275+ [ CI Train Bot ]
1276+ * Update translation template
1277+
1278+ [ Lukáš Tinkl ]
1279+ * Fix notifications with the new UITK color schemes (LP: #1554616,
1280+ #1556523)
1281+
1282+ [ Lukáš Tinkl, Michael Zanetti, Nick Dedekind ]
1283+ * more fixes for the new theme palette (LP: #1554616, #1557534)
1284+
1285+ -- Michael Zanetti <michael.zanetti@canonical.com> Fri, 18 Mar 2016 17:12:53 +0000
1286+
1287+unity8 (8.11+16.04.20160310.4-0ubuntu1) xenial; urgency=medium
1288+
1289+ [ Albert Astals Cid ]
1290+ * Add context for Re-dock as asked by translators (LP: #1534608)
1291+ * Add emblem to the preview header widget (LP: #1424720)
1292+ * Add haptics to ScopesListCategoryItem buttons
1293+ * Audio Cards: Make some of the image loading async (LP: #1533432)
1294+ * Do not create fallback code for the card tool fake card (LP:
1295+ #1545865)
1296+ * Fix resizing the dash bringing temp scopes size out of sync (LP:
1297+ #1543130)
1298+ * Minor fixes for unity-scope-tool
1299+ * Resolve title alignment on card creator time instead of on runtime
1300+ * Use fixedHeaderHeight only in the non cardtool cards
1301+ * Use the new undeprecated connectivityqt::Connectivity
1302+ * asynchronous is only false on the fake card in cardtool
1303+ * clazy fixes
1304+
1305+ [ Albert Astals Cid, CI Train Bot ]
1306+ * click scope: Add the else branch so we reset the card size in all
1307+ situations
1308+
1309+ [ Andrea Cimitan ]
1310+ * PreviewSharing widget now accepts both string and array of
1311+ widgetData["share-data"]["uri"] (LP: #1549056)
1312+ * Update AP tests for new single preview
1313+ * Use Text.Wrap for body notification text (LP: #1544909)
1314+
1315+ [ Andrea Cimitan, Lukáš Tinkl, Michael Zanetti, Nick Dedekind ]
1316+ * some fixes for the new palette (LP: #1554616)
1317+
1318+ [ CI Train Bot ]
1319+ * Resync trunk.
1320+ * Update translation template
1321+
1322+ [ CI Train Bot, Daniel d'Andrada ]
1323+ * Ensure the QML engine doesn't delete our mock MirSurfaces on its
1324+ own.
1325+
1326+ [ Daniel d'Andrada ]
1327+ * tst_Shell: Remove unused qml items
1328+
1329+ [ Josh Arenson ]
1330+ * Allow the shell to blacklist input devices and force the OSK shown.
1331+ (LP: #1542224)
1332+
1333+ [ Lukáš Tinkl ]
1334+ * Disallow resizing windows up, past the Panel (LP: #1544766)
1335+ * Elide the window title not to let it overflow into the indicators
1336+ area (LP: #1535767)
1337+ * Enable the PIN lockscreen to be used with a HW keyboard (LP:
1338+ #1550359)
1339+ * Fix tiny windows when switching stages
1340+ * Provide a range of ports to QML JS Debugger
1341+ * Watch for launcher item icon changes (LP: #1543290)
1342+
1343+ [ Michael Terry ]
1344+ * Proxy more mouse and touchpad properties to USC (LP: #1540398) (LP:
1345+ #1543344, #1540398)
1346+ * Refactor the AccountsService plugin and make it slightly faster.
1347+ * To let the user log in if a mouse is connected, hide the greeter
1348+ cover page on a mouse click (but NOT a touch click). (LP: #1540497)
1349+ * Watch AccountsService for changes to the user's real name. This was
1350+ preventing us from noticing when the user set their name in the
1351+ welcome wizard.
1352+
1353+ [ Michael Zanetti ]
1354+ * Allow alt+tabbing in staged mode too (LP: #1540502)
1355+ * Allow invoking the staged mode spreads by mouse right edge pushes
1356+ too (LP: #1540392)
1357+ * Allow loading the device configuration from an external file
1358+ * Implement Launcher's keyboard navigation and updated pip design
1359+ * Make launcher scalable, allow it locking (LP: #1511015)
1360+ * Properly parent launcher items in all cases (LP: #1495732)
1361+ * Read inputMethod surface from the new property int QtMir (LP:
1362+ #1545286)
1363+ * Some visual updates and rotation lock for the virtual touchpad (LP:
1364+ #1549087)
1365+ * Visual updates for the windowed spread (LP: #1488148)
1366+ * stabilize swipeAwayGreeter()
1367+
1368+ [ Michał Sawicz ]
1369+ * Add udev rules to make sure we have access to uinput
1370+ * Make dash respawn indefinitely (LP: #1550056)
1371+ * Use dpkg-architecture, not arch, to disable touch emulation
1372+
1373+ [ Vesa Rautiainen ]
1374+ * Fixing the vertical position of desktop spread item icon.
1375+
1376+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 10 Mar 2016 22:44:16 +0000
1377+
1378+unity8 (8.11+16.04.20160308-0ubuntu1) xenial; urgency=medium
1379+
1380+ [ Albert Astals Cid ]
1381+ * Make these tests pass with the new SDK
1382+
1383+ [ Andrea Cimitan, Nick Dedekind ]
1384+ * replace selected.backgroundText with normal.backgroundText in
1385+ Splash, Notifications, Wizard
1386+
1387+ [ CI Train Bot ]
1388+ * Update translation template
1389+
1390+ [ Michał Sawicz, Nick Dedekind ]
1391+ * Fixed colours palette value set. Moved ModemItem to USC.
1392+
1393+ [ Michał Sawicz, Tim Peeters ]
1394+ * Update headers for Dash and Splash to work properly with the new UI
1395+ toolkit release.
1396+
1397+ [ Zoltán Balogh, Zsombor Egri ]
1398+ * Use SuruDark theme instead of the deprecated SuruGradient.
1399+
1400+ -- Zoltan Balogh <zoltan.balogh@canonical.com> Tue, 08 Mar 2016 20:59:34 +0000
1401+
1402+unity8 (8.11+16.04.20160307-0ubuntu1) xenial; urgency=medium
1403+
1404+ [ CI Train Bot ]
1405+ * Resync trunk.
1406+ * Update translation template
1407+
1408+ [ Rodney Dawes ]
1409+ * Re-enable the purchaseCancelled signal.
1410+
1411+ -- Rodney Dawes <ci-train-bot@canonical.com> Mon, 07 Mar 2016 14:12:08 +0000
1412+
1413+unity8 (8.11+16.04.20160301-0ubuntu1) xenial; urgency=medium
1414+
1415+ [ Albert Astals Cid ]
1416+ * Hook the new scope.activationInProgress property (LP: #1537132)
1417+
1418+ [ Andrea Cimitan ]
1419+ * Updated the Preview view to use a single PreviewModel instead old
1420+ PreviewStack, using a Loader instead ListView (LP: #1541967)
1421+
1422+ [ CI Train Bot ]
1423+ * Resync trunk.
1424+ * Update translation template
1425+
1426+ [ Michał Sawicz ]
1427+ * Add autopilot as DEP-8 tests added: debian/tests/autopilot.sh
1428+
1429+ -- Pawel Stolowski <ci-train-bot@canonical.com> Tue, 01 Mar 2016 10:28:52 +0000
1430+
1431+unity8 (8.11+16.04.20160216.1-0ubuntu1) xenial; urgency=medium
1432+
1433+ [ Albert Astals Cid ]
1434+ * Make the audio previews create a playlist (LP: #1540477)
1435+
1436+ [ CI Train Bot ]
1437+ * Resync trunk. added: po/aa.po
1438+ * Update translation template
1439+
1440+ -- Pawel Stolowski <ci-train-bot@canonical.com> Tue, 16 Feb 2016 03:24:46 +0000
1441+
1442+unity8 (8.11+16.04.20160212-0ubuntu1) xenial; urgency=medium
1443+
1444+ [ Albert Astals Cid ]
1445+ * Do not use components in card creator generated code
1446+ * Forward the makesurevisible signal from the inner preview widget
1447+ * Make fallback also be fallback when the image is empty and not only
1448+ on error (LP: #1531913)
1449+ * Make the artShapeSize assignment be updated when using dynamic grid
1450+ units
1451+ * Visual improvements to the dash audio play cards
1452+ * We don't use the unity-scope-scopes anymore (LP: #1439172)
1453+
1454+ [ Andrea Cimitan ]
1455+ * only request a bigger image if zoomable widget data property is
1456+ true, otherwise just leave the screen size (LP: #1536814)
1457+
1458+ [ CI Train Bot ]
1459+ * Update translation template
1460+
1461+ [ Daniel d'Andrada ]
1462+ * Set initial surface size (LP: #1532974)
1463+
1464+ [ Daniel d'Andrada, Michał Sawicz ]
1465+ * Window Size Hints
1466+
1467+ [ Florian Boucault ]
1468+ * Splash screen: delay showing the ActivityIndicator by 2 seconds.
1469+
1470+ [ Lukáš Tinkl ]
1471+ * Replace the word "phone" with a more generic term "device" in the
1472+ welcome wizard (LP: #1294732, #1543527)
1473+
1474+ [ Michael Terry ]
1475+ * Have the tablet greeter set appropriate OSK hints if the user has a
1476+ passcode instead of a passphrase. (LP: #1544173)
1477+
1478+ [ Michael Zanetti ]
1479+ * Don't eat mouse events in the edgebarrer
1480+
1481+ [ Michał Sawicz ]
1482+ * Bump unity-api dependencies
1483+
1484+ [ Nick Dedekind ]
1485+ * Added support for secondary indicator actions (LP: #1398888)
1486+ * Remove zombie if they're not animated. (LP: #1534541)
1487+ * Removed unused panel resources
1488+
1489+ [ Ted Gould ]
1490+ * Start the indicators after Unity8 starts instead of before
1491+
1492+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 12 Feb 2016 00:12:41 +0000
1493+
1494+unity8 (8.11+16.04.20160208-0ubuntu1) xenial; urgency=medium
1495+
1496+ [ Albert Astals Cid ]
1497+ * LVWPH: Reset to initial values when list is empty (LP: #1540490)
1498+ * Make LazyImage qmltest less flaky on CI
1499+
1500+ [ Andrea Cimitan ]
1501+ * Make LazyImage qmltest less flaky on CI
1502+
1503+ [ CI Train Bot ]
1504+ * Resync trunk.
1505+ * Update translation template
1506+
1507+ [ Michael Terry ]
1508+ * Display the current user's real name on the tablet lockscreen. (LP:
1509+ #1536714)
1510+
1511+ -- Michał Sawicz <michal.sawicz@canonical.com> Mon, 08 Feb 2016 09:38:00 +0000
1512+
1513+unity8 (8.11+16.04.20160129-0ubuntu1) xenial; urgency=medium
1514+
1515+ [ Albert Astals Cid ]
1516+ * Audio Preview Button: Don't gain focus on press (LP: #1517830)
1517+ * Better attempt at sanitization
1518+ * Better looking application scopes for wide screens
1519+ * Call printSettings correctly
1520+ * Card test: Limit the precision we ask for doubles to be equal
1521+ * Convert while into tryCompareFunction
1522+ * Do not use the same filepath parameter for all the card creator
1523+ createQmlObject calls (LP: #1536379)
1524+ * Fix some test shells being unstable in the armhf builders
1525+ * Make revealByEdgePush more stable
1526+ * More reliable compares
1527+ * Move the mouse over the bfb before waiting for rendering
1528+ * Remove the DDAs constrains for every test
1529+ * Set the background source size to the max we'll need + new
1530+ background (LP: #1539011)
1531+
1532+ [ Andrea Cimitan ]
1533+ * Dynamically change click scope card size according to size (LP:
1534+ #1536745)
1535+ * Should fix lazyimage test failures on fast machines
1536+
1537+ [ CI Train Bot ]
1538+ * Fix card tests on the phone
1539+ * Update translation template
1540+
1541+ [ Daniel d'Andrada ]
1542+ * Desktop stage rotates only to follow screen orientation (LP:
1543+ #1515977)
1544+
1545+ [ Lukáš Tinkl ]
1546+ * Hide/reveal the mouse pointer on touch/mouse events renamed:
1547+ plugins/Utils/HomeKeyWatcher.cpp =>
1548+ plugins/Utils/WindowInputMonitor.cpp plugins/Utils/HomeKeyWatcher.h
1549+ => plugins/Utils/WindowInputMonitor.h
1550+ tests/mocks/Utils/HomeKeyWatcher.qml =>
1551+ tests/mocks/Utils/WindowInputMonitor.qml
1552+ tests/plugins/Utils/HomeKeyWatcherTest.cpp =>
1553+ tests/plugins/Utils/WindowInputMonitorTest.cpp
1554+
1555+ [ Michael Terry ]
1556+ * Synchronize the mouse-cursor-speed and touchpad-cursor-speed
1557+ properties with USC. (LP: #1536383)
1558+
1559+ [ Michael Zanetti ]
1560+ * Add InputMethod to secondary screen
1561+ * Add a virtual Touchpad while external screen is connected
1562+ * Make big tablets switch to windowed mode by plugging a kbd only (LP:
1563+ #1535399)
1564+ * Prevent alt key presses from being dispatched to the app on alt+tab
1565+ (LP: #1532862)
1566+
1567+ [ Michał Sawicz ]
1568+ * Make qmluitests.sh more robust and allow parallel test execution
1569+ * Skip SessionBackendTest::testLogin1Capabilities until we talk to a
1570+ mock instead (LP: #1532112, #1532113)
1571+
1572+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 29 Jan 2016 11:53:27 +0000
1573+
1574+unity8 (8.11+16.04.20160122-0ubuntu1) xenial; urgency=medium
1575+
1576+ [ Albert Astals Cid ]
1577+ * Fix bug #1536296 added: tests/plugins/Dash/cardcreator/10.tst (LP:
1578+ #1536296)
1579+ * Fix card tests on the phone
1580+
1581+ [ CI Train Bot ]
1582+ * Update translation template
1583+
1584+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 22 Jan 2016 16:56:04 +0000
1585+
1586+unity8 (8.11+16.04.20160111.1-0ubuntu1) xenial; urgency=medium
1587+
1588+ [ Albert Astals Cid ]
1589+ * Clear fake item icon name as soon as it goes invisible (LP:
1590+ #1531172)
1591+ * Fix LVWPH test failing on Xenial (Qt 5.5)
1592+ * Fix dragging so that test passes on Xenial
1593+ * Fix focus on the dash page header text field with new SDK (LP:
1594+ #1528178)
1595+ * Make the card creator test pass again
1596+ * Quit the dash communicator thread before destroying it (LP:
1597+ #1508485)
1598+ * Remove duplicated override_dh_auto_clean
1599+ * SDK changed the name they give to the buttons, follow
1600+
1601+ [ Andrea Cimitan ]
1602+ * Fix a broken binding
1603+
1604+ [ CI Train Bot ]
1605+ * Resync trunk.
1606+ * Update translation template
1607+
1608+ [ Daniel d'Andrada ]
1609+ * Have "make tryFoo" work with Qt 5.5
1610+ * Make DragHandle tests run again.
1611+
1612+ [ Lukáš Tinkl ]
1613+ * Fix dismissing the launcher when clicking/tapping outside (LP:
1614+ #1531339, #1530940)
1615+ * Fix panel drop shadow and click-to-focus of maximized apps (LP:
1616+ #1531854)
1617+ * Fix wifi access point indicator items signal strength icon on
1618+ desktop
1619+
1620+ [ Michael Terry ]
1621+ * Guard against a couple odd timing scenarios for the too-many-failed-
1622+ login-attempts lockout screen.
1623+ * Skip the wizard's password screens if there is already a password
1624+ set by other means. (LP: #1531268)
1625+ * Stop the emergency dialer from accidentally exposing the mtp
1626+ service. (LP: #1525981)
1627+
1628+ [ Michael Zanetti ]
1629+ * Make sure the triangle of the quicklist is in bounds (LP: #1531340)
1630+
1631+ [ Pawel Stolowski ]
1632+ * Changes 'shareData' and 'contentType' attributes to 'share-data' and
1633+ 'content-type', to match existing naming schema.
1634+
1635+ -- Michał Sawicz <michal.sawicz@canonical.com> Mon, 11 Jan 2016 17:38:49 +0000
1636+
1637+unity8 (8.11+16.04.20160107-0ubuntu1) xenial; urgency=medium
1638+
1639+ [ Albert Astals Cid ]
1640+ * Introduce audio cards
1641+
1642+ [ CI Train Bot ]
1643+ * Update translation template
1644+
1645+ [ Michael Zanetti ]
1646+ * Introduce audio cards
1647+
1648+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 07 Jan 2016 08:04:47 +0000
1649+
1650+unity8 (8.11+16.04.20160105.1-0ubuntu1) xenial; urgency=medium
1651+
1652+ [ CI Train Bot ]
1653+ * Resync trunk.
1654+ * Update translation template
1655+
1656+ [ Nick Dedekind ]
1657+ * Use volume-sync action to resync the volume control. (LP: #1520548)
1658+
1659+ -- Xavi Garcia <xavi.garcia.mena@canonical.com> Tue, 05 Jan 2016 13:55:38 +0000
1660+
1661+unity8 (8.11+16.04.20151208.1-0ubuntu1) xenial; urgency=medium
1662+
1663+ [ Albert Astals Cid ]
1664+ * Allow dragging launcher items with the quicklist open (LP: #1250861)
1665+ * Create ratings on demand instead of all at the same time (LP:
1666+ #1519898, #1492214)
1667+ * LVWPH: Process correctly section changes (LP: #1519893)
1668+ * Make sure that unfavoriting a scope gives us the next one
1669+ * Move images only used in tests to tests folder
1670+
1671+ [ Andrea Cimitan ]
1672+ * Add shadows to ubuntu store icon
1673+
1674+ [ Daniel d'Andrada ]
1675+ * MirSurfaceItem got a new property: fillMode (LP: #1497083)
1676+ * Session can have multiple surfaces now
1677+ * plugins/Cursor: Do not force loading a specific cursor size (LP:
1678+ #1517878)
1679+
1680+ [ Lukáš Tinkl ]
1681+ * Indicators convergence: use the "phone" profile everywhere (LP:
1682+ #1520492)
1683+
1684+ [ Michael Terry ]
1685+ * Let qtmir know which apps are exempt from the lifecycle management.
1686+ This way, it can manage its own wakelocks better (and stop
1687+ preventing the system from deep sleeping).
1688+
1689+ [ Michael Zanetti ]
1690+ * Use proper z ordering instead of app index for occlusion detection
1691+ * add some debug prints to the uinput backend
1692+ * drop the ignoredMice hack again (LP: #1521580)
1693+
1694+ [ Michał Sawicz ]
1695+ * Let qtmir know which apps are exempt from the lifecycle management.
1696+ This way, it can manage its own wakelocks better (and stop
1697+ preventing the system from deep sleeping).
1698+ * Update .pot file in debian/clean when in train
1699+
1700+ -- Gerry Boland <ci-train-bot@canonical.com> Tue, 08 Dec 2015 15:37:58 +0000
1701+
1702+unity8 (8.11+16.04.20151126-0ubuntu2) xenial; urgency=medium
1703+
1704+ * Rebuild against Qt 5.5.1.
1705+
1706+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Mon, 30 Nov 2015 16:19:18 +0200
1707+
1708+unity8 (8.11+16.04.20151126-0ubuntu1) xenial; urgency=medium
1709+
1710+ [ Albert Astals Cid ]
1711+ * Initialize the image to be transparent (LP: #1517128)
1712+ * Update pot file
1713+ * clazy improvements
1714+
1715+ [ Andrea Cimitan ]
1716+ * Shadows in launcher and dash using UbuntuShapeIcon
1717+
1718+ [ CI Train Bot ]
1719+ * Resync trunk.
1720+
1721+ [ Daniel d'Andrada ]
1722+ * Cursor plugin: add scroll wheel handling (LP: #1497091)
1723+ * Cursor: Add more fallback names, a blank and custom cursor support
1724+ * DesktopStage: swiping from right edge shows window spread
1725+ * Don't stretch application surfaces when resizing (LP: #1497083)
1726+ * Mouse has to push against edges to show launcher or apps spread (LP:
1727+ #1510969)
1728+
1729+ [ Josh Arenson ]
1730+ * Don't let IntegratedLightDM muck with the username (LP: #1497081)
1731+
1732+ [ Lukáš Tinkl ]
1733+ * Implement new visuals for panel and window decorations (LP:
1734+ #1493066, #1511020, #1497095)
1735+ * Let systemd/logind handle the lid-close action
1736+ * Make saving screenshots really async
1737+
1738+ [ Michael Zanetti ]
1739+ * detect touchpads too, not only mice (LP: #1518395)
1740+ * move screenshots out of the Dash dir
1741+
1742+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 26 Nov 2015 13:52:00 +0000
1743+
1744+unity8 (8.11+16.04.20151112.1-0ubuntu1) xenial; urgency=medium
1745+
1746+ [ Albert Astals Cid ]
1747+ * Make cardWidth and cardHeight real
1748+ * Reset instead of qFatal when removing things from the middle (LP:
1749+ #1238979)
1750+ * Warn we're using only the cache when not connected to the interwebs
1751+
1752+ [ Andrea Cimitan ]
1753+ * Add sharing widget to zoomable image and video playback
1754+
1755+ [ Daniel d'Andrada ]
1756+ * Cursor: properly initialize hotspot position (LP: #1510407)
1757+ * Update GSettings mock in tst_OrientedShell
1758+
1759+ [ Lukáš Tinkl ]
1760+ * Restore windows when activating from the spread, maintain a focus
1761+ stack
1762+
1763+ [ Michael Terry ]
1764+ * Make a few DBus calls asynchronous, for a smoother UX.
1765+
1766+ [ Michael Zanetti ]
1767+ * Add a warning dialog when disconnecting the external monitor.
1768+ * added icon for the dash (LP: #1488146)
1769+ * prevent windows to be moved under the panel (LP: #1438465)
1770+ * update inputinfo api to the latest upstream snapshot
1771+ * use UbuntuNumberAnimations instead of linear ones for window state
1772+ transitions (LP: #1497097)
1773+
1774+ -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 12 Nov 2015 20:41:02 +0000
1775+
1776+unity8 (8.11+16.04.20151104-0ubuntu1) xenial; urgency=medium
1777+
1778+ [ Albert Astals Cid ]
1779+ * Add an Item that proxies for old and new audio roles (LP: #1493851)
1780+ * CroppedImageMinimumSourceSize: Fix 'Binding loop detected for
1781+ property "imageAspectRatio"'
1782+ * Make the scope settings list scroll to text visible area (LP:
1783+ #1499084)
1784+ * Move to importing QtQuick 2.4 & friends
1785+ * Use SDK 1.3 across all files (LP: #1503498, #1508363, #1449628)
1786+
1787+ [ Andrea Cimitan ]
1788+ * Add sharing widget to zoomable image and video playback
1789+ * Make zoomable and video playback widgets edge to edge
1790+ * Updated all 1.3 UbuntuShape to use new APIs where possible
1791+ * Use SDK 1.3 across all files (LP: #1503498, #1508363, #1449628)
1792+
1793+ [ CI Train Bot ]
1794+ * Resync trunk.
1795+
1796+ [ Christopher Lee ]
1797+ * Quick spelling fix in process control output.
1798+
1799+ [ Daniel d'Andrada ]
1800+ * Enable support for overriding application orientations based on
1801+ device type (LP: #1478637)
1802+ * Use SDK 1.3 across all files (LP: #1503498, #1508363, #1449628)
1803+ * Use SDK 1.3 across all files (LP: #1503498, #1508363, #1449628)
1804+
1805+ [ Josh Arenson ]
1806+ * Enable support for overriding application orientations based on
1807+ device type (LP: #1478637)
1808+
1809+ [ Michael Terry ]
1810+ * Avoid showing the shutdown dialog when turning on the screen if your
1811+ device is under heavy load. (LP: #1508563)
1812+ * Handle lifecycle policy exceptions ourselves, instead of letting
1813+ qtmir do it for us and allow non-Touch apps to opt-out of the Touch
1814+ lifecycle.
1815+
1816+ [ Michael Zanetti ]
1817+ * Fixes for the panel buttons (LP: #1510360, #1504269, #1431566,
1818+ #1443319)
1819+ * Use SDK 1.3 across all files (LP: #1503498, #1508363, #1449628)
1820+
1821+ [ Michał Sawicz ]
1822+ * Add missing copyright to Cursor.qml
1823+ * Enable support for overriding application orientations based on
1824+ device type (LP: #1478637)
1825+ * Support server->client visibility change to stop rendering
1826+ (lp:#1475678) (LP: #1475678)
1827+
1828+ [ Nick Dedekind ]
1829+ * Support server->client visibility change to stop rendering
1830+ (lp:#1475678) (LP: #1475678)
1831+
1832+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 04 Nov 2015 14:58:41 +0000
1833+
1834+unity8 (8.11+15.10.20151021-0ubuntu1) wily; urgency=medium
1835+
1836+ [ Albert Astals Cid ]
1837+ * Clazy fixes
1838+ * Enable Efficient String Construction by default
1839+
1840+ [ CI Train Bot ]
1841+ * New rebuild forced.
1842+
1843+ [ Daniel d'Andrada ]
1844+ * Have unity8 drawing its own cursor (LP: #1488417)
1845+ * Initial multi-monitor support
1846+
1847+ [ Daniel van Vugt ]
1848+ * Disable Qt's stuttering 'touch compression' to fix scrolling
1849+ smoothness (LP: #1486341, #1488327)
1850+
1851+ [ Lukáš Tinkl ]
1852+ * Fix autopilot wizard test skipping the reporting page
1853+ * Implement Unity.Platform plugin wrapping org.freedesktop.hostname1
1854+ (LP: #1504318)
1855+ * React to window title (aka surface name) changes (LP: #1497092)
1856+ * Rotate the screenshots according to the actual orientation
1857+
1858+ [ Michał Sawicz ]
1859+ * Fix application API dependency
1860+ * Have unity8 drawing its own cursor (LP: #1488417)
1861+ * Initial multi-monitor support
1862+ * Rotate the screenshots according to the actual orientation
1863+
1864+ [ Nick Dedekind ]
1865+ * Fixed leak in UnityMenuModelStackTest
1866+ * Moved time translation to SDK (LP: #1372061)
1867+
1868+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 21 Oct 2015 11:51:53 +0000
1869+
1870+unity8 (8.11+15.10.20151009-0ubuntu1) wily; urgency=medium
1871+
1872+ [ CI Train Bot ]
1873+ * New rebuild forced.
1874+
1875+ [ Pawel Stolowski ]
1876+ * Store unity8 package version in /var/lib/.../version file for fast
1877+ retrieval from the shell plugin.
1878+
1879+ -- Pawel Stolowski <ci-train-bot@canonical.com> Fri, 09 Oct 2015 09:13:03 +0000
1880+
1881+unity8 (8.11+15.10.20151008-0ubuntu1) wily; urgency=medium
1882+
1883+ [ Lukáš Tinkl ]
1884+ * Revert to using plaintext instead of HTML-like markup for the
1885+ notifications (LP: #1504256)
1886+
1887+ -- Michał Sawicz <michal.sawicz@canonical.com> Thu, 08 Oct 2015 20:46:26 +0000
1888+
1889+unity8 (8.11+15.10.20151002-0ubuntu1) wily; urgency=medium
1890+
1891+ [ CI Train Bot ]
1892+ * Resync trunk.
1893+
1894+ [ Lukáš Tinkl ]
1895+ * Wizard: skip the reporting page if the system is configured not to
1896+ report crashes (LP: #1494442)
1897+
1898+ -- Ken VanDine <ken.vandine@canonical.com> Fri, 02 Oct 2015 13:24:03 +0000
1899+
1900+unity8 (8.11+15.10.20151001-0ubuntu1) wily; urgency=medium
1901+
1902+ [ Alexandros Frantzis ]
1903+ * Use power state change reason SnapDecision to turn screen on when a
1904+ SnapDecision arrives (LP: #1291455)
1905+
1906+ [ CI Train Bot ]
1907+ * New rebuild forced.
1908+
1909+ -- Alexandros Frantzis <alexandros.frantzis@canonical.com> Thu, 01 Oct 2015 12:04:04 +0000
1910+
1911+unity8 (8.11+15.10.20150930.1-0ubuntu1) wily; urgency=medium
1912+
1913+ [ Albert Astals Cid ]
1914+ * Make Launcher::test_quickListMenuOnRMB stable (LP: #1500359)
1915+
1916+ [ CI Train Bot ]
1917+ * New rebuild forced.
1918+
1919+ [ Michael Zanetti ]
1920+ * Stabilize Launcher DND test
1921+
1922+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 30 Sep 2015 10:09:33 +0000
1923+
1924+unity8 (8.11+15.10.20150925-0ubuntu1) wily; urgency=medium
1925+
1926+ [ Albert Astals Cid ]
1927+ * Improvements from running clazy over the code
1928+
1929+ [ Daniel d'Andrada ]
1930+ * PhoneStage: ensure you're left in a consistent state after being
1931+ reset (LP: #1476757)
1932+
1933+ [ Lukáš Tinkl ]
1934+ * Improve the appearance and functionality of datetime and session
1935+ indicators in Unity8 desktop.
1936+ * Using InputInfo, determine if we need swipe or click to dismiss the
1937+ notifications (e.g. incoming phone call)
1938+
1939+ [ Michael Zanetti ]
1940+ * further development on the Desktop Spread (LP: #1488147)
1941+
1942+ [ Michał Sawicz ]
1943+ * Bump application API version
1944+ * Skip bluetooth check under wily, use expectFailure to notice when
1945+ it's back
1946+
1947+ [ Richard Somlói ]
1948+ * Fix translator comments in time formatter
1949+
1950+ -- Michał Sawicz <michal.sawicz@canonical.com> Fri, 25 Sep 2015 12:13:20 +0000
1951+
1952+unity8 (8.11+15.10.20150922.1-0ubuntu1) wily; urgency=medium
1953+
1954+ [ Albert Astals Cid ]
1955+ * Adapt test to code changes
1956+ * Add DEP-8 test for all our UI and unit tests
1957+ * Keep the PreviewStack around to avoid mem leaks (LP: #1495467)
1958+
1959+ [ CI Train Bot ]
1960+ * Resync trunk.
1961+
1962+ [ Michael Terry ]
1963+ * When libusermetrics gives us an empty string, still show the
1964+ infographic circle rather than hiding it. This is a follow-on to a
1965+ branch [1] that changes the "no data available" label to the empty
1966+ string.
1967+
1968+ [ Michał Sawicz ]
1969+ * Add DEP-8 test for all our UI and unit tests
1970+ * Fix integrated LightDM path
1971+ * Resync trunk
1972+
1973+ -- Michał Sawicz <michal.sawicz@canonical.com> Tue, 22 Sep 2015 12:57:15 +0000
1974+
1975+unity8 (8.11+15.10.20150915-0ubuntu1) wily; urgency=medium
1976+
1977+ [ Albert Astals Cid ]
1978+ * Fix testNotifications
1979+ * Make the wait longer to make tests pass in CI
1980+ * New simplified CroppedImageMinimumSourceSize (LP: #1467740)
1981+ * Stop animateTimer when starting the fadeOutAnimation
1982+ * Use AlreadyLaunchedUpstart so that tests passes
1983+ * Workaround keyboard issues and make test pass again
1984+
1985+ [ Daniel d'Andrada ]
1986+ * DesktopStage: Refactor focus handling
1987+ * Stabilize tstShell.test_launchedAppHasActiveFocus
1988+
1989+ [ Gary.Wzl ]
1990+ * Add widgetData["expanded"] property for expandable widget.
1991+
1992+ [ Michael Terry ]
1993+ * Fix typo that caused the tutorial to tease the launcher on top of
1994+ the greeter.
1995+ * Fix typo that caused the tutorial to tease the launcher on top of
1996+ the greeter.
1997+
1998+ -- Michael Zanetti <michael.zanetti@canonical.com> Tue, 15 Sep 2015 12:06:06 +0000
1999+
2000+unity8 (8.11+15.10.20150907-0ubuntu1) wily; urgency=medium
2001+
2002+ [ Michal Sawicz ]
2003+ * Resync wily with vivid
2004+
2005+ [ Albert Astals Cid ]
2006+ * Accomodate header height when using a card carousel with non
2007+ overlayed header (LP: #1489309)
2008+ * Fix restart unity8 from inside the phone more than two times (LP:
2009+ #1487946)
2010+
2011+ [ Gary.Wzl ]
2012+ * Move textarea up automatically when inputmethod popup. (LP:
2013+ #1485947)
2014+
2015+ [ Lukáš Tinkl ]
2016+ * Introduce a GlobalShortcut QML component for handling global
2017+ keyboard shortcuts
2018+
2019+ [ Michael Terry ]
2020+ * Fix the fact that a user that is locked out from their account for
2021+ five minutes after entering too many wrong passwords can simply
2022+ reboot to try again. (LP: #1383086)
2023+ * Fix the fact that a user that is locked out from their account for
2024+ five minutes after entering too many wrong passwords can simply
2025+ reboot to try again. (LP: #1383086)
2026+
2027+ [ Michael Zanetti ]
2028+ * Implement progressive autoscrolling in desktop spread
2029+ * add an animation transition when invoking the spread by hitting the
2030+ right edge
2031+
2032+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 07 Sep 2015 14:05:37 +0000
2033+
2034+unity8 (8.11+15.10.20150826-0ubuntu1) wily; urgency=medium
2035+
2036+ [ Michael Zanetti ]
2037+ * release for wily
2038+
2039+ [ CI Train Bot ]
2040+ * New rebuild forced.
2041+
2042+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 26 Aug 2015 09:01:03 +0000
2043+
2044+unity8 (8.11+15.04.20150831.2-0ubuntu1) vivid; urgency=medium
2045+
2046+ [ Albert Astals Cid ]
2047+ * Accept auto repeats for the power down button if timer is not yet
2048+ running (LP: #1486953, #1488927)
2049+ * Add tests for Shell+Dash interaction
2050+ * Make clicking on launcher buttons have haptic feedback
2051+ * Make test_greeter_hides_on_app_open more stable
2052+ * Move connect() to new syntax
2053+ * make pot_file (LP: #1488484)
2054+
2055+ [ Gerry Boland ]
2056+ * [spread] avoid changing sourceSize of snapshotted apps, it causes
2057+ ghost apps in the spread (LP: #1474319)
2058+
2059+ [ Josh Arenson ]
2060+ * Refactor the greeter to enable dynamic loading of backend plugins.
2061+ * Refactor the greeter to enable dynamic loading of backend plugins.
2062+
2063+ [ Lukáš Tinkl ]
2064+ * Don't show the volume notification when the sound indicator is shown
2065+ (LP: #1484126)
2066+
2067+ [ Michael Terry ]
2068+ * Unify turn-on-screen-upon-notification logic from various daemons
2069+ into unity8. (LP: #1426115, #1482317)
2070+
2071+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 31 Aug 2015 10:25:39 +0000
2072+
2073+unity8 (8.11+15.04.20150827.1-0ubuntu1) vivid; urgency=medium
2074+
2075+ [ Daniel d'Andrada ]
2076+ * MirSurfaceItem is now a view+controller instantiated from QML (LP:
2077+ #1483752)
2078+
2079+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 27 Aug 2015 14:00:05 +0000
2080+
2081+unity8 (8.11+15.04.20150821-0ubuntu1) vivid; urgency=medium
2082+
2083+ [ Michael Terry ]
2084+ * Skip the tutorial entirely when in desktop mode. This fixes the
2085+ emulator not being able to pass the tutorial.
2086+ * Skip the tutorial entirely when in desktop mode. This fixes the
2087+ emulator not being able to pass the tutorial.
2088+
2089+ -- CI Train Bot <ci-train-bot@canonical.com> Fri, 21 Aug 2015 14:34:50 +0000
2090+
2091+unity8 (8.11+15.04.20150817-0ubuntu1) vivid; urgency=medium
2092+
2093+ [ Albert Astals Cid ]
2094+ * Drop gcc 4.9 requirement in debian/rules
2095+ * Make the test more stable
2096+ * Optimize scope.preview() calls (LP: #1478022)
2097+
2098+ [ Alberto Mardegan ]
2099+ * Set currentIndex after the model change is completed (LP: #1433442)
2100+
2101+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 17 Aug 2015 11:57:31 +0000
2102+
2103+unity8 (8.11+15.04.20150814-0ubuntu1) vivid; urgency=medium
2104+
2105+ [ Albert Astals Cid ]
2106+ * Make the test pass again after rework of appmanager
2107+ * fix testPhoneStage
2108+
2109+ [ CI Train Bot ]
2110+ * New rebuild forced.
2111+
2112+ [ Daniel d'Andrada ]
2113+ * Fix and clean up InputInfo plugin
2114+
2115+ [ Rodney Dawes ]
2116+ * Do not call verify in the payments button code. (LP: #1468038)
2117+
2118+ -- CI Train Bot <ci-train-bot@canonical.com> Fri, 14 Aug 2015 09:53:11 +0000
2119+
2120+unity8 (8.11+15.04.20150812-0ubuntu1) vivid; urgency=medium
2121+
2122+ [ Albert Astals Cid ]
2123+ * Add a test that checks that items in an expandable are the correct
2124+ size after expanding the expandable
2125+ * Fix the expandable test
2126+ * Replace some waitForRendering with wait(0)
2127+ * Workaround for bug 1473471 (LP: #1473471)
2128+
2129+ [ Gary.Wzl ]
2130+ * Fix layout issue when adding audio track widget in expandable widget
2131+
2132+ [ handsome_feng ]
2133+ * Added indication for running apps. (LP: #1471577)
2134+ * Adjust the color to highlighting indicator. (LP: #1457098)
2135+ * Convert the MouseArea to MultiPointTouchArea to track multiple touch
2136+ points. (LP: #1445472)
2137+
2138+ [ handsome_feng<445865575@qq.com> ]
2139+ * Convert the MouseArea to MultiPointTouchArea to track multiple touch
2140+ points. (LP: #1445472)
2141+
2142+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 12 Aug 2015 08:41:24 +0000
2143+
2144+unity8 (8.10+15.10.20150804-0ubuntu1) wily; urgency=medium
2145+
2146+ [ Kevin Gunn ]
2147+ * No change, rebuild for gcc5
2148+
2149+ [ CI Train Bot ]
2150+ * Resync trunk. added: po/cy.po
2151+ * Resync trunk. added: po/cy.po
2152+
2153+ [ Daniel d'Andrada ]
2154+ * Stages now control the "requestedState" property of applications
2155+ * Stages now control the "requestedState" property of applications
2156+
2157+ -- CI Train Bot <ci-train-bot@canonical.com> Tue, 04 Aug 2015 20:56:05 +0000
2158+
2159+unity8 (8.10+15.10.20150729-0ubuntu1) wily; urgency=medium
2160+
2161+ [ CI Train Bot ]
2162+ * Resync trunk.
2163+ * allow opening the manage dash area by clicking with a mouse on the
2164+ arrow label (LP: #1431564)
2165+
2166+ [ Daniel d'Andrada ]
2167+ * TouchRegistry: remove null candidates from list of candidates (LP:
2168+ #1473492)
2169+
2170+ [ Lukáš Tinkl ]
2171+ * Fix power dialogs on desktop
2172+ * Provide DBUS compatibility with various session services
2173+ (suspend/hibernate, lock/unlock, screensaver, etc)
2174+ * React on PrtScr keyboard shortcut for taking screenshots on desktop
2175+ (LP: #1474149)
2176+ * launcher parity: close apps from quicklist (LP: #1457201)
2177+
2178+ [ Michael Zanetti ]
2179+ * Implement first edition for a desktop Alt+Tab spread
2180+ * drop the gcc-4.9 dependency (LP: #1452348)
2181+
2182+ [ Mirco Müller ]
2183+ * Added corresponding tests and visual tweaks to a launcher-item's
2184+ progress-overlay.
2185+ * Added corresponding tests and visual tweaks to a launcher-item's
2186+ progress-overlay.
2187+ * Implemented alert/wiggle feature for launcher-icons.
2188+ * Implemented alert/wiggle feature for launcher-icons.
2189+
2190+ [ handsome_feng ]
2191+ * makes left swip reset the search string. (LP: #1413791)
2192+
2193+ [ handsome_feng<445865575@qq.com> ]
2194+ * Don't expand indicators when tap to return to call. (LP: #1453217)
2195+ * makes left swip reset the search string. (LP: #1413791)
2196+
2197+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 29 Jul 2015 12:39:01 +0000
2198+
2199+unity8 (8.10+15.10.20150708.2-0ubuntu1) wily; urgency=medium
2200+
2201+ [ Albert Astals Cid ]
2202+ * Make the card sizes a bit dependant on the total of gu of the dash
2203+
2204+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 08 Jul 2015 15:01:41 +0000
2205+
2206+unity8 (8.10+15.10.20150702.2-0ubuntu1) wily; urgency=medium
2207+
2208+ [ Albert Astals Cid ]
2209+ * Save screenshots of suspended apps to disk
2210+ * Set width of title label when inside the title row (LP: #1461979)
2211+ * qmluitests was renamed to uitests
2212+
2213+ [ CI Train Bot ]
2214+ * Resync trunk.
2215+
2216+ [ Daniel d'Andrada ]
2217+ * Fix tst_OrientedShell and tst_Tutorial (LP: #1469761, #1466947)
2218+
2219+ [ Leo Arias ]
2220+ * Reorganized the python test helper modules. Deprecated the
2221+ unity8.shell.emulators namespace. (LP: #1306340)
2222+
2223+ [ Leonardo Arias Fonseca ]
2224+ * Reorganized the python test helper modules. Deprecated the
2225+ unity8.shell.emulators namespace. (LP: #1306340)
2226+
2227+ [ Lukáš Tinkl ]
2228+ * fix PO files extraction
2229+
2230+ [ Michael Zanetti ]
2231+ * Make use of QInputDeviceInfo in order to automatically switch
2232+ between usage modes and hide the OSK.
2233+
2234+ [ Nick Dedekind ]
2235+ * Fixed qtmultimedia mock which was generating errors in tests
2236+
2237+ [ Richard Huddie ]
2238+ * Reorganized the python test helper modules. Deprecated the
2239+ unity8.shell.emulators namespace. (LP: #1306340)
2240+
2241+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 02 Jul 2015 16:09:57 +0000
2242+
2243+unity8 (8.10+15.10.20150618-0ubuntu1) wily; urgency=medium
2244+
2245+ [ Albert Astals Cid ]
2246+ * Refactor QmlTest.cmake module so that all tests can go through it.
2247+ Also a bit of cleanup around tests.
2248+ * Support fallback images for dash card and preview widgets (LP:
2249+ #1324142)
2250+
2251+ [ CI Train Bot ]
2252+ * New rebuild forced.
2253+ * Resync trunk.
2254+
2255+ [ Daniel d'Andrada ]
2256+ * Fix Shell tests
2257+
2258+ [ Josh Arenson ]
2259+ * Refactor greeter emulator to unlock the greeter via dbus
2260+
2261+ [ Lukáš Tinkl ]
2262+ * respect target window's devicePixelRatio in MouseTouchAdaptor
2263+
2264+ [ Michael Zanetti ]
2265+ * Refactor QmlTest.cmake module so that all tests can go through it.
2266+ Also a bit of cleanup around tests.
2267+
2268+ [ Michał Sawicz ]
2269+ * Refactor QmlTest.cmake module so that all tests can go through it.
2270+ Also a bit of cleanup around tests.
2271+
2272+ [ handsome_feng ]
2273+ * Forbid closing apps during the edge gesture. (LP: #1445572)
2274+ * Removed the horizonal rule on pin unlock screen. (LP: #1368798)
2275+
2276+ [ handsome_feng<445865575@qq.com> ]
2277+ * Forbid closing apps during the edge gesture. (LP: #1445572)
2278+
2279+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 18 Jun 2015 19:40:06 +0000
2280+
2281+unity8 (8.10+15.10.20150612-0ubuntu2) wily; urgency=medium
2282+
2283+ * No-change rebuild against Qt 5.4.2.
2284+
2285+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Mon, 15 Jun 2015 12:33:07 +0300
2286+
2287+unity8 (8.10+15.10.20150612-0ubuntu1) wily; urgency=medium
2288+
2289+ [ Michał Sawicz ]
2290+ * Implement full-shell rotation (LP: #1210199)
2291+
2292+ [ CI Train Bot ]
2293+ * New rebuild forced.
2294+ * Resync trunk.
2295+
2296+ [ Daniel d'Andrada ]
2297+ * Implemented autopilot-test and fake-sensors for shell-rotation.
2298+
2299+ [ Mirco Müller ]
2300+ * Implemented autopilot-test and fake-sensors for shell-rotation.
2301+
2302+ -- CI Train Bot <ci-train-bot@canonical.com> Fri, 12 Jun 2015 16:07:47 +0000
2303+
2304+unity8 (8.10-0ubuntu1) UNRELEASED; urgency=medium
2305+
2306+ * Implement full-shell rotation (LP: #1210199)
2307+
2308+ -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 15 Apr 2015 14:47:17 +0200
2309+
2310+unity8 (8.02+15.10.20150603.1-0ubuntu1) wily; urgency=medium
2311+
2312+ [ CI Train Bot ]
2313+ * New rebuild forced.
2314+ * Resync trunk.
2315+
2316+ [ Renato Araujo Oliveira Filho ]
2317+ * Set the device led color to green. (LP: #1450894)
2318+
2319+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 03 Jun 2015 21:42:35 +0000
2320+
2321+unity8 (8.02+15.10.20150518.1-0ubuntu1) wily; urgency=medium
2322+
2323+ [ Albert Astals Cid ]
2324+ * Add overrides to override functions
2325+ * Implement "rating-edit" preview widget (LP: #1318144)
2326+ * Make the DashContent::test_mainNavigation test more stable (LP:
2327+ #1450809)
2328+ * Use art height as implicitHeight when the header is overlayed and
2329+ there's no summary
2330+
2331+ [ CI Train Bot ]
2332+ * New rebuild forced.
2333+ * Resync trunk.
2334+
2335+ [ Daniel d'Andrada ]
2336+ * Introducing FloatingFlickable
2337+ * Make Ubuntu.Gestures components install TouchRegistry by themselves
2338+
2339+ [ Michael Terry ]
2340+ * Fix a possible crash in our PAM threading code. (LP: #1425362) (LP:
2341+ #1425362)
2342+ * Fix the lockscreen becoming unresponsive after testing an app on the
2343+ device from QtCreator. (LP: #1435364)
2344+
2345+ [ Nick Dedekind ]
2346+ * Fixed desktop stage app focus.
2347+ * Fixed issue in laggy indicator autpilot tests (LP: #1446846)
2348+
2349+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 18 May 2015 23:04:39 +0000
2350+
2351+unity8 (8.02+15.04.20150511-0ubuntu1) vivid; urgency=medium
2352+
2353+ [ Albert Astals Cid ]
2354+ * Workarounds for concierge mode.
2355+
2356+ [ CI Train Bot ]
2357+ * New rebuild forced.
2358+ * Resync trunk.
2359+
2360+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 11 May 2015 08:29:58 +0000
2361+
2362+unity8 (8.02+15.04.20150505-0ubuntu1) vivid; urgency=medium
2363+
2364+ [ Albert Astals Cid ]
2365+ * Make runtests fake a test error if make fails
2366+ * Make the test more stable
2367+ * Use dbus-test-runner instead of dbus-launch
2368+
2369+ [ Daniel d'Andrada ]
2370+ * DirectionalDragArea: improvements & API grooming (LP: #1417920)
2371+ * Fix EdgeDragEvaluator when a drag can happen both ways
2372+ (Direction.Horizontal)
2373+
2374+ [ Josh Arenson ]
2375+ * Remove panelHeight property as it is unused.
2376+
2377+ [ Leo Arias ]
2378+ * Initial clean up of the autopilot tests set up. Removed the touch
2379+ device from the test case. Moved the restart of unity to a fixture.
2380+ Removed the unused DragMixin. Updated the setUpClass to use
2381+ process_helpers. Removed the workaround for bug #1238417, already
2382+ fixed. Use the toolkit helper to set the testability environment
2383+ variable. Fixed the indicators base class that was restarting unity
2384+ twice. (LP: #1238417, #1447206)
2385+ * Use the base class from the toolkit in autopilot tests.
2386+
2387+ [ Michael Zanetti ]
2388+ * emit application-stop when we're going down (LP: #1326513)
2389+
2390+ [ Michał Sawicz ]
2391+ * UNITY_SCOPES_LIST is no more
2392+
2393+ [ handsome_feng<445865575@qq.com> ]
2394+ * When click the favorite scope in Dash Manager , it just return to
2395+ the corresponding scope page. (LP: #1447056)
2396+
2397+ -- CI Train Bot <ci-train-bot@canonical.com> Tue, 05 May 2015 14:47:24 +0000
2398+
2399+unity8 (8.02+15.04.20150422-0ubuntu1) vivid; urgency=medium
2400+
2401+ [ Albert Astals Cid ]
2402+ * Compile with Qt 5.5 (LP: #1437238)
2403+ * Different way of top aligning labels when the other one in the row
2404+ is multiline (LP: #1442085)
2405+ * make pot_file
2406+
2407+ [ Andrea Cimitan ]
2408+ * Set sourceSize for DashBackground.qml Image
2409+
2410+ [ CI Train Bot ]
2411+ * New rebuild forced.
2412+ * Resync trunk. added: po/sk.po
2413+
2414+ [ Daniel d'Andrada ]
2415+ * Move handling of command line options to a separate class
2416+ * Refactor tst_PhysicalKeysMapper.qml
2417+
2418+ [ Leo Arias ]
2419+ * For autopilot tests, use the device simulation scenarios from the
2420+ toolkit.
2421+
2422+ [ Leonardo Arias Fonseca ]
2423+ * For autopilot tests, use the device simulation scenarios from the
2424+ toolkit.
2425+
2426+ [ Michael Zanetti ]
2427+ * Make sure dnd mode is ended properly when drag gesture is cancelled
2428+ (LP: #1444949)
2429+
2430+ [ Michał Sawicz ]
2431+ * Fix flake8 warnings (LP: #1444170)
2432+ * Move mock indicator service to unity8-fake-env, as it's a binary-
2433+ dependent package.
2434+
2435+ [ Nick Dedekind ]
2436+ * Use asynchronous dbus requests for property updates. (LP: #1436982)
2437+
2438+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 22 Apr 2015 14:46:31 +0000
2439+
2440+unity8 (8.02+15.04.20150409.1-0ubuntu1) vivid; urgency=medium
2441+
2442+ [ Albert Astals Cid ]
2443+ * Focus the shutdown dialog (LP: #1417991)
2444+ * Make url-dispatching scope activation when the dash is not on the
2445+ main scopes (LP: #1364306)
2446+ * We use autopilot3 now
2447+
2448+ [ CI Train Bot ]
2449+ * New rebuild forced.
2450+ * Resync trunk. added: po/or.po
2451+
2452+ [ Daniel d'Andrada ]
2453+ * Make tst_PreviewListView and tst_GenericScopeView work in out-of-
2454+ source builds
2455+ * MouseArea that shows the indicators panel should cover the
2456+ indicators bar only (LP: #1439318)
2457+ * Surface gets active focus also with mouse clicks
2458+
2459+ [ Josh Arenson ]
2460+ * Add a mode option to unity8 for selecting greeter mode in the future
2461+ * Remove PkgConfig include from Launcher plugin to fix cross-compile
2462+ (LP: #1437702)
2463+
2464+ [ Leo Arias ]
2465+ * Fixed the check for string in the lock screen test. (LP: #1434518)
2466+
2467+ [ Michael Terry ]
2468+ * Make sure the edge tutorial is destroyed when we receive a call
2469+ during the wizard. (LP: #1436349)
2470+ * Skip parts of the edge tutorial that require a touch device (like
2471+ spread and bottom edge). (LP: #1434712)
2472+
2473+ [ Michael Zanetti ]
2474+ * Don't hide stages just because they're empty (LP: #1439615)
2475+ * [Launcher] fix bug where an item would disappear even though the app
2476+ is running (LP: #1438172)
2477+
2478+ [ Nick Dedekind ]
2479+ * Fixed autopilot test failures related to udev input failure for
2480+ power button.
2481+ * Made improvements for laggy indicator backends (lp#1390136). (LP:
2482+ #1390136)
2483+
2484+ [ Pete Woods ]
2485+ * GPS only goes active when the Dash is in the foreground (LP:
2486+ #1434379)
2487+
2488+ [ handsome_feng<445865575@qq.com> ]
2489+ * Modified the wrong time format in ScreenGrabber (LP: #1436006)
2490+
2491+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 09 Apr 2015 14:01:11 +0000
2492+
2493+unity8 (8.02+15.04.20150320-0ubuntu1) vivid; urgency=medium
2494+
2495+ [ Albert Astals Cid ]
2496+ * Fix regression making pan not possible in Zoomable Image (LP:
2497+ #1433506)
2498+ * Make sure m_firstVisibleIndex is correctly set after processing
2499+ changeSet.removes (LP: #1433056)
2500+ * make pot_file
2501+
2502+ [ Daniel d'Andrada ]
2503+ * Don't show the rotating rect in "make tryFoo".
2504+
2505+ [ Michael Zanetti ]
2506+ * make pinlockscreen adjust better to larger displays
2507+
2508+ -- CI Train Bot <ci-train-bot@canonical.com> Fri, 20 Mar 2015 11:56:41 +0000
2509+
2510+unity8 (8.02+15.04.20150318-0ubuntu1) vivid; urgency=medium
2511+
2512+ [ Albert Astals Cid ]
2513+ * Add some context to tr calls (LP: #1431497)
2514+ * Require binaries and .pc files we call from code
2515+ * Test: More stubborn flick to the end
2516+
2517+ [ Andrea Cimitan ]
2518+ * Refactor PreviewOverlay to fix weird zoom out/in animations when
2519+ previewing images from the Previews
2520+
2521+ [ CI Train Bot ]
2522+ * Resync trunk.
2523+
2524+ [ Charles Kerr ]
2525+ * Re-enable a rotation lock test now that the bug that broke that test
2526+ has been fixed. (LP: #1410915)
2527+
2528+ [ Daniel d'Andrada ]
2529+ * Darkened area behind indicators menu should eat input until it fully
2530+ disappears (LP: #1417967)
2531+ * DesktopStage - fix focus switch when user taps on window (LP:
2532+ #1431325)
2533+ * Fix warnings when launching tutorial
2534+ * Make MouseTouchAdaptor controllable from within QML
2535+ * Make tst_Shell absorb tst_TabletShell
2536+
2537+ [ Leo Arias ]
2538+ * Changed the autopilot dependencies so they do not require qt4. (LP:
2539+ #1429158)
2540+ * Drop the support for python2 in autopilot tests. (LP: #1429163)
2541+ * Stop using the deprecated toolkit emulators namespace in autopilot
2542+ tests. (LP: #1341681)
2543+
2544+ [ Michael Terry ]
2545+ * Don't close wizard & edge tutorial when the unity8-dash closes (LP:
2546+ #1425484)
2547+ * Don't let the wizard sit indefinitely, waiting for a wizard page to
2548+ finish preparing itself. (LP: #1425737)
2549+ * Fix two broken qmluitest files by waiting for everything to settle
2550+ before starting the tests.
2551+ * Only call unlockAllModems once the wizard is done. (LP: #1425161)
2552+ (LP: #1425161)
2553+ * When we are locking the user out from too many login failures,
2554+ notice when time passes even if the device is suspended. (LP:
2555+ #1396817) (LP: #1396817)
2556+
2557+ [ Michael Zanetti ]
2558+ * Add a mouse area to the indicators panel so we can open them by
2559+ clicking. (LP: #1417650)
2560+ * fix launcher not reacting to first click when revealed by mouse
2561+ hover, add tests
2562+ * performance improvements (LP: #1430233, #1425087)
2563+
2564+ [ Michał Sawicz ]
2565+ * Remove the activity indicator from tests
2566+ * Use targets instead of custom ld arguments for linking
2567+
2568+ [ Mirco Müller ]
2569+ * Updated the visuals of the SwipeToAct-widget for incoming-call snap-
2570+ decision notifications according to new design-spec.
2571+ * Updated the visuals of the SwipeToAct-widget for incoming-call snap-
2572+ decision notifications according to new design-spec.
2573+
2574+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 18 Mar 2015 10:19:06 +0000
2575+
2576+unity8 (8.02+15.04.20150302-0ubuntu2) vivid; urgency=medium
2577+
2578+ * No-change rebuild against Qt 5.4.1.
2579+
2580+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Wed, 11 Mar 2015 10:27:23 +0200
2581+
2582+unity8 (8.02+15.04.20150302-0ubuntu1) vivid; urgency=medium
2583+
2584+ [ Albert Astals ]
2585+ * Don't precache items that are outisde the 1.5*height buffering area
2586+ (LP: #1410131)
2587+
2588+ [ Albert Astals Cid ]
2589+ * Don't precache items that are outisde the 1.5*height buffering area
2590+ (LP: #1410131)
2591+
2592+ [ Chris Townsend ]
2593+ * Add a wrapper for handling the
2594+ /org/gnome/SessionManager/EndSessionDialog DBus object used by
2595+ indicator-session. This allows indicator-session to properly talk to
2596+ the Unity 8 session management functions. (LP: #1392187)
2597+ * Allow for proper logout session management. This uses the
2598+ EndSession() Upstart DBus method on the current session bus. (LP:
2599+ #1360316)
2600+ * Make the Unity 8 session dialogs behave in the same fashion as Unity
2601+ 7. From indicator-session: Clicking "Log Out" will now present a
2602+ dialog to "Lock", "Log Out", or "Cancel". Clicking "Shut Down" will
2603+ now present a dialog to "Reboot", "Shut Down", or "Cancel". (LP:
2604+ #1416074)
2605+
2606+ [ Daniel d'Andrada ]
2607+ * Add NO_TESTS cmake option to skip tests and therefore speed up
2608+ builds
2609+ * Remove enums and properties that doesn't exist in the real
2610+ ApplicationManager
2611+ * Stabilize some Shell qml tests
2612+
2613+ [ Josh Arenson ]
2614+ * Create a PhysicalKeyMapper to handle all physical/hardware keys (LP:
2615+ #1390393)
2616+
2617+ [ Michael Terry ]
2618+ * Make the draggable part of the right edge (during the tutorial) a
2619+ constant size, instead of having it grow and shrink as the spread
2620+ peeks out from the side.
2621+
2622+ [ Michał Sawicz ]
2623+ * Create a PhysicalKeyMapper to handle all physical/hardware keys (LP:
2624+ #1390393)
2625+
2626+ [ Robert Bruce Park ]
2627+ * Launchpad automatic translations update.
2628+
2629+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 02 Mar 2015 12:11:21 +0000
2630+
2631+unity8 (8.02+15.04.20150226-0ubuntu1) vivid; urgency=medium
2632+
2633+ [ CI Train Bot ]
2634+ * New rebuild forced.
2635+
2636+ [ Pete Woods ]
2637+ * Only set scopes active when the screen is on (LP: #1422879)
2638+
2639+ -- CI Train Bot <ci-train-bot@canonical.com> Thu, 26 Feb 2015 19:39:54 +0000
2640+
2641+unity8 (8.02+15.04.20150224-0ubuntu1) vivid; urgency=medium
2642+
2643+ [ Albert Astals Cid ]
2644+ * Dash manage hint should not be visible in previews+test (LP:
2645+ #1422260)
2646+ * Do not declare the hostname property twice
2647+ * Fix some warnings in Mock Notifications
2648+ * Make qmluittests pass with Qt 5.4
2649+ * Preserve the aspect ratio for the card attribute images (LP:
2650+ #1411751)
2651+ * Update qmltypes
2652+
2653+ [ Andrea Cimitan ]
2654+ * Add maximumLineCount for subtitle label in cards (LP: #1414870)
2655+
2656+ [ Michael Terry ]
2657+ * Move the gschema file to data/ and install it via cmake, not dpkg.
2658+ * Refactor the greeter code to be more compartmented and isolatable.
2659+ * Silence a couple qml warnings. (LP: #1423286)
2660+ * Wait for libqofono to finish initializing before we decide whether
2661+ to skip the wizard's SIM page or not.
2662+
2663+ [ Michael Zanetti ]
2664+ * enable revealing the launcher by hitting the left edge using the
2665+ mouse
2666+
2667+ [ Ying-Chun Liu ]
2668+ * Add Autopilot Notification helper.
2669+
2670+ -- CI Train Bot <ci-train-bot@canonical.com> Tue, 24 Feb 2015 10:17:16 +0000
2671+
2672+unity8 (8.02+15.04.20150216.1-0ubuntu1) vivid; urgency=medium
2673+
2674+ [ Andrea Cimitan ]
2675+ * Fix temp scopes opening temp scopes, correctly close previously
2676+ opened temp scope with its preview (LP: #1410337)
2677+ * Set sourcesize for scopes images in manage dash
2678+
2679+ [ CI Train Bot ]
2680+ * Resync trunk
2681+
2682+ [ Albert Astals Cid ]
2683+ * Test for bug #1316660 (LP: #1316660)
2684+ * Hardcode tranlsation for internal.location field (LP: #1393438)
2685+ * Make sure the height it's the height it will have
2686+
2687+ [ Michael Zanetti ]
2688+ * Cleanup cmake warning about missing Qt5Sql module
2689+
2690+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 16 Feb 2015 13:14:26 +0000
2691+
2692+unity8 (8.02+15.04.20150211-0ubuntu2) vivid; urgency=medium
2693+
2694+ * No-change rebuild against Qt 5.4.0.
2695+
2696+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Fri, 13 Feb 2015 15:17:18 +0200
2697+
2698+unity8 (8.02+15.04.20150211-0ubuntu1) vivid; urgency=medium
2699+
2700+ [ Michael Terry ]
2701+ * Redesign tutorial to match latest spec (just removing obsolete pages
2702+ and redesigning look, no new pages yet)
2703+ * Add new right-edge and bottom-edge screens to the first-boot edge
2704+ tutorial (LP: #1383297)
2705+ * Support switching the indicator profile on the fly, as the greeter
2706+ appears and disappears. (But don't use it yet, not until the
2707+ settings panel to control this is in place.)
2708+ * Clip the infographic to its bounding box, instead of letting it
2709+ bleed past the welcome page (visible when dragging the welcome page
2710+ to the side).
2711+
2712+ [ Michael Zanetti ]
2713+ * Add an AccountService based launcher model to be used with split
2714+ greeter
2715+ * Launcher fixes for windowed mode
2716+ * save and restore window size and position
2717+ * Fix resizing windows when making it smaller than minSize and then
2718+ larger again.
2719+
2720+ [ handsome_feng<445865575@qq.com> ]
2721+ * makes the header fully reveal when tapping the search icon. (LP:
2722+ #1379327)
2723+
2724+ [ Mirco Müller ]
2725+ * Allow swipe-to-dismiss for contracted snap-decision notifications,
2726+ interactive notifications and ephemeral notifications. (LP:
2727+ #1355422, #1334855)
2728+
2729+ [ Daniel d'Andrada ]
2730+ * Make indicators bar eat all events
2731+ * Improve Launcher tests, making them more reliable
2732+ * Tapping on a surface gives it active focus
2733+
2734+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 11 Feb 2015 17:13:16 +0000
2735+
2736+unity8 (8.02+15.04.20150123.3-0ubuntu1) vivid; urgency=low
2737+
2738+ [ Sebastien Bacher ]
2739+ * Set text hint property for the messaging menus inline reply widget
2740+ (LP: #1389234)
2741+
2742+ [ Ying-Chun Liu ]
2743+ * Added an initial set of autopilot tests for the display indicator.
2744+
2745+ [ Nick Dedekind ]
2746+ * Removed filtering the indicator model by visibility.
2747+
2748+ [ Michael Zanetti ]
2749+ * fixes left edge drag when in spread
2750+
2751+ [ Albert Astals Cid ]
2752+ * Fix ninja build in a different way The previous one was adding rpath
2753+ to some .so that broke our tests that use LD_LIBRARY_PATH to change
2754+ which one is picked up
2755+
2756+ [ Leo Arias ]
2757+ * Added an initial set of autopilot tests for the display indicator.
2758+
2759+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 23 Jan 2015 12:12:41 +0000
2760+
2761+unity8 (8.02+15.04.20150121.2-0ubuntu1) vivid; urgency=low
2762+
2763+ [ Michael Terry ]
2764+ * Don't show any power dialogs while the screen is off. This is a
2765+ band-aid to avoid the symptom, while we still investigate the source
2766+ of why the screen doesn't turn on (and why we seem to not handle the
2767+ power-button-release event). (LP: #1409003, #1410830)
2768+ * Don't refocus the dialer-app when a call is started by the user.
2769+ Because of how qtmir works, this would cause the dialer-app to
2770+ unfocus momentarily, causing interface oddities for the user. (LP:
2771+ #1413065)
2772+
2773+ [ CI Train Bot ]
2774+ * Resync trunk
2775+
2776+ [ Albert Astals Cid ]
2777+ * Build with ninja
2778+ * Fixes for Table Preview Widget (LP: #1410420)
2779+
2780+ [ Michael Zanetti ]
2781+ * Add support for earpiece media buttons (LP: #1398427)
2782+ * Add a WindowMoveResizeArea and tests for it
2783+
2784+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 21 Jan 2015 18:33:18 +0000
2785+
2786+unity8 (8.02+15.04.20150113.1-0ubuntu1) vivid; urgency=low
2787+
2788+ [ Andrea Cimitan ]
2789+ * support background on horizontal cards with summary (LP: #1393008)
2790+
2791+ [ Gerry Boland ]
2792+ * DashCommunicator: replace QDBusInterface with a non-blocking
2793+ simplification which does not introspect the service on creation
2794+ (LP: #1403508)
2795+
2796+ [ Leo Arias ]
2797+ * Added an autopilot test for the edges demo.
2798+
2799+ [ Albert Astals ]
2800+ * Don't show the manage dash pull up arrow on temp scopes (LP:
2801+ #1401869)
2802+ * Remove hack, newer Qt already support keyClick(char)
2803+ * Tests: Add Qt 5.5 removal TODOs
2804+ * Make sure we use fPIC when compiling files for the static library
2805+ too
2806+ * Make sure changing a scope doesn't trigger creation/destruction of
2807+ delegates until it's finished (LP: #1410122)
2808+
2809+ [ Michael Zanetti ]
2810+ * patch debian/control file before using it to make it work with mk-
2811+ build-deps
2812+
2813+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 13 Jan 2015 20:58:08 +0000
2814+
2815+unity8 (8.02+15.04.20150109.2-0ubuntu1) vivid; urgency=low
2816+
2817+ [ Michał Sawicz ]
2818+ * We don't need the SIGSTOP in main() any more.
2819+ * Add a test to make sure the shell always starts disabled until it is
2820+ enabled by a complete PAM interaction.
2821+
2822+ [ Leo Arias ]
2823+ * Added an autopilot test for the edges demo.
2824+
2825+ [ Nick Dedekind ]
2826+ * Unhook Lights interface from indicator widgets (LP: #1385331)
2827+
2828+ [ Albert Astals ]
2829+ * Fix going to scopes when the Manage Dash is open (LP: #1403464)
2830+ * QSortFilterProxyModelQML -> UnitySortFilterProxyModelQML
2831+ * Clip the Scopes List header
2832+ * Fix ScopesList not being under finger
2833+ * Make waitForRendering with no item fail instead of crash
2834+ * Disable Dash horizontal scroll while Navigation InverseMouseArea is
2835+ pressed (LP: #1403048)
2836+ * Test: Make sure the mouse area is enabled before clicking into it
2837+ * Test: We actually need to click on the customBackButton and not on
2838+ backButton
2839+ * Test: By default mouseX act on the middle
2840+
2841+ [ Michael Terry ]
2842+ * Don't block handling power events on loading the greeter's qml and
2843+ the background image.
2844+ * Show OSK above the wizard. (LP: #1401213)
2845+ * Unify the name of the Greeter DBus test, make it use our standard
2846+ binary test macro (which also nicely exports xml results), and make
2847+ the test a little more robust against timing issues.
2848+ * Add a test to make sure the shell always starts disabled until it is
2849+ enabled by a complete PAM interaction.
2850+
2851+ [ Martin Pitt ]
2852+ * tests: Fix Notify.Notification.add_action invocation to work also
2853+ with unpatched libnotify API. (LP: #1223401)
2854+
2855+ [ Rodney Dawes ]
2856+ * Depend on :native version of g++ to allow cross-compiling to work.
2857+ (LP: #1353855)
2858+
2859+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 09 Jan 2015 10:43:06 +0000
2860+
2861+unity8 (8.02+15.04.20141216.1-0ubuntu1) vivid; urgency=low
2862+
2863+ [ Ubuntu daily release ]
2864+ * New rebuild forced
2865+
2866+ [ Albert Astals ]
2867+ * Need to wait until loaded is true to use the count property
2868+ * Manage Dash: Ellide properly
2869+
2870+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 16 Dec 2014 11:03:37 +0000
2871+
2872+unity8 (8.02+15.04.20141215.3-0ubuntu1) vivid; urgency=low
2873+
2874+ [ Albert Astals Cid ]
2875+ * ScopesList: Use the default scope style for the header
2876+
2877+ [ Daniel d'Andrada ]
2878+ * Refactor Dialogs.qml to use proper in-scene dialogs
2879+ * Make Greeter nicely handle being resized
2880+
2881+ [ Albert Astals ]
2882+ * Rework how we set the ranges so we get some more asynchronousity
2883+ from item views (LP: #1384374)
2884+ * clickscope is back to being unfavoritable (LP: #1400762)
2885+ * Fix clicking on the manage dash list after having moved the current
2886+ scope
2887+ * Make the drag range be a multiple of the drag "rate" value.
2888+ Workarounds https://bugs.launchpad.net/mir/+bug/1399690
2889+
2890+ [ Gerry Boland ]
2891+ * MockAppMan: emit SIGSTOP so AP test apps are run (LP: #1394208)
2892+
2893+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 15 Dec 2014 22:43:16 +0000
2894+
2895+unity8 (8.02+15.04.20141212.1-0ubuntu1) vivid; urgency=low
2896+
2897+ [ Ubuntu daily release ]
2898+ * New rebuild forced
2899+
2900+ [ Albert Astals ]
2901+ * Make Navigation work when "jumping" to the non root
2902+
2903+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 12 Dec 2014 12:28:10 +0000
2904+
2905+unity8 (8.02+15.04.20141211.2-0ubuntu1) vivid; urgency=medium
2906+
2907+ [ Michał Sawicz ]
2908+ * Bump version due to new Manage Dash
2909+
2910+ [ Gerry Boland ]
2911+ * [indicators] Fix positioning on panel resize.
2912+
2913+ [ Nick Dedekind ]
2914+ * [indicators] Fix positioning on panel resize.
2915+
2916+ [ Albert Astals ]
2917+ * Fix the Dash Header hamburger menu background color
2918+ * Fix tests (LP: #1400449)
2919+ * Allow pulling manage dash if there's no favorite scopes (LP:
2920+ #1400774)
2921+ * Manage Dash: Make store button work even if you have no favorites
2922+ (LP: #1400771)
2923+ * Make pot_file
2924+
2925+ [ CI Train Bot ]
2926+ * Resync trunk
2927+
2928+ [ Andrea Cimitan ]
2929+ * Remove dismiss timer in Launcher (LP: #1368778)
2930+
2931+ [ Michael Zanetti ]
2932+ * decrease opacity changes in spread, move it to a separate surface.
2933+ * Add an initial, rudimentary DesktopStage to get started
2934+ * Uninvert Launcher in Desktop Mode
2935+ * Add support for Wallpaper in Desktop stage
2936+ * Add window control buttons to panel for fullscreen applications
2937+
2938+ [ Rodney Dawes ]
2939+ * Add dependency on gir1.2-notify-0.7 to unity8-autopilot package.
2940+ (LP: #1400437)
2941+
2942+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 11 Dec 2014 13:25:44 +0000
2943+
2944+unity8 (8.01+15.04.20141205-0ubuntu1) vivid; urgency=low
2945+
2946+ [ CI Train Bot ]
2947+ * Resync trunk
2948+
2949+ [ Albert Astals ]
2950+ * Replace Scopes Overview by the new Manage Dash (LP: #1386698,
2951+ #1368670)
2952+
2953+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 05 Dec 2014 10:55:50 +0000
2954+
2955+unity8 (8.01+15.04.20141204-0ubuntu1) vivid; urgency=low
2956+
2957+ [ Michael Terry ]
2958+ * Import wizard code from ubuntu-system-settings.
2959+ * Convert the welcome wizard from a separate executable into a qml
2960+ plugin (with a small C++ plugin for support).
2961+ * Add tests for welcome wizard.
2962+
2963+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 04 Dec 2014 20:55:11 +0000
2964+
2965+unity8 (8.01+15.04.20141202-0ubuntu1) vivid; urgency=low
2966+
2967+ [ Michael Terry ]
2968+ * Make sure that there is no window of opportunity for swiping away
2969+ greeter before the lockscreen appears.
2970+ * Don't allow dragging the greeter out from the left edge if it's
2971+ hidden there. (LP: #1372952)
2972+
2973+ [ Michał Sawicz ]
2974+ * Move from Theme colour to direct UbuntuColors.orange for activity
2975+ indicator and preview buttons
2976+
2977+ [ Albert Astals ]
2978+ * Use QImageReader not to load the image into memory twice (LP:
2979+ #1384374)
2980+ * Don't create the whole current scope delegates, just height * 3 (LP:
2981+ #1384393, #1384374)
2982+ * Make CroppedImageSizer async
2983+ * Use ubuntu::connectivity::NetworkingStatus instead of
2984+ QNetworkConfigurationManager
2985+ * Compile with Qt 5.4 (LP: #1395636)
2986+
2987+ [ Michael Zanetti ]
2988+ * close previews and temp scopes on left edge/BFB (LP: #1391798)
2989+ * make spread reversible (LP: #1368668, #1355284, #1368677)
2990+
2991+ [ Andrea Cimitan ]
2992+ * Different drag behaviour for not closable apps in spread (LP:
2993+ #1368287)
2994+
2995+ [ Daniel d'Andrada ]
2996+ * Make UnityTestCase.touchFlick properly map event coordinates
2997+
2998+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 02 Dec 2014 09:26:49 +0000
2999+
3000+unity8 (8.01+15.04.20141125.2-0ubuntu1) vivid; urgency=low
3001+
3002+ [ Michael Zanetti ]
3003+ * improve snapping after dragging
3004+ * Make the launcher BFB rounded on one end (LP: #1382596)
3005+ * disable swipeToClose while some snapping is happening (LP: #1378938)
3006+ * increase threshold and avoid jumping in SpreadDelegate dragging (LP:
3007+ #1352842, #1350803)
3008+
3009+ [ Ying-Chun Liu ]
3010+ * Notifications should be on right side when wide. (LP: 1379384) (LP:
3011+ #1379384)
3012+
3013+ [ Albert Astals ]
3014+ * Fix qml warnings
3015+ * Fix some qmluitests
3016+
3017+ [ Lars Uebernickel ]
3018+ * Use Icon instead of StatusIcon
3019+
3020+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 25 Nov 2014 13:54:47 +0000
3021+
3022+unity8 (8.01+15.04.20141117-0ubuntu1) vivid; urgency=low
3023+
3024+ [ josharenson ]
3025+ * Return focus to the application after a tusted session overlay is
3026+ closing. (LP: #1381292)
3027+
3028+ [ Josh Arenson ]
3029+ * Return focus to the application after a tusted session overlay is
3030+ closing. (LP: #1381292)
3031+
3032+ [ Albert Astals ]
3033+ * Remove unused ResponsiveFlowView
3034+ * Fix a few cmake warnings when running ./build.sh in a clean checkout
3035+
3036+ [ Mirco Müller ]
3037+ * Make sure non-square icons are not cropped. (LP: #1378417)
3038+
3039+ [ Michael Terry ]
3040+ * Drop the "EARLY ALPHA" scare label when running in testing mode.
3041+
3042+ [ Michael Zanetti ]
3043+ * unify Greeter and Lockscreen wallpaper again
3044+ * hide quicklist when launcher hides (LP: #1387088)
3045+ * Keep applications suspended while lockscreen is shown (LP: #1378126)
3046+ * change spread background color to 111111
3047+
3048+ [ Omer Akram ]
3049+ * show password when tapped on the 'Show password' label, not just the
3050+ checkbox. (LP: #1389832)
3051+
3052+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 17 Nov 2014 13:48:33 +0000
3053+
3054+unity8 (8.01+15.04.20141107.2-0ubuntu2) vivid; urgency=medium
3055+
3056+ * No-change rebuild against Qt 5.3.2.
3057+
3058+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Sat, 08 Nov 2014 13:50:11 +0200
3059+
3060+unity8 (8.01+15.04.20141107.2-0ubuntu1) vivid; urgency=low
3061+
3062+ [ Michael Terry ]
3063+ * Skip second SIM unlock dialog if user presses Emergency Call on
3064+ first one (LP: #1387925)
3065+
3066+ [ Michael Zanetti ]
3067+ * fix positive/negative answer order on the new swipe notification
3068+ (LP: #1358343)
3069+ * Update PageHeader to use new SDK api
3070+ * antialias surfaces when in spread (LP: #1351559)
3071+
3072+ [ Albert Astals ]
3073+ * Remove Hud
3074+
3075+ [ Mirco Müller ]
3076+ * Replace ComboButton in snap-decision notifications, used for
3077+ additional actions (> 3 actions), with custom widget immune to
3078+ accidental taps. (LP: #1384730)
3079+
3080+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 07 Nov 2014 14:33:02 +0000
3081+
3082+unity8 (8.01+15.04.20141104-0ubuntu1) vivid; urgency=low
3083+
3084+ [ Sebastien Bacher ]
3085+ * Drop workaround, it's not needed and create issues for desktop-next
3086+ (LP: #1387671)
3087+
3088+ [ Albert Astals ]
3089+ * Do not append integer to char *
3090+ * Remove unused end() function
3091+ * Update build.sh
3092+ * Fix i18n
3093+
3094+ [ Michael Zanetti ]
3095+ * rework launcher quicklist visuals to fit new design (LP: #1368660)
3096+ * Fix DBusVariant conversion for launcher emblems (LP: #1387261)
3097+ * Fix desktop file encoding in launcher (LP: #1387083)
3098+ * Add a hinting animation to indicate changes in the backend (LP:
3099+ #1376707)
3100+
3101+ [ Alberto Aguirre ]
3102+ * Add audioRole to QtMultimedia mock
3103+ * Add a plugin to take screenshots on vol up + vol down
3104+
3105+ [ CI bot ]
3106+ * Fix relative time formatter when using non-UTC timezone. (LP:
3107+ #1378821)
3108+
3109+ [ Leo Arias ]
3110+ * Removed the tests for the alternate paths of the autopilot helpers.
3111+
3112+ [ Nick Dedekind ]
3113+ * Fix relative time formatter when using non-UTC timezone. (LP:
3114+ #1378821)
3115+ * Reset current item selection on deleted. (LP: #1378462)
3116+ * Added timer to re-assert server value after indicator menu item
3117+ activation. (LP: #1336715)
3118+
3119+ [ Mirco Müller ]
3120+ * Added dedicated swipe-to-act button for snap-decisions, which avoids
3121+ accidental taps/button-presses. (LP: #1358343)
3122+
3123+ [ Chris Gagnon ]
3124+ * add missing unity-scope-click dependancy to unity8-autopilot package
3125+ (LP: #1336276)
3126+
3127+ [ Michael Terry ]
3128+ * Don't lock phone if user tries to switch back to an active call.
3129+ (LP: #1388156)
3130+
3131+ [ Daniel d'Andrada ]
3132+ * DirectionalDragArea: Update TODO comment in light of new events
3133+ * TouchDispatcher: synthesize MouseButtonDblClick events
3134+
3135+ [ Leonardo Arias Fonseca ]
3136+ * Removed the tests for the alternate paths of the autopilot helpers.
3137+
3138+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 04 Nov 2014 12:56:08 +0000
3139+
3140+unity8 (8.01+15.04.20141030-0ubuntu1) vivid; urgency=medium
3141+
3142+ [ Michael Terry ]
3143+ * Provide 'passphrase' as a field of Components.Lockscreen
3144+ * Fix a race between Qml loading and DBus registration that caused
3145+ problems when jenkins tried to unlock the phone.
3146+ * Set domain explicitly for the Dialogs component because the welcome
3147+ wizard wants to import it. (LP: #1381731)
3148+ * When greeter or lockscreen has focus, show active call panel. (LP:
3149+ #1378872)
3150+
3151+ [ Ted Gould ]
3152+ * Set the default OOM score for the dash (LP: #1379786)
3153+
3154+ [ Michał Sawicz ]
3155+ * Revert lp:~unity-team/unity8/flickables-speed-workaround to avoid
3156+ risk in RTM.
3157+ * Updated behaviour for zoomable image, workaround for sourcesize (LP:
3158+ #1333187)
3159+
3160+ [ Michael Frey ]
3161+ * Added a check for Proximity to determine if we show the lock screen.
3162+ (LP: #1378012)
3163+
3164+ [ Ying-Chun Liu ]
3165+ * Add non-interactive code into GenericScopeView. (LP: #1384441)
3166+
3167+ [ Mirco Müller ]
3168+ * Also use modal nature of snap-decision notifications when
3169+ greeter/lockscreen is shown. This fixes LP: #1378827. (LP: #1378827)
3170+
3171+ [ Michael Zanetti ]
3172+ * Make the launcher update on dconf changes (LP: #1376707)
3173+ * exit spread on background tap (LP: #1368261)
3174+ * Use an index instead of a scope id in DashCommunicator (LP:
3175+ #1376044)
3176+
3177+ [ Andrea Cimitan ]
3178+ * Updated behaviour for zoomable image, workaround for sourcesize (LP:
3179+ #1333187)
3180+
3181+ [ Daniel d'Andrada ]
3182+ * Make TouchGate synthesize QMouseEvents for mouse-based target items
3183+ * Don't specify a distanceThreshold as it conflicts with
3184+ hintDisplacment
3185+
3186+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 30 Oct 2014 21:43:42 +0000
3187+
3188+unity8 (8.00+15.04.20141030-0ubuntu1) vivid; urgency=low
3189+
3190+ [ josharenson ]
3191+ * Fix lp:1370240 by making stages interactive when a snap decision is
3192+ dismissed. (LP: #1370240)
3193+
3194+ [ Nick Dedekind ]
3195+ * remove qml ownership confusion for caching unitymenumodels (LP:
3196+ #1368856)
3197+ * Implementation of expandable panel design (LP: #1368856)
3198+
3199+ [ Albert Astals ]
3200+ * CardAttributes: Specify column and row since the gridlayout gets
3201+ confused sometimes (LP: #1381092)
3202+ * Reset VerticalJournal until the cardTool settles (LP: #1381255)
3203+
3204+ [ Mirco Müller ]
3205+ * Added synchronous/confirmation notification support to unity8. (LP:
3206+ #1232633)
3207+
3208+ [ Michael Zanetti ]
3209+ * Fix lp:1370240 by making stages interactive when a snap decision is
3210+ dismissed. (LP: #1370240)
3211+ * Drop all visual indication of "pinning" (LP: #1381054)
3212+
3213+ [ Antti Kaijanmäki ]
3214+ * Unlock all modems on boot. (LP: #1333121)
3215+
3216+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 30 Oct 2014 10:51:17 +0000
3217+
3218+unity8 (8.00+14.10.20141013.2-0ubuntu1) utopic; urgency=low
3219+
3220+ [ Michael Terry ]
3221+ * Don't show initial lockscreen during the edge demo. The user just
3222+ set up their phone with a password, it's pointless to ask them
3223+ again. (LP: #1358283)
3224+ * Distinguish between incoming calls and other dialer-app opens. (LP:
3225+ #1378218) (LP: #1378218)
3226+
3227+ [ Andrea Cimitan ]
3228+ * Fix flickable speed to be resolution independent, by subclassing
3229+ components (LP: #1348557)
3230+
3231+ [ Michał Sawicz ]
3232+ * Fix the ShellWithPin test and some functionality.
3233+
3234+ [ Albert Astals ]
3235+ * Move Base.qml to DashCategoryBase
3236+ * Fix first item positioning when m_clipItem->y() is not 0 (LP:
3237+ #1251597)
3238+ * Fix some small qml warnings
3239+
3240+ [ Daniel d'Andrada ]
3241+ * Add touch ownership logic on top of qt input handling
3242+
3243+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 13 Oct 2014 15:43:03 +0000
3244+
3245+unity8 (8.00+14.10.20141009.4-0ubuntu1) utopic; urgency=low
3246+
3247+ [ Michał Sawicz ]
3248+ * Rename datetime indicator in test
3249+
3250+ [ Albert Astals ]
3251+ * Close overview temp scope on show dash (LP: #1373819)
3252+ * Enable QT_STRICT_ITERATORS
3253+ * Make Base not clickable, since we don't use it in anywhere clickable
3254+ (we only use it for Category delegates in the LVWPH) (LP: #1300709)
3255+ * Hide preview if it was visible when going to a scope (LP: #1374548)
3256+ * Remove contentScale variable
3257+
3258+ [ Andrea Cimitan ]
3259+ * Fix card implicitHeight when summary is declared, but its text is
3260+ empty. Also fixes vertical journal height and clipping (LP:
3261+ #1362160)
3262+ * Redesign for pinned apps. Remove thindivider on top of ubuntu dash
3263+ button (not needed anymore) (LP: #1377100)
3264+
3265+ [ Ying-Chun Liu ]
3266+ * Fix run_on_device.sh to let it run again.
3267+
3268+ [ Nick Dedekind ]
3269+ * Fixed indicator menu bindings to server toggle value broken by user
3270+ interaction. (LP: #1336715)
3271+ * Force rendering so we don't get stuck in "waitForRendering" loop in
3272+ tests.
3273+
3274+ [ Daniel d'Andrada ]
3275+ * PhoneStage: focus the new topmost app after the current one closes
3276+ itself (LP: #1375267)
3277+
3278+ [ Michael Terry ]
3279+ * Fix some security issues with the tablet greeter, which allowed the
3280+ lockscreen to be bypassed. (LP: #1367715) (LP: #1367715)
3281+
3282+ [ Michael Zanetti ]
3283+ * scale down errorText label if necessary (LP: #1378848)
3284+
3285+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 09 Oct 2014 14:05:54 +0000
3286+
3287+unity8 (8.00+14.10.20141008-0ubuntu1) utopic; urgency=low
3288+
3289+ [ Michael Zanetti ]
3290+ * Dual SIM pin unlocking. Hook up the UI to the backend. (LP:
3291+ #1267135)
3292+
3293+ [ Antti Kaijanmäki ]
3294+ * Dual SIM pin unlocking. Hook up the UI to the backend. (LP:
3295+ #1267135)
3296+
3297+ [ Ubuntu daily release ]
3298+ * New rebuild forced
3299+
3300+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 08 Oct 2014 09:41:32 +0000
3301+
3302+unity8 (8.00+14.10.20141006-0ubuntu1) utopic; urgency=low
3303+
3304+ [ Andrea Cimitan ]
3305+ * Tweak card header to match the spec
3306+ * Add preview image slideshow (LP: #1351537)
3307+
3308+ [ Michał Sawicz ]
3309+ * Cache more things in memory, so flicking scopes should be faster
3310+ (LP: #1336724)
3311+ * Tweak card header to match the spec
3312+ * Save texture memory by limiting sourceSize (LP: #1338430)
3313+
3314+ [ Ying-Chun Liu ]
3315+ * Add attributes to Preview. (LP: #1282460)
3316+
3317+ [ Albert Astals ]
3318+ * Update pot
3319+ * Cache more things in memory, so flicking scopes should be faster
3320+ (LP: #1336724)
3321+ * Save texture memory by limiting sourceSize (LP: #1338430)
3322+ * Clip the settings list
3323+ * Fix unlocking from the left again
3324+ * Add wait_ makes tests more reliable
3325+
3326+ [ Michael Zanetti ]
3327+ * fix fading out the launcher instead of sliding it out on left-edge
3328+ minimizing an app.
3329+ * Make the DashCommunicator async and more flexible to handle a
3330+ lifecycle-suspended dash (LP: #1339883)
3331+
3332+ [ Michael Terry ]
3333+ * Retry unlock-device script if it fails, as there is always a risk of
3334+ a small race with boot-up. (LP: #1370644)
3335+ * Add pull-to-refresh functionality to scopes. (LP: #1368336)
3336+
3337+ [ CI bot ]
3338+ * Resync trunk
3339+
3340+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 06 Oct 2014 08:03:23 +0000
3341+
3342+unity8 (8.00+14.10.20140930.2-0ubuntu1) utopic; urgency=low
3343+
3344+ [ Alexandros Frantzis ]
3345+ * Remove stale trusted socket before starting unity8 from upstart (LP:
3346+ #1371597) (LP: #1371597)
3347+
3348+ [ CI bot ]
3349+ * Resync trunk
3350+
3351+ [ Andrea Cimitan ]
3352+ * Move activity indicator on top of keyboard (LP: #1354519)
3353+
3354+ [ Gerry Boland ]
3355+ * Cleanup: Remove unused member and fix small syntax error in
3356+ OrientationLock
3357+
3358+ [ josharenson ]
3359+ * Fix lp:1367894 by correcting how the minute value is calculated in
3360+ the panel. (LP: #1367894)
3361+
3362+ [ Nick Dedekind ]
3363+ * Fixed DefaultIndicatorPage test. Fixed warnings from test.
3364+
3365+ [ Ying-Chun Liu ]
3366+ * Remove maxLineCount in preview. (LP: 1328513) (LP: #1328513)
3367+
3368+ [ Michael Terry ]
3369+ * Fix some code that accidentally landed in trunk before it got
3370+ cleaned up. The current code just has some duplication to it that
3371+ should be unified.
3372+ * Implement latest visual designs for passphrase lockscreen.
3373+ * Make it easier to use the Lockscreen component from the welcome
3374+ wizard.
3375+ * Limit how much memory we reserve for the greeter background image,
3376+ allowing giant images to appear correctly.
3377+
3378+ [ Daniel d'Andrada ]
3379+ * Add gdbTestComponentName build targets
3380+
3381+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 30 Sep 2014 16:57:28 +0000
3382+
3383+unity8 (8.00+14.10.20140926-0ubuntu1) utopic; urgency=low
3384+
3385+ [ CI bot ]
3386+ * Resync trunk
3387+
3388+ [ Nick Dedekind ]
3389+ * Visual changes for indicator RTM polishing (LP: #1329289)
3390+
3391+ [ Ubuntu daily release ]
3392+ * New rebuild forced
3393+
3394+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 26 Sep 2014 19:12:39 +0000
3395+
3396+unity8 (8.00+14.10.20140923-0ubuntu1) utopic; urgency=low
3397+
3398+ [ Michael Zanetti ]
3399+ * fix swiping away the launcher from the left edge
3400+ * fix indicators AP test
3401+
3402+ [ Florian Boucault ]
3403+ * New Splash screen implementation that fakes real app
3404+
3405+ [ Albert Astals ]
3406+ * We need this in build-depends so that qmluitests pass in CI
3407+
3408+ [ Daniel d'Andrada ]
3409+ * New Splash screen implementation that fakes real app
3410+
3411+ [ Michael Terry ]
3412+ * Fix LC_ALL and test harder by making both manual runs of
3413+ timeformattertest and the whole test suite use the same locale
3414+ settings.
3415+
3416+ [ CI bot ]
3417+ * Resync trunk
3418+
3419+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 23 Sep 2014 09:26:18 +0000
3420+
3421+unity8 (8.00+14.10.20140918.3-0ubuntu1) utopic; urgency=low
3422+
3423+ [ Michał Sawicz ]
3424+ * Add -windowgeometry option to the Dash and drop any user-visible
3425+ mentions of Dash
3426+ * Dash: Fix issue when expanding a category and collapsing another one
3427+ at the same time.
3428+
3429+ [ Albert Astals ]
3430+ * Dash: Fix issue when expanding a category and collapsing another one
3431+ at the same time.
3432+ * Make the categoryView invisible when we are in the preview mode (LP:
3433+ #1341205)
3434+ * Pixel pushing in the dash header (LP: #1365929)
3435+
3436+ [ Ying-Chun Liu ]
3437+ * Re-add restart button for power menu. (LP: 1358197) (LP: #1358197)
3438+
3439+ [ Marcus Tomlinson ]
3440+ * Don't show a preview if a null response is returned from
3441+ scope.preview(result)
3442+
3443+ [ Mirco Müller ]
3444+ * Don't limit the number of text-lines for body-text. (LP: #1369438)
3445+
3446+ [ Michael Zanetti ]
3447+ * Don't hide launcher when nothing happens on long left edge swipes
3448+ (LP: #1357333)
3449+ * Rework LauncherBackend
3450+
3451+ [ Michael Terry ]
3452+ * When running qmluitests, make sure that they use LANGUAGE=C, fixing
3453+ a test failure when running locally in the US.
3454+
3455+ [ Daniel d'Andrada ]
3456+ * Some ApplicationWindow test improvements
3457+
3458+ [ Rodney Dawes ]
3459+ * Check purchase state to determine if purchase was cancelled and hide
3460+ progress. (LP: #1362622)
3461+
3462+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 18 Sep 2014 21:26:42 +0000
3463+
3464+unity8 (8.00+14.10.20140918-0ubuntu1) utopic; urgency=low
3465+
3466+ [ Michael Zanetti ]
3467+ * Focus first app if there are already some running when we're
3468+ starting up (LP: #1339883)
3469+
3470+ [ Michał Sawicz ]
3471+ * Don't play empty urls in Notification.qml
3472+
3473+ [ Daniel d'Andrada ]
3474+ * Improve tst_Shell
3475+ * Build without any warnings
3476+ * Make tst_Card work from outside the source tree (LP:1359201) (LP:
3477+ #1359201)
3478+
3479+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 18 Sep 2014 09:44:06 +0000
3480+
3481+unity8 (8.00+14.10.20140910.1-0ubuntu1) utopic; urgency=low
3482+
3483+ [ Pete Woods ]
3484+ * Disable OEM and Click scopes when system scopes are disabled
3485+
3486+ [ CI bot ]
3487+ * Resync trunk
3488+
3489+ [ Pawel Stolowski ]
3490+ * Set UNITY_SCOPES_NO_FAVORITES environment variable to make scopes
3491+ plugin ignore favorite scopes and fix basic functionality of unity-
3492+ scope-tool.
3493+
3494+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 10 Sep 2014 08:53:57 +0000
3495+
3496+unity8 (8.00+14.10.20140908.1-0ubuntu1) utopic; urgency=low
3497+
3498+ [ Michał Sawicz ]
3499+ * Use a single white pixel instead of the heavier checkers image.
3500+ * Add support to unlock-device for the new adbd coming down the
3501+ pipeline. Also fix autopilot tests and run scripts for that.
3502+ * Make LVWPH non interactive while on header animation
3503+ * Improve references to scope/scopeStyle in PreviewListView and
3504+ PageHeader, add tests.
3505+
3506+ [ Nick Dedekind ]
3507+ * Support for nested prompt session. (LP: #1358388)
3508+
3509+ [ Albert Astals ]
3510+ * Remove unused hasAttributes variable
3511+ * Disable dash overview if in temp scope preview
3512+ * Block mouse events under scope overview bottombar (LP: #1362206)
3513+ * Fix regression in focus handling due to SDK change
3514+ * Fix warning 'Background.qml:81:21: Unable to assign bool to QUrl'
3515+ * Fix launcher internationalization
3516+ * Make swipe and home button press in the launcher dismiss the
3517+ overview
3518+ * GSV: Use proper variable since altnav renames
3519+ * Fix some "Cannot read property 'luminance' of null" warnings
3520+ * Make LVWPH non interactive while on header animation
3521+
3522+ [ Mirco Müller ]
3523+ * Implemented the needed visual updates on notifications requested by
3524+ Design for RTM. (LP: #1348092)
3525+
3526+ [ Michael Terry ]
3527+ * Don't show greeter when screen turns off during a call, even if
3528+ proximity sensor isn't active. (LP: #1347001)
3529+ * Add support to unlock-device for the new adbd coming down the
3530+ pipeline. Also fix autopilot tests and run scripts for that.
3531+
3532+ [ Michael Zanetti ]
3533+ * open the application when clicking on the title entry in the
3534+ quicklist (LP: #1336380)
3535+ * Don't animate x while dragging apps from the left edge (LP:
3536+ #1360105)
3537+
3538+ [ Diego Sarmentero ]
3539+ * Reset button state on cancel (LP: #1362622)
3540+
3541+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 08 Sep 2014 14:16:42 +0000
3542+
3543+unity8 (8.00+14.10.20140903.1-0ubuntu1) utopic; urgency=low
3544+
3545+ [ Nick Dedekind ]
3546+ * Support for nested prompt session. (LP: #1358388)
3547+
3548+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 03 Sep 2014 07:58:49 +0000
3549+
3550+unity8 (8.00+14.10.20140828.1-0ubuntu1) utopic; urgency=low
3551+
3552+ [ Michael Terry ]
3553+ * Reverse default for the user option "allow launcher/panel in greeter
3554+ when locked." And allow that property to be controlled by an
3555+ AccountsService property. (LP: #1358340) (LP: #1358340)
3556+ * With recent password support, we want to be able to unlock the
3557+ device even with a password set. And we need to be able to do this
3558+ once the new adbd lands. So I've added a DBus command to hide the
3559+ greeter. This should be secure because all apps are constrained and
3560+ if you're on the local session bus unconstrained, you already have
3561+ access to anything you want.
3562+
3563+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 28 Aug 2014 20:06:41 +0000
3564+
3565+unity8 (8.00+14.10.20140827.2-0ubuntu1) utopic; urgency=low
3566+
3567+ [ Michał Sawicz ]
3568+ * Implement scope header customization options
3569+ * Don't ignore empty attributes in CardAttributes.qml and improve its
3570+ encapsulation (LP: #1355901)
3571+ * Add support for preview button color customization. Deprecate
3572+ support for action icons.
3573+ * Add table preview widget
3574+ * Make "See Less" get stuck at the bottom of the view
3575+ * Support alternative navigation in the dash.
3576+ * Add scope settings UI
3577+ * Add scope favoriting support
3578+ * Passcode, not PIN (LP: #1361114)
3579+
3580+ [ Jussi Pakkanen ]
3581+ * Use nullptr instead of NULL.
3582+
3583+ [ Albert Astals ]
3584+ * Add table preview widget
3585+ * Make "See Less" get stuck at the bottom of the view
3586+ * Support alternative navigation in the dash.
3587+ * Make the PageHeaderLabelTest pass under valgrind
3588+
3589+ [ Benjamin Zeller ]
3590+ * Add support for scope:// url in the dash (LP: #1361349)
3591+
3592+ [ Marcus Tomlinson ]
3593+ * Handle the openScope signal in "tempScopeItem" (ScopesOverview.qml)
3594+ as is done with "scopeItem" (Dash.qml) (LP: #1356410)
3595+
3596+ [ Daniel d'Andrada ]
3597+ * Make "See Less" get stuck at the bottom of the view
3598+
3599+ [ Andrea Cimitan ]
3600+ * Fix right padding on overlay card
3601+ * Add scope settings UI
3602+
3603+ [ Michael Zanetti ]
3604+ * use a smaller asset for the app's dropshadow (LP: #1359157)
3605+
3606+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 27 Aug 2014 15:37:05 +0000
3607+
3608+unity8 (8.00+14.10.20140825.3-0ubuntu1) utopic; urgency=low
3609+
3610+ [ Daniel d'Andrada ]
3611+ * SpreadDelegate - properly transition between splash screen, surface
3612+ and screenshot
3613+
3614+ [ Michał Sawicz ]
3615+ * Rename Ubuntu.Connectivity to Unity.Connectivity to avoid name clash
3616+
3617+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 25 Aug 2014 13:10:57 +0000
3618+
3619+unity8 (8.00+14.10.20140822-0ubuntu1) utopic; urgency=low
3620+
3621+ [ Albert Astals ]
3622+ * More stable dash overview tests
3623+ * PreviewExpandable: "widgets" is a model, not an array
3624+
3625+ [ Alberto Aguirre ]
3626+ * Proxy inactivity timeout values from gsettings into Unity.Screen
3627+ (LP: #1230345)
3628+
3629+ [ Gerry Boland ]
3630+ * Cancel open PAM interactions on shutdown - fixes hang on logout on
3631+ desktop (LP: #1353041)
3632+
3633+ [ Diego Sarmentero ]
3634+ * Show progress bar on payment button click The payment process has a
3635+ small delay before the UI comes up which might cause confusion. Show
3636+ a progress bar with unknown value to indicate activity. (LP:
3637+ #1354139)
3638+
3639+ [ Mirco Müller ]
3640+ * Made notification qml-test pass again by using Component.onCompleted
3641+ instead of onOpacityChanged for the time being.
3642+
3643+ [ Michael Zanetti ]
3644+ * Implement new lockscreen designs
3645+
3646+ [ Michael Terry ]
3647+ * Show the SIM unlock dialog immediately after booting, and enable its
3648+ emergency call button.
3649+ * Always keep indicator/launcher locked state in sync with whether the
3650+ user is authenticated. (LP:# 1357230) (LP: #1357230)
3651+ * Allow logging into a desktop or tablet session again, by properly
3652+ dismissing old PAM conversations. (LP: #1350878) In a desktop or
3653+ tablet, we were accidentally starting two PAM conversations in
3654+ sequence on startup. Which is a small bug; it shouldn't normally be
3655+ a problem, since each new PAM conversation should kill the old
3656+ one.But the way we were killing the old one was subject to a thread
3657+ race condition. See, a PAM conversation thread won't exit until all
3658+ its prompts are answered. And what we do when we kill a PAM
3659+ conversation is to answer all prompts with empty strings.But it's
3660+ possible that when we want to kill a PAM conversation that it hasn't
3661+ actually gotten to the point of prompting us yet. And when those
3662+ prompts do come through, we were treating them as prompts for the
3663+ new PAM conversation.So I've changed the PAM conversation logic to
3664+ include a pam_handle and compare the handle with the current handle
3665+ when being prompted. If it's an old handle, we just dismiss the
3666+ prompt with an empty string response.Oh, and I fixed the bug that
3667+ caused two prompts on startup in the first place. (But we still need
3668+ the above logic anyway, for when you switch users quickly.) (LP:
3669+ #1350878)
3670+
3671+ [ Martin Pitt ]
3672+ * Mark for using language packs.
3673+
3674+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 22 Aug 2014 09:29:41 +0000
3675+
3676+unity8 (8.00+14.10.20140820-0ubuntu1) utopic; urgency=low
3677+
3678+ [ CI bot ]
3679+ * Resync trunk
3680+
3681+ [ Nick Dedekind ]
3682+ * Fixed CachedUnityMenuModel destruction unhinging indicators. (LP:
3683+ #1328646)
3684+
3685+ [ Mirco Müller ]
3686+ * Temporarily disable any opacity-animation for notifications to
3687+ unblock the train due to LP: 1354406. (LP: #1354406)
3688+
3689+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 20 Aug 2014 20:03:55 +0000
3690+
3691+unity8 (8.00+14.10.20140817-0ubuntu1) utopic; urgency=low
3692+
3693+ [ CI bot ]
3694+ * Resync trunk
3695+
3696+ [ Michał Sawicz ]
3697+ * Fix dash overview test and prevent crash in mock ApplicationInfo's
3698+ d'tor. tryCompareFunction didn't work because .item threw.
3699+
3700+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Sun, 17 Aug 2014 00:37:35 +0000
3701+
3702+unity8 (8.00+14.10.20140815.1-0ubuntu1) utopic; urgency=low
3703+
3704+ [ Michael Terry ]
3705+ * Bring dialer to front on incoming call even when device is locked
3706+ (LP: #1354532)
3707+
3708+ [ CI bot ]
3709+ * Resync trunk
3710+
3711+ [ Michał Sawicz ]
3712+ * Use palette's baseText for text colour in dash.
3713+ * Update qmltypes definitions
3714+ * Move PageHeader out of qml/Components into qml/Dash
3715+ * Reshuffle and update dependencies
3716+ * Fix cardtool test and make card creator output debugging info on
3717+ errors.
3718+ * Support previews for scopes in overview and hook up preview
3719+ processing to activity indicator.
3720+ * Fix notifications indicator title
3721+ * Fix horizontal list activation and add test for it.
3722+
3723+ [ Ying-Chun Liu ]
3724+ * Add button colors and i18n for power off dialog. (LP: #1354506)
3725+
3726+ [ Mirco Müller ]
3727+ * Force plain-text rendering for summary- and body-text. (LP:
3728+ #1335787)
3729+
3730+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 15 Aug 2014 17:38:07 +0000
3731+
3732+unity8 (8.00+14.10.20140814.1-0ubuntu1) utopic; urgency=low
3733+
3734+ [ Michael Terry ]
3735+ * Add --lightdm= argument to ./run.sh that lets developers choose
3736+ which lightdm backend to use. Stop letting a user that is
3737+ immediately denied via PAM into the shell by fixing some assumptions
3738+ that a user which was not prompted was successfully authenticated.
3739+ This is not a common situation, you'd have to manually change your
3740+ PAM config. Fix a small console warning .
3741+ * Make wrong-password handling much nicer by showing a pretty spinner
3742+ while we wait for PAM, by improving the prompt text to match
3743+ designs, by forcing the user to wait five seconds after every five
3744+ failed attemps, and by supporting (but not yet enabling) an opt-in
3745+ "factory-reset your phone after X failed attemps" feature.
3746+
3747+ [ Michael Zanetti ]
3748+ * bring back network caching in dash (LP: #1355729)
3749+
3750+ [ Michał Sawicz ]
3751+ * Add --lightdm= argument to ./run.sh that lets developers choose
3752+ which lightdm backend to use. Stop letting a user that is
3753+ immediately denied via PAM into the shell by fixing some assumptions
3754+ that a user which was not prompted was successfully authenticated.
3755+ This is not a common situation, you'd have to manually change your
3756+ PAM config. Fix a small console warning .
3757+ * Fix anchor in PreviewListView.qml.
3758+ * Make wrong-password handling much nicer by showing a pretty spinner
3759+ while we wait for PAM, by improving the prompt text to match
3760+ designs, by forcing the user to wait five seconds after every five
3761+ failed attemps, and by supporting (but not yet enabling) an opt-in
3762+ "factory-reset your phone after X failed attemps" feature.
3763+ * Add new horizontal list category layout. (LP: #1352226)
3764+ * Fix qml tests - loader around PageHeader, more retries for selecting
3765+ a scope and undefined attributes in mock overview scope.
3766+
3767+ [ Leo Arias ]
3768+ * Added autopilot helpers and tests for the launcher and dash icon.
3769+ * Added an autopilot helper to click a scope item.
3770+ * Added an autopilot test for focusing an app clicking the icon on the
3771+ launcher.
3772+
3773+ [ Mirco Müller ]
3774+ * Allow ENTER/RETURN in a TextField to accept a snap-decision
3775+ notification. (LP: #1305885)
3776+
3777+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 14 Aug 2014 01:29:55 +0000
3778+
3779+unity8 (8.00+14.10.20140811-0ubuntu1) utopic; urgency=low
3780+
3781+ [ Andrea Cimitan ]
3782+ * Add emblem support in dash cards.
3783+
3784+ [ Michael Terry ]
3785+ * Fix a variety of design nits with the current lockscreen: * disable
3786+ indicators and launcher when locked * when reversing the direction
3787+ of a greeter flick, treat it as a cancel * don't animate dots when
3788+ changing the infographic data source * make cancelling a login
3789+ nicer: * reduce the delay before greeter starts animating * show the
3790+ greeter from the same side of the screen that it hid to * don't re-
3791+ animate the infographic (LP: #1351027)
3792+
3793+ [ Stephen M. Webb ]
3794+ * enables the unity8 upstart job for desktop sessions (LP: #1353041)
3795+
3796+ [ Albert Astals ]
3797+ * Dash Overview (LP: #1317683)
3798+ * GenericScopeView: On click only activate scope:// uris and
3799+ clickscope items The rest of clicks result in a preview, also
3800+ scope:// uris don't get a preview
3801+ * Pass the scope search hint up to the search line
3802+
3803+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 11 Aug 2014 19:03:41 +0000
3804+
3805+unity8 (8.00+14.10.20140808-0ubuntu1) utopic; urgency=low
3806+
3807+ [ CI bot ]
3808+ * Resync trunk
3809+
3810+ [ Nick Dedekind ]
3811+ * Added application prompt surfaces to allow prompting application
3812+ which have not yet created a surface.
3813+
3814+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 08 Aug 2014 12:15:05 +0000
3815+
3816+unity8 (8.00+14.10.20140806.1-0ubuntu1) utopic; urgency=low
3817+
3818+ [ Michal Hruby ]
3819+ * Work with the scopes-v4 branch + departments->navigation renaming
3820+
3821+ [ Michał Sawicz ]
3822+ * Hardcode art shape size for click scope local and predefined
3823+ categories While at it, drop the fillmode of cards
3824+ * Use the correct API in PageHeader. (LP: #1353048)
3825+ * Refactor dash activity indicator. (LP: #1351539)
3826+
3827+ [ Albert Astals ]
3828+ * Dash Departments fixes Update maxHeight manually since it depends on
3829+ the position of the item and its parents and it can't know when the
3830+ binding has to be updated Make parent stuff non interactive when the
3831+ department list is shown
3832+ * PageHeader: when on search clip y-coordinates otherwise the
3833+ background spills out when on search (LP: #1350398)
3834+ * Dash: Implement OverlayColor support in Cards
3835+ * Hardcode art shape size for click scope local and predefined
3836+ categories While at it, drop the fillmode of cards
3837+ * Make test_departments test more stable There's various
3838+ DashDepartments on the dash, make sure we're working over the one
3839+ that is on screen, otherwise clicks don't end up where they should
3840+ * Work with the scopes-v4 branch + departments->navigation renaming
3841+ * Fixes for dash as app Load i18n catalog Process command line options
3842+ Add the posibility to have a mouse touch adaptor (LP: #1353351)
3843+ * Implement the Expandable Preview Widget Now TextSummary is not
3844+ expandable by itself anymore, you have to use it inside an
3845+ Expandable to get the behaviour
3846+ * Add test prefix to xml output, seems CI needs it
3847+
3848+ [ Antti Kaijanmäki ]
3849+ * Indicators: Adds new ModemInfoItem to be used with indicator-network
3850+ (LP: #1329204)
3851+
3852+ [ Michael Terry ]
3853+ * When the edge demo is running, don't show the greeter if the screen
3854+ is turned off. This avoids an odd interaction where parts of the
3855+ greeter are disabled but the edge demo isn't visible until you slide
3856+ the greeter away. (LP: #1283425)
3857+ * Don't hardcode the phablet password in our testing script.
3858+
3859+ [ Ying-Chun Liu ]
3860+ * Add divider dots.
3861+
3862+ [ Mirco Müller ]
3863+ * Make sure the TextField of a snap-decision notification has the
3864+ active focus upon creation, thus the osk shows up right away. (LP:
3865+ #1346867)
3866+
3867+ [ Andrea Cimitan ]
3868+ * Add touchdown effect to dash cards.
3869+ * Import Ubuntu.Components for preview image gallery to pick up
3870+ default flicking speeds.
3871+
3872+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 06 Aug 2014 19:40:05 +0000
3873+
3874+unity8 (8.00+14.10.20140805-0ubuntu1) utopic; urgency=low
3875+
3876+ [ Michael Zanetti ]
3877+ * Split the dash from the shell into a separate app (LP: #1232687)
3878+
3879+ [ Leo Arias ]
3880+ * Update the autopilot tests to work with the new dash app.
3881+
3882+ [ Daniel d'Andrada ]
3883+ * Split the dash from the shell into a separate app (LP: #1232687)
3884+
3885+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 05 Aug 2014 12:06:31 +0000
3886+
3887+unity8 (8.00+14.10.20140731.1-0ubuntu1) utopic; urgency=low
3888+
3889+ [ Gerry Boland ]
3890+ * Fix the run.sh script - pretend to be running with qtmir and emit
3891+ SIGSTOP at the right time
3892+
3893+ [ Ying-Chun Liu ]
3894+ * Implement Attribute UI. (LP: #1282460)
3895+
3896+ [ Albert Astals ]
3897+ * Hide search history popup as soon as you start typing As discussed
3898+ with Mike and Saviq
3899+ * Compile with for scopes-v3 unity-api
3900+ * PageHeader: Unfocus search field when search entry is selected
3901+ * Show search field if the search query changes
3902+ * Test: Add a condition for art.height being > 0 means stuff has
3903+ already been layouted a bit without it it can happen that we get 0
3904+ for everything at startup and tests still pass
3905+ * Remove leftover in test of an old headerless implementation
3906+
3907+ [ Michael Zanetti ]
3908+ * Drop Recent apps category from Dash (LP: #1281092)
3909+ * update launcher count emblems to match new spec (LP: #1338984)
3910+
3911+ [ Bill Filler ]
3912+ * disable predictive text for dash search field (LP: #1340409)
3913+
3914+ [ CI bot ]
3915+ * Resync trunk
3916+
3917+ [ Antti Kaijanmäki ]
3918+ * DefaultIndicatorPage: use Loader status to determine the visible
3919+ property. (LP: #1350555)
3920+
3921+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 31 Jul 2014 16:51:01 +0000
3922+
3923+unity8 (8.00+14.10.20140729.1-0ubuntu1) utopic; urgency=low
3924+
3925+ [ Michael Terry ]
3926+ * Check user's pin/password using PAM, instead of a plaintext keyfile.
3927+ New build dependency: libpam0g-dev for phone unlock with PAM (LP:
3928+ #1234983)
3929+
3930+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Jul 2014 23:36:30 +0000
3931+
3932+unity8 (8.00+14.10.20140729-0ubuntu1) utopic; urgency=medium
3933+
3934+ [ Gerry Boland ]
3935+ [ Daniel d'Andrada ]
3936+ * Re-architecture unity8 to use the QtMirCompositor library so that
3937+ the Qt scenegraph renderer is used as the Mir compositor, and
3938+ application surfaces are added to the QML scene as items.
3939+
3940+ [ Michael Zanetti ]
3941+ * Port phone right-edge spread code to use QtCompositor
3942+ * Add right-edge spread animation for tablet
3943+
3944+ [ Ubuntu daily release ]
3945+ * New rebuild forced
3946+
3947+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Jul 2014 15:07:32 +0000
3948+
3949+unity8 (7.90+14.10.20140725-0ubuntu1) utopic; urgency=low
3950+
3951+ [ CI bot ]
3952+ * Resync trunk
3953+
3954+ [ Michał Sawicz ]
3955+ * Fix the ap test for applications.
3956+
3957+ [ Albert Astals ]
3958+ * Use deleteLater instead of a direct delete We are seeing a crash in
3959+ QQuickWindowPrivate::polishItems because LVWPH is deleting items to
3960+ polish from it's updatePolish which means the set in
3961+ QQuickWindowPrivate::polishItems may end up with some yet-to-
3962+ process-but-now-deleted items. Switching to deleteLater fixes this
3963+
3964+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 25 Jul 2014 10:47:34 +0000
3965+
3966+unity8 (7.90+14.10.20140724.1-0ubuntu1) utopic; urgency=low
3967+
3968+ [ Michael Zanetti ]
3969+ * properly parent launcher items (LP: #1347902)
3970+
3971+ [ Michał Sawicz ]
3972+ * Move the PyDev project files to the root, supporting .py scripts
3973+ outside of tests/autopilot. Add Autopilot Run and List launch
3974+ configurations to easily support debugging in Eclipse. Use
3975+ add_unity8_mock macro in the Telephony plugin.
3976+ * Drop FilterGrid and refactor height animations in GenericScopeView.
3977+ Also implement forced category expansion. (LP: #1326470)
3978+ * Move expansion button from section header to category footer. (LP:
3979+ #1261300)
3980+ * Fix expect-sigstop enviroment variable name. (LP: #1346819)
3981+ * Make headerless categories easier Instead of having no header
3982+ category (which is a bit confusing since the LVWPH code was designed
3983+ so that when a category has no header it is because it shares the
3984+ category with the previous one) what we have for headerless
3985+ categories is a header of height 0, this way everything works as it
3986+ should and results in cleaner code in the LVWPH and in
3987+ GenericScopeView
3988+ * Add support for header links.
3989+ * Add dash PageHeader styling.
3990+
3991+ [ Albert Astals ]
3992+ * Make headerless categories easier Instead of having no header
3993+ category (which is a bit confusing since the LVWPH code was designed
3994+ so that when a category has no header it is because it shares the
3995+ category with the previous one) what we have for headerless
3996+ categories is a header of height 0, this way everything works as it
3997+ should and results in cleaner code in the LVWPH and in
3998+ GenericScopeView
3999+
4000+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 24 Jul 2014 20:41:29 +0000
4001+
4002+unity8 (7.90+14.10.20140723.4-0ubuntu1) utopic; urgency=low
4003+
4004+ [ thomas-voss ]
4005+ * Explicitly select gcc version.
4006+
4007+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 23 Jul 2014 15:32:41 +0000
4008+
4009+unity8 (7.90+14.10.20140721.1-0ubuntu1) utopic; urgency=low
4010+
4011+ [ Michael Terry ]
4012+ * Allow running the dialer-app in emergency mode when the screen is
4013+ locked.
4014+
4015+ [ Michał Sawicz ]
4016+ * Add missing nameOwner property to mock UnityMenuModel.
4017+
4018+ [ Albert Astals ]
4019+ * Fix name, There's nothing called pageHeader in this file
4020+
4021+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 21 Jul 2014 14:57:08 +0000
4022+
4023+unity8 (7.90+14.10.20140717.3-0ubuntu1) utopic; urgency=low
4024+
4025+ [ Nick Dedekind ]
4026+ * Added environment variable to upstart conf for mir trusted socket
4027+ * Removed indicator menu dismissal on menu activation (LP: #1337771)
4028+
4029+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 17 Jul 2014 16:35:52 +0000
4030+
4031+unity8 (7.90+14.10.20140717.1-0ubuntu1) utopic; urgency=low
4032+
4033+ [ Michał Sawicz ]
4034+ * Only generate .qmltypes files manually, no need to do it build-time.
4035+ It didn't work when cross-compiling either, and required builders to
4036+ have otherwise unnecessary environment.
4037+ * Fix CardCreator test. It got broken with a merge that got landed
4038+ along side of it.
4039+
4040+ [ Ying-Chun Liu ]
4041+ * Add reboot/shutdown (LP: #1234062)
4042+
4043+ [ Albert Astals ]
4044+ * Make the departments test more stable
4045+
4046+ [ Mirco Müller ]
4047+ * Fixes gap at top of sim-unlock/fullscreen notification (point 1.),
4048+ fixes blocking overlay if underlying UnityMenuModel vanishes from
4049+ DBus (point 2.). The third bullet-point of the bug-report, lockup of
4050+ shell-UI, could not be reproduced. (LP: #1308011)
4051+
4052+ [ Michael Terry ]
4053+ * Expose a new greeter DBus property, IsActive, which tells apps and
4054+ indicators when the integrated-greeter screen is active. Useful for
4055+ switching UI modes when the screen is locked.
4056+ * Allow the session to bring up the greeter/lockscreen over DBus. The
4057+ emergency dialer will need this support in order to cancel bringing
4058+ it up.
4059+
4060+ [ Michael Zanetti ]
4061+ * Fixes gap at top of sim-unlock/fullscreen notification (point 1.),
4062+ fixes blocking overlay if underlying UnityMenuModel vanishes from
4063+ DBus (point 2.). The third bullet-point of the bug-report, lockup of
4064+ shell-UI, could not be reproduced. (LP: #1308011)
4065+
4066+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 17 Jul 2014 09:38:20 +0000
4067+
4068+unity8 (7.90+14.10.20140714-0ubuntu1) utopic; urgency=low
4069+
4070+ [ Michał Sawicz ]
4071+ * Activate all results in click scope by default. (LP: #1341262)
4072+
4073+ [ Mirco Müller ]
4074+ * Added support for utilization of the ComboButton SDK-element for
4075+ snap-decision notifications with many actions.
4076+
4077+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 14 Jul 2014 18:20:25 +0000
4078+
4079+unity8 (7.90+14.10.20140709.2-0ubuntu1) utopic; urgency=low
4080+
4081+ [ Michal Hruby ]
4082+ * Fix FTBFS when using latest unity-api.
4083+
4084+ [ Michał Sawicz ]
4085+ * Refactor carousel item activation.
4086+ * Refactor ScopeItem into GenericScopeView.
4087+ * Add initial support for scope customizations.
4088+ * Make rating stars in PreviewReviewDisplay.qml non-interactive. (LP:
4089+ #1337508)
4090+
4091+ [ Nick Dedekind ]
4092+ * Added active call hint A hint is displayed in the indicator panel
4093+ when an call is active on the Telephony Serivce
4094+
4095+ [ Albert Astals ]
4096+ * We need to boostrap height also when we have 1 item ^_^ (LP:
4097+ #1337408)
4098+ * Add initial support for scope customizations.
4099+ * CardCreator: Give a correct implicitHeight if we only have art The
4100+ hasSubtitle change is really unrelated and not needed here, just
4101+ sneaking it in to not create yet another review. (LP: #1330899)
4102+ * Fake Scopes Plugin: Register PreviewModelInterface
4103+
4104+ [ Michael Zanetti ]
4105+ * make the launcher's drag'n'drop indicator more prominent (LP:
4106+ #1332042)
4107+ * make launcher items live having them non-live is not really required
4108+ and reveals an issue in combination with UbuntuShape (LP: #1302761)
4109+ * Fade out launcher in place instead of moving it to the left on long
4110+ left edge swipes. (LP: #1332096)
4111+ * update launcher icon glow as requested by design (LP: #1336725)
4112+ * update header in dash to use the new header from the SDK (LP:
4113+ #1335491)
4114+ * fix testPreview with larger GRID_UNIT_PX values
4115+ * clip the corner of pinned icons in the launcher as per new design
4116+ * update launcher background according to latest design (LP: #1336314)
4117+ * Update Launcher's home button design according to new spec. (LP:
4118+ #1329331)
4119+
4120+ [ CI bot ]
4121+ * make launcher items live having them non-live is not really required
4122+ and reveals an issue in combination with UbuntuShape (LP: #1302761)
4123+
4124+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 09 Jul 2014 19:46:11 +0000
4125+
4126+unity8 (7.90+14.10.20140707-0ubuntu1) utopic; urgency=low
4127+
4128+ [ Nick Dedekind ]
4129+ * Added support for TransferMenu
4130+
4131+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 07 Jul 2014 11:40:59 +0000
4132+
4133+unity8 (7.90+14.10.20140703.1-0ubuntu1) utopic; urgency=low
4134+
4135+ [ Michał Sawicz ]
4136+ * Initial code for a payment button widget, to handle purchasing apps
4137+ from the click scope.
4138+
4139+ [ Nick Dedekind ]
4140+ * Moved [Message]MenuItemFacotory from Unity.Indicators plugin to qml
4141+ folder.
4142+
4143+ [ Albert Astals ]
4144+ * EasingCurve: Initialize members
4145+ * Fix valgrind warning by not emitting reset on model destructor That
4146+ won't be supported until Qt 5.4 More info at https://bugreports.qt-
4147+ project.org/browse/QTBUG-39780 Warning was ==16693== Invalid read of
4148+ size 8 ==16693== at 0x72B19A0: QQmlContext::isValid() const
4149+ (qqmlcontext.cpp:231) ==16693== by 0x736C82B:
4150+ QQmlDelegateModelPrivate::emitChanges() (qqmldelegatemodel.cpp:1412)
4151+ ==16693== by 0x7372AE6: QQmlDelegateModel::_q_modelReset()
4152+ (qqmldelegatemodel.cpp:1463) ==16693== by 0x7397224:
4153+ QQmlDelegateModel::qt_static_metacall(QObject*, QMetaObject::Call,
4154+ int, void**) (moc_qqmldelegatemodel_p.cpp:196) ==16693== by
4155+ 0x739769E: QQmlDelegateModel::qt_metacall(QMetaObject::Call, int,
4156+ void**) (moc_qqmldelegatemodel_p.cpp:292) ==16693== by 0x66379CC:
4157+ QMetaObject::activate(QObject*, int, int, void**) (in
4158+ /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.0) ==16693== by
4159+ 0x65AEEFD: QAbstractItemModel::endResetModel() (in /usr/lib/x86_64-
4160+ linux-gnu/libQt5Core.so.5.3.0) ==16693== by 0x23461EFD:
4161+ FakeIndicatorsModel::unload() (fakeindicatorsmodel.cpp:53) ==16693==
4162+ by 0x23461E13: FakeIndicatorsModel::~FakeIndicatorsModel()
4163+ (fakeindicatorsmodel.cpp:34) ==16693== by 0x2345C073:
4164+ QQmlPrivate::QQmlElement<FakeIndicatorsModel>::~QQmlElement() (in
4165+ /home/tsdgeos_work/phablet/unity8/investigate_test_shell_crash/build
4166+ dir/tests/mocks/Unity/Indicators/libIndicatorsFakeQml.so) ==16693==
4167+ by 0x2345C0A3:
4168+ QQmlPrivate::QQmlElement<FakeIndicatorsModel>::~QQmlElement()
4169+ (qqmlprivate.h:106) ==16693== by 0x663636B:
4170+ QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-
4171+ gnu/libQt5Core.so.5.3.0) ==16693== Address 0x1862d448 is 8 bytes
4172+ inside a block of size 16 free'd ==16693== at 0x4C2C2BC: operator
4173+ delete(void*) (vg_replace_malloc.c:503) ==16693== by 0x72B21B8:
4174+ QQmlContextData::destroy() (qqmlcontext.cpp:647) ==16693== by
4175+ 0x7293458: QQmlPrivate::qdeclarativeelement_destructor(QObject*)
4176+ (qqmlengine.cpp:612) ==16693== by 0x6C0CADD:
4177+ QQmlPrivate::QQmlElement<QQuickItem>::~QQmlElement()
4178+ (qqmlprivate.h:105) ==16693== by 0x663636B:
4179+ QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-
4180+ gnu/libQt5Core.so.5.3.0) ==16693== by 0x663F0EB: QObject::~QObject()
4181+ (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.0) ==16693== by
4182+ 0x6BF64B5: QQuickItem::~QQuickItem() (qquickitem.cpp:2064) ==16693==
4183+ by 0x6C0CAE5: QQmlPrivate::QQmlElement<QQuickItem>::~QQmlElement()
4184+ (qqmlprivate.h:106) ==16693== by 0x663636B:
4185+ QObjectPrivate::deleteChildren() (in /usr/lib/x86_64-linux-
4186+ gnu/libQt5Core.so.5.3.0) ==16693== by 0x663F0EB: QObject::~QObject()
4187+ (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.3.0) ==16693== by
4188+ 0x6BF64B5: QQuickItem::~QQuickItem() (qquickitem.cpp:2064) ==16693==
4189+ by 0x6C0CAE5: QQmlPrivate::QQmlElement<QQuickItem>::~QQmlElement()
4190+ (qqmlprivate.h:106) (LP: #1332598)
4191+
4192+ [ Michael Zanetti ]
4193+ * drop launcher item spacing (LP: #1332022)
4194+ * change wording in launcher quicklist (LP: #1332035)
4195+
4196+ [ Alejandro J. Cura ]
4197+ * Initial code for a payment button widget, to handle purchasing apps
4198+ from the click scope.
4199+
4200+ [ Rodney Dawes ]
4201+ * Initial code for a payment button widget, to handle purchasing apps
4202+ from the click scope.
4203+
4204+ [ Renato Araujo Oliveira Filho ]
4205+ * Create IndicatorsLight.qml component used to control indicator led.
4206+ A blue led will pulse if the message indicator is blue and screen is
4207+ off.
4208+
4209+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 03 Jul 2014 14:47:46 +0000
4210+
4211+unity8 (7.90+14.10.20140701.2-0ubuntu2) utopic; urgency=medium
4212+
4213+ * debian/control:
4214+ list qtdeclarative5-ubuntu-ui-toolkit-plugin-gles as an alternative
4215+ choice, since provides are not versionned, should restore installability
4216+ on amd64 and i386
4217+
4218+ -- Sebastien Bacher <seb128@ubuntu.com> Thu, 03 Jul 2014 13:26:38 +0200
4219+
4220+unity8 (7.90+14.10.20140701.2-0ubuntu1) utopic; urgency=medium
4221+
4222+ [ Michał Sawicz ]
4223+ * Adapt to suru theme.
4224+
4225+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 01 Jul 2014 15:10:35 +0000
4226+
4227+unity8 (7.89+14.10.20140627-0ubuntu1) utopic; urgency=low
4228+
4229+ [ Michael Terry ]
4230+ * Fix path in launcher mock after moving our mock icons, to avoid a
4231+ lot of "icon not found" warnings during qmluitests.
4232+ * Fix the testMultiGreeter qmluitest. Incoming method variables are
4233+ apparently read-only in Qt5.3. (LP: #1332488)
4234+
4235+ [ CI bot ]
4236+ * Resync trunk
4237+
4238+ [ Michał Sawicz ]
4239+ * Adapt scope mock to new api and quiet unused variable warnings.
4240+ * Fix dynamic overlay height. (LP: #1334879)
4241+ * Don't center items in CardVerticalJournal, kind of beats the
4242+ purpose... Also don't bind unnecessarily.
4243+
4244+ [ Ying-Chun Liu ]
4245+ * Fix LP:1330957 Fix some failed test cases. (LP: #1330957)
4246+
4247+ [ Albert Astals ]
4248+ * Don't seem to need this waitForRendering And makes test fail in 5.3
4249+
4250+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 27 Jun 2014 08:47:58 +0000
4251+
4252+unity8 (7.89+14.10.20140624.1-0ubuntu1) utopic; urgency=low
4253+
4254+ [ Alberto Aguirre ]
4255+ * Update Powerd plugin and Shell.qml to accommodate changes in the
4256+ display power state notification.
4257+
4258+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 24 Jun 2014 17:11:08 +0000
4259+
4260+unity8 (7.89+14.10.20140624-0ubuntu1) utopic; urgency=low
4261+
4262+ [ Ying-Chun Liu ]
4263+ * Add logout support. Reviewed by: Daniel d'Andrada (LP: #1302213)
4264+
4265+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 24 Jun 2014 08:17:09 +0000
4266+
4267+unity8 (7.89+14.10.20140623.1-0ubuntu1) utopic; urgency=low
4268+
4269+ [ Michał Sawicz ]
4270+ * Make so that fixedArtShapeSize actually fixes artShapeSize.
4271+
4272+ [ Albert Astals ]
4273+ * Add VerticalJournal integration to Dash/scopes/QML (LP: #1326467)
4274+ * Make so that fixedArtShapeSize actually fixes artShapeSize.
4275+
4276+ [ Mirco Müller ]
4277+ * Added the frontend-part of sound-hint support for notifications with
4278+ updated QML-tests.
4279+
4280+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 23 Jun 2014 11:17:12 +0000
4281+
4282+unity8 (7.89+14.10.20140619.3-0ubuntu1) utopic; urgency=low
4283+
4284+ * New rebuild forced
4285+
4286+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 19 Jun 2014 16:02:41 +0000
4287+
4288+unity8 (7.89+14.10.20140619.2-0ubuntu1) utopic; urgency=low
4289+
4290+ [ Albert Astals ]
4291+ * Departments support (LP: #1320847)
4292+
4293+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 19 Jun 2014 11:17:40 +0000
4294+
4295+unity8 (7.89+14.10.20140616.1-0ubuntu1) utopic; urgency=low
4296+
4297+ [ Pawel Stolowski ]
4298+ * Extend the hack for click scope categories with the upcoming 'store'
4299+ category: single-tap on results from the 'store' category should
4300+ activate them, instead of requesting a preview. (LP: #1326292)
4301+
4302+ [ Albert Astals ]
4303+ * Drop the " Preview" suffix from Preview title As requested in
4304+ https://bugs.launchpad.net/unity8/+bug/1316671 (LP: #1316671)
4305+
4306+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 16 Jun 2014 14:43:01 +0000
4307+
4308+unity8 (7.89+14.10.20140613-0ubuntu1) utopic; urgency=medium
4309+
4310+ [ Michael Terry ]
4311+ * Revert split greeter for now. We will bring it back as an option
4312+ for Desktop, but use a big hammer revert right now to get Touch back
4313+ in shape.
4314+
4315+ [ CI bot ]
4316+ * Fix build problems. Reviewed by: Michael Terry (LP: #1328850)
4317+
4318+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 13 Jun 2014 08:30:48 +0000
4319+
4320+unity8 (7.88+14.10.20140606-0ubuntu1) utopic; urgency=low
4321+
4322+ [ Michał Sawicz ]
4323+ * Make lockscreen buttons translatable.
4324+
4325+ [ Albert Astals ]
4326+ * Correctly mark these functions as overrides
4327+ * Remove connections to non existant signal
4328+ * Better test name
4329+ * Improvements for headerless categories LVPWH: No section name -> no
4330+ header LVPWH: New hasSectionHeader context property for delegates
4331+ GSV: Add topMargin if no hasSectionHeader (LP: #1326415)
4332+ * Make tryVerticalJournal, tryHorizontalJournal and tryOrganicGrid
4333+ work again
4334+
4335+ [ Michael Zanetti ]
4336+ * Don't crash when we get an invalid app from ApplicationManager (LP:
4337+ #1309162)
4338+
4339+ [ Andrea Cimitan ]
4340+ * Workaround for lp1324159 (LP: #1322233, #1324159)
4341+
4342+ [ CI bot ]
4343+ * Resync trunk
4344+
4345+ [ Florian Boucault ]
4346+ * Application startup: changed splash rectangle to be black instead of
4347+ white and added a neat little animation. (LP: #1124265)
4348+
4349+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 06 Jun 2014 11:38:53 +0000
4350+
4351+unity8 (7.88+14.10.20140603.1-0ubuntu1) utopic; urgency=medium
4352+
4353+ [ Michael Terry ]
4354+ * Bump version so ubuntu-touch-session can reference this one
4355+
4356+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 03 Jun 2014 20:31:00 +0000
4357+
4358+unity8 (7.87+14.10.20140603.1-0ubuntu1) utopic; urgency=low
4359+
4360+ [ CI bot ]
4361+ * Resync trunk
4362+
4363+ [ Michał Sawicz ]
4364+ * Move env setup past session init in greeter wrapper. (LP: #1325882)
4365+
4366+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 03 Jun 2014 10:33:11 +0000
4367+
4368+unity8 (7.87+14.10.20140530.1-0ubuntu3) utopic; urgency=medium
4369+
4370+ * no change rebuild
4371+
4372+ -- Oliver Grawert <ogra@ubuntu.com> Mon, 02 Jun 2014 16:19:10 +0200
4373+
4374+unity8 (7.87+14.10.20140530.1-0ubuntu2) utopic; urgency=medium
4375+
4376+ * drop dbus-x11 dependency of unity8-greeter, it makes us end up with
4377+ multiple session dbus daemons which breaks many AP tests in the lab
4378+
4379+ -- Oliver Grawert <ogra@ubuntu.com> Mon, 02 Jun 2014 14:50:59 +0200
4380+
4381+unity8 (7.87+14.10.20140530.1-0ubuntu1) utopic; urgency=medium
4382+
4383+ [ Michael Terry ]
4384+ * Bump version for Breaks due to unity8-greeter
4385+ * In split mode, determine whether the application identifiers in
4386+ AccountsService are click packages or not, so we know the correct
4387+ url prefix to use.
4388+ * Start logrotate in the greeter's session.
4389+
4390+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 30 May 2014 09:29:15 +0000
4391+
4392+unity8 (7.86+14.10.20140527-0ubuntu1) utopic; urgency=low
4393+
4394+ [ Andrea Cimitan ]
4395+ * Passes to make tryCommand -qmljsdebugger=port:3768 to enable
4396+ debug/profiling test apps
4397+ * Fixes carousel shadow
4398+
4399+ [ Michał Sawicz ]
4400+ * Use dpkg-architecture, not gcc, to determine the machine triplet.
4401+
4402+ [ Ying-Chun Liu ]
4403+ * Fix ZoomableImage test failure. (LP: #1317254)
4404+
4405+ [ Albert Astals ]
4406+ * We don't need iconutils in this mock
4407+ * Don't reserve space for mascot if no mascot is specified (LP:
4408+ #1319343)
4409+ * CardHeader is no more, remove stale line in CMakeLists.txt
4410+ * GenericScopeViewTest: Wait a bit more Otherwise sometimes we end
4411+ getting up the wrong delegate (maybe one that will be garbage
4412+ collected?) (LP: #1322279)
4413+ * Fix crash in organicgridtest
4414+
4415+ [ Daniel d'Andrada ]
4416+ * Remove Shell's underlay background image as it cannot be seen
4417+ anymore Now that the Dash has its own, opaque, background, the
4418+ underlay's background image can no longer be seen. So it's just a
4419+ waste of resources to have it.
4420+
4421+ [ Michael Terry ]
4422+ * Use the same animation when dismissing a greeter slide from the
4423+ launcher as from a normal greeter drag. (LP: #1316513)
4424+
4425+ [ Michael Zanetti ]
4426+ * enhance lockscreen add a retry indication label (e.g. 3 attempts
4427+ left). add an additional label (e.g. phone number for multi sim).
4428+ add a infoPopup (e.g. to display a warning for last retry). add min
4429+ and max limit values. add tests for the above (LP: #1302050)
4430+
4431+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 27 May 2014 07:47:11 +0000
4432+
4433+unity8 (7.86+14.10.20140522-0ubuntu1) utopic; urgency=low
4434+
4435+ [ Albert Astals ]
4436+ * Use Interface classes from unity-api
4437+
4438+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 22 May 2014 17:59:23 +0000
4439+
4440+unity8 (7.86+14.10.20140519-0ubuntu1) utopic; urgency=low
4441+
4442+ [ Ubuntu daily release ]
4443+ * New rebuild forced
4444+
4445+ [ Albert Astals ]
4446+ * Use the new displayMargin feature Also port our DashViews to use
4447+ same naming and behaviour + update tests
4448+
4449+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 19 May 2014 07:35:51 +0000
4450+
4451+unity8 (7.86+14.10.20140516.5-0ubuntu1) utopic; urgency=low
4452+
4453+ [ Michal Hruby ]
4454+ * Updated scope tool to create proper config files after recent
4455+ libunity-scopes-api changes.
4456+
4457+ [ Michał Sawicz ]
4458+ * Refactor export_qmlfiles and export_qmlplugins to be more generic
4459+ and clean up installed mocks.
4460+
4461+ [ Albert Astals ]
4462+ * Remove empty dirs
4463+ * Set the tabbarmodel index as we do on real code It works better :D
4464+ (LP: #1317255)
4465+
4466+ [ Thomi Richards ]
4467+ * Use new import location for ProcessSearchError in process_helpers
4468+ script.
4469+
4470+ [ Andrea Cimitan ]
4471+ * Adds shadow for the carousel
4472+
4473+ [ Daniel d'Andrada ]
4474+ * Remove Revealer component It's not used anywhere anymore. It's been
4475+ replaced by DragHandle.
4476+
4477+ [ Andy Doan ]
4478+ * unlock_device: support more complex reboot/wait cycles Currently
4479+ this script only allows you to override how to "wait" on the device.
4480+ This changes the logic to also support how you go about rebooting
4481+ the device. This is handy for the ubuntu-emulator because adb-reboot
4482+ is not currently supported. However, we also have a more
4483+ sophisticated, fool-proof way we reboot/wait in the CI lab that
4484+ would be nice to take advantage of:
4485+ http://bazaar.launchpad.net/~ubuntu-test-case-dev/ubuntu-test-
4486+ cases/touch/view/head:/scripts/reboot-and-wait
4487+
4488+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 16 May 2014 18:46:32 +0000
4489+
4490+unity8 (7.86+14.10.20140516.2-0ubuntu1) utopic; urgency=low
4491+
4492+ [ CI bot ]
4493+ * Resync trunk
4494+
4495+ [ Michael Zanetti ]
4496+ * support appid:// entries in gsettings schema and make
4497+ findDesktopFile work with short-appid (LP: #1239750)
4498+
4499+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 16 May 2014 12:32:40 +0000
4500+
4501+unity8 (7.86+14.10.20140514.1-0ubuntu1) utopic; urgency=low
4502+
4503+ [ Antti Kaijanmäki ]
4504+ * Indicators/RootActionState: use g_variant_iter_loop to extract
4505+ icons.
4506+
4507+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 14 May 2014 11:43:55 +0000
4508+
4509+unity8 (7.86+14.10.20140513-0ubuntu1) utopic; urgency=low
4510+
4511+ [ Andrea Cimitan ]
4512+ * Improve padding in Text preview widget. (LP: #1316683)
4513+
4514+ [ CI bot ]
4515+ * Resync trunk
4516+
4517+ [ Nick Dedekind ]
4518+ * Removed binding loop from Unity.Indicators.MenuContentActivator
4519+ Change handler for QMLListProperty used by MenuContent.qml:
4520+ menuActivator.content[index].active If we're already asking for the
4521+ index, we know it exists already. No need to send a
4522+ changeNotification on an implied creation.
4523+
4524+ [ Josh Arenson ]
4525+ * Implements usage-style documentation for unity8 executable. Fixes
4526+ lp:1269282 (LP: #1269282)
4527+
4528+ [ Albert Astals ]
4529+ * Create specialized Card code in Javascript instead of having various
4530+ copied&pasted files (LP: #1297197)
4531+
4532+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 13 May 2014 08:34:02 +0000
4533+
4534+unity8 (7.86+14.10.20140507.3-0ubuntu1) utopic; urgency=low
4535+
4536+ [ Michał Sawicz ]
4537+ * Remove HUD from the bottom edge. Again.
4538+
4539+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 07 May 2014 11:14:30 +0000
4540+
4541+unity8 (7.86+14.10.20140505-0ubuntu1) utopic; urgency=low
4542+
4543+ [ Ted Gould ]
4544+ * Provide a dbus interface for setting the count and countVisible
4545+ properties. (LP: #1301400)
4546+
4547+ [ Michał Sawicz ]
4548+ * Pass env variables to initctl start.
4549+ * Suffix .sh to our scripts and clean up debian/rules.
4550+ * Adapt to Debian Qt package renames and drop unneeded Dee plugin
4551+ dependency.
4552+
4553+ [ Ying-Chun Liu ]
4554+ * Add Zoomable Image for Preview widgets.
4555+
4556+ [ Albert Astals ]
4557+ * Remove support for Qt <= 5.2.1
4558+
4559+ [ Mirco Müller ]
4560+ * Implemented feature-request from Design for modal snap-decision
4561+ notifications on the phone. See LP #1285712 (LP: #1285712)
4562+
4563+ [ Andrea Cimitan ]
4564+ * Make progressbas in preview widget big as the button
4565+
4566+ [ CI bot ]
4567+ * Resync trunk
4568+
4569+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 05 May 2014 12:09:43 +0000
4570+
4571+unity8 (7.86+14.10.20140502.6-0ubuntu1) utopic; urgency=low
4572+
4573+ [ tpeeters ]
4574+ * Adapt to new TabBar
4575+
4576+ [ Tim Peeters ]
4577+ * Adapt to new TabBar
4578+
4579+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 02 May 2014 16:44:52 +0000
4580+
4581+unity8 (7.86+14.10.20140429.2-0ubuntu1) utopic; urgency=medium
4582+
4583+ [ Andrea Cimitan ]
4584+ * Update upstart job to reflect latest unity-mir changes
4585+ * Fix locale in qml tests and fixtimeformattertest (LP: #1301038)
4586+ * Fix 1309135 (LP: #1309135)
4587+
4588+ [ Michał Sawicz ]
4589+ * Split out unity8-common package
4590+ * Don't wait for indicator services to start, and drop Scope Tool's
4591+ .desktop file. (LP: #1310172)
4592+
4593+ [ Michael Terry ]
4594+ * Stop clock from hiding when the 'show dash' button is pressed in
4595+ greeter. (LP: #1308139)
4596+ * Make swipe teases in the greeter more helpful and obvious (LP:
4597+ #1267623)
4598+
4599+ [ Nick Dedekind ]
4600+ * Fixed datetime indicator appointment colour (LP: #1307048)
4601+
4602+ [ Albert Astals ]
4603+ * Improve Card creation time by adding loaders that make sure only
4604+ what's needed is loaded (LP: #1297197)
4605+ * CategoryDelegateRange: Fix condition for detecting overshooting
4606+ * Make xvfbtests work in the DashView plugins
4607+ * Fix binding loop in FilterGrid height
4608+
4609+ [ Victor R. Ruiz ]
4610+ * Move autopilot notification code to a helper method.
4611+
4612+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Apr 2014 15:21:33 +0000
4613+
4614+unity8 (7.85+14.04.20140416-0ubuntu1) trusty; urgency=low
4615+
4616+ [ Albert Astals ]
4617+ * Fix last item X position Fixes clicking on the last item sometimes
4618+ not working (LP: #1301871)
4619+ * Use upstart in ./run Makes it so that you can use the lock button on
4620+ the device without getting that nasty hwc crash
4621+ * Remove AnimationControllerWithSignals.
4622+ * Use the correct delegate base item for the Carousel test
4623+ * Some simplification in DashContent Kill the ScopeDelegateMapper in
4624+ favour of a simple if (that will eventually go away). Removal of all
4625+ the fake scopes in the tests that added nothing of value to the
4626+ tests. Removal of movementEnded signal that was unused. Removal of
4627+ movementStarted and positionedAtBeginning signals that were being
4628+ used as function calls. Rework DashContent tests so they what the
4629+ function does what it is supposed to do instead of just making sure
4630+ QML signals work .
4631+ * Improve Card creation time by adding loaders that make sure only
4632+ what's needed is loaded In my computer it goes from RESULT :
4633+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
4634+ l": 3.217 msecs per iteration (total: 3,218, iterations: 1000)
4635+ RESULT :
4636+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
4637+ 1.647 msecs per iteration (total: 1,648, iterations: 1000) RESULT :
4638+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.514
4639+ msecs per iteration (total: 1,515, iterations: 1000) RESULT :
4640+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.471 msecs per
4641+ iteration (total: 1,471, iterations: 1000) RESULT :
4642+ qmltestrunner::benchmark_time:"cardArtModel": 1.447 msecs per
4643+ iteration (total: 1,448, iterations: 1000) RESULT :
4644+ qmltestrunner::benchmark_time:"cardTitleModel": 1.276 msecs per
4645+ iteration (total: 1,276, iterations: 1000) to RESULT :
4646+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
4647+ l": 2.916 msecs per iteration (total: 2,917, iterations: 1000)
4648+ RESULT :
4649+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
4650+ 1.504 msecs per iteration (total: 1,504, iterations: 1000) RESULT :
4651+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.060
4652+ msecs per iteration (total: 1,061, iterations: 1000) RESULT :
4653+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.052 msecs per
4654+ iteration (total: 1,053, iterations: 1000) RESULT :
4655+ qmltestrunner::benchmark_time:"cardArtModel": 0.727 msecs per
4656+ iteration (total: 728, iterations: 1000) RESULT :
4657+ qmltestrunner::benchmark_time:"cardTitleModel": 0.817 msecs per
4658+ iteration (total: 818, iterations: 1000) (LP: #1297197)
4659+
4660+ [ Allan LeSage ]
4661+ * DashApps emulator get_applications should return a list ordered by
4662+ visible y, x.
4663+
4664+ [ Andrea Cimitan ]
4665+ * Workaround for lp1301309 until fixes for palette in ui toolkit (LP:
4666+ #1301309)
4667+
4668+ [ Leo Arias ]
4669+ * Reverted the change that returns application cards instead of
4670+ titles.
4671+
4672+ [ Nick Dedekind ]
4673+ * Indicator services started by unity8 upstart configuration rather
4674+ than manual emmision from indicator manager.
4675+
4676+ [ Mirco Müller ]
4677+ * Fix notification ap-test assertions.
4678+
4679+ [ Michael Terry ]
4680+ * Use new tablet and phone backgrounds from Design.
4681+
4682+ [ Michael Zanetti ]
4683+ * workaround the QTestLogger assertion issue with make tryXyz and our
4684+ custom uqmlscene
4685+
4686+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 16 Apr 2014 13:45:01 +0000
4687+
4688+unity8 (7.85+14.04.20140415.2-0ubuntu1) trusty; urgency=low
4689+
4690+ [ Michael Terry ]
4691+ * When an application requests focus, handle it in Shell.qml by hiding
4692+ the greeter and stopping any edge demo. (LP: #1227753)
4693+
4694+ [ Leo Arias ]
4695+ * Use subprocess.check_call when caling url-dispatcher, so an error
4696+ will be raised if it fails.
4697+ * Test application life cycle with fake apps, instead of messaging and
4698+ address book.
4699+
4700+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 15 Apr 2014 12:47:11 +0000
4701+
4702+unity8 (7.85+14.04.20140410.1-0ubuntu1) trusty; urgency=medium
4703+
4704+ [ Didier Roche ]
4705+ * Resync trunk with previous revert upload
4706+
4707+ [ Michał Sawicz ]
4708+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
4709+ lp:1291575 (LP: #1291575)
4710+
4711+ [ Albert Astals ]
4712+ * Take into account the originY when specifying the delegate ranges
4713+ Fixes bug #1300302 (LP: #1300302)
4714+
4715+ [ CI bot ]
4716+ * Resync trunk
4717+
4718+ [ Allan LeSage ]
4719+ * Swiping open an indicator must show its correct title--protect
4720+ against lp:1253804 . (LP: #1253804)
4721+
4722+ [ Alexander Sack ]
4723+ * Fix TypeError: issue seen in system_integration autopilot test on
4724+ image 279. (LP: #1303685)
4725+
4726+ [ Bill Filler ]
4727+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
4728+ lp:1291575 (LP: #1291575)
4729+
4730+ [ Leo Arias ]
4731+ * Added a search autopilot helper.
4732+
4733+ [ Michael Terry ]
4734+ * Provide a all-in-one script for getting a device to an unlocked
4735+ state.
4736+
4737+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 10 Apr 2014 10:03:31 +0000
4738+
4739+unity8 (7.85+14.04.20140404.is.7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=medium
4740+
4741+ * Revert to previous version as it's linked to latest sdk change which
4742+ is making gallery-app AP tests failing on the CI dashboard
4743+
4744+ -- Didier Roche <didrocks@ubuntu.com> Tue, 08 Apr 2014 13:53:47 +0200
4745+
4746+unity8 (7.85+14.04.20140404-0ubuntu1) trusty; urgency=low
4747+
4748+ [ Albert Astals ]
4749+ * Adapt to new TabBar
4750+
4751+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 04 Apr 2014 15:03:00 +0000
4752+
4753+unity8 (7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=low
4754+
4755+ [ Michael Terry ]
4756+ * Re-enable test_networkmanager_integration autopilot test on phone
4757+ platforms
4758+
4759+ [ CI bot ]
4760+ * Resync trunk
4761+
4762+ [ Leo Arias ]
4763+ * Reverted the open_preview autopilot helper to return a Preview
4764+ object.
4765+
4766+ [ Albert Astals ]
4767+ * If not running in Mir load the "fake" application manager (LP:
4768+ #1301547)
4769+ * Remove unused properties from DashRenderer
4770+
4771+ [ Michael Zanetti ]
4772+ * Fix tests after right edge merge. Drop old stages tests. Fix right
4773+ edge tests if someone doesn't have the GRID_UNIT_PX exported. make
4774+ GenericScopeView test more robust that broke because the ordering
4775+ changed
4776+ * add "make xvfbtestSomething" target to run qml tests in xvfb
4777+ * make the "make test" commit hook work again
4778+
4779+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 03 Apr 2014 10:38:53 +0000
4780+
4781+unity8 (7.85+14.04.20140401.3-0ubuntu1) trusty; urgency=medium
4782+
4783+ [ Michał Sawicz ]
4784+ * Bump version to ensure incompatibility with previous Unity.Application
4785+ implementations.
4786+ * We'll only have the unity-mir and mock Ubuntu.Application plugins
4787+ now, no need for mangling the import paths.
4788+
4789+ [ Michal Hruby ]
4790+ * Remove the albumart image provider. (LP: #1262711)
4791+ * Don't reset search string after 2 seconds. (LP: #1297246)
4792+
4793+ [ James Henstridge ]
4794+ * Remove the albumart image provider. (LP: #1262711)
4795+
4796+ [ Albert Astals ]
4797+ * Carousel: Add test to make sure we only create the needed delegates
4798+ and not more
4799+ * LVWPH: Remove processEvents() call from updatePolish() It causes
4800+ some reentrancy issues and in some times you end up in polishItems()
4801+ with items that have been deleted because you called processEvents()
4802+ This means i need a small tweak in itemGeometryChanged to not
4803+ reposition items if we are inside a setContentHeight call and two
4804+ small tweaks to tests since now things happen in a different order
4805+ and numbers are different (though equivalent) (LP: #1297240)
4806+ * Card.qml binding loops are gone. hooray \o/ Also made the aspect
4807+ properties readonly
4808+
4809+ [ Mirco Müller ]
4810+ * A potential fix for "Cannot read property 'state' of null"-failure
4811+ on Jenkins with the VisualSnapDecisionsQueue QML-test of
4812+ notifications.
4813+
4814+ [ Michael Terry ]
4815+ * Pass user's preference for auto-brightness on to powerd. (LP:
4816+ #1273174)
4817+
4818+ [ Michael Zanetti ]
4819+ * Registers a dummy QObject as QTestRootObject in uqmlscene in order
4820+ to fix make trySomething with Qt 5.2.
4821+
4822+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 01 Apr 2014 22:56:52 +0000
4823+
4824+unity8 (7.84+14.04.20140327.1-0ubuntu2) trusty; urgency=medium
4825+
4826+ * For now, have libunity-private depending on libunity-core-6.0-9 as the
4827+ gsettings schema is here. The dependency wasn't direct and dropped from
4828+ Touch image #271. Consequently, unity8 didn't start (gsettings
4829+ segfaulting).
4830+ Proper strategy will be to include the schema in another package to only
4831+ pull it.
4832+
4833+ -- Didier Roche <didrocks@ubuntu.com> Tue, 01 Apr 2014 09:52:14 +0200
4834+
4835+unity8 (7.84+14.04.20140327.1-0ubuntu1) trusty; urgency=low
4836+
4837+ [ Michał Sawicz ]
4838+ * Increase kill timeout so that crashes are not truncated.
4839+
4840+ [ Ying-Chun Liu ]
4841+ * Fix a small typo in LazyImage: scale -> scaleTo
4842+
4843+ [ Albert Astals ]
4844+ * Make geometry calls for autopilot work again -geometry is a internal
4845+ Qt argument that only works for QWidget based apps Before it was
4846+ being returned to us in -args but now it's eaten so we need to use a
4847+ different one, -windowgeometry
4848+ * Make "Recent" translatable and update pot file
4849+
4850+ [ Mirco Müller ]
4851+ * Make visual queue of (up to five) snap-decisions contract and expand
4852+ according to visual design-spec.
4853+
4854+ [ Michael Terry ]
4855+ * Pass user's preference for auto-brightness on to powerd. (LP:
4856+ #1273174)
4857+
4858+ [ Michael Zanetti ]
4859+ * allow executing a single test function example: make testShell
4860+ FUNCTION="Shell::test_background"
4861+
4862+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 27 Mar 2014 12:38:21 +0000
4863+
4864+unity8 (7.84+14.04.20140324.4-0ubuntu1) trusty; urgency=low
4865+
4866+ [ Michal Hruby ]
4867+ * Change and extend the way non-installed scopes are started with the
4868+ scope-tool.
4869+ * Switch to new scope backend and apply required visual adaptations.
4870+ (LP: #1294294)
4871+
4872+ [ Gerry Boland ]
4873+ * Switch to new scope backend and apply required visual adaptations.
4874+ (LP: #1294294)
4875+
4876+ [ Michał Sawicz ]
4877+ * Fix rating input action to always be "rated", not dynamic. Based on
4878+ http://developer.ubuntu.com/api/devel/ubuntu-14.04/cplusplus/unity-
4879+ scopes/previewwidgets.html#rating-input
4880+ * Switch to new scope backend and apply required visual adaptations.
4881+ (LP: #1294294)
4882+
4883+ [ Kevin Gunn ]
4884+ * Switch to new scope backend and apply required visual adaptations.
4885+ (LP: #1294294)
4886+
4887+ [ Albert Astals ]
4888+ * Switch to new scope backend and apply required visual adaptations.
4889+ (LP: #1294294)
4890+ * LVWPH: cull lost items lost items will be released on the next
4891+ updatePolish cycle but meanwhile don't let them be visible
4892+
4893+ [ Daniel d'Andrada ]
4894+ * Switch to new scope backend and apply required visual adaptations.
4895+ (LP: #1294294)
4896+
4897+ [ Michał Karnicki ]
4898+ * Switch to new scope backend and apply required visual adaptations.
4899+ (LP: #1294294)
4900+
4901+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 24 Mar 2014 16:10:24 +0000
4902+
4903+unity8 (7.84+14.04.20140319.1-0ubuntu1) trusty; urgency=low
4904+
4905+ [ Michał Sawicz ]
4906+ * Work around bug #1293478 - make sure to send ints, not doubles for
4907+ volume control. (LP: #1293478)
4908+
4909+ [ Nick Dedekind ]
4910+ * Fixed binding being cleared when manually changing slider value
4911+ (lp#1283191). (LP: #1283191)
4912+
4913+ [ Albert Astals ]
4914+ * Fix indicators highlight position on 5.2 We need to take into
4915+ account the list originX if we're using the list delegates x outside
4916+ the list itself
4917+ * LVWPH: Make sure m_firstVisibleIndex is correctly set on
4918+ removeNonVisibleItems
4919+
4920+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 19 Mar 2014 16:40:20 +0000
4921+
4922+unity8 (7.84+14.04.20140317.2-0ubuntu1) trusty; urgency=low
4923+
4924+ [ CI bot ]
4925+ * Resync trunk
4926+
4927+ [ Michał Sawicz ]
4928+ * Revert disable-hud, we weren't ready to land it yet.
4929+
4930+ [ Mirco Müller ]
4931+ * The snap-decision AP-test for "incoming call"-case used the wrong
4932+ objectName "notification0". It has to be "notification1".
4933+
4934+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 17 Mar 2014 15:54:39 +0000
4935+
4936+unity8 (7.84+14.04.20140314-0ubuntu1) trusty; urgency=low
4937+
4938+ [ Michał Sawicz ]
4939+ * Fix tests under Qt 5.2.
4940+ * CardHeader improvements depending on background. Also drop prices,
4941+ they need to be reworked into attributes.
4942+ * Bring Cards closer to design
4943+ * Add back the workaround for not being able scroll the image gallery
4944+ Taken from AppPreview.qml (LP: #1281709)
4945+ * Only allow searching when preview isn't open. (LP: #1282475)
4946+ * Adds carousel dynamic switch
4947+
4948+ [ Leo Arias ]
4949+ * Update the url dispatcher test to use the fake app fixture from the
4950+ toolkit.
4951+
4952+ [ Albert Astals ]
4953+ * Fix tests under Qt 5.2.
4954+ * Workaround compiz/unity7 behaviour change/bug
4955+
4956+ [ Michael Zanetti ]
4957+ * Fix tests under Qt 5.2.
4958+ * Disable HUD from the bottom edge.
4959+
4960+ [ Andrea Cimitan ]
4961+ * Adds carousel dynamic switch
4962+
4963+ [ CI bot ]
4964+ * Resync trunk
4965+
4966+ [ Michał Karnicki ]
4967+ * CardHeader improvements depending on background. Also drop prices,
4968+ they need to be reworked into attributes.
4969+
4970+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 14 Mar 2014 15:46:10 +0000
4971+
4972+unity8 (7.84+14.04.20140307-0ubuntu1) trusty; urgency=low
4973+
4974+ * New rebuild forced
4975+
4976+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 07 Mar 2014 10:54:33 +0000
4977+
4978+unity8 (7.84+14.04.20140306-0ubuntu1) trusty; urgency=low
4979+
4980+ [ Bill Filler ]
4981+ * Convert gallery and camera to click
4982+
4983+ [ Michael Zanetti ]
4984+ * Just disable HUD tests, without really disabling the HUD itself
4985+
4986+ [ Sergio Schvezov ]
4987+ * Convert gallery and camera to click
4988+
4989+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 06 Mar 2014 16:45:46 +0000
4990+
4991+unity8 (7.84+14.04.20140304-0ubuntu1) trusty; urgency=low
4992+
4993+ [ Michael Terry ]
4994+ * Ensure that the selected() signal is emitted by the greeter on
4995+ startup, fixing the background on startup for the first user in
4996+ tablet mode.
4997+
4998+ [ Nick Dedekind ]
4999+ * Remocked IndicatorModel to fix qt5.2.1 changes.
5000+
5001+ [ Albert Astals ]
5002+ * Initialize m_distance (LP: #1285385)
5003+ * import Ubuntu.Components so we can use UbuntuAnimation
5004+
5005+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 04 Mar 2014 11:43:04 +0000
5006+
5007+unity8 (7.84+14.04.20140228-0ubuntu1) trusty; urgency=low
5008+
5009+ [ Michał Sawicz ]
5010+ * Fix CardHeader title font weight.
5011+ * Delete stale sockets. (LP: #1285215)
5012+
5013+ [ Dmitrijs Ledkovs ]
5014+ * Ship python3 autopilot modules.
5015+
5016+ [ Albert Astals ]
5017+ * Cleanup DashContent Remove unused signals and properties
5018+
5019+ [ Michał Karnicki ]
5020+ * Take it easy on the logging.
5021+ * Fix CardHeader title font weight.
5022+
5023+ [ Nick Dedekind ]
5024+ * Added ability to change indicator profile in shell (env
5025+ UNITY_INDICATOR_PROFILE)
5026+
5027+ [ Andrea Cimitan ]
5028+ * Rename PreviewRating to PreviewRatingInput
5029+ * Adds PreviewRatingDisplay
5030+
5031+ [ Daniel d'Andrada ]
5032+ * DirectionalDragArea: Reset status if disabled while dragging (LP:
5033+ #1276122)
5034+
5035+ [ Dimitri John Ledkov ]
5036+ * Ship python3 autopilot modules.
5037+
5038+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 28 Feb 2014 10:48:06 +0000
5039+
5040+unity8 (7.84+14.04.20140221-0ubuntu1) trusty; urgency=low
5041+
5042+ [ Michał Sawicz ]
5043+ * Add card background support.
5044+ * Increase the sidestage threshold.
5045+
5046+ [ Jussi Pakkanen ]
5047+ * Move downloads to their own threads so they don't muck about with
5048+ the parent thread's event loop. (LP: #1240408)
5049+
5050+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 21 Feb 2014 09:06:04 +0000
5051+
5052+unity8 (7.84+14.04.20140218-0ubuntu1) trusty; urgency=low
5053+
5054+ [ Michał Sawicz ]
5055+ * Center-align title when it's alone in the header.
5056+
5057+ [ Leo Arias ]
5058+ * Prepare unity8 to the _uinput refactors in autopilot.
5059+
5060+ [ Albert Astals ]
5061+ * Progress Preview Widget
5062+ * LWPH Fix crash from bug 1279434 (LP: #1279434)
5063+ * Show the loading indicator of the screenshot in video playback
5064+
5065+ [ Andrea Cimitan ]
5066+ * Adds rating preview widget. Work on the rating widget
5067+
5068+ [ Daniel d'Andrada ]
5069+ * Make DirectionalDragArea work when rotated The drag gesture
5070+ direction is in local coordinates, not in scene coordinates
5071+
5072+ [ Michał Karnicki ]
5073+ * Center-align title when it's alone in the header.
5074+
5075+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 18 Feb 2014 11:41:58 +0000
5076+
15077unity8 (7.84+14.04.20140212-0ubuntu1) trusty; urgency=low
25078
35079 [ Gerry Boland ]
@@ -2237,7 +7313,7 @@ unity8 (7.81.2) saucy; urgency=low
22377313 [ Michał Sawicz ]
22387314 * Fix icons in ApplicationsFilterGrid.qml.
22397315 * Support flipped image in run_on_device.
2240−
7316+
22417317 [ Michael Zanetti ]
22427318 * Don't clear lockscreen when it's fading out.
22437319 * Reworked Launcher folding.
@@ -2322,7 +7398,7 @@ qml-phone-shell (1.79) raring; urgency=low
23227398
23237399 [ Michael Terry ]
23247400 * Make greeter look like the desktop one
2325−
7401+
23267402 [ Gerry Boland ]
23277403 * Fix a bug where a minimized app gets focus after closing another app
23287404 * Applied a workaround to reduce flickering when launching apps
@@ -2338,7 +7414,7 @@ qml-phone-shell (1.79) raring; urgency=low
23387414qml-phone-shell (1.78) raring; urgency=low
23397415
23407416 [ Sergio Schvezov ]
2341− * Replacing the music and ski safari mock apps with calendar and weather in
7417+ * Replacing the music and ski safari mock apps with calendar and weather in
23427418 the launcher (LP: #1178262).
23437419
23447420 [ Daniel d'Andrada ]
@@ -2380,7 +7456,7 @@ qml-phone-shell (1.77) raring; urgency=low
23807456 [ Mathieu Trudel-Lapierre ]
23817457 * debian/control:
23827458 - Drop indicators-client-plugin* Depends for qml-phone-shell to Recommends.
2383− - Add/update Vcs-Browser, Vcs-Bzr and add a notice to uploaders.
7459+ - Add/update Vcs-Browser, Vcs-Bzr and add a notice to uploaders.
23847460 * debian/copyright: fix syntax.
23857461
23867462 [ Michał Sawicz ]
@@ -2390,7 +7466,7 @@ qml-phone-shell (1.77) raring; urgency=low
23907466 * Renamed Media player files to match with new application name.
23917467
23927468 [ Daniel d'Andrada ]
2393− * New: DirectionalDragArea component. An area that detects axis-aligned
7469+ * New: DirectionalDragArea component. An area that detects axis-aligned
23947470 single-finger drag gestures.
23957471 * Make it possible to send touch events from within QML test code.
23967472
@@ -2827,7 +7903,7 @@ qml-phone-shell (1.39) quantal; urgency=low
28277903
28287904qml-phone-shell (1.38) quantal; urgency=low
28297905
2830− * fix launching of notepad
7906+ * fix launching of notepad
28317907
28327908 -- Bill Filler <bill.filler@canonical.com> Fri, 01 Feb 2013 03:21:29 -0500
28337909
@@ -2840,14 +7916,14 @@ qml-phone-shell (1.37) quantal; urgency=low
28407916
28417917qml-phone-shell (1.36) quantal; urgency=low
28427918
2843− * launch real notepad app
7919+ * launch real notepad app
28447920 * fix launching of mock apps
28457921
28467922 -- Bill Filler <bill.filler@canonical.com> Thu, 31 Jan 2013 21:36:05 -0500
28477923
28487924qml-phone-shell (1.35) quantal; urgency=low
28497925
2850− * integrate ubuntu-browser instead of snowshoe
7926+ * integrate ubuntu-browser instead of snowshoe
28517927
28527928 -- Bill Filler <bill.filler@canonical.com> Thu, 31 Jan 2013 17:33:37 -0500
28537929
@@ -2931,7 +8007,7 @@ qml-phone-shell (1.22) quantal; urgency=low
29318007
29328008qml-phone-shell (1.21) quantal; urgency=low
29338009
2934− * New release with fullscreen launcher fixes
8010+ * New release with fullscreen launcher fixes
29358011
29368012 -- Bill Filler <bill.filler@canonical.com> Fri, 07 Dec 2012 09:36:37 +0000
29378013
@@ -2943,7 +8019,7 @@ qml-phone-shell (1.20) quantal; urgency=low
29438019
29448020qml-phone-shell (1.19) quantal; urgency=low
29458021
2946− * enable multi-threaded render for apps
8022+ * enable multi-threaded render for apps
29478023
29488024 -- Bill Filler <bill.filler@canonical.com> Wed, 05 Dec 2012 17:34:09 +0000
29498025
@@ -2951,7 +8027,7 @@ qml-phone-shell (1.18) quantal; urgency=low
29518027
29528028 [ Bill Filler ]
29538029 * update launcher to use wk2-render (chromeless webkit) for facebook
2954− and twitter
8030+ and twitter
29558031
29568032 -- Florian Boucault <florian.boucault@canonical.com> Wed, 05 Dec 2012 12:20:50 +0000
29578033
@@ -2963,7 +8039,7 @@ qml-phone-shell (1.17) quantal; urgency=low
29638039
29648040qml-phone-shell (1.16) quantal; urgency=low
29658041
2966− * fix to launch new gallery with correct args
8042+ * fix to launch new gallery with correct args
29678043
29688044 -- Bill Filler <bill.filler@canonical.com> Thu, 29 Nov 2012 17:04:36 -0500
29698045
@@ -3025,7 +8101,7 @@ qml-phone-shell (1.2) quantal; urgency=low
30258101
30268102qml-phone-shell (1.1) quantal; urgency=low
30278103
3028− * comment out console.log() to prevent crash
8104+ * comment out console.log() to prevent crash
30298105
30308106 -- Bill Filler <bill.filler@canonical.com> Sun, 28 Oct 2012 22:18:36 +0100
30318107
@@ -3053,19 +8129,19 @@ qml-phone-shell (0.7) quantal; urgency=low
30538129 * qml-phone-shell.conf: better setup of env vars and launch
30548130 via dbus-luanch to properly setup session bus
30558131 * shellapplication.cpp: don't setup custom env before launching
3056− processes
8132+ processes
30578133
30588134 -- Bill Filler <bill.filler@canonical.com> Sun, 21 Oct 2012 11:32:42 +0200
30598135
30608136qml-phone-shell (0.6) quantal; urgency=low
30618137
3062− * added additional Android env vars to upstart script
8138+ * added additional Android env vars to upstart script
30638139
30648140 -- Bill Filler <bill.filler@canonical.com> Fri, 19 Oct 2012 09:35:25 -0400
30658141
30668142qml-phone-shell (0.5) quantal; urgency=low
30678143
3068− * added support to launch telephony-app
8144+ * added support to launch telephony-app
30698145
30708146 -- Bill Filler <bill.filler@canonical.com> Thu, 18 Oct 2012 13:45:25 -0400
30718147
@@ -3092,3 +8168,8 @@ qml-phone-shell (0.1) quantal; urgency=low
30928168 * Initial release
30938169
30948170 -- Bill Filler <bill.filler@canonical.com> Wed, 10 Oct 2012 10:19:53 -0400
8171+unity8 (8.15+17.04.20170404.7-0ubuntu2) zesty; urgency=medium
8172+
8173+ [ Michael Zanetti ]
8174+ * Make the default store uri point to gnome software center
8175+
debian/control+231−114
@@ -2,154 +2,271 @@ Source: unity8
22Section: x11
33Priority: optional
44Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
5−Build-Depends: cmake,
6− dbus-test-runner,
7− debhelper (>= 9),
8− doxyqml,
9− graphviz,
10− libdee-qt5-dev (>= 3.2),
11− libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
12− libgl1-mesa-dri,
13− libgles2-mesa-dev[armhf],
14− libgsettings-qt-dev,
15− libhud-client2-dev,
16− libjson-perl,
17− libnih-dbus-dev,
18− libnih-dev,
19− libpulse-dev,
20− libqmenumodel-dev (>= 0.2.7),
21− libunity-api-dev (>= 7.80.4),
22− libunity-mir-dev,
23− libunity-scopes-json-def-phone,
24− libupstart-dev,
25− libusermetricsoutput1-dev,
26− libxcb1-dev,
27− libglib2.0-dev,
28− pkg-config,
29− python:any (>= 2.7),
30− python-setuptools,
31− python3:any,
32− qt5-default,
33− qtbase5-dev,
34− qtbase5-dev-tools,
35− qtbase5-private-dev,
36− qtdeclarative5-dev,
37− qtdeclarative5-dev-tools,
38− qtdeclarative5-qtmultimedia-plugin,
39− qtdeclarative5-private-dev,
40− qtdeclarative5-qtquick2-plugin,
41− qtdeclarative5-test-plugin,
42− qtdeclarative5-ubuntu-settings-components,
43− qtdeclarative5-ubuntu-ui-toolkit-plugin,
44− qtdeclarative5-xmllistmodel-plugin,
45− libqt5xmlpatterns5-dev,
46− ttf-ubuntu-font-family,
5+Build-Depends:
6+ android-headers,
7+ cmake,
8+ cmake-extras,
9+ dbus-test-runner,
10+ debhelper (>= 9),
11+ dh-apparmor,
12+ doxyqml,
13+ g++:native,
14+ gdb,
15+ graphviz,
16+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
17+ libandroid-properties-dev,
18+ libconnectivity-qt1-dev (>= 0.7.1),
19+ libevdev-dev,
20+ libgeonames-dev (>= 0.2),
21+ libgl1-mesa-dev[!arm64 !armhf] | libgl-dev[!arm64 !armhf],
22+ libgl1-mesa-dri,
23+ libgles2-mesa-dev[arm64 armhf],
24+ libglib2.0-dev,
25+ libgnome-desktop-3-dev,
26+ libgsettings-qt-dev,
27+ libhardware-dev,
28+ liblightdm-qt5-3-dev,
29+ libpam0g-dev,
30+ libpulse-dev,
31+ libqmenumodel-dev (>= 0.2.12),
32+ libqt5sql5-sqlite,
33+ libqt5svg5-dev,
34+ libqt5xmlpatterns5-dev,
35+ libqtdbusmock1-dev (>= 0.7),
36+ libqtdbustest1-dev,
37+ libsystemsettings-dev,
38+ libubuntu-app-launch2-dev,
39+ libubuntu-download-manager-common-dev,
40+ libubuntugestures5-dev (>= 1.3.2030),
41+ libubuntugestures5-private-dev (>= 1.3.2030),
42+ libudev-dev,
43+ libudm-common-dev,
44+ libunity-api-dev (>= 8.7),
45+ libusermetricsoutput1-dev,
46+ libx11-dev[!arm64 !armhf],
47+ libxcb1-dev[!arm64 !armhf],
48+ libxi-dev[!arm64 !armhf],
49+ pkg-config,
50+ python3-all:any,
51+ python3-setuptools,
52+ qml-module-qt-labs-folderlistmodel,
53+ qml-module-qt-labs-settings,
54+ qml-module-qtmultimedia (>= 5.6),
55+ qml-module-qtqml-statemachine,
56+ qml-module-qtquick-layouts,
57+ qml-module-qtquick-xmllistmodel,
58+ qml-module-qtquick2,
59+ qml-module-qtsysteminfo,
60+ qml-module-qttest,
61+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
62+ qml-module-ubuntu-layouts,
63+ qml-module-ubuntu-settings-components,
64+ qml-module-ubuntu-test,
65+ qtbase5-dev (>= 5.6),
66+ qtbase5-dev-tools,
67+ qtbase5-private-dev (>= 5.6),
68+ qtdbustest-runner,
69+ qtdeclarative5-dev (>= 5.6),
70+ qtdeclarative5-dev-tools,
71+ qtdeclarative5-private-dev (>= 5.6),
72+ qtdeclarative5-ubuntu-content1,
73+ ttf-ubuntu-font-family,
74+ ubports-wallpapers,
75+ xvfb,
4776Standards-Version: 3.9.4
48−Homepage: http://launchpad.net/unity
49−# If you aren't a member of ~unity-team but need to upload
50−# packaging changes, just go ahead. ~unity-team will notice
51−# and sync up the code again.
52−Vcs-Bzr: https://code.launchpad.net/unity8
53−Vcs-Browser: https://bazaar.launchpad.net/~unity-team/unity8/trunk
77+Homepage: https://github.com/ubports/unity8
78+Vcs-Git: https://github.com/ubports/unity8
79+XS-Testsuite: autopkgtest
80+X-Ubuntu-Use-Langpack: yes
5481
5582Package: indicators-client
56−Architecture: amd64 armhf i386
57−Depends: qmenumodel-qml (>= 0.2.7),
58− qtdeclarative5-ubuntu-ui-toolkit-plugin,
59− unity8 (= ${binary:Version}),
60− ${misc:Depends},
61− ${shlibs:Depends},
83+Architecture: any
84+Depends:
85+ qmenumodel-qml (>= 0.2.11),
86+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
87+ unity8 (= ${binary:Version}),
88+ ${misc:Depends},
89+ ${shlibs:Depends},
6290Description: Indicators client test application
6391 This package contains the client application for indicators used by autopilot
6492
65−Package: unity-scope-tool
93+Package: unity8-greeter
6694Architecture: any
67−Depends: unity8 (= ${binary:Version}),
68− ${misc:Depends},
69− ${shlibs:Depends},
70−Description: Development tool for Unity scopes
71− This package contains the development tool for new generation Unity scopes, based
72− on Unity8.
95+Depends:
96+ unity-system-compositor,
97+ unity8 (= ${binary:Version}),
98+ ${misc:Depends},
99+ ${shlibs:Depends},
100+Recommends:
101+ lightdm,
102+Provides:
103+ lightdm-greeter,
104+Description: The Unity8 Greeter
105+ The Unity 8 greeter is the primary login greeter for Ubuntu devices.
73106
74107Package: unity8
75108Architecture: any
76−Provides: indicator-renderer,
77−Depends: gsettings-desktop-schemas,
78− libglib2.0-bin,
79− libunity-mir1,
80− qmenumodel-qml (>= 0.2.7),
81− qtdeclarative5-dee-plugin,
82− qtdeclarative5-gsettings1.0,
83− qtdeclarative5-ubuntu-settings-components,
84− qtdeclarative5-ubuntu-ui-toolkit-plugin,
85− qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
86− qtdeclarative5-xmllistmodel-plugin,
87− unity-launcher-impl-3,
88− unity-notifications-impl-2,
89− unity8-fake-env | qtubuntu-shell,
90− unity8-private (= ${binary:Version}),
91− unity8-private | unity-launcher-impl,
92− unity-plugin-scopes | unity-scopes-impl,
93− unity-scopes-impl-0,
94−# for setcap:
95− libcap2-bin,
96− ${misc:Depends},
97− ${shlibs:Depends},
98−Recommends: ${unity-default-masterscopes},
99−Breaks: indicator-network (<< 0.5.1)
100−Replaces: ubuntu-touch-session (<< 0.82~)
109+Provides:
110+ indicator-renderer,
111+Depends:
112+ dmz-cursor-theme,
113+ gsettings-desktop-schemas,
114+ libcap2-bin,
115+ libglib2.0-bin,
116+ qmenumodel-qml (>= 0.2.11),
117+ qml-module-biometryd,
118+ qml-module-qt-labs-folderlistmodel,
119+ qml-module-qt-labs-settings,
120+ qml-module-qtqml-statemachine,
121+ qml-module-qtquick-xmllistmodel,
122+ qml-module-qtsysteminfo,
123+ qtdeclarative5-qtmir-plugin (>= 0.4.8),
124+ qtdeclarative5-ubuntu-telephony0.1,
125+ ubuntu-system-settings (>= 0.4),
126+ unity-launcher-impl-13,
127+ unity8-common (= ${source:Version}),
128+ unity8-private (= ${binary:Version}),
129+ unity8-private | unity-launcher-impl,
130+ ${misc:Depends},
131+ ${shlibs:Depends},
132+Recommends:
133+ indicator-keyboard,
134+ indicator-session,
135+ unity-greeter-session-broadcast,
136+Breaks:
137+ indicator-network (<< 0.5.1+14.10.20141014),
138+ ubuntu-keyboard (<< 0.100),
139+ ubuntu-touch-session (<< 0.107),
140+ unity-scope-tool,
141+ unity8-greeter (<< 7.89),
142+Replaces:
143+ ubuntu-touch-session (<< 0.82~),
144+ unity-scope-tool,
145+ unity8-greeter (<< 7.89),
146+Conflicts:
147+ ubuntu-system-settings-wizard,
101148Description: Unity 8 shell
102149 The Unity 8 shell is the primary user interface for Ubuntu devices.
103150
151+Package: unity8-common
152+Architecture: all
153+Depends:
154+ qml-module-qtquick-layouts,
155+ qml-module-ubuntu-components (>= 1.3.2030) | qml-module-ubuntu-components-gles (>= 1.3.2030),
156+ qml-module-ubuntu-settings-components,
157+ qml-module-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
158+ qtdeclarative5-unity-notifications-plugin (>= 0.1.2) | unity-notifications-impl,
159+ qttranslations5-l10n,
160+ ubuntu-thumbnailer-impl-0,
161+ unity-application-impl-27,
162+ unity-notifications-impl-3,
163+ unity8-schemas,
164+ unity8-tests | unity-application-impl,
165+ ${misc:Depends},
166+Breaks:
167+ unity8 (<< 7.86),
168+Replaces:
169+ unity8 (<< 7.86),
170+Description: Unity 8 shell (common files)
171+ The Unity 8 shell is the primary user interface for Ubuntu devices.
172+ .
173+ This package contains the QML, graphics and locale files for unity8.
174+
104175Package: unity8-autopilot
105176Architecture: all
106−Depends: gir1.2-glib-2.0,
107− libautopilot-qt (>= 1.4),
108− libqt5test5,
109− libqt5widgets5,
110− python-evdev,
111− python-fixtures,
112− python-gi,
113− python-mock,
114− ubuntu-ui-toolkit-autopilot,
115− unity8 (>= ${source:Version}),
116− unity8-fake-env (>= ${source:Version}),
117− url-dispatcher-tools,
118− ${misc:Depends},
119− ${python:Depends},
120− ${shlibs:Depends},
177+Depends:
178+ autopilot-qt5 (>= 1.4),
179+ gir1.2-glib-2.0,
180+ gir1.2-notify-0.7,
181+ libqt5test5,
182+ libqt5widgets5,
183+ ofono-phonesim,
184+ python3-autopilot,
185+ python3-evdev,
186+ python3-fixtures,
187+ python3-gi,
188+ qttestability-autopilot (>= 1.4),
189+ ubuntu-ui-toolkit-autopilot (>= 1.3.2030),
190+ unity8 (= ${source:Version}),
191+ unity8-tests (= ${source:Version}),
192+ url-dispatcher-tools,
193+ xvfb,
194+ ${misc:Depends},
195+ ${python3:Depends},
121196Description: Test package for Unity 8 shell
122197 Autopilot tests for the unity8 package
123198
124−Package: unity8-fake-env
199+Package: unity8-tests
125200Architecture: any
126201Multi-Arch: same
127−Pre-Depends: ${misc:Pre-Depends},
128−Depends: ${misc:Depends},
129− ${shlibs:Depends},
130−Provides: qtubuntu-shell,
131−Description: Fake environment for running Unity 8 shell
202+Pre-Depends:
203+ ${misc:Pre-Depends},
204+Depends:
205+ dbus-test-runner,
206+ parallel,
207+ qt5-default,
208+ qtdbustest-runner,
209+ qtdeclarative5-dev-tools,
210+ unity8 (= ${source:Version}),
211+ xvfb,
212+ ${misc:Depends},
213+ ${shlibs:Depends},
214+Provides:
215+ unity-application-impl,
216+ unity-application-impl-27,
217+ unity8-fake-env,
218+Replaces:
219+ unity8-autopilot (<< 8.02+15.04.20150422-0ubuntu1),
220+ unity8-fake-env,
221+Conflicts:
222+ unity8-fake-env,
223+Description: Scripts and mocks for running Unity 8 shell tests
132224 Provides fake implementations of some QML modules used by Unity 8 shell
133− (e.g Ubuntu.Application) so that you can run it in a sandboxed environment.
225+ (e.g Ubuntu.Application) so that you can run it in a sandboxed environment
226+ and scripts to run its test suite.
134227
135228Package: unity8-private
136229Architecture: any
137230Multi-Arch: same
138−Pre-Depends: ${misc:Pre-Depends},
139−Depends: ${misc:Depends},
140− ${shlibs:Depends},
141−Provides: unity-launcher-impl,
142− unity-launcher-impl-3,
231+Pre-Depends:
232+ ${misc:Pre-Depends},
233+Depends:
234+ accountsservice-ubuntu-schemas (>= 0.0.7),
235+ gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
236+ libhardware2,
237+ qml-module-qtmultimedia,
238+ qtdeclarative5-gsettings1.0,
239+ unity8-schemas,
240+ ${misc:Depends},
241+ ${shlibs:Depends},
242+Provides:
243+ unity-launcher-impl,
244+ unity-launcher-impl-13,
143245Description: Unity 8 private libs
144246 The Unity 8 shell is the primary user interface for Ubuntu devices.
145247 .
146248 This package contains the private libraries for QML and other components
147249 only used by the shell.
148250
251+Package: unity8-schemas
252+Architecture: all
253+Multi-Arch: foreign
254+Depends:
255+ ${misc:Depends},
256+Replaces:
257+ unity-schemas (>= 7.3.1+14.10.20140915),
258+Breaks:
259+ unity-schemas (>= 7.3.1+14.10.20140915),
260+Description: Unity 8 schemas
261+ The Unity 8 shell is the primary user interface for Ubuntu devices.
262+ .
263+ This package contains the configuration schemas used by unity.
264+
149265Package: unity8-doc
150266Section: doc
151267Architecture: all
152268Multi-Arch: foreign
153−Depends: ${misc:Depends},
269+Depends:
270+ ${misc:Depends},
154271Description: Documentation for Unity8
155272 The Unity 8 shell is the primary user interface for Ubuntu devices. (documentation)
debian/copyright+21
@@ -60,3 +60,24 @@ License: LGPL-2.1 with Digia Qt LGPL Exception 1.1 or GPL-3
6060 packaging of this file. Please review the following information to
6161 ensure the GNU General Public License version 3.0 requirements will be
6262 met: http://www.gnu.org/copyleft/gpl.html.
63+
64+Files: plugins/Cursor/3rd_party/xcursor/xcursor.*
65+Copyright: 2002 Keith Packard
66+License: Keith Packard
67+ Permission to use, copy, modify, distribute, and sell this software and its
68+ documentation for any purpose is hereby granted without fee, provided that
69+ the above copyright notice appear in all copies and that both that
70+ copyright notice and this permission notice appear in supporting
71+ documentation, and that the name of Keith Packard not be used in
72+ advertising or publicity pertaining to distribution of the software without
73+ specific, written prior permission. Keith Packard makes no
74+ representations about the suitability of this software for any purpose. It
75+ is provided "as is" without express or implied warranty.
76+ .
77+ KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
78+ INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
79+ EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
80+ CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
81+ DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
82+ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
83+ PERFORMANCE OF THIS SOFTWARE.
debian/indicators-client.install+1
@@ -1 +1,2 @@
11/usr/bin/indicators-client
2+usr/share/applications/indicators-client.desktop
debian/rules+26−15
@@ -1,20 +1,21 @@
11#!/usr/bin/make -f
22# -*- makefile -*-
33
4+include /usr/share/dpkg/default.mk
5+
46# Uncomment this to turn on verbose mode.
57#export DH_VERBOSE=1
68export DPKG_GENSYMBOLS_CHECK_LEVEL=4
79export NO_PNG_PKG_MANGLE=1
10+export QT_SELECT=qt5
811
9−SCOPES_RECOMMENDS := $(shell perl debian/scopes-recommends-generator /usr/share/unity/client-scopes.json)
12+DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
1013
11−.PHONY: build
12−build %:
13− dh $@ --parallel --fail-missing --with python2
14+# Skip tests on the archs they are known to be flaky with current configuration
15+testskip_architectures := arm64 powerpc ppc64el s390x
1416
15−override_dh_auto_clean:
16− dh_auto_clean
17− rm -rf builddir
17+%:
18+ dh $@ --parallel --fail-missing --with python3
1819
1920override_dh_auto_configure:
2021 # Debian defines CMAKE_INSTALL_LOCALSTATEDIR as /usr/var, which is wrong.
@@ -23,12 +24,24 @@ override_dh_auto_configure:
2324
2425override_dh_auto_build:
2526 # doc is not a default target
26− dh_auto_build -- all doc
27+ dh_auto_build -- -O all doc
28+
29+override_dh_auto_test:
30+ # Run the entire test battery
31+ # Parallel tests have a risk of starting xvfb on the same DISPLAY multiple times,
32+ # causing the whole battery to fail.
33+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
34+ifneq (,$(filter $(DEB_HOST_ARCH),$(testskip_architectures)))
35+ -dh_auto_test --no-parallel -- -O -k xvfballtests
36+else
37+ dh_auto_test --no-parallel -- -O -k xvfballtests
38+endif
39+endif
2740
2841override_dh_install:
2942 # install autopilot tests
3043 cd tests/autopilot; \
31− set -ex; for python in $(shell pyversions -r); do \
44+ set -ex; for python in $(shell py3versions -r); do \
3245 $$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \
3346 done; \
3447 cd $(CURDIR)
@@ -36,11 +49,9 @@ override_dh_install:
3649
3750# use private lib directories
3851override_dh_makeshlibs:
39− dh_makeshlibs -Nunity8-private -Nunity8-fake-env
52+ dh_makeshlibs -Nunity8-private -Nunity8-tests
4053
41−# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
4254override_dh_shlibdeps:
43− dh_shlibdeps -XlibMockLightDM-qml.so
44−
45−override_dh_gencontrol:
46− dh_gencontrol -- -Vunity-default-masterscopes="$(SCOPES_RECOMMENDS)"
55+ # Some mock libraries link against liblightdm-qt5-3.so which we want to
56+ # avoid, since we only really link against our mock one, not the system one.
57+ dh_shlibdeps -XlibMockAccountsService-qml.so -Lunity8-private
debian/scopes-recommends-generatordeleted−27
@@ -1,27 +0,0 @@
1−#!/usr/bin/perl -w
2−
3−use strict;
4−binmode STDOUT, ":utf8";
5−use utf8;
6−
7−use JSON;
8−
9−my $json;
10−{
11− local $/; #Enable 'slurp' mode
12− open my $fh, "<", $ARGV[0];
13− $json = <$fh>;
14− close $fh;
15−}
16−# get it to a scalar
17−my $j = "[" . $json . "]";
18−
19−my $decoded_json = decode_json( $j );
20−
21−my $recommends_list = "";
22−for my $record ( @$decoded_json ) {
23− foreach my $key ( keys(%$record) ) {
24− $recommends_list = $recommends_list . $key . ", ";
25− }
26−}
27−print $recommends_list;
debian/shlibs.localnew file+1
@@ -0,0 +1 @@
1+libunity8-private 0 unity8-private
debian/source/formatdeleted−1
@@ -1 +0,0 @@
1−1.0
debian/tests/autopilot.shnew file+13
@@ -0,0 +1,13 @@
1+#!/bin/sh
2+
3+# log all commands and abort on error
4+set -xe
5+
6+if [ ! -f /system/build.prop ]; then
7+ echo "WARNING: Skipping autopilot test, will only run on devices at the moment."
8+ exit 0
9+fi
10+
11+initctl --session stop unity8
12+autopilot3 run --verbose --format xml --output "${ADT_ARTIFACTS}/unity8.xml" unity8
13+initctl --session start unity8
debian/tests/controlnew file+11
@@ -0,0 +1,11 @@
1+Tests: qmluitests.sh
2+Restrictions: allow-stderr
3+Depends:
4+ dpkg-dev,
5+ unity8-tests,
6+
7+Tests: autopilot.sh
8+Restrictions: allow-stderr,
9+ isolation-machine,
10+Depends:
11+ unity8-autopilot,
debian/tests/qmluitests.shnew file+11
@@ -0,0 +1,11 @@
1+#!/bin/sh
2+# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 4 -*-
3+
4+# log all commands and abort on error
5+set -xe
6+
7+DEB_HOST_MULTIARCH=$(dpkg-architecture -qDEB_HOST_MULTIARCH)
8+
9+export ARTIFACTS_DIR="${ADT_ARTIFACTS}"
10+
11+/usr/lib/$DEB_HOST_MULTIARCH/unity8/tests/scripts/xvfballtests.sh
debian/unity-scope-tool.installdeleted−3
@@ -1,3 +0,0 @@
1−usr/bin/unity-scope-tool
2−usr/share/applications/unity-scope-tool.desktop
3−usr/share/unity8/ScopeTool.qml
debian/unity8-autopilot.install+1
@@ -1 +1,2 @@
11usr/lib/python*/*/unity*
2+usr/share/unity8/unlock-device
debian/unity8-common.installnew file+5
@@ -0,0 +1,5 @@
1+usr/share/locale
2+usr/share/unity8/Components
3+usr/share/unity8/Notifications
4+usr/share/unity8/graphics
5+var/lib/polkit-1/localauthority/10-vendor.d
debian/unity8-common.udevnew file+2
@@ -0,0 +1,2 @@
1+# Make local foreground session able to inject input
2+KERNEL=="uinput", SUBSYSTEM=="misc", TAG+="uaccess"
debian/unity8-doc.install+1
@@ -1 +1,2 @@
1+doc/devices.conf usr/share/doc/unity8/
12usr/share/doc/unity8/*
debian/unity8-fake-env.installdeleted−3
@@ -1,3 +0,0 @@
1−usr/lib/*/unity8/qml/mocks
2−usr/lib/*/unity8/qml/scopefakes
3−usr/share/unity8/mocks
debian/unity8-greeter.installnew file+5
@@ -0,0 +1,5 @@
1+data/unity8-greeter-init.conf usr/share/upstart/sessions/
2+data/unity8-greeter-wrapper usr/bin/
3+data/unity8-greeter.pkla /var/lib/polkit-1/localauthority/10-vendor.d/
4+usr/share/lightdm/greeters/unity8-greeter.desktop
5+usr/share/lightdm/lightdm.conf.d/51-unity8-greeter.conf
debian/unity8-private.install+9−4
@@ -1,13 +1,18 @@
1+usr/lib/*/libunity8-private.*
12usr/lib/*/unity8/qml/AccountsService
2−usr/lib/*/unity8/qml/HudClient
3+usr/lib/*/unity8/qml/Cursor
4+usr/lib/*/unity8/qml/GlobalShortcut
5+usr/lib/*/unity8/qml/Greeter
36usr/lib/*/unity8/qml/LightDM
4−usr/lib/*/unity8/qml/DashViews
7+usr/lib/*/unity8/qml/Lights
58usr/lib/*/unity8/qml/Powerd
9+usr/lib/*/unity8/qml/ScreenshotDirectory
610usr/lib/*/unity8/qml/SessionBroadcast
11+usr/lib/*/unity8/qml/UInput
712usr/lib/*/unity8/qml/Ubuntu
813usr/lib/*/unity8/qml/Unity
914usr/lib/*/unity8/qml/Utils
15+usr/lib/*/unity8/qml/WindowManager
16+usr/lib/*/unity8/qml/Wizard
1017usr/share/accountsservice/interfaces
1118usr/share/dbus-1/interfaces
12−usr/share/polkit-1
13−var/lib/polkit-1
debian/unity8-schemas.installnew file+1
@@ -0,0 +1 @@
1+usr/share/glib-2.0/schemas
debian/unity8-tests.installnew file+9
@@ -0,0 +1,9 @@
1+data/unity-mock-indicator-service.conf usr/share/upstart/sessions/
2+usr/bin/unity-mock-indicator-service
3+usr/lib/*/unity8/qml/mocks
4+usr/lib/*/unity8/qml/nonmirplugins
5+usr/lib/*/unity8/qml/utils
6+usr/lib/*/unity8/tests
7+usr/lib/*/unity8/uqmlscene
8+usr/share/unity8/mocks
9+usr/share/unity8/tests
debian/unity8-tests.lintian-overridesnew file+1
@@ -0,0 +1 @@
1+unity8-tests: unusual-interpreter usr/lib/*/unity8/tests/scripts/*.sh #!/usr/bin/parallel
debian/unity8.install+13−9
@@ -1,15 +1,19 @@
1+data/devices.conf etc/ubuntu/
2+data/test.sensors etc/ubuntusensors/
3+data/unity8-filewatcher.conf usr/share/upstart/sessions/
4+data/unity8.conf usr/share/upstart/sessions/
15usr/bin/unity8
26usr/share/applications/unity8.desktop
3−usr/share/locale
4−usr/share/unity8/Bottombar
5−usr/share/unity8/Components
6−usr/share/unity8/Dash
7+usr/share/unity8/ApplicationMenus
8+usr/share/unity8/DeviceConfiguration.qml
9+usr/share/unity8/DisabledScreenNotice.qml
710usr/share/unity8/Greeter
8−usr/share/unity8/Hud
911usr/share/unity8/Launcher
10−usr/share/unity8/Notifications
12+usr/share/unity8/OrientedShell.qml
1113usr/share/unity8/Panel
14+usr/share/unity8/Rotation
1215usr/share/unity8/Shell.qml
13−usr/share/unity8/SideStage
14−usr/share/unity8/graphics
15−data/unity8.conf usr/share/upstart/sessions/
16+usr/share/unity8/Stage
17+usr/share/unity8/Tutorial
18+usr/share/unity8/Wizard
19+var/lib/unity8/version
doc/CMakeLists.txt+2
@@ -15,6 +15,8 @@ else()
1515 ${CMAKE_SOURCE_DIR}/src/*.cpp
1616 ${CMAKE_SOURCE_DIR}/plugins/*.h
1717 ${CMAKE_SOURCE_DIR}/plugins/*.cpp
18+ ${CMAKE_SOURCE_DIR}/plugins/*.qml
19+ ${CMAKE_SOURCE_DIR}/plugins/*.js
1820 ${CMAKE_SOURCE_DIR}/qml/*.qml
1921 ${CMAKE_SOURCE_DIR}/qml/*.js
2022 ${CMAKE_SOURCE_DIR}/tests/autopilot/*.py
doc/devices.confnew file+45
@@ -0,0 +1,45 @@
1+# This file can hold multiple device configs. Devices are separated by sections.
2+#
3+# SupportedOrientations holds a list of all enabled orientations. A standard
4+# phone will usually have Portrait,Landcape,InvertedLandscape in order to
5+# disable upside down usage.
6+#
7+# PrimaryOrientation gives the orientation the device will start up with
8+# when there is no orientations sensor input available (yet) or lock to
9+# when an application specifies to be locked to PrimaryOrientation.
10+#
11+# The other Orientation settings can be used to re-map the orientations.
12+# A device might be used with different orientations than how the screen
13+# is physically mounted on the hardware.
14+#
15+# Category can be phone, tablet, or desktop. This option determines
16+# whether the side stage is shown (tablet) or not (phone). Using
17+# desktop will load the shell in windowed mode. Note that the user
18+# can override/change this by connecting input hardware or change
19+# user settings.
20+#
21+# Any options not listed will default to the values of the example below.
22+
23+[devicename]
24+SupportedOrientations=Portrait,InvertedPortrait,Landscape,InvertedLandscape
25+PrimaryOrientation=PrimaryOrienation
26+PortraitOrientation=Portrait
27+InvertedPortraitOrientation=InvertedPortrait
28+LandscapeOrientation=Landscape
29+InvertedLandscapeOrientation=InvertedLandscape
30+Category=phone
31+
32+# Example for the Nexus 7
33+# This device has the screen mounted in portrait, but we run it as a landscape
34+# device and we want the side stage on it.
35+[flo]
36+PrimaryOrientation=LandscapeOrienation
37+Category=tablet
38+
39+# Example for the Nexus 4
40+# The screen is already mounted the way we want it, so no special config
41+# required. However, we don't want the phone to rotate upside down, so lets
42+# restrict that.
43+[mako]
44+SupportedOrientations=Portrait,Landscape,InvertedLandscape
45+Category=phone
include/paths.h.in+86−39
@@ -1,8 +1,5 @@
11/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * Authors:
5− * Ugo Riboni <ugo.riboni@canonical.com>
2+ * Copyright (C) 2012-2016 Canonical, Ltd.
63 *
74 * This program is free software; you can redistribute it and/or modify
85 * it under the terms of the GNU General Public License as published by
@@ -17,8 +14,7 @@
1714 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1815 */
1916
20−#ifndef PATHS_H
21−#define PATHS_H
17+#pragma once
2218
2319// Qt
2420#include <QtCore/QCoreApplication>
@@ -27,32 +23,92 @@
2723#include <QtQml/QQmlEngine>
2824#include <QStandardPaths>
2925
26+inline QString installRoot() {
27+ static QString installRoot;
28+ static bool installRootSet = false;
29+ if (!installRootSet) {
30+ QString snapRoot = QFile::decodeName(qgetenv("SNAP"));
31+ if (!snapRoot.isEmpty() && QCoreApplication::applicationDirPath() ==
32+ QDir(snapRoot + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@")).canonicalPath()) {
33+ installRoot = snapRoot;
34+ } else if (QCoreApplication::applicationDirPath() ==
35+ QDir(QStringLiteral("@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@")).canonicalPath()) {
36+ installRoot = QStringLiteral("");
37+ }
38+ installRootSet = true;
39+ }
40+ return installRoot;
41+}
42+
3043inline bool isRunningInstalled() {
31− static bool installed = (QCoreApplication::applicationDirPath() ==
32− QDir(("@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@")).canonicalPath());
33− return installed;
44+ // Tests don't use the normal binary, so we want to check binary *and*
45+ // the environment. Installed tests have UNITY_TESTING_DATADIR set.
46+ static bool installed_test_env = !qgetenv("UNITY_TESTING_DATADIR").isEmpty();
47+ return !installRoot().isNull() || installed_test_env;
48+}
49+
50+inline QString buildDirectory() {
51+ if (!qEnvironmentVariableIsEmpty("UNITY_BINARY_DIR")) return qgetenv("UNITY_BINARY_DIR");
52+ return QStringLiteral("@CMAKE_BINARY_DIR@");
53+}
54+
55+inline QString sourceDirectory() {
56+ if (!qEnvironmentVariableIsEmpty("UNITY_SOURCE_DIR")) return qgetenv("UNITY_SOURCE_DIR");
57+ return QStringLiteral("@CMAKE_SOURCE_DIR@");
3458}
3559
3660inline QString translationDirectory() {
3761 if (isRunningInstalled()) {
38− return QString("@CMAKE_INSTALL_PREFIX@/share/locale");
62+ return installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/share/locale");
3963 } else {
40− return QString("@CMAKE_BINARY_DIR@/po/locale");
64+ return buildDirectory() + QStringLiteral("/po/locale");
65+ }
66+}
67+
68+inline QString testDataDir() {
69+ // Can't use isRunningInstalled, since tests don't use the normal unity8
70+ // executable. $UNITY_TESTING_DATADIR is set by installed tests.
71+ QString datadir(qgetenv("UNITY_TESTING_DATADIR"));
72+ if (datadir.isEmpty()) {
73+ return sourceDirectory() + "/tests";
74+ } else {
75+ return datadir + "/tests";
76+ }
77+}
78+
79+inline QString testLibDir() {
80+ // Can't use isRunningInstalled, since tests don't use the normal unity8
81+ // executable. $UNITY_TESTING_DATADIR is set by installed tests.
82+ QString libdir(qgetenv("UNITY_TESTING_LIBDIR"));
83+ if (libdir.isEmpty()) {
84+ return buildDirectory() + "/tests";
85+ } else {
86+ return libdir + "/tests";
4187 }
4288}
4389
4490inline QString qmlDirectory() {
4591 if (isRunningInstalled()) {
46− return QString("@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/");
92+ return installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_APP_DIR@/");
4793 } else {
48− return QString("@CMAKE_SOURCE_DIR@/qml/");
94+ return sourceDirectory() + QStringLiteral("/qml");
4995 }
5096}
5197
5298inline QStringList overrideImportPaths() {
5399 QStringList paths;
54100 if (!isRunningInstalled()) {
55− paths << QString("@CMAKE_BINARY_DIR@/plugins");
101+ paths << buildDirectory() + QStringLiteral("/plugins");
102+ }
103+ return paths;
104+}
105+
106+inline QStringList nonMirImportPaths() {
107+ QStringList paths;
108+ if (isRunningInstalled()) {
109+ paths << installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/nonmirplugins");
110+ } else {
111+ paths << buildDirectory() + QStringLiteral("/nonmirplugins");
56112 }
57113 return paths;
58114}
@@ -60,34 +116,35 @@ inline QStringList overrideImportPaths() {
60116inline QStringList fallbackImportPaths() {
61117 QStringList paths;
62118 if (isRunningInstalled()) {
63− paths << QString("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@");
64− paths << QString("@SHELL_PLUGINDIR@");
65− paths << QString("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/mocks");
119+ paths << installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@");
120+ paths << installRoot() + QStringLiteral("@USS_PRIVATE_PLUGINDIR@");
121+ paths << installRoot() + QStringLiteral("@SHELL_PLUGINDIR@");
122+ paths << installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/mocks");
66123 } else {
67− paths << QString("@SHELL_PLUGINDIR@");
68− paths << QString("@CMAKE_BINARY_DIR@/tests/mocks");
124+ paths << QStringLiteral("@USS_PRIVATE_PLUGINDIR@");
125+ paths << QStringLiteral("@SHELL_PLUGINDIR@");
126+ paths << buildDirectory() + QStringLiteral("/tests/mocks");
69127 }
70128 return paths;
71129}
72130
131+inline QString mockPluginsDir() {
132+ if (isRunningInstalled()) {
133+ return installRoot() + QStringLiteral("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/mocks");
134+ } else {
135+ return buildDirectory() + QStringLiteral("/tests/mocks");
136+ }
137+}
138+
73139inline QStringList shellDataDirs() {
74140 QStringList dirs = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation);
75− if (!isRunningInstalled()) {
76− if (getenv("UNITY_TEST_ENV")==NULL) {
77− dirs.prepend("@CMAKE_BINARY_DIR@/share");
78− }
79− }
80− else {
141+ if (isRunningInstalled()) {
81142 // append so by default we use xdg files.
82143 dirs.append(qmlDirectory());
83144 }
84145 return dirs;
85146}
86147
87−inline QString sourceDirectory() {
88− return QString("@CMAKE_SOURCE_DIR@/");
89−}
90−
91148inline void prependImportPaths(QQmlEngine *engine, const QStringList &paths)
92149{
93150 QStringList importPathList = engine->importPathList();
@@ -116,13 +173,3 @@ inline void appendImportPaths(QQmlEngine *engine, const QStringList &paths)
116173 }
117174 engine->setImportPathList(importPathList);
118175}
119−
120−inline void resolveIconTheme() {
121− const char *ubuntuIconTheme = getenv("UBUNTU_ICON_THEME");
122− if (ubuntuIconTheme == NULL) {
123− ubuntuIconTheme = "ubuntu-mobile";
124− }
125− QIcon::setThemeName(ubuntuIconTheme);
126−}
127−
128−#endif
plugins/AccountsService/50-com.canonical.unity.AccountsService.pkladeleted−6
@@ -1,6 +0,0 @@
1−[Allow LightDM to set Unity AccountsService fields]
2−Identity=unix-user:lightdm
3−Action=com.canonical.unity.AccountsService.ModifyAnyUser
4−ResultActive=yes
5−ResultInactive=yes
6−ResultAny=yes
plugins/AccountsService/AccountsService.cpp+365−47
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,26 +12,124 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#include "AccountsService.h"
2018#include "AccountsServiceDBusAdaptor.h"
2119
20+#include <QDBusInterface>
21+#include <QFile>
2222#include <QStringList>
23+#include <QDebug>
24+
25+#include <glib.h>
26+
27+#define IFACE_ACCOUNTS_USER QStringLiteral("org.freedesktop.Accounts.User")
28+#define IFACE_UBUNTU_INPUT QStringLiteral("com.ubuntu.AccountsService.Input")
29+#define IFACE_UBUNTU_SECURITY QStringLiteral("com.ubuntu.AccountsService.SecurityPrivacy")
30+#define IFACE_UBUNTU_SECURITY_OLD QStringLiteral("com.ubuntu.touch.AccountsService.SecurityPrivacy")
31+#define IFACE_UNITY QStringLiteral("com.canonical.unity.AccountsService")
32+#define IFACE_UNITY_PRIVATE QStringLiteral("com.canonical.unity.AccountsService.Private")
33+
34+#define PROP_BACKGROUND_FILE QStringLiteral("BackgroundFile")
35+#define PROP_DEMO_EDGES QStringLiteral("DemoEdges2")
36+#define PROP_DEMO_EDGES_COMPLETED QStringLiteral("DemoEdgesCompleted")
37+#define PROP_EMAIL QStringLiteral("Email")
38+#define PROP_ENABLE_FINGERPRINT_IDENTIFICATION QStringLiteral("EnableFingerprintIdentification")
39+#define PROP_ENABLE_INDICATORS_WHILE_LOCKED QStringLiteral("EnableIndicatorsWhileLocked")
40+#define PROP_ENABLE_LAUNCHER_WHILE_LOCKED QStringLiteral("EnableLauncherWhileLocked")
41+#define PROP_FAILED_FINGERPRINT_LOGINS QStringLiteral("FailedFingerprintLogins")
42+#define PROP_FAILED_LOGINS QStringLiteral("FailedLogins")
43+#define PROP_INPUT_SOURCES QStringLiteral("InputSources")
44+#define PROP_LICENSE_ACCEPTED QStringLiteral("LicenseAccepted")
45+#define PROP_LICENSE_BASE_PATH QStringLiteral("LicenseBasePath")
46+#define PROP_MOUSE_CURSOR_SPEED QStringLiteral("MouseCursorSpeed")
47+#define PROP_MOUSE_DOUBLE_CLICK_SPEED QStringLiteral("MouseDoubleClickSpeed")
48+#define PROP_MOUSE_PRIMARY_BUTTON QStringLiteral("MousePrimaryButton")
49+#define PROP_MOUSE_SCROLL_SPEED QStringLiteral("MouseScrollSpeed")
50+#define PROP_PASSWORD_DISPLAY_HINT QStringLiteral("PasswordDisplayHint")
51+#define PROP_REAL_NAME QStringLiteral("RealName")
52+#define PROP_STATS_WELCOME_SCREEN QStringLiteral("StatsWelcomeScreen")
53+#define PROP_TOUCHPAD_CURSOR_SPEED QStringLiteral("TouchpadCursorSpeed")
54+#define PROP_TOUCHPAD_DISABLE_WHILE_TYPING QStringLiteral("TouchpadDisableWhileTyping")
55+#define PROP_TOUCHPAD_DISABLE_WITH_MOUSE QStringLiteral("TouchpadDisableWithMouse")
56+#define PROP_TOUCHPAD_DOUBLE_CLICK_SPEED QStringLiteral("TouchpadDoubleClickSpeed")
57+#define PROP_TOUCHPAD_PRIMARY_BUTTON QStringLiteral("TouchpadPrimaryButton")
58+#define PROP_TOUCHPAD_SCROLL_SPEED QStringLiteral("TouchpadScrollSpeed")
59+#define PROP_TOUCHPAD_TAP_TO_CLICK QStringLiteral("TouchpadTapToClick")
60+#define PROP_TOUCHPAD_TWO_FINGER_SCROLL QStringLiteral("TouchpadTwoFingerScroll")
2361
24−AccountsService::AccountsService(QObject* parent)
25− : QObject(parent),
26− m_service(new AccountsServiceDBusAdaptor(this)),
27− m_user(qgetenv("USER")),
28− m_demoEdges(false),
29− m_statsWelcomeScreen(false)
62+using StringMap = QMap<QString,QString>;
63+using StringMapList = QList<StringMap>;
64+Q_DECLARE_METATYPE(StringMapList)
65+
66+
67+QVariant primaryButtonConverter(const QVariant &value)
3068{
31− connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
32− this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
33− connect(m_service, SIGNAL(maybeChanged(const QString &)),
34− this, SLOT(maybeChanged(const QString &)));
69+ QString stringValue = value.toString();
70+ if (stringValue == QLatin1String("left")) {
71+ return QVariant::fromValue(0);
72+ } else if (stringValue == QLatin1String("right")) {
73+ return QVariant::fromValue(1); // Mir is less clear on this -- any non-zero value is the same
74+ } else {
75+ return QVariant::fromValue(0); // default to left
76+ }
77+}
78+
79+AccountsService::AccountsService(QObject* parent, const QString &user)
80+ : QObject(parent)
81+ , m_service(new AccountsServiceDBusAdaptor(this))
82+{
83+ m_unityInput = new QDBusInterface(QStringLiteral("com.canonical.Unity.Input"),
84+ QStringLiteral("/com/canonical/Unity/Input"),
85+ QStringLiteral("com.canonical.Unity.Input"),
86+ QDBusConnection::SM_BUSNAME(), this);
87+
88+ connect(m_service, &AccountsServiceDBusAdaptor::propertiesChanged, this, &AccountsService::onPropertiesChanged);
89+ connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged, this, &AccountsService::onMaybeChanged);
90+
91+ registerProperty(IFACE_ACCOUNTS_USER, PROP_BACKGROUND_FILE, QStringLiteral("backgroundFileChanged"));
92+ registerProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, QStringLiteral("emailChanged"));
93+ registerProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, QStringLiteral("realNameChanged"));
94+ registerProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QStringLiteral("keymapsChanged"));
95+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION, QStringLiteral("enableFingerprintIdentificationChanged"));
96+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED, QStringLiteral("enableLauncherWhileLockedChanged"));
97+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED, QStringLiteral("enableIndicatorsWhileLockedChanged"));
98+ registerProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT, QStringLiteral("passwordDisplayHintChanged"));
99+ registerProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN, QStringLiteral("statsWelcomeScreenChanged"));
100+ registerProperty(IFACE_UNITY, PROP_DEMO_EDGES, QStringLiteral("demoEdgesChanged"));
101+ registerProperty(IFACE_UNITY, PROP_DEMO_EDGES_COMPLETED, QStringLiteral("demoEdgesCompletedChanged"));
102+ registerProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_FINGERPRINT_LOGINS, QStringLiteral("failedFingerprintLoginsChanged"));
103+ registerProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, QStringLiteral("failedLoginsChanged"));
104+
105+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_CURSOR_SPEED,
106+ m_unityInput, QStringLiteral("setMouseCursorSpeed"));
107+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_DOUBLE_CLICK_SPEED,
108+ m_unityInput, QStringLiteral("setMouseDoubleClickSpeed"));
109+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_PRIMARY_BUTTON,
110+ m_unityInput, QStringLiteral("setMousePrimaryButton"),
111+ primaryButtonConverter);
112+ registerProxy(IFACE_UBUNTU_INPUT, PROP_MOUSE_SCROLL_SPEED,
113+ m_unityInput, QStringLiteral("setMouseScrollSpeed"));
114+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_CURSOR_SPEED,
115+ m_unityInput, QStringLiteral("setTouchpadCursorSpeed"));
116+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_SCROLL_SPEED,
117+ m_unityInput, QStringLiteral("setTouchpadScrollSpeed"));
118+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DISABLE_WHILE_TYPING,
119+ m_unityInput, QStringLiteral("setTouchpadDisableWhileTyping"));
120+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DISABLE_WITH_MOUSE,
121+ m_unityInput, QStringLiteral("setTouchpadDisableWithMouse"));
122+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_DOUBLE_CLICK_SPEED,
123+ m_unityInput, QStringLiteral("setTouchpadDoubleClickSpeed"));
124+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_PRIMARY_BUTTON,
125+ m_unityInput, QStringLiteral("setTouchpadPrimaryButton"),
126+ primaryButtonConverter);
127+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_TAP_TO_CLICK,
128+ m_unityInput, QStringLiteral("setTouchpadTapToClick"));
129+ registerProxy(IFACE_UBUNTU_INPUT, PROP_TOUCHPAD_TWO_FINGER_SCROLL,
130+ m_unityInput, QStringLiteral("setTouchpadTwoFingerScroll"));
131+
132+ setUser(!user.isEmpty() ? user : QString::fromUtf8(g_get_user_name()));
35133}
36134
37135QString AccountsService::user() const
@@ -41,85 +139,305 @@ QString AccountsService::user() const
41139
42140void AccountsService::setUser(const QString &user)
43141{
142+ if (user.isEmpty() || m_user == user)
143+ return;
144+
145+ bool wasEmpty = m_user.isEmpty();
146+
44147 m_user = user;
45148 Q_EMIT userChanged();
46149
47− updateDemoEdges();
48− updateBackgroundFile();
49− updateStatsWelcomeScreen();
150+ // Do the first update synchronously, as a cheap way to block rendering
151+ // until we have the right values on bootup.
152+ refresh(!wasEmpty);
50153}
51154
52155bool AccountsService::demoEdges() const
53156{
54− return m_demoEdges;
157+ auto value = getProperty(IFACE_UNITY, PROP_DEMO_EDGES);
158+ return value.toBool();
55159}
56160
57161void AccountsService::setDemoEdges(bool demoEdges)
58162{
59− m_demoEdges = demoEdges;
60− m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges", demoEdges);
163+ setProperty(IFACE_UNITY, PROP_DEMO_EDGES, demoEdges);
164+}
165+
166+QStringList AccountsService::demoEdgesCompleted() const
167+{
168+ auto value = getProperty(IFACE_UNITY, PROP_DEMO_EDGES_COMPLETED);
169+ return value.toStringList();
170+}
171+
172+void AccountsService::markDemoEdgeCompleted(const QString &edge)
173+{
174+ auto currentList = demoEdgesCompleted();
175+ if (!currentList.contains(edge)) {
176+ setProperty(IFACE_UNITY, PROP_DEMO_EDGES_COMPLETED, currentList << edge);
177+ }
178+}
179+
180+bool AccountsService::enableFingerprintIdentification() const
181+{
182+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_FINGERPRINT_IDENTIFICATION);
183+ return value.toBool();
184+}
185+
186+bool AccountsService::enableLauncherWhileLocked() const
187+{
188+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_LAUNCHER_WHILE_LOCKED);
189+ return value.toBool();
190+}
191+
192+bool AccountsService::enableIndicatorsWhileLocked() const
193+{
194+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_ENABLE_INDICATORS_WHILE_LOCKED);
195+ return value.toBool();
61196}
62197
63198QString AccountsService::backgroundFile() const
64199{
65− return m_backgroundFile;
200+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_BACKGROUND_FILE);
201+ return value.toString();
66202}
67203
68204bool AccountsService::statsWelcomeScreen() const
69205{
70− return m_statsWelcomeScreen;
206+ auto value = getProperty(IFACE_UBUNTU_SECURITY_OLD, PROP_STATS_WELCOME_SCREEN);
207+ return value.toBool();
208+}
209+
210+AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
211+{
212+ auto value = getProperty(IFACE_UBUNTU_SECURITY, PROP_PASSWORD_DISPLAY_HINT);
213+ return (PasswordDisplayHint)value.toInt();
214+}
215+
216+QString AccountsService::realName() const
217+{
218+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME);
219+ return value.toString();
220+}
221+
222+void AccountsService::setRealName(const QString &realName)
223+{
224+ setProperty(IFACE_ACCOUNTS_USER, PROP_REAL_NAME, realName);
225+}
226+
227+QString AccountsService::email() const
228+{
229+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL);
230+ return value.toString();
71231}
72232
73−void AccountsService::updateDemoEdges()
233+void AccountsService::setEmail(const QString &email)
74234{
75− auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
76− if (m_demoEdges != demoEdges) {
77− m_demoEdges = demoEdges;
78− Q_EMIT demoEdgesChanged();
235+ setProperty(IFACE_ACCOUNTS_USER, PROP_EMAIL, email);
236+}
237+
238+QStringList AccountsService::keymaps() const
239+{
240+ auto value = getProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES);
241+ QDBusArgument arg = value.value<QDBusArgument>();
242+ StringMapList maps = qdbus_cast<StringMapList>(arg);
243+ QStringList simplifiedMaps;
244+
245+ Q_FOREACH(const StringMap &map, maps) {
246+ Q_FOREACH(const QString &entry, map) {
247+ simplifiedMaps.append(entry);
248+ }
79249 }
250+
251+ if (!simplifiedMaps.isEmpty()) {
252+ return simplifiedMaps;
253+ }
254+
255+ return {QStringLiteral("us")};
80256}
81257
82−void AccountsService::updateBackgroundFile()
258+void AccountsService::setKeymaps(const QStringList &keymaps)
83259{
84− auto backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
85− if (m_backgroundFile != backgroundFile) {
86− m_backgroundFile = backgroundFile;
87− Q_EMIT backgroundFileChanged();
260+ if (keymaps.isEmpty()) {
261+ qWarning() << "Setting empty keymaps is not supported";
262+ return;
88263 }
264+
265+ StringMapList result;
266+ Q_FOREACH(const QString &keymap, keymaps) {
267+ StringMap map;
268+ map.insert(QStringLiteral("xkb"), keymap);
269+ result.append(map);
270+ }
271+
272+ setProperty(IFACE_ACCOUNTS_USER, PROP_INPUT_SOURCES, QVariant::fromValue(result));
273+ Q_EMIT keymapsChanged();
89274}
90275
91−void AccountsService::updateStatsWelcomeScreen()
276+uint AccountsService::failedFingerprintLogins() const
92277{
93− bool statsWelcomeScreen = m_service->getUserProperty(m_user, "com.ubuntu.touch.AccountsService.SecurityPrivacy", "StatsWelcomeScreen").toBool();
94− if (m_statsWelcomeScreen != statsWelcomeScreen) {
95− m_statsWelcomeScreen = statsWelcomeScreen;
96− Q_EMIT statsWelcomeScreenChanged();
278+ return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_FINGERPRINT_LOGINS).toUInt();
279+}
280+
281+void AccountsService::setFailedFingerprintLogins(uint failedFingerprintLogins)
282+{
283+ setProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_FINGERPRINT_LOGINS, failedFingerprintLogins);
284+}
285+
286+uint AccountsService::failedLogins() const
287+{
288+ return getProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS).toUInt();
289+}
290+
291+void AccountsService::setFailedLogins(uint failedLogins)
292+{
293+ setProperty(IFACE_UNITY_PRIVATE, PROP_FAILED_LOGINS, failedLogins);
294+}
295+
296+// ====================================================
297+// Everything below this line is generic helper methods
298+// ====================================================
299+
300+void AccountsService::emitChangedForProperty(const QString &interface, const QString &property)
301+{
302+ QString signalName = m_properties[interface][property].signal;
303+ QMetaObject::invokeMethod(this, signalName.toUtf8().data());
304+}
305+
306+QVariant AccountsService::getProperty(const QString &interface, const QString &property) const
307+{
308+ return m_properties[interface][property].value;
309+}
310+
311+void AccountsService::setProperty(const QString &interface, const QString &property, const QVariant &value)
312+{
313+ if (m_properties[interface][property].value != value) {
314+ m_properties[interface][property].value = value;
315+ m_service->setUserPropertyAsync(m_user, interface, property, value);
316+ emitChangedForProperty(interface, property);
317+ }
318+}
319+
320+void AccountsService::updateCache(const QString &interface, const QString &property, const QVariant &value)
321+{
322+ PropertyInfo &info = m_properties[interface][property];
323+
324+ if (info.proxyInterface) {
325+ QVariant finalValue;
326+ if (info.proxyConverter) {
327+ finalValue = info.proxyConverter(value);
328+ } else {
329+ finalValue = value;
330+ }
331+ info.proxyInterface->asyncCall(info.proxyMethod, finalValue);
332+ return; // don't bother saving a copy
333+ }
334+
335+ if (info.value != value) {
336+ info.value = value;
337+ emitChangedForProperty(interface, property);
338+ }
339+}
340+
341+void AccountsService::updateProperty(const QString &interface, const QString &property)
342+{
343+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
344+ interface,
345+ property);
346+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
347+
348+ connect(watcher, &QDBusPendingCallWatcher::finished,
349+ this, [this, interface, property](QDBusPendingCallWatcher* watcher) {
350+
351+ QDBusPendingReply<QVariant> reply = *watcher;
352+ watcher->deleteLater();
353+ if (reply.isError()) {
354+ qWarning() << "Failed to get '" << property << "' property:" << reply.error().message();
355+ return;
356+ }
357+
358+ updateCache(interface, property, reply.value());
359+ });
360+}
361+
362+void AccountsService::updateAllProperties(const QString &interface, bool async)
363+{
364+ QDBusPendingCall pendingReply = m_service->getAllPropertiesAsync(m_user,
365+ interface);
366+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
367+
368+ connect(watcher, &QDBusPendingCallWatcher::finished,
369+ this, [this, interface](QDBusPendingCallWatcher* watcher) {
370+
371+ QDBusPendingReply< QHash<QString, QVariant> > reply = *watcher;
372+ watcher->deleteLater();
373+ if (reply.isError()) {
374+ qWarning() << "Failed to get all properties for" << interface << ":" << reply.error().message();
375+ return;
376+ }
377+
378+ auto valueHash = reply.value();
379+ auto i = valueHash.constBegin();
380+ while (i != valueHash.constEnd()) {
381+ updateCache(interface, i.key(), i.value());
382+ ++i;
383+ }
384+ });
385+ if (!async) {
386+ watcher->waitForFinished();
97387 }
98388}
99389
100−void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
390+void AccountsService::registerProxy(const QString &interface, const QString &property, QDBusInterface *iface, const QString &method, ProxyConverter converter)
391+{
392+ registerProperty(interface, property, nullptr);
393+
394+ m_properties[interface][property].proxyInterface = iface;
395+ m_properties[interface][property].proxyMethod = method;
396+ m_properties[interface][property].proxyConverter = converter;
397+}
398+
399+void AccountsService::registerProperty(const QString &interface, const QString &property, const QString &signal)
400+{
401+ m_properties[interface][property] = PropertyInfo();
402+ m_properties[interface][property].signal = signal;
403+}
404+
405+void AccountsService::onPropertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
101406{
102407 if (m_user != user) {
103408 return;
104409 }
105410
106− if (interface == "com.canonical.unity.AccountsService") {
107− if (changed.contains("demo-edges")) {
108− updateDemoEdges();
109− }
110− } else if (interface == "com.ubuntu.touch.AccountsService.SecurityPrivacy") {
111− if (changed.contains("StatsWelcomeScreen")) {
112− updateStatsWelcomeScreen();
411+ auto propHash = m_properties.value(interface);
412+ auto i = propHash.constBegin();
413+ while (i != propHash.constEnd()) {
414+ if (changed.contains(i.key())) {
415+ updateProperty(interface, i.key());
113416 }
417+ ++i;
114418 }
115419}
116420
117−void AccountsService::maybeChanged(const QString &user)
421+void AccountsService::onMaybeChanged(const QString &user)
118422{
119423 if (m_user != user) {
120424 return;
121425 }
122426
123− // Standard properties might have changed
124− updateBackgroundFile();
427+ // Any of the standard properties might have changed!
428+ auto propHash = m_properties.value(IFACE_ACCOUNTS_USER);
429+ auto i = propHash.constBegin();
430+ while (i != propHash.constEnd()) {
431+ updateProperty(IFACE_ACCOUNTS_USER, i.key());
432+ ++i;
433+ }
434+}
435+
436+void AccountsService::refresh(bool async)
437+{
438+ auto i = m_properties.constBegin();
439+ while (i != m_properties.constEnd()) {
440+ updateAllProperties(i.key(), async);
441+ ++i;
442+ }
125443}
plugins/AccountsService/AccountsService.h+91−12
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,17 +12,19 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#ifndef UNITY_ACCOUNTSSERVICE_H
2018#define UNITY_ACCOUNTSSERVICE_H
2119
20+#include <QHash>
2221#include <QObject>
2322#include <QString>
23+#include <QStringList>
24+#include <QVariant>
2425
2526class AccountsServiceDBusAdaptor;
27+class QDBusInterface;
2628
2729class AccountsService: public QObject
2830{
@@ -35,43 +37,120 @@ class AccountsService: public QObject
3537 READ demoEdges
3638 WRITE setDemoEdges
3739 NOTIFY demoEdgesChanged)
40+ Q_PROPERTY (QStringList demoEdgesCompleted
41+ READ demoEdgesCompleted
42+ NOTIFY demoEdgesCompletedChanged)
43+ Q_PROPERTY (bool enableFingerprintIdentification
44+ READ enableFingerprintIdentification
45+ NOTIFY enableFingerprintIdentificationChanged)
46+ Q_PROPERTY (bool enableLauncherWhileLocked
47+ READ enableLauncherWhileLocked
48+ NOTIFY enableLauncherWhileLockedChanged)
49+ Q_PROPERTY (bool enableIndicatorsWhileLocked
50+ READ enableIndicatorsWhileLocked
51+ NOTIFY enableIndicatorsWhileLockedChanged)
3852 Q_PROPERTY (QString backgroundFile
3953 READ backgroundFile
4054 NOTIFY backgroundFileChanged)
4155 Q_PROPERTY (bool statsWelcomeScreen
4256 READ statsWelcomeScreen
4357 NOTIFY statsWelcomeScreenChanged)
58+ Q_PROPERTY (PasswordDisplayHint passwordDisplayHint
59+ READ passwordDisplayHint
60+ NOTIFY passwordDisplayHintChanged)
61+ Q_PROPERTY (uint failedLogins
62+ READ failedLogins
63+ WRITE setFailedLogins
64+ NOTIFY failedLoginsChanged)
65+ Q_PROPERTY (uint failedFingerprintLogins
66+ READ failedFingerprintLogins
67+ WRITE setFailedFingerprintLogins
68+ NOTIFY failedFingerprintLoginsChanged)
69+ Q_PROPERTY(QString realName READ realName WRITE setRealName NOTIFY realNameChanged)
70+ Q_PROPERTY(QString email READ email WRITE setEmail NOTIFY emailChanged)
71+ Q_PROPERTY(QStringList keymaps READ keymaps WRITE setKeymaps NOTIFY keymapsChanged)
4472
4573public:
46− explicit AccountsService(QObject *parent = 0);
74+ enum PasswordDisplayHint {
75+ Keyboard,
76+ Numeric,
77+ };
78+ Q_ENUM(PasswordDisplayHint)
79+
80+ explicit AccountsService(QObject *parent = 0, const QString & user = QString());
81+ ~AccountsService() = default;
4782
4883 QString user() const;
4984 void setUser(const QString &user);
5085 bool demoEdges() const;
5186 void setDemoEdges(bool demoEdges);
87+ QStringList demoEdgesCompleted() const;
88+ Q_INVOKABLE void markDemoEdgeCompleted(const QString &edge);
89+ bool enableFingerprintIdentification() const;
90+ bool enableLauncherWhileLocked() const;
91+ bool enableIndicatorsWhileLocked() const;
5292 QString backgroundFile() const;
5393 bool statsWelcomeScreen() const;
94+ PasswordDisplayHint passwordDisplayHint() const;
95+ uint failedLogins() const;
96+ void setFailedLogins(uint failedLogins);
97+ uint failedFingerprintLogins() const;
98+ void setFailedFingerprintLogins(uint failedFingerprintLogins);
99+ QString realName() const;
100+ void setRealName(const QString &realName);
101+ QString email() const;
102+ void setEmail(const QString &email);
103+ QStringList keymaps() const;
104+ void setKeymaps(const QStringList &keymaps);
54105
55106Q_SIGNALS:
56107 void userChanged();
57108 void demoEdgesChanged();
109+ void demoEdgesCompletedChanged();
110+ void enableFingerprintIdentificationChanged();
111+ void enableLauncherWhileLockedChanged();
112+ void enableIndicatorsWhileLockedChanged();
58113 void backgroundFileChanged();
59114 void statsWelcomeScreenChanged();
115+ void passwordDisplayHintChanged();
116+ void failedLoginsChanged();
117+ void failedFingerprintLoginsChanged();
118+ void realNameChanged();
119+ void emailChanged();
120+ void keymapsChanged();
60121
61122private Q_SLOTS:
62− void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
63− void maybeChanged(const QString &user);
123+ void onPropertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
124+ void onMaybeChanged(const QString &user);
64125
65126private:
66− void updateDemoEdges();
67− void updateBackgroundFile();
68− void updateStatsWelcomeScreen();
127+ typedef QVariant (*ProxyConverter)(const QVariant &);
128+
129+ void refresh(bool async);
130+ void registerProperty(const QString &interface, const QString &property, const QString &signal);
131+ void registerProxy(const QString &interface, const QString &property, QDBusInterface *iface, const QString &method, ProxyConverter converter = nullptr);
132+
133+ void updateAllProperties(const QString &interface, bool async);
134+ void updateProperty(const QString &interface, const QString &property);
135+ void updateCache(const QString &interface, const QString &property, const QVariant &value);
136+
137+ void setProperty(const QString &interface, const QString &property, const QVariant &value);
138+ QVariant getProperty(const QString &interface, const QString &property) const;
139+
140+ void emitChangedForProperty(const QString &interface, const QString &property);
69141
142+ struct PropertyInfo {
143+ QVariant value{};
144+ QString signal{};
145+ QDBusInterface *proxyInterface{};
146+ QString proxyMethod{};
147+ ProxyConverter proxyConverter{};
148+ };
149+ typedef QHash< QString, QHash<QString, PropertyInfo> > PropertyHash;
150+ PropertyHash m_properties;
70151 AccountsServiceDBusAdaptor *m_service;
152+ QDBusInterface *m_unityInput;
71153 QString m_user;
72− bool m_demoEdges;
73− QString m_backgroundFile;
74− bool m_statsWelcomeScreen;
75154};
76155
77156#endif
plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+56−30
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,8 +12,6 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#include "AccountsServiceDBusAdaptor.h"
@@ -21,40 +19,58 @@
2119#include <QDBusConnectionInterface>
2220#include <QDBusMessage>
2321#include <QDBusVariant>
22+#include <QDebug>
2423
2524AccountsServiceDBusAdaptor::AccountsServiceDBusAdaptor(QObject* parent)
2625 : QObject(parent),
27− m_accountsManager(NULL),
28− m_users()
26+ m_accountsManager(nullptr),
27+ m_ignoreNextChanged(false)
2928{
3029 QDBusConnection connection = QDBusConnection::SM_BUSNAME();
3130 QDBusConnectionInterface *interface = connection.interface();
32− interface->startService("org.freedesktop.Accounts");
33− m_accountsManager = new QDBusInterface("org.freedesktop.Accounts",
34− "/org/freedesktop/Accounts",
35− "org.freedesktop.Accounts",
36− connection, this);
31+ interface->startService(QStringLiteral("org.freedesktop.Accounts"));
32+ m_accountsManager = new QDBusInterface(QStringLiteral("org.freedesktop.Accounts"),
33+ QStringLiteral("/org/freedesktop/Accounts"),
34+ QStringLiteral("org.freedesktop.Accounts"),
35+ connection, this);
3736}
3837
39−QVariant AccountsServiceDBusAdaptor::getUserProperty(const QString &user, const QString &interface, const QString &property)
38+QDBusPendingReply<QVariantMap> AccountsServiceDBusAdaptor::getAllPropertiesAsync(const QString &user, const QString &interface)
4039{
4140 QDBusInterface *iface = getUserInterface(user);
4241 if (iface != nullptr && iface->isValid()) {
43− QDBusMessage answer = iface->call("Get", interface, property);
44− if (answer.type() == QDBusMessage::ReplyMessage) {
45− return answer.arguments()[0].value<QDBusVariant>().variant();
46− }
42+ return iface->asyncCall(QStringLiteral("GetAll"), interface);
4743 }
48− return QVariant();
44+ return QDBusPendingReply<QVariantMap>(QDBusMessage::createError(QDBusError::Other, QStringLiteral("Invalid Interface")));
4945}
5046
51−void AccountsServiceDBusAdaptor::setUserProperty(const QString &user, const QString &interface, const QString &property, const QVariant &value)
47+QDBusPendingReply<QVariant> AccountsServiceDBusAdaptor::getUserPropertyAsync(const QString &user, const QString &interface, const QString &property)
5248{
5349 QDBusInterface *iface = getUserInterface(user);
5450 if (iface != nullptr && iface->isValid()) {
55− // The value needs to be carefully wrapped
56− iface->call("Set", interface, property, QVariant::fromValue(QDBusVariant(value)));
51+ return iface->asyncCall(QStringLiteral("Get"), interface, property);
5752 }
53+ return QDBusPendingReply<QVariant>(QDBusMessage::createError(QDBusError::Other, QStringLiteral("Invalid Interface")));
54+}
55+
56+QDBusPendingCall AccountsServiceDBusAdaptor::setUserPropertyAsync(const QString &user, const QString &interface, const QString &property, const QVariant &value)
57+{
58+ QDBusInterface *iface = getUserInterface(user);
59+ if (iface != nullptr && iface->isValid()) {
60+ if (interface == QStringLiteral("org.freedesktop.Accounts.User")) {
61+ // Standard AccountsService properties use special set methods.
62+ // It will not let you use the usual DBus property setters.
63+ QDBusInterface accountsIface(iface->service(),
64+ iface->path(),
65+ interface,
66+ iface->connection());
67+ return accountsIface.asyncCall(QStringLiteral("Set") + property, value);
68+ } else {
69+ // The value needs to be carefully wrapped
70+ return iface->asyncCall(QStringLiteral("Set"), interface, property, QVariant::fromValue(QDBusVariant(value)));
71+ }
72+ }
73+ return QDBusPendingCall::fromCompletedCall(QDBusMessage::createError(QDBusError::Other, QStringLiteral("Invalid Interface")));
5874}
5975
6076void AccountsServiceDBusAdaptor::propertiesChangedSlot(const QString &interface, const QVariantMap &changed, const QStringList &invalid)
@@ -66,14 +82,22 @@ void AccountsServiceDBusAdaptor::propertiesChangedSlot(const QString &interface,
6682 combined.removeDuplicates();
6783
6884 Q_EMIT propertiesChanged(getUserForPath(message().path()), interface, combined);
85+
86+ // In case a non-builtin property changes, we're getting propertiesChanged *and* changed
87+ // As the generic changed requires asking back over DBus, it's quite slow to process.
88+ // We don't want to trigger that when we know it's not a built-in property change.
89+ m_ignoreNextChanged = true;
6990}
7091
7192void AccountsServiceDBusAdaptor::maybeChangedSlot()
7293{
73− Q_EMIT maybeChanged(getUserForPath(message().path()));
94+ if (!m_ignoreNextChanged) {
95+ Q_EMIT maybeChanged(getUserForPath(message().path()));
96+ }
97+ m_ignoreNextChanged = false;
7498}
7599
76−QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path)
100+QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path) const
77101{
78102 QMap<QString, QDBusInterface *>::const_iterator i;
79103 for (i = m_users.constBegin(); i != m_users.constEnd(); ++i) {
@@ -88,13 +112,13 @@ QDBusInterface *AccountsServiceDBusAdaptor::getUserInterface(const QString &user
88112{
89113 QDBusInterface *iface = m_users.value(user);
90114 if (iface == nullptr && m_accountsManager->isValid()) {
91− QDBusMessage answer = m_accountsManager->call("FindUserByName", user);
92− if (answer.type() == QDBusMessage::ReplyMessage) {
93− QString path = answer.arguments()[0].value<QDBusObjectPath>().path();
115+ QDBusReply<QDBusObjectPath> answer = m_accountsManager->call(QStringLiteral("FindUserByName"), user);
116+ if (answer.isValid()) {
117+ const QString path = answer.value().path();
94118
95− iface = new QDBusInterface("org.freedesktop.Accounts",
119+ iface = new QDBusInterface(QStringLiteral("org.freedesktop.Accounts"),
96120 path,
97− "org.freedesktop.DBus.Properties",
121+ QStringLiteral("org.freedesktop.DBus.Properties"),
98122 m_accountsManager->connection(), this);
99123
100124 // With its own pre-defined properties, AccountsService is oddly
@@ -104,8 +128,8 @@ QDBusInterface *AccountsServiceDBusAdaptor::getUserInterface(const QString &user
104128 iface->connection().connect(
105129 iface->service(),
106130 path,
107− "org.freedesktop.Accounts.User",
108− "Changed",
131+ QStringLiteral("org.freedesktop.Accounts.User"),
132+ QStringLiteral("Changed"),
109133 this,
110134 SLOT(maybeChangedSlot()));
111135
@@ -114,12 +138,14 @@ QDBusInterface *AccountsServiceDBusAdaptor::getUserInterface(const QString &user
114138 iface->connection().connect(
115139 iface->service(),
116140 path,
117− "org.freedesktop.DBus.Properties",
118− "PropertiesChanged",
141+ QStringLiteral("org.freedesktop.DBus.Properties"),
142+ QStringLiteral("PropertiesChanged"),
119143 this,
120144 SLOT(propertiesChangedSlot(QString, QVariantMap, QStringList)));
121145
122146 m_users.insert(user, iface);
147+ } else {
148+ qWarning() << "Couldn't get user interface" << answer.error().name() << answer.error().message();
123149 }
124150 }
125151 return iface;
plugins/AccountsService/AccountsServiceDBusAdaptor.h+10−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,15 +12,15 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917#ifndef UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
2018#define UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
2119
20+#include <QDBusArgument>
2221#include <QDBusContext>
2322#include <QDBusInterface>
23+#include <QDBusPendingReply>
2424#include <QMap>
2525#include <QObject>
2626#include <QString>
@@ -31,9 +31,11 @@ class AccountsServiceDBusAdaptor: public QObject, public QDBusContext
3131
3232public:
3333 explicit AccountsServiceDBusAdaptor(QObject *parent = 0);
34+ ~AccountsServiceDBusAdaptor() = default;
3435
35− Q_INVOKABLE QVariant getUserProperty(const QString &user, const QString &interface, const QString &property);
36− Q_INVOKABLE void setUserProperty(const QString &user, const QString &interface, const QString &property, const QVariant &value);
36+ QDBusPendingReply<QVariantMap> getAllPropertiesAsync(const QString &user, const QString &interface);
37+ QDBusPendingReply<QVariant> getUserPropertyAsync(const QString &user, const QString &interface, const QString &property);
38+ QDBusPendingCall setUserPropertyAsync(const QString &user, const QString &interface, const QString &property, const QVariant &value);
3739
3840Q_SIGNALS:
3941 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -45,10 +47,12 @@ private Q_SLOTS:
4547
4648private:
4749 QDBusInterface *getUserInterface(const QString &user);
48− QString getUserForPath(const QString &path);
50+ QString getUserForPath(const QString &path) const;
4951
5052 QDBusInterface *m_accountsManager;
5153 QMap<QString, QDBusInterface *> m_users;
54+
55+ bool m_ignoreNextChanged;
5256};
5357
5458#endif
plugins/AccountsService/CMakeLists.txt+6−15
@@ -1,6 +1,5 @@
1−include(Plugins)
2−
31add_definitions(-DSM_BUSNAME=systemBus)
2+include_directories(${GLIB_INCLUDE_DIRS})
43
54add_library(AccountsService-qml MODULE
65 AccountsService.cpp
@@ -8,13 +7,13 @@ add_library(AccountsService-qml MODULE
87 plugin.cpp
98 )
109
11−qt5_use_modules(AccountsService-qml DBus Qml)
10+target_link_libraries(AccountsService-qml
11+ Qt5::DBus Qt5::Qml
12+ ${GLIB_LIBRARIES}
13+ )
1214
13−export_qmlfiles(AccountsService AccountsService)
14−export_qmlplugin(AccountsService 0.1 AccountsService TARGETS AccountsService-qml)
15+add_unity8_plugin(AccountsService 0.1 AccountsService TARGETS AccountsService-qml)
1516
16−set(POLKIT_LIB_DIR "${CMAKE_INSTALL_LOCALSTATEDIR}/lib/polkit-1")
17−set(POLKIT_DATA_DIR "${CMAKE_INSTALL_PREFIX}/share/polkit-1")
1817set(DBUS_IFACE_DIR "${CMAKE_INSTALL_PREFIX}/share/dbus-1/interfaces")
1918set(ACCOUNTS_IFACE_DIR "${CMAKE_INSTALL_PREFIX}/share/accountsservice/interfaces")
2019
@@ -27,11 +26,3 @@ install(CODE "
2726execute_process(COMMAND mkdir -p \"\$ENV{DESTDIR}${ACCOUNTS_IFACE_DIR}\")
2827execute_process(COMMAND ln -sf ../../dbus-1/interfaces/com.canonical.unity.AccountsService.xml \"\$ENV{DESTDIR}${ACCOUNTS_IFACE_DIR}\")
2928 ")
30−
31−install(FILES com.canonical.unity.AccountsService.policy
32− DESTINATION "${POLKIT_DATA_DIR}/actions"
33− )
34−
35−install(FILES 50-com.canonical.unity.AccountsService.pkla
36− DESTINATION "${POLKIT_LIB_DIR}/localauthority/10-vendor.d"
37− )
plugins/AccountsService/com.canonical.unity.AccountsService.policydeleted−24
@@ -1,24 +0,0 @@
1−<?xml version="1.0" encoding="UTF-8"?>
2−
3−<policyconfig>
4− <action id="com.canonical.unity.AccountsService.ModifyOwnUser">
5− <description>Set properties of own user</description>
6− <message>Authentication is required to set one's own unity properties.</message>
7− <defaults>
8− <allow_any>yes</allow_any>
9− <allow_inactive>yes</allow_inactive>
10− <allow_active>yes</allow_active>
11− </defaults>
12− </action>
13−
14− <action id="com.canonical.unity.AccountsService.ModifyAnyUser">
15− <description>Set properties of any user</description>
16− <message>Authentication is required to set another user's unity
17−properties.</message>
18− <defaults>
19− <allow_any>no</allow_any>
20− <allow_inactive>no</allow_inactive>
21− <allow_active>no</allow_active>
22− </defaults>
23− </action>
24−</policyconfig>
plugins/AccountsService/com.canonical.unity.AccountsService.xml+43−6
@@ -3,22 +3,59 @@
33
44 <annotation name="org.freedesktop.Accounts.VendorExtension" value="true"/>
55
6− <annotation name="org.freedesktop.Accounts.Authentication.ChangeOwn"
7− value="com.canonical.unity.AccountsService.ModifyOwnUser"/>
8−
96 <annotation name="org.freedesktop.Accounts.Authentication.ReadAny"
10− value="com.canonical.unity.AccountsService.ModifyAnyUser"/>
7+ value="com.ubuntu.AccountsService.GreeterReadAny"/>
118
129 <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
13− value="com.canonical.unity.AccountsService.ModifyAnyUser"/>
10+ value="com.ubuntu.AccountsService.GreeterChangeAny"/>
1411
12+ <!-- Marks that V1 (pre-8.21) edge demos have been run. Legacy value. -->
13+ <!-- Should have been named DemoEdges, sorry folks. -mterry -->
1514 <property name="demo-edges" type="b" access="readwrite">
1615 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
1716 </property>
1817
19− <property name="launcher-items" type="aa{sv}" access="readwrite">
18+ <!-- Marks that V2 (post-8.21) edge demos have been run -->
19+ <property name="DemoEdges2" type="b" access="readwrite">
20+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
21+ </property>
22+
23+ <!-- List of tutorial pages that have been completed by the user -->
24+ <property name="DemoEdgesCompleted" type="as" access="readwrite">
25+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
26+ </property>
27+
28+ <property name="LauncherItems" type="aa{sv}" access="readwrite">
2029 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[{'defaults': <true>}]"/>
2130 </property>
2231
2332 </interface>
33+
34+ <!-- This interface is for bits of data that the greeter wants to track
35+ per-user in a persistent way, but that users shouldn't be able to edit
36+ in an ideal world.
37+
38+ This interface is identical in permissions to the above one for now,
39+ but once we stop running the greeter in user-space, we should
40+ disallow org.freedesktop.Accounts.Authentication.ChangeOwn from the
41+ Private inteface. -->
42+ <interface name="com.canonical.unity.AccountsService.Private">
43+
44+ <annotation name="org.freedesktop.Accounts.VendorExtension" value="true"/>
45+
46+ <annotation name="org.freedesktop.Accounts.Authentication.ReadAny"
47+ value="com.ubuntu.AccountsService.GreeterReadAny"/>
48+
49+ <annotation name="org.freedesktop.Accounts.Authentication.ChangeAny"
50+ value="com.ubuntu.AccountsService.GreeterChangeAny"/>
51+
52+ <property name="FailedLogins" type="u" access="readwrite">
53+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="0"/>
54+ </property>
55+
56+ <property name="FailedFingerprintLogins" type="u" access="readwrite">
57+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="0"/>
58+ </property>
59+
60+ </interface>
2461</node>
plugins/AccountsService/plugin.cpp+1
@@ -33,5 +33,6 @@ void AccountsServicePlugin::registerTypes(const char *uri)
3333{
3434 Q_ASSERT(uri == QLatin1String("AccountsService"));
3535 qDBusRegisterMetaType<QList<QVariantMap>>();
36+ qRegisterMetaType<AccountsService::PasswordDisplayHint>("AccountsService::PasswordDisplayHint");
3637 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
3738}
plugins/AccountsService/plugin.h+1−1
@@ -28,7 +28,7 @@ class AccountsServicePlugin : public QQmlExtensionPlugin
2828 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2929
3030public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
3232};
3333
3434#endif
plugins/AccountsService/qmldir+1−1
@@ -1,3 +1,3 @@
11module AccountsService
22plugin AccountsService-qml
3−typeinfo plugin.qmltypes
3+typeinfo AccountsService.qmltypes
plugins/CMakeLists.txt+21−2
@@ -1,9 +1,28 @@
1+find_package(QmlPlugins)
2+
3+# Set up and install a plugin for unity8.
4+#
5+# add_unity8_plugin(plugin version path
6+# [...] # See export_qmlfiles and export_qmlplugin documentation for more options
7+# )
8+
9+macro(add_unity8_plugin PLUGIN VERSION PATH)
10+ export_qmlfiles(${PLUGIN} ${PATH} DESTINATION ${SHELL_INSTALL_QML} ${ARGN})
11+ export_qmlplugin(${PLUGIN} ${VERSION} ${PATH} DESTINATION ${SHELL_INSTALL_QML} ${ARGN})
12+endmacro()
13+
114add_subdirectory(AccountsService)
2−add_subdirectory(HudClient)
15+add_subdirectory(Cursor)
16+add_subdirectory(GlobalShortcut)
17+add_subdirectory(Greeter)
318add_subdirectory(LightDM)
4−add_subdirectory(DashViews)
19+add_subdirectory(Lights)
520add_subdirectory(Powerd)
21+add_subdirectory(ScreenshotDirectory)
622add_subdirectory(SessionBroadcast)
723add_subdirectory(Ubuntu)
24+add_subdirectory(UInput)
825add_subdirectory(Unity)
926add_subdirectory(Utils)
27+add_subdirectory(WindowManager)
28+add_subdirectory(Wizard)
plugins/Cursor/3rd_party/CMakeLists.txtnew file+1
@@ -0,0 +1 @@
1+add_subdirectory(xcursor)
plugins/Cursor/3rd_party/xcursor/CMakeLists.txtnew file+15
@@ -0,0 +1,15 @@
1+add_definitions(-D_DEFAULT_SOURCE=1)
2+
3+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
4+
5+set(
6+ XCURSOR_SOURCES
7+
8+ xcursor.c
9+)
10+
11+add_library(
12+ xcursorloader-static STATIC
13+
14+ ${XCURSOR_SOURCES}
15+)
plugins/Cursor/3rd_party/xcursor/xcursor.cnew file+968
@@ -0,0 +1,968 @@
1+/*
2+ * Copyright © 2002 Keith Packard
3+ *
4+ * Permission to use, copy, modify, distribute, and sell this software and its
5+ * documentation for any purpose is hereby granted without fee, provided that
6+ * the above copyright notice appear in all copies and that both that
7+ * copyright notice and this permission notice appear in supporting
8+ * documentation, and that the name of Keith Packard not be used in
9+ * advertising or publicity pertaining to distribution of the software without
10+ * specific, written prior permission. Keith Packard makes no
11+ * representations about the suitability of this software for any purpose. It
12+ * is provided "as is" without express or implied warranty.
13+ *
14+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20+ * PERFORMANCE OF THIS SOFTWARE.
21+ */
22+
23+#include "xcursor.h"
24+#include <stdio.h>
25+#include <stdlib.h>
26+#include <string.h>
27+#include <dirent.h>
28+
29+/*
30+ * From libXcursor/include/X11/extensions/Xcursor.h
31+ */
32+
33+#define XcursorTrue 1
34+#define XcursorFalse 0
35+
36+/*
37+ * Cursor files start with a header. The header
38+ * contains a magic number, a version number and a
39+ * table of contents which has type and offset information
40+ * for the remaining tables in the file.
41+ *
42+ * File minor versions increment for compatible changes
43+ * File major versions increment for incompatible changes (never, we hope)
44+ *
45+ * Chunks of the same type are always upward compatible. Incompatible
46+ * changes are made with new chunk types; the old data can remain under
47+ * the old type. Upward compatible changes can add header data as the
48+ * header lengths are specified in the file.
49+ *
50+ * File:
51+ * FileHeader
52+ * LISTofChunk
53+ *
54+ * FileHeader:
55+ * CARD32 magic magic number
56+ * CARD32 header bytes in file header
57+ * CARD32 version file version
58+ * CARD32 ntoc number of toc entries
59+ * LISTofFileToc toc table of contents
60+ *
61+ * FileToc:
62+ * CARD32 type entry type
63+ * CARD32 subtype entry subtype (size for images)
64+ * CARD32 position absolute file position
65+ */
66+
67+#define XCURSOR_MAGIC 0x72756358 /* "Xcur" LSBFirst */
68+
69+/*
70+ * Current Xcursor version number. Will be substituted by configure
71+ * from the version in the libXcursor configure.ac file.
72+ */
73+
74+#define XCURSOR_LIB_MAJOR 1
75+#define XCURSOR_LIB_MINOR 1
76+#define XCURSOR_LIB_REVISION 13
77+#define XCURSOR_LIB_VERSION ((XCURSOR_LIB_MAJOR * 10000) + \
78+ (XCURSOR_LIB_MINOR * 100) + \
79+ (XCURSOR_LIB_REVISION))
80+
81+/*
82+ * This version number is stored in cursor files; changes to the
83+ * file format require updating this version number
84+ */
85+#define XCURSOR_FILE_MAJOR 1
86+#define XCURSOR_FILE_MINOR 0
87+#define XCURSOR_FILE_VERSION ((XCURSOR_FILE_MAJOR << 16) | (XCURSOR_FILE_MINOR))
88+#define XCURSOR_FILE_HEADER_LEN (4 * 4)
89+#define XCURSOR_FILE_TOC_LEN (3 * 4)
90+
91+typedef struct _XcursorFileToc {
92+ XcursorUInt type; /* chunk type */
93+ XcursorUInt subtype; /* subtype (size for images) */
94+ XcursorUInt position; /* absolute position in file */
95+} XcursorFileToc;
96+
97+typedef struct _XcursorFileHeader {
98+ XcursorUInt magic; /* magic number */
99+ XcursorUInt header; /* byte length of header */
100+ XcursorUInt version; /* file version number */
101+ XcursorUInt ntoc; /* number of toc entries */
102+ XcursorFileToc *tocs; /* table of contents */
103+} XcursorFileHeader;
104+
105+/*
106+ * The rest of the file is a list of chunks, each tagged by type
107+ * and version.
108+ *
109+ * Chunk:
110+ * ChunkHeader
111+ * <extra type-specific header fields>
112+ * <type-specific data>
113+ *
114+ * ChunkHeader:
115+ * CARD32 header bytes in chunk header + type header
116+ * CARD32 type chunk type
117+ * CARD32 subtype chunk subtype
118+ * CARD32 version chunk type version
119+ */
120+
121+#define XCURSOR_CHUNK_HEADER_LEN (4 * 4)
122+
123+typedef struct _XcursorChunkHeader {
124+ XcursorUInt header; /* bytes in chunk header */
125+ XcursorUInt type; /* chunk type */
126+ XcursorUInt subtype; /* chunk subtype (size for images) */
127+ XcursorUInt version; /* version of this type */
128+} XcursorChunkHeader;
129+
130+/*
131+ * Here's a list of the known chunk types
132+ */
133+
134+/*
135+ * Comments consist of a 4-byte length field followed by
136+ * UTF-8 encoded text
137+ *
138+ * Comment:
139+ * ChunkHeader header chunk header
140+ * CARD32 length bytes in text
141+ * LISTofCARD8 text UTF-8 encoded text
142+ */
143+
144+#define XCURSOR_COMMENT_TYPE 0xfffe0001
145+#define XCURSOR_COMMENT_VERSION 1
146+#define XCURSOR_COMMENT_HEADER_LEN (XCURSOR_CHUNK_HEADER_LEN + (1 *4))
147+#define XCURSOR_COMMENT_COPYRIGHT 1
148+#define XCURSOR_COMMENT_LICENSE 2
149+#define XCURSOR_COMMENT_OTHER 3
150+#define XCURSOR_COMMENT_MAX_LEN 0x100000
151+
152+typedef struct _XcursorComment {
153+ XcursorUInt version;
154+ XcursorUInt comment_type;
155+ char *comment;
156+} XcursorComment;
157+
158+/*
159+ * Each cursor image occupies a separate image chunk.
160+ * The length of the image header follows the chunk header
161+ * so that future versions can extend the header without
162+ * breaking older applications
163+ *
164+ * Image:
165+ * ChunkHeader header chunk header
166+ * CARD32 width actual width
167+ * CARD32 height actual height
168+ * CARD32 xhot hot spot x
169+ * CARD32 yhot hot spot y
170+ * CARD32 delay animation delay
171+ * LISTofCARD32 pixels ARGB pixels
172+ */
173+
174+#define XCURSOR_IMAGE_TYPE 0xfffd0002
175+#define XCURSOR_IMAGE_VERSION 1
176+#define XCURSOR_IMAGE_HEADER_LEN (XCURSOR_CHUNK_HEADER_LEN + (5*4))
177+#define XCURSOR_IMAGE_MAX_SIZE 0x7fff /* 32767x32767 max cursor size */
178+
179+typedef struct _XcursorFile XcursorFile;
180+
181+struct _XcursorFile {
182+ void *closure;
183+ int (*read) (XcursorFile *file, unsigned char *buf, int len);
184+ int (*write) (XcursorFile *file, unsigned char *buf, int len);
185+ int (*seek) (XcursorFile *file, long offset, int whence);
186+};
187+
188+typedef struct _XcursorComments {
189+ int ncomment; /* number of comments */
190+ XcursorComment **comments; /* array of XcursorComment pointers */
191+} XcursorComments;
192+
193+/*
194+ * From libXcursor/src/file.c
195+ */
196+
197+static XcursorImage *
198+XcursorImageCreate (int width, int height)
199+{
200+ XcursorImage *image;
201+
202+ image = malloc (sizeof (XcursorImage) +
203+ width * height * sizeof (XcursorPixel));
204+ if (!image)
205+ return NULL;
206+ image->version = XCURSOR_IMAGE_VERSION;
207+ image->pixels = (XcursorPixel *) (image + 1);
208+ image->size = width > height ? width : height;
209+ image->width = width;
210+ image->height = height;
211+ image->delay = 0;
212+ return image;
213+}
214+
215+static void
216+XcursorImageDestroy (XcursorImage *image)
217+{
218+ free (image);
219+}
220+
221+static XcursorImages *
222+XcursorImagesCreate (int size)
223+{
224+ XcursorImages *images;
225+
226+ images = malloc (sizeof (XcursorImages) +
227+ size * sizeof (XcursorImage *));
228+ if (!images)
229+ return NULL;
230+ images->nimage = 0;
231+ images->images = (XcursorImage **) (images + 1);
232+ images->name = NULL;
233+ return images;
234+}
235+
236+void
237+XcursorImagesDestroy (XcursorImages *images)
238+{
239+ int n;
240+
241+ if (!images)
242+ return;
243+
244+ for (n = 0; n < images->nimage; n++)
245+ XcursorImageDestroy (images->images[n]);
246+ if (images->name)
247+ free (images->name);
248+ free (images);
249+}
250+
251+static void
252+XcursorImagesSetName (XcursorImages *images, const char *name)
253+{
254+ char *new;
255+
256+ if (!images || !name)
257+ return;
258+
259+ new = malloc (strlen (name) + 1);
260+
261+ if (!new)
262+ return;
263+
264+ strcpy (new, name);
265+ if (images->name)
266+ free (images->name);
267+ images->name = new;
268+}
269+
270+static XcursorBool
271+_XcursorReadUInt (XcursorFile *file, XcursorUInt *u)
272+{
273+ unsigned char bytes[4];
274+
275+ if (!file || !u)
276+ return XcursorFalse;
277+
278+ if ((*file->read) (file, bytes, 4) != 4)
279+ return XcursorFalse;
280+ *u = ((bytes[0] << 0) |
281+ (bytes[1] << 8) |
282+ (bytes[2] << 16) |
283+ (bytes[3] << 24));
284+ return XcursorTrue;
285+}
286+
287+static void
288+_XcursorFileHeaderDestroy (XcursorFileHeader *fileHeader)
289+{
290+ free (fileHeader);
291+}
292+
293+static XcursorFileHeader *
294+_XcursorFileHeaderCreate (int ntoc)
295+{
296+ XcursorFileHeader *fileHeader;
297+
298+ if (ntoc > 0x10000)
299+ return NULL;
300+ fileHeader = malloc (sizeof (XcursorFileHeader) +
301+ ntoc * sizeof (XcursorFileToc));
302+ if (!fileHeader)
303+ return NULL;
304+ fileHeader->magic = XCURSOR_MAGIC;
305+ fileHeader->header = XCURSOR_FILE_HEADER_LEN;
306+ fileHeader->version = XCURSOR_FILE_VERSION;
307+ fileHeader->ntoc = ntoc;
308+ fileHeader->tocs = (XcursorFileToc *) (fileHeader + 1);
309+ return fileHeader;
310+}
311+
312+static XcursorFileHeader *
313+_XcursorReadFileHeader (XcursorFile *file)
314+{
315+ XcursorFileHeader head, *fileHeader;
316+ XcursorUInt skip;
317+ unsigned int n;
318+
319+ if (!file)
320+ return NULL;
321+
322+ if (!_XcursorReadUInt (file, &head.magic))
323+ return NULL;
324+ if (head.magic != XCURSOR_MAGIC)
325+ return NULL;
326+ if (!_XcursorReadUInt (file, &head.header))
327+ return NULL;
328+ if (!_XcursorReadUInt (file, &head.version))
329+ return NULL;
330+ if (!_XcursorReadUInt (file, &head.ntoc))
331+ return NULL;
332+ skip = head.header - XCURSOR_FILE_HEADER_LEN;
333+ if (skip)
334+ if ((*file->seek) (file, skip, SEEK_CUR) == EOF)
335+ return NULL;
336+ fileHeader = _XcursorFileHeaderCreate (head.ntoc);
337+ if (!fileHeader)
338+ return NULL;
339+ fileHeader->magic = head.magic;
340+ fileHeader->header = head.header;
341+ fileHeader->version = head.version;
342+ fileHeader->ntoc = head.ntoc;
343+ for (n = 0; n < fileHeader->ntoc; n++)
344+ {
345+ if (!_XcursorReadUInt (file, &fileHeader->tocs[n].type))
346+ break;
347+ if (!_XcursorReadUInt (file, &fileHeader->tocs[n].subtype))
348+ break;
349+ if (!_XcursorReadUInt (file, &fileHeader->tocs[n].position))
350+ break;
351+ }
352+ if (n != fileHeader->ntoc)
353+ {
354+ _XcursorFileHeaderDestroy (fileHeader);
355+ return NULL;
356+ }
357+ return fileHeader;
358+}
359+
360+static XcursorBool
361+_XcursorSeekToToc (XcursorFile *file,
362+ XcursorFileHeader *fileHeader,
363+ int toc)
364+{
365+ if (!file || !fileHeader || \
366+ (*file->seek) (file, fileHeader->tocs[toc].position, SEEK_SET) == EOF)
367+ return XcursorFalse;
368+ return XcursorTrue;
369+}
370+
371+static XcursorBool
372+_XcursorFileReadChunkHeader (XcursorFile *file,
373+ XcursorFileHeader *fileHeader,
374+ int toc,
375+ XcursorChunkHeader *chunkHeader)
376+{
377+ if (!file || !fileHeader || !chunkHeader)
378+ return XcursorFalse;
379+ if (!_XcursorSeekToToc (file, fileHeader, toc))
380+ return XcursorFalse;
381+ if (!_XcursorReadUInt (file, &chunkHeader->header))
382+ return XcursorFalse;
383+ if (!_XcursorReadUInt (file, &chunkHeader->type))
384+ return XcursorFalse;
385+ if (!_XcursorReadUInt (file, &chunkHeader->subtype))
386+ return XcursorFalse;
387+ if (!_XcursorReadUInt (file, &chunkHeader->version))
388+ return XcursorFalse;
389+ /* sanity check */
390+ if (chunkHeader->type != fileHeader->tocs[toc].type ||
391+ chunkHeader->subtype != fileHeader->tocs[toc].subtype)
392+ return XcursorFalse;
393+ return XcursorTrue;
394+}
395+
396+#define dist(a,b) ((a) > (b) ? (a) - (b) : (b) - (a))
397+
398+static XcursorDim
399+_XcursorFindBestSize (XcursorFileHeader *fileHeader,
400+ XcursorDim size,
401+ int *nsizesp)
402+{
403+ unsigned int n;
404+ int nsizes = 0;
405+ XcursorDim bestSize = 0;
406+ XcursorDim thisSize;
407+
408+ if (!fileHeader || !nsizesp)
409+ return 0;
410+
411+ for (n = 0; n < fileHeader->ntoc; n++)
412+ {
413+ if (fileHeader->tocs[n].type != XCURSOR_IMAGE_TYPE)
414+ continue;
415+ thisSize = fileHeader->tocs[n].subtype;
416+ if (!bestSize || dist (thisSize, size) < dist (bestSize, size))
417+ {
418+ bestSize = thisSize;
419+ nsizes = 1;
420+ }
421+ else if (thisSize == bestSize)
422+ nsizes++;
423+ }
424+ *nsizesp = nsizes;
425+ return bestSize;
426+}
427+
428+static int
429+_XcursorFindImageToc (XcursorFileHeader *fileHeader,
430+ XcursorDim size,
431+ int count)
432+{
433+ unsigned int toc;
434+ XcursorDim thisSize;
435+
436+ if (!fileHeader)
437+ return 0;
438+
439+ for (toc = 0; toc < fileHeader->ntoc; toc++)
440+ {
441+ if (fileHeader->tocs[toc].type != XCURSOR_IMAGE_TYPE)
442+ continue;
443+ thisSize = fileHeader->tocs[toc].subtype;
444+ if (thisSize != size)
445+ continue;
446+ if (!count)
447+ break;
448+ count--;
449+ }
450+ if (toc == fileHeader->ntoc)
451+ return -1;
452+ return toc;
453+}
454+
455+static XcursorImage *
456+_XcursorReadImage (XcursorFile *file,
457+ XcursorFileHeader *fileHeader,
458+ int toc)
459+{
460+ XcursorChunkHeader chunkHeader;
461+ XcursorImage head;
462+ XcursorImage *image;
463+ int n;
464+ XcursorPixel *p;
465+
466+ if (!file || !fileHeader)
467+ return NULL;
468+
469+ if (!_XcursorFileReadChunkHeader (file, fileHeader, toc, &chunkHeader))
470+ return NULL;
471+ if (!_XcursorReadUInt (file, &head.width))
472+ return NULL;
473+ if (!_XcursorReadUInt (file, &head.height))
474+ return NULL;
475+ if (!_XcursorReadUInt (file, &head.xhot))
476+ return NULL;
477+ if (!_XcursorReadUInt (file, &head.yhot))
478+ return NULL;
479+ if (!_XcursorReadUInt (file, &head.delay))
480+ return NULL;
481+ /* sanity check data */
482+ if (head.width >= 0x10000 || head.height > 0x10000)
483+ return NULL;
484+ if (head.width == 0 || head.height == 0)
485+ return NULL;
486+ if (head.xhot > head.width || head.yhot > head.height)
487+ return NULL;
488+
489+ /* Create the image and initialize it */
490+ image = XcursorImageCreate (head.width, head.height);
491+ if (image == NULL)
492+ return NULL;
493+ if (chunkHeader.version < image->version)
494+ image->version = chunkHeader.version;
495+ image->size = chunkHeader.subtype;
496+ image->xhot = head.xhot;
497+ image->yhot = head.yhot;
498+ image->delay = head.delay;
499+ n = image->width * image->height;
500+ p = image->pixels;
501+ while (n--)
502+ {
503+ if (!_XcursorReadUInt (file, p))
504+ {
505+ XcursorImageDestroy (image);
506+ return NULL;
507+ }
508+ p++;
509+ }
510+ return image;
511+}
512+
513+static XcursorImages *
514+XcursorXcFileLoadImages (XcursorFile *file, int size)
515+{
516+ XcursorFileHeader *fileHeader;
517+ XcursorDim bestSize;
518+ int nsize;
519+ XcursorImages *images;
520+ int n;
521+ int toc;
522+
523+ if (!file || size < 0)
524+ return NULL;
525+ fileHeader = _XcursorReadFileHeader (file);
526+ if (!fileHeader)
527+ return NULL;
528+ bestSize = _XcursorFindBestSize (fileHeader, (XcursorDim) size, &nsize);
529+ if (!bestSize)
530+ {
531+ _XcursorFileHeaderDestroy (fileHeader);
532+ return NULL;
533+ }
534+ images = XcursorImagesCreate (nsize);
535+ if (!images)
536+ {
537+ _XcursorFileHeaderDestroy (fileHeader);
538+ return NULL;
539+ }
540+ for (n = 0; n < nsize; n++)
541+ {
542+ toc = _XcursorFindImageToc (fileHeader, bestSize, n);
543+ if (toc < 0)
544+ break;
545+ images->images[images->nimage] = _XcursorReadImage (file, fileHeader,
546+ toc);
547+ if (!images->images[images->nimage])
548+ break;
549+ images->nimage++;
550+ }
551+ _XcursorFileHeaderDestroy (fileHeader);
552+ if (images->nimage != nsize)
553+ {
554+ XcursorImagesDestroy (images);
555+ images = NULL;
556+ }
557+ return images;
558+}
559+
560+static int
561+_XcursorStdioFileRead (XcursorFile *file, unsigned char *buf, int len)
562+{
563+ FILE *f = file->closure;
564+ return fread (buf, 1, len, f);
565+}
566+
567+static int
568+_XcursorStdioFileWrite (XcursorFile *file, unsigned char *buf, int len)
569+{
570+ FILE *f = file->closure;
571+ return fwrite (buf, 1, len, f);
572+}
573+
574+static int
575+_XcursorStdioFileSeek (XcursorFile *file, long offset, int whence)
576+{
577+ FILE *f = file->closure;
578+ return fseek (f, offset, whence);
579+}
580+
581+static void
582+_XcursorStdioFileInitialize (FILE *stdfile, XcursorFile *file)
583+{
584+ file->closure = stdfile;
585+ file->read = _XcursorStdioFileRead;
586+ file->write = _XcursorStdioFileWrite;
587+ file->seek = _XcursorStdioFileSeek;
588+}
589+
590+static XcursorImages *
591+XcursorFileLoadImages (FILE *file, int size)
592+{
593+ XcursorFile f;
594+
595+ if (!file)
596+ return NULL;
597+
598+ _XcursorStdioFileInitialize (file, &f);
599+ return XcursorXcFileLoadImages (&f, size);
600+}
601+
602+/*
603+ * From libXcursor/src/library.c
604+ */
605+
606+#ifndef ICONDIR
607+#define ICONDIR "/usr/X11R6/lib/X11/icons"
608+#endif
609+
610+#ifndef XCURSORPATH
611+#define XCURSORPATH "~/.icons:/usr/share/icons:/usr/share/pixmaps:~/.cursors:/usr/share/cursors/xorg-x11:"ICONDIR
612+#endif
613+
614+static const char *
615+XcursorLibraryPath (void)
616+{
617+ static const char *path;
618+
619+ if (!path)
620+ {
621+ path = getenv ("XCURSOR_PATH");
622+ if (!path)
623+ path = XCURSORPATH;
624+ }
625+ return path;
626+}
627+
628+static void
629+_XcursorAddPathElt (char *path, const char *elt, int len)
630+{
631+ int pathlen = strlen (path);
632+
633+ /* append / if the path doesn't currently have one */
634+ if (path[0] == '\0' || path[pathlen - 1] != '/')
635+ {
636+ strcat (path, "/");
637+ pathlen++;
638+ }
639+ if (len == -1)
640+ len = strlen (elt);
641+ /* strip leading slashes */
642+ while (len && elt[0] == '/')
643+ {
644+ elt++;
645+ len--;
646+ }
647+ strncpy (path + pathlen, elt, len);
648+ path[pathlen + len] = '\0';
649+}
650+
651+static char *
652+_XcursorBuildThemeDir (const char *dir, const char *theme)
653+{
654+ const char *colon;
655+ const char *tcolon;
656+ char *full;
657+ char *home;
658+ int dirlen;
659+ int homelen;
660+ int themelen;
661+ int len;
662+
663+ if (!dir || !theme)
664+ return NULL;
665+
666+ colon = strchr (dir, ':');
667+ if (!colon)
668+ colon = dir + strlen (dir);
669+
670+ dirlen = colon - dir;
671+
672+ tcolon = strchr (theme, ':');
673+ if (!tcolon)
674+ tcolon = theme + strlen (theme);
675+
676+ themelen = tcolon - theme;
677+
678+ home = NULL;
679+ homelen = 0;
680+ if (*dir == '~')
681+ {
682+ home = getenv ("HOME");
683+ if (!home)
684+ return NULL;
685+ homelen = strlen (home);
686+ dir++;
687+ dirlen--;
688+ }
689+
690+ /*
691+ * add space for any needed directory separators, one per component,
692+ * and one for the trailing null
693+ */
694+ len = 1 + homelen + 1 + dirlen + 1 + themelen + 1;
695+
696+ full = malloc (len);
697+ if (!full)
698+ return NULL;
699+ full[0] = '\0';
700+
701+ if (home)
702+ _XcursorAddPathElt (full, home, -1);
703+ _XcursorAddPathElt (full, dir, dirlen);
704+ _XcursorAddPathElt (full, theme, themelen);
705+ return full;
706+}
707+
708+static char *
709+_XcursorBuildFullname (const char *dir, const char *subdir, const char *file)
710+{
711+ char *full;
712+
713+ if (!dir || !subdir || !file)
714+ return NULL;
715+
716+ full = malloc (strlen (dir) + 1 + strlen (subdir) + 1 + strlen (file) + 1);
717+ if (!full)
718+ return NULL;
719+ full[0] = '\0';
720+ _XcursorAddPathElt (full, dir, -1);
721+ _XcursorAddPathElt (full, subdir, -1);
722+ _XcursorAddPathElt (full, file, -1);
723+ return full;
724+}
725+
726+static const char *
727+_XcursorNextPath (const char *path)
728+{
729+ char *colon = strchr (path, ':');
730+
731+ if (!colon)
732+ return NULL;
733+ return colon + 1;
734+}
735+
736+#define XcursorWhite(c) ((c) == ' ' || (c) == '\t' || (c) == '\n')
737+#define XcursorSep(c) ((c) == ';' || (c) == ',')
738+
739+static char *
740+_XcursorThemeInherits (const char *full)
741+{
742+ char line[8192];
743+ char *result = NULL;
744+ FILE *f;
745+
746+ if (!full)
747+ return NULL;
748+
749+ f = fopen (full, "r");
750+ if (f)
751+ {
752+ while (fgets (line, sizeof (line), f))
753+ {
754+ if (!strncmp (line, "Inherits", 8))
755+ {
756+ char *l = line + 8;
757+ char *r;
758+ while (*l == ' ') l++;
759+ if (*l != '=') continue;
760+ l++;
761+ while (*l == ' ') l++;
762+ result = malloc (strlen (l) + 1);
763+ if (result)
764+ {
765+ r = result;
766+ while (*l)
767+ {
768+ while (XcursorSep(*l) || XcursorWhite (*l)) l++;
769+ if (!*l)
770+ break;
771+ if (r != result)
772+ *r++ = ':';
773+ while (*l && !XcursorWhite(*l) &&
774+ !XcursorSep(*l))
775+ *r++ = *l++;
776+ }
777+ *r++ = '\0';
778+ }
779+ break;
780+ }
781+ }
782+ fclose (f);
783+ }
784+ return result;
785+}
786+
787+static FILE *
788+XcursorScanTheme (const char *theme, const char *name)
789+{
790+ FILE *f = NULL;
791+ char *full;
792+ char *dir;
793+ const char *path;
794+ char *inherits = NULL;
795+ const char *i;
796+
797+ if (!theme || !name)
798+ return NULL;
799+
800+ /*
801+ * Scan this theme
802+ */
803+ for (path = XcursorLibraryPath ();
804+ path && f == NULL;
805+ path = _XcursorNextPath (path))
806+ {
807+ dir = _XcursorBuildThemeDir (path, theme);
808+ if (dir)
809+ {
810+ full = _XcursorBuildFullname (dir, "cursors", name);
811+ if (full)
812+ {
813+ f = fopen (full, "r");
814+ free (full);
815+ }
816+ if (!f && !inherits)
817+ {
818+ full = _XcursorBuildFullname (dir, "", "index.theme");
819+ if (full)
820+ {
821+ inherits = _XcursorThemeInherits (full);
822+ free (full);
823+ }
824+ }
825+ free (dir);
826+ }
827+ }
828+ /*
829+ * Recurse to scan inherited themes
830+ */
831+ for (i = inherits; i && f == NULL; i = _XcursorNextPath (i))
832+ f = XcursorScanTheme (i, name);
833+ if (inherits != NULL)
834+ free (inherits);
835+ return f;
836+}
837+
838+XcursorImages *
839+XcursorLibraryLoadImages (const char *file, const char *theme, int size)
840+{
841+ FILE *f = NULL;
842+ XcursorImages *images = NULL;
843+
844+ if (!file)
845+ return NULL;
846+
847+ if (theme)
848+ f = XcursorScanTheme (theme, file);
849+ if (!f)
850+ f = XcursorScanTheme ("default", file);
851+ if (f)
852+ {
853+ images = XcursorFileLoadImages (f, size);
854+ if (images)
855+ XcursorImagesSetName (images, file);
856+ fclose (f);
857+ }
858+ return images;
859+}
860+
861+static void
862+load_all_cursors_from_dir(const char *path, int size,
863+ void (*load_callback)(XcursorImages *, void *),
864+ void *user_data)
865+{
866+ FILE *f;
867+ DIR *dir = opendir(path);
868+ struct dirent *ent;
869+ char *full;
870+ XcursorImages *images;
871+
872+ if (!dir)
873+ return;
874+
875+ for(ent = readdir(dir); ent; ent = readdir(dir)) {
876+#ifdef _DIRENT_HAVE_D_TYPE
877+ if (ent->d_type != DT_UNKNOWN &&
878+ (ent->d_type != DT_REG && ent->d_type != DT_LNK))
879+ continue;
880+#endif
881+
882+ full = _XcursorBuildFullname(path, "", ent->d_name);
883+ if (!full)
884+ continue;
885+
886+ f = fopen(full, "r");
887+ if (!f) {
888+ free(full);
889+ continue;
890+ }
891+
892+ images = XcursorFileLoadImages(f, size);
893+
894+ if (images) {
895+ XcursorImagesSetName(images, ent->d_name);
896+ load_callback(images, user_data);
897+ }
898+
899+ fclose (f);
900+ free(full);
901+ }
902+
903+ closedir(dir);
904+}
905+
906+/** Load all the cursor of a theme
907+ *
908+ * This function loads all the cursor images of a given theme and its
909+ * inherited themes. Each cursor is loaded into an XcursorImages object
910+ * which is passed to the caller's load callback. If a cursor appears
911+ * more than once across all the inherited themes, the load callback
912+ * will be called multiple times, with possibly different XcursorImages
913+ * object which have the same name. The user is expected to destroy the
914+ * XcursorImages objects passed to the callback with
915+ * XcursorImagesDestroy().
916+ *
917+ * \param theme The name of theme that should be loaded
918+ * \param size The desired size of the cursor images
919+ * \param load_callback A callback function that will be called
920+ * for each cursor loaded. The first parameter is the XcursorImages
921+ * object representing the loaded cursor and the second is a pointer
922+ * to data provided by the user.
923+ * \param user_data The data that should be passed to the load callback
924+ */
925+void
926+xcursor_load_theme(const char *theme, int size,
927+ void (*load_callback)(XcursorImages *, void *),
928+ void *user_data)
929+{
930+ char *full, *dir;
931+ char *inherits = NULL;
932+ const char *path, *i;
933+
934+ if (!theme)
935+ theme = "default";
936+
937+ for (path = XcursorLibraryPath();
938+ path;
939+ path = _XcursorNextPath(path)) {
940+ dir = _XcursorBuildThemeDir(path, theme);
941+ if (!dir)
942+ continue;
943+
944+ full = _XcursorBuildFullname(dir, "cursors", "");
945+
946+ if (full) {
947+ load_all_cursors_from_dir(full, size, load_callback,
948+ user_data);
949+ free(full);
950+ }
951+
952+ if (!inherits) {
953+ full = _XcursorBuildFullname(dir, "", "index.theme");
954+ if (full) {
955+ inherits = _XcursorThemeInherits(full);
956+ free(full);
957+ }
958+ }
959+
960+ free(dir);
961+ }
962+
963+ for (i = inherits; i; i = _XcursorNextPath(i))
964+ xcursor_load_theme(i, size, load_callback, user_data);
965+
966+ if (inherits)
967+ free(inherits);
968+}
plugins/Cursor/3rd_party/xcursor/xcursor.hnew file+65
@@ -0,0 +1,65 @@
1+/*
2+ * Copyright © 2002 Keith Packard
3+ *
4+ * Permission to use, copy, modify, distribute, and sell this software and its
5+ * documentation for any purpose is hereby granted without fee, provided that
6+ * the above copyright notice appear in all copies and that both that
7+ * copyright notice and this permission notice appear in supporting
8+ * documentation, and that the name of Keith Packard not be used in
9+ * advertising or publicity pertaining to distribution of the software without
10+ * specific, written prior permission. Keith Packard makes no
11+ * representations about the suitability of this software for any purpose. It
12+ * is provided "as is" without express or implied warranty.
13+ *
14+ * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16+ * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20+ * PERFORMANCE OF THIS SOFTWARE.
21+ */
22+
23+#ifndef XCURSOR_H
24+#define XCURSOR_H
25+
26+#include <stdint.h>
27+
28+
29+typedef int XcursorBool;
30+typedef uint32_t XcursorUInt;
31+
32+typedef XcursorUInt XcursorDim;
33+typedef XcursorUInt XcursorPixel;
34+
35+typedef struct _XcursorImage {
36+ XcursorUInt version; /* version of the image data */
37+ XcursorDim size; /* nominal size for matching */
38+ XcursorDim width; /* actual width */
39+ XcursorDim height; /* actual height */
40+ XcursorDim xhot; /* hot spot x (must be inside image) */
41+ XcursorDim yhot; /* hot spot y (must be inside image) */
42+ XcursorUInt delay; /* animation delay to next frame (ms) */
43+ XcursorPixel *pixels; /* pointer to pixels */
44+} XcursorImage;
45+
46+/*
47+ * Other data structures exposed by the library API
48+ */
49+typedef struct _XcursorImages {
50+ int nimage; /* number of images */
51+ XcursorImage **images; /* array of XcursorImage pointers */
52+ char *name; /* name used to load images */
53+} XcursorImages;
54+
55+XcursorImages *
56+XcursorLibraryLoadImages (const char *file, const char *theme, int size);
57+
58+void
59+XcursorImagesDestroy (XcursorImages *images);
60+
61+void
62+xcursor_load_theme(const char *theme, int size,
63+ void (*load_callback)(XcursorImages *, void *),
64+ void *user_data);
65+#endif
plugins/Cursor/CMakeLists.txtnew file+32
@@ -0,0 +1,32 @@
1+add_subdirectory(3rd_party)
2+
3+include_directories(
4+ ${CMAKE_CURRENT_SOURCE_DIR}
5+ ${CMAKE_CURRENT_SOURCE_DIR}/3rd_party/xcursor
6+)
7+
8+include_directories(
9+ SYSTEM
10+ ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
11+)
12+
13+set(QMLPLUGIN_SRC
14+ plugin.cpp
15+ CursorImageInfo.cpp
16+ CursorImageProvider.cpp
17+ MousePointer.cpp
18+ # We need to run moc on this header
19+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/MirMousePointerInterface.h
20+ )
21+
22+add_library(Cursor-qml SHARED
23+ ${QMLPLUGIN_SRC}
24+ )
25+
26+target_link_libraries(Cursor-qml
27+ xcursorloader-static
28+ ${QT5PLATFORM_SUPPORT_LDFLAGS}
29+ Qt5::Qml Qt5::Quick Qt5::Svg
30+)
31+
32+add_unity8_plugin(Cursor 1.1 Cursor TARGETS Cursor-qml)
plugins/Cursor/Cursor.qmlnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.4
18+import Cursor 1.1
19+import Powerd 0.1
20+
21+MousePointer {
22+ id: mousePointer
23+
24+ CursorImageInfo {
25+ id: imageInfo
26+ themeName: mousePointer.themeName
27+ cursorName: mousePointer.cursorName
28+ cursorHeight: mousePointer.height
29+ }
30+
31+ Loader {
32+ active: mousePointer.visible && imageInfo.frameCount > 1
33+ sourceComponent: AnimatedSprite {
34+ x: -imageInfo.hotspot.x
35+ y: -imageInfo.hotspot.y
36+ source: imageInfo.imageSource
37+
38+ interpolate: false
39+
40+ width: imageInfo.frameWidth
41+ height: imageInfo.frameHeight
42+
43+ frameCount: imageInfo.frameCount
44+ frameDuration: imageInfo.frameDuration
45+ frameWidth: imageInfo.frameWidth
46+ frameHeight: imageInfo.frameHeight
47+
48+ running: Powerd.status === Powerd.On
49+ }
50+ }
51+
52+ Loader {
53+ active: mousePointer.visible && imageInfo.frameCount === 1
54+ sourceComponent: Image {
55+ x: -imageInfo.hotspot.x
56+ y: -imageInfo.hotspot.y
57+ source: imageInfo.imageSource
58+ width: sourceSize.width
59+ height: sourceSize.height
60+ }
61+ }
62+}
plugins/Cursor/CursorImageInfo.cppnew file+115
@@ -0,0 +1,115 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "CursorImageInfo.h"
18+
19+CursorImageInfo::CursorImageInfo(QObject *parent)
20+ : QObject(parent)
21+{
22+}
23+
24+void CursorImageInfo::setCursorName(const QString &cursorName)
25+{
26+ if (cursorName != m_cursorName) {
27+ m_cursorName = cursorName;
28+ update();
29+ Q_EMIT cursorNameChanged();
30+ }
31+
32+}
33+void CursorImageInfo::setCursorHeight(qreal cursorHeight)
34+{
35+ if (cursorHeight != m_cursorHeight) {
36+ m_cursorHeight = cursorHeight;
37+ update();
38+ Q_EMIT cursorHeightChanged();
39+ }
40+}
41+
42+void CursorImageInfo::setThemeName(const QString &themeName)
43+{
44+ if (m_themeName != themeName) {
45+ m_themeName = themeName;
46+ update();
47+ Q_EMIT themeNameChanged();
48+ }
49+}
50+
51+void CursorImageInfo::update()
52+{
53+ m_cursorImage = CursorImageProvider::instance()->fetchCursor(m_themeName, m_cursorName, (int) m_cursorHeight);
54+
55+ Q_EMIT hotspotChanged();
56+ Q_EMIT frameWidthChanged();
57+ Q_EMIT frameHeightChanged();
58+ Q_EMIT frameCountChanged();
59+ Q_EMIT frameDurationChanged();
60+ Q_EMIT imageSourceChanged();
61+}
62+
63+QPoint CursorImageInfo::hotspot() const
64+{
65+ if (m_cursorImage) {
66+ return m_cursorImage->hotspot;
67+ } else {
68+ return QPoint();
69+ }
70+}
71+
72+qreal CursorImageInfo::frameWidth() const
73+{
74+ if (m_cursorImage) {
75+ return m_cursorImage->frameWidth;
76+ } else {
77+ return 0;
78+ }
79+}
80+
81+qreal CursorImageInfo::frameHeight() const
82+{
83+ if (m_cursorImage) {
84+ return m_cursorImage->frameHeight;
85+ } else {
86+ return 0;
87+ }
88+}
89+
90+int CursorImageInfo::frameCount() const
91+{
92+ if (m_cursorImage) {
93+ return m_cursorImage->frameCount;
94+ } else {
95+ return 0;
96+ }
97+}
98+
99+int CursorImageInfo::frameDuration() const
100+{
101+ if (m_cursorImage) {
102+ return m_cursorImage->frameDuration;
103+ } else {
104+ return 0;
105+ }
106+}
107+
108+QUrl CursorImageInfo::imageSource() const
109+{
110+ auto urlString = QString("image://cursor/%1/%2/%3")
111+ .arg(m_themeName, m_cursorName)
112+ .arg(m_cursorHeight);
113+
114+ return QUrl(urlString);
115+}
plugins/Cursor/CursorImageInfo.hnew file+82
@@ -0,0 +1,82 @@
1+/*
2+ * Copyright (C) 2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef CURSOR_IMAGE_INFO_H
18+#define CURSOR_IMAGE_INFO_H
19+
20+#include "CursorImageProvider.h"
21+
22+#include <QObject>
23+#include <QString>
24+#include <QUrl>
25+
26+class CursorImageInfo : public QObject
27+{
28+ Q_OBJECT
29+
30+ Q_PROPERTY(QString themeName READ themeName WRITE setThemeName NOTIFY themeNameChanged)
31+ Q_PROPERTY(QString cursorName READ cursorName WRITE setCursorName NOTIFY cursorNameChanged)
32+ Q_PROPERTY(qreal cursorHeight READ cursorHeight WRITE setCursorHeight NOTIFY cursorHeightChanged)
33+
34+ Q_PROPERTY(QPoint hotspot READ hotspot NOTIFY hotspotChanged)
35+ Q_PROPERTY(qreal frameWidth READ frameWidth NOTIFY frameWidthChanged)
36+ Q_PROPERTY(qreal frameHeight READ frameHeight NOTIFY frameHeightChanged)
37+ Q_PROPERTY(int frameCount READ frameCount NOTIFY frameCountChanged)
38+ Q_PROPERTY(int frameDuration READ frameDuration NOTIFY frameDurationChanged)
39+ Q_PROPERTY(QUrl imageSource READ imageSource NOTIFY imageSourceChanged)
40+
41+public:
42+ CursorImageInfo(QObject *parent = nullptr);
43+
44+ QString themeName() const { return m_themeName; }
45+ void setThemeName(const QString &);
46+
47+ QString cursorName() const { return m_cursorName; }
48+ void setCursorName(const QString &);
49+
50+ qreal cursorHeight() const { return m_cursorHeight; }
51+ void setCursorHeight(qreal);
52+
53+ QPoint hotspot() const;
54+ qreal frameWidth() const;
55+ qreal frameHeight() const;
56+ int frameCount() const;
57+ int frameDuration() const;
58+ QUrl imageSource() const;
59+
60+Q_SIGNALS:
61+ void themeNameChanged();
62+ void cursorNameChanged();
63+ void cursorHeightChanged();
64+ void hotspotChanged();
65+ void frameWidthChanged();
66+ void frameHeightChanged();
67+ void frameCountChanged();
68+ void frameDurationChanged();
69+ void imageSourceChanged();
70+
71+private Q_SLOTS:
72+ void update();
73+
74+private:
75+ QString m_themeName;
76+ QString m_cursorName;
77+ qreal m_cursorHeight{0};
78+
79+ CursorImage *m_cursorImage{nullptr};
80+};
81+
82+#endif // CURSOR_IMAGE_INFO_H
plugins/Cursor/CursorImageProvider.cppnew file+337
@@ -0,0 +1,337 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "CursorImageProvider.h"
18+
19+#include <QCursor>
20+#include <QDebug>
21+#include <QFile>
22+#include <QPainter>
23+#include <QSvgRenderer>
24+
25+CursorImageProvider *CursorImageProvider::m_instance = nullptr;
26+
27+/////
28+// BuiltInCursorImage
29+
30+BuiltInCursorImage::BuiltInCursorImage(int cursorHeight)
31+{
32+ const char *svgString =
33+ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"
34+ "<svg"
35+ " xmlns:dc=\"http://purl.org/dc/elements/1.1/\""
36+ " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""
37+ " xmlns:svg=\"http://www.w3.org/2000/svg\""
38+ " xmlns=\"http://www.w3.org/2000/svg\""
39+ " version=\"1.1\">"
40+ " <path"
41+ " style=\"fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:40;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\""
42+ " d=\"M 20.504,50.94931 460.42533,518.14486 266.47603,515.61948 366.48114,719.16522 274.05218,770.68296 172.53185,559.56112 20.504,716.13476 Z\" />"
43+ "</svg>";
44+
45+ // NB: Original image dimension is 20x32. Ensure aspect ratio is kept
46+ qimage = QImage((20./32.)*cursorHeight, cursorHeight, QImage::Format_ARGB32);
47+ qimage.fill(Qt::transparent);
48+ QPainter imagePainter(&qimage);
49+
50+ frameWidth = qimage.width();
51+ frameHeight = qimage.height();
52+ requestedHeight = cursorHeight;
53+
54+ QSvgRenderer *svgRenderer = new QSvgRenderer(QByteArray(svgString));
55+ svgRenderer->render(&imagePainter);
56+ delete svgRenderer;
57+}
58+
59+/////
60+// BlankCursorImage
61+
62+
63+BlankCursorImage::BlankCursorImage()
64+{
65+ qimage = QImage(1, 1, QImage::Format_ARGB32);
66+ qimage.fill(Qt::transparent);
67+ frameWidth = qimage.width();
68+ frameHeight = qimage.height();
69+}
70+
71+/////
72+// CustomCursorImage
73+
74+
75+CustomCursorImage::CustomCursorImage(const QCursor &cursor)
76+{
77+ qimage = cursor.pixmap().toImage();
78+ hotspot = cursor.hotSpot();
79+ frameWidth = qimage.width();
80+ frameHeight = qimage.height();
81+}
82+
83+/////
84+// XCursorImage
85+
86+XCursorImage::XCursorImage(const QString &theme, const QString &file, int preferredCursorHeightPx)
87+{
88+ requestedHeight = preferredCursorHeightPx;
89+
90+ XcursorImages *xcursorImages = XcursorLibraryLoadImages(QFile::encodeName(file), QFile::encodeName(theme),
91+ preferredCursorHeightPx);
92+ if (!xcursorImages || xcursorImages->nimage == 0) {
93+ return;
94+ }
95+
96+ frameCount = xcursorImages->nimage;
97+
98+ for (int i = 0; i < xcursorImages->nimage; ++i) {
99+ XcursorImage *xcursorImage = xcursorImages->images[i];
100+ if (frameWidth < (int)xcursorImage->width) {
101+ frameWidth = xcursorImage->width;
102+ }
103+ if (frameHeight < (int)xcursorImage->height) {
104+ frameHeight = xcursorImage->height;
105+ }
106+ if (i == 0) {
107+ frameDuration = (int)xcursorImage->delay;
108+ } else {
109+ if (frameDuration != (int)xcursorImage->delay) {
110+ qWarning().nospace() << "CursorImageProvider: XCursorImage("<<theme<<","<<file<<") has"
111+ " varying delays in its animation. Animation won't look right.";
112+ }
113+ }
114+ }
115+
116+ {
117+ // Assume that the hotspot position does not animate
118+ XcursorImage *xcursorImage = xcursorImages->images[0];
119+ hotspot.setX(xcursorImage->xhot);
120+ hotspot.setY(xcursorImage->yhot);
121+ }
122+
123+ // Build the sprite as a single row of frames
124+ qimage = QImage(frameWidth*frameCount, frameHeight, QImage::Format_ARGB32);
125+ qimage.fill(Qt::transparent);
126+
127+ {
128+ QPainter painter(&qimage);
129+
130+ for (int i = 0; i < xcursorImages->nimage; ++i) {
131+ XcursorImage *xcursorImage = xcursorImages->images[i];
132+
133+ auto frameImage = QImage((uchar*)xcursorImage->pixels,
134+ xcursorImage->width, xcursorImage->height, QImage::Format_ARGB32);
135+
136+ painter.drawImage(QPoint(i*frameWidth, 0), frameImage);
137+ }
138+ }
139+
140+ XcursorImagesDestroy(xcursorImages);
141+}
142+
143+XCursorImage::~XCursorImage()
144+{
145+}
146+
147+/////
148+// CursorImageProvider
149+
150+CursorImageProvider::CursorImageProvider()
151+ : QQuickImageProvider(QQuickImageProvider::Image)
152+{
153+ if (m_instance) {
154+ qFatal("Cannot have multiple CursorImageProvider instances");
155+ }
156+ m_instance = this;
157+
158+ m_fallbackNames[QStringLiteral("closedhand")].append(QStringLiteral("grabbing"));
159+ m_fallbackNames[QStringLiteral("closedhand")].append(QStringLiteral("dnd-none"));
160+
161+ m_fallbackNames[QStringLiteral("dnd-copy")].append(QStringLiteral("dnd-none"));
162+ m_fallbackNames[QStringLiteral("dnd-copy")].append(QStringLiteral("grabbing"));
163+ m_fallbackNames[QStringLiteral("dnd-copy")].append(QStringLiteral("closedhand"));
164+
165+ m_fallbackNames[QStringLiteral("dnd-move")].append(QStringLiteral("dnd-none"));
166+ m_fallbackNames[QStringLiteral("dnd-move")].append(QStringLiteral("grabbing"));
167+ m_fallbackNames[QStringLiteral("dnd-move")].append(QStringLiteral("closedhand"));
168+
169+ m_fallbackNames[QStringLiteral("dnd-link")].append(QStringLiteral("dnd-none"));
170+ m_fallbackNames[QStringLiteral("dnd-link")].append(QStringLiteral("grabbing"));
171+ m_fallbackNames[QStringLiteral("dnd-link")].append(QStringLiteral("closedhand"));
172+
173+ m_fallbackNames[QStringLiteral("forbidden")].append(QStringLiteral("crossed_circle")); // DMZ-White and DMZ-Black themes
174+ m_fallbackNames[QStringLiteral("forbidden")].append(QStringLiteral("not-allowed"));
175+ m_fallbackNames[QStringLiteral("forbidden")].append(QStringLiteral("circle"));
176+
177+ m_fallbackNames[QStringLiteral("grabbing")].append(QStringLiteral("closedhand")); // Breeze
178+
179+ m_fallbackNames[QStringLiteral("hand")].append(QStringLiteral("pointing_hand"));
180+ m_fallbackNames[QStringLiteral("hand")].append(QStringLiteral("pointer"));
181+
182+ m_fallbackNames[QStringLiteral("ibeam")].append(QStringLiteral("xterm"));
183+ m_fallbackNames[QStringLiteral("ibeam")].append(QStringLiteral("text"));
184+
185+ m_fallbackNames[QStringLiteral("left_ptr")].append(QStringLiteral("default"));
186+ m_fallbackNames[QStringLiteral("left_ptr")].append(QStringLiteral("top_left_arrow"));
187+ m_fallbackNames[QStringLiteral("left_ptr")].append(QStringLiteral("left_arrow"));
188+
189+ m_fallbackNames[QStringLiteral("left_ptr_watch")].append(QStringLiteral("half-busy"));
190+ m_fallbackNames[QStringLiteral("left_ptr_watch")].append(QStringLiteral("progress"));
191+
192+ m_fallbackNames[QStringLiteral("size_bdiag")].append(QStringLiteral("fd_double_arrow"));
193+ m_fallbackNames[QStringLiteral("size_bdiag")].append(QStringLiteral("nesw-resize"));
194+
195+ m_fallbackNames[QStringLiteral("size_fdiag")].append(QStringLiteral("bd_double_arrow")); // DMZ-White and DMZ-Black themes
196+ m_fallbackNames[QStringLiteral("size_fdiag")].append(QStringLiteral("nwse-resize"));
197+
198+ m_fallbackNames[QStringLiteral("size_hor")].append(QStringLiteral("sb_h_double_arrow")); // DMZ-White and DMZ-Black themes
199+ m_fallbackNames[QStringLiteral("size_hor")].append(QStringLiteral("ew-resize"));
200+ m_fallbackNames[QStringLiteral("size_hor")].append(QStringLiteral("h_double_arrow"));
201+
202+ m_fallbackNames[QStringLiteral("size_ver")].append(QStringLiteral("sb_v_double_arrow")); // DMZ-White and DMZ-Black themes
203+ m_fallbackNames[QStringLiteral("size_ver")].append(QStringLiteral("ns-resize"));
204+ m_fallbackNames[QStringLiteral("size_ver")].append(QStringLiteral("v_double_arrow"));
205+
206+ m_fallbackNames[QStringLiteral("split_h")].append(QStringLiteral("sb_h_double_arrow")); // DMZ-White and DMZ-Black themes
207+ m_fallbackNames[QStringLiteral("split_h")].append(QStringLiteral("col-resize"));
208+
209+ m_fallbackNames[QStringLiteral("split_v")].append(QStringLiteral("sb_v_double_arrow")); // DMZ-White and DMZ-Black themes
210+ m_fallbackNames[QStringLiteral("split_v")].append(QStringLiteral("row-resize"));
211+
212+ m_fallbackNames[QStringLiteral("up_arrow")].append(QStringLiteral("sb_up_arrow")); // DMZ-White and DMZ-Black themes
213+
214+ m_fallbackNames[QStringLiteral("watch")].append(QStringLiteral("wait"));
215+
216+ m_fallbackNames[QStringLiteral("whats_this")].append(QStringLiteral("left_ptr_help"));
217+ m_fallbackNames[QStringLiteral("whats_this")].append(QStringLiteral("help"));
218+ m_fallbackNames[QStringLiteral("whats_this")].append(QStringLiteral("question_arrow"));
219+
220+ m_fallbackNames[QStringLiteral("xterm")].append(QStringLiteral("ibeam"));
221+}
222+
223+CursorImageProvider::~CursorImageProvider()
224+{
225+ {
226+ QList< QMap<QString, CursorImage*> > cursorList = m_cursors.values();
227+
228+ for (int i = 0; i < cursorList.count(); ++i) {
229+ QList<CursorImage*> cursorImageList = cursorList[i].values();
230+ for (int j = 0; j < cursorImageList.count(); ++j) {
231+ delete cursorImageList[j];
232+ }
233+ }
234+ }
235+
236+ m_cursors.clear();
237+ m_instance = nullptr;
238+}
239+
240+QImage CursorImageProvider::requestImage(const QString &cursorThemeAndNameAndHeight, QSize *size, const QSize & /*requestedSize*/)
241+{
242+ CursorImage *cursorImage = fetchCursor(cursorThemeAndNameAndHeight);
243+ size->setWidth(cursorImage->qimage.width());
244+ size->setHeight(cursorImage->qimage.height());
245+
246+ return cursorImage->qimage;
247+}
248+
249+CursorImage *CursorImageProvider::fetchCursor(const QString &cursorThemeAndNameAndHeight)
250+{
251+ QString themeName;
252+ QString cursorName;
253+ int cursorHeight;
254+ {
255+ QStringList themeAndNameList = cursorThemeAndNameAndHeight.split('/');
256+ if (themeAndNameList.size() != 3) {
257+ return nullptr;
258+ }
259+ themeName = themeAndNameList[0];
260+ cursorName = themeAndNameList[1];
261+
262+ bool ok;
263+ cursorHeight = themeAndNameList[2].toInt(&ok);
264+ if (!ok) {
265+ cursorHeight = 32;
266+ qWarning().nospace() << "CursorImageProvider: invalid cursor height ("<<themeAndNameList[2]<<")."
267+ " Falling back to "<<cursorHeight<<" pixels";
268+ }
269+ }
270+
271+ return fetchCursor(themeName, cursorName, cursorHeight);
272+}
273+
274+CursorImage *CursorImageProvider::fetchCursor(const QString &themeName, const QString &cursorName, int cursorHeight)
275+{
276+ CursorImage *cursorImage = fetchCursorHelper(themeName, cursorName, cursorHeight);
277+
278+ // Try some fallbacks
279+ if (cursorImage->qimage.isNull()) {
280+ if (m_fallbackNames.contains(cursorName)) {
281+ const QStringList &fallbackNames = m_fallbackNames[cursorName];
282+ int i = 0;
283+ while (cursorImage->qimage.isNull() && i < fallbackNames.count()) {
284+ qDebug().nospace() << "CursorImageProvider: "<< cursorName <<" not found, trying " << fallbackNames.at(i);
285+ cursorImage = fetchCursorHelper(themeName, fallbackNames.at(i), cursorHeight);
286+ ++i;
287+ }
288+ }
289+ }
290+
291+ // if it all fails, there must be at least a left_ptr
292+ if (cursorImage->qimage.isNull() && cursorName != QLatin1String("left_ptr")) {
293+ qDebug() << "CursorImageProvider:" << cursorName
294+ << "not found (nor its fallbacks, if any). Going for \"left_ptr\" as a last resort.";
295+ cursorImage = fetchCursorHelper(themeName, QStringLiteral("left_ptr"), cursorHeight);
296+ }
297+
298+ if (cursorImage->qimage.isNull()) {
299+ // finally, go for the built-in cursor
300+ qWarning() << "CursorImageProvider: couldn't find any cursors. Using the built-in one";
301+ if (!m_builtInCursorImage || m_builtInCursorImage->requestedHeight != cursorHeight) {
302+ m_builtInCursorImage.reset(new BuiltInCursorImage(cursorHeight));
303+ }
304+ cursorImage = m_builtInCursorImage.data();
305+ }
306+
307+ return cursorImage;
308+}
309+
310+CursorImage *CursorImageProvider::fetchCursorHelper(const QString &themeName, const QString &cursorName, int cursorHeight)
311+{
312+ if (cursorName == QLatin1String("blank")) {
313+ return &m_blankCursorImage;
314+ } else if (cursorName.startsWith(QLatin1String("custom"))) {
315+ return m_customCursorImage.data();
316+ } else {
317+ QMap<QString, CursorImage*> &themeCursors = m_cursors[themeName];
318+
319+ if (!themeCursors.contains(cursorName)) {
320+ themeCursors[cursorName] = new XCursorImage(themeName, cursorName, cursorHeight);
321+ } else if (themeCursors[cursorName]->requestedHeight != cursorHeight) {
322+ delete themeCursors.take(cursorName);
323+ themeCursors[cursorName] = new XCursorImage(themeName, cursorName, cursorHeight);
324+ }
325+
326+ return themeCursors[cursorName];
327+ }
328+}
329+
330+void CursorImageProvider::setCustomCursor(const QCursor &customCursor)
331+{
332+ if (customCursor.pixmap().isNull()) {
333+ m_customCursorImage.reset();
334+ } else {
335+ m_customCursorImage.reset(new CustomCursorImage(customCursor));
336+ }
337+}
plugins/Cursor/CursorImageProvider.hnew file+103
@@ -0,0 +1,103 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef CURSORIMAGEPROVIDER_H
18+#define CURSORIMAGEPROVIDER_H
19+
20+#include <QQuickImageProvider>
21+#include <QScopedPointer>
22+
23+// xcursor static lib
24+extern "C"
25+{
26+#include <xcursor.h>
27+}
28+
29+class CursorImage {
30+public:
31+ virtual ~CursorImage() {}
32+
33+ QImage qimage;
34+
35+ // TODO: consider if there's a need to animate the hotspot
36+ // ie, if there's a need to make it an array of points, one for each frame.
37+ // Maybe no single xcursor (or at least the ones we know of or use)
38+ // vary its hotspot position through its animation.
39+ QPoint hotspot;
40+
41+ int frameWidth{0};
42+ int frameHeight{0};
43+ int frameCount{1};
44+ int frameDuration{40};
45+
46+ // Requested height when creating this cursor.
47+ int requestedHeight{0};
48+};
49+
50+class XCursorImage : public CursorImage {
51+public:
52+ XCursorImage(const QString &theme, const QString &file, int preferredCursorHeightPx);
53+ virtual ~XCursorImage();
54+};
55+
56+class BuiltInCursorImage : public CursorImage {
57+public:
58+ BuiltInCursorImage(int cursorHeight);
59+};
60+
61+class BlankCursorImage : public CursorImage {
62+public:
63+ BlankCursorImage();
64+};
65+
66+class CustomCursorImage : public CursorImage {
67+public:
68+ CustomCursorImage(const QCursor &cursor);
69+};
70+
71+class CursorImageProvider : public QQuickImageProvider
72+{
73+public:
74+ CursorImageProvider();
75+ virtual ~CursorImageProvider();
76+
77+ static CursorImageProvider *instance() { return m_instance; }
78+
79+
80+ QImage requestImage(const QString &cursorThemeAndNameAndHeight, QSize *size, const QSize &requestedSize) override;
81+
82+ CursorImage *fetchCursor(const QString &themeName, const QString &cursorName, int cursorHeight);
83+
84+ void setCustomCursor(const QCursor &customCursor);
85+
86+private:
87+ CursorImage *fetchCursor(const QString &cursorThemeAndNameAndHeight);
88+ CursorImage *fetchCursorHelper(const QString &themeName, const QString &cursorName, int cursorHeight);
89+
90+ // themeName -> (cursorName -> cursorImage)
91+ // TODO: discard old, unused, cursors
92+ QMap<QString, QMap<QString, CursorImage*> > m_cursors;
93+
94+ QScopedPointer<CursorImage> m_builtInCursorImage;
95+ BlankCursorImage m_blankCursorImage;
96+ QScopedPointer<CursorImage> m_customCursorImage;
97+
98+ QMap<QString, QStringList> m_fallbackNames;
99+
100+ static CursorImageProvider *m_instance;
101+};
102+
103+#endif // CURSORIMAGEPROVIDER_H
plugins/Cursor/MousePointer.cppnew file+235
@@ -0,0 +1,235 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "MousePointer.h"
18+#include "CursorImageProvider.h"
19+
20+// Unity API
21+#include <unity/shell/application/MirPlatformCursor.h>
22+
23+#include <QQuickWindow>
24+#include <QGuiApplication>
25+#include <QtMath>
26+
27+#include <qpa/qwindowsysteminterface.h>
28+
29+MousePointer::MousePointer(QQuickItem *parent)
30+ : MirMousePointerInterface(parent)
31+ , m_cursorName(QStringLiteral("left_ptr"))
32+ , m_themeName(QStringLiteral("default"))
33+{
34+}
35+
36+void MousePointer::handleMouseEvent(ulong timestamp, QPointF movement, Qt::MouseButtons buttons,
37+ Qt::KeyboardModifiers modifiers)
38+{
39+ if (!parentItem()) {
40+ return;
41+ }
42+
43+ if (!movement.isNull()) {
44+ Q_EMIT mouseMoved();
45+ }
46+
47+ m_accumulatedMovement += movement;
48+ // don't apply the fractional part
49+ QPointF appliedMovement(int(m_accumulatedMovement.x()), int(m_accumulatedMovement.y()));
50+ m_accumulatedMovement -= appliedMovement;
51+
52+ qreal newX = x() + appliedMovement.x();
53+ qreal newY = y() + appliedMovement.y();
54+ const qreal sceneWidth = parentItem()->width();
55+ const qreal sceneHeight = parentItem()->height();
56+
57+ if (newX <= 0 && newY < m_topBoundaryOffset) { // top left corner
58+ const auto distance = qSqrt(qPow(newX, 2) + qPow(newY-m_topBoundaryOffset, 2));
59+ Q_EMIT pushedTopLeftCorner(qAbs(distance), buttons);
60+ m_pushing = true;
61+ } else if (newX >= sceneWidth-1 && newY < m_topBoundaryOffset) { // top right corner
62+ const auto distance = qSqrt(qPow(newX-sceneWidth, 2) + qPow(newY-m_topBoundaryOffset, 2));
63+ Q_EMIT pushedTopRightCorner(qAbs(distance), buttons);
64+ m_pushing = true;
65+ } else if (newX < 0 && newY >= sceneHeight-1) { // bottom left corner
66+ const auto distance = qSqrt(qPow(newX, 2) + qPow(newY-sceneHeight, 2));
67+ Q_EMIT pushedBottomLeftCorner(qAbs(distance), buttons);
68+ m_pushing = true;
69+ } else if (newX >= sceneWidth-1 && newY >= sceneHeight-1) { // bottom right corner
70+ const auto distance = qSqrt(qPow(newX-sceneWidth, 2) + qPow(newY-sceneHeight, 2));
71+ Q_EMIT pushedBottomRightCorner(qAbs(distance), buttons);
72+ m_pushing = true;
73+ } else if (newX < 0) { // left edge
74+ Q_EMIT pushedLeftBoundary(qAbs(newX), buttons);
75+ m_pushing = true;
76+ } else if (newX >= sceneWidth) { // right edge
77+ Q_EMIT pushedRightBoundary(newX - (sceneWidth - 1), buttons);
78+ m_pushing = true;
79+ } else if (newY < m_topBoundaryOffset) { // top edge
80+ Q_EMIT pushedTopBoundary(qAbs(newY - m_topBoundaryOffset), buttons);
81+ m_pushing = true;
82+ } else if (Q_LIKELY(newX > 0 && newX < sceneWidth-1 && newY > 0 && newY < sceneHeight-1)) { // normal pos, not pushing
83+ if (m_pushing) {
84+ Q_EMIT pushStopped();
85+ m_pushing = false;
86+ }
87+ }
88+
89+ applyItemConfinement(newX, newY);
90+
91+ setX(qBound(0.0, newX, sceneWidth - 1));
92+ setY(qBound(0.0, newY, sceneHeight - 1));
93+
94+ QPointF scenePosition = mapToItem(nullptr, QPointF(0, 0));
95+ QWindowSystemInterface::handleMouseEvent(window(), timestamp, scenePosition /*local*/, scenePosition /*global*/,
96+ buttons, modifiers);
97+}
98+
99+void MousePointer::applyItemConfinement(qreal &newX, qreal &newY)
100+{
101+ Q_ASSERT(parentItem() != nullptr);
102+
103+ if (m_confiningItem.isNull()) {
104+ return;
105+ }
106+
107+ QRectF confiningItemGeometry(0, 0, m_confiningItem->width(), m_confiningItem->height());
108+
109+ QRectF confiningRect = m_confiningItem->mapRectToItem(parentItem(), confiningItemGeometry);
110+
111+ if (newX < confiningRect.x()) {
112+ newX = confiningRect.x();
113+ } else if (newX > confiningRect.right()) {
114+ newX = confiningRect.right();
115+ }
116+
117+ if (newY < confiningRect.y()) {
118+ newY = confiningRect.y();
119+ } else if (newY > confiningRect.bottom()) {
120+ newY = confiningRect.bottom();
121+ }
122+}
123+
124+void MousePointer::handleWheelEvent(ulong timestamp, QPoint angleDelta, Qt::KeyboardModifiers modifiers)
125+{
126+ if (!parentItem()) {
127+ return;
128+ }
129+
130+ QPointF scenePosition = mapToItem(nullptr, QPointF(0, 0));
131+ QWindowSystemInterface::handleWheelEvent(window(), timestamp, scenePosition /* local */, scenePosition /* global */,
132+ QPoint() /* pixelDelta */, angleDelta, modifiers, Qt::ScrollUpdate);
133+}
134+
135+int MousePointer::topBoundaryOffset() const
136+{
137+ return m_topBoundaryOffset;
138+}
139+
140+void MousePointer::setTopBoundaryOffset(int topBoundaryOffset)
141+{
142+ if (m_topBoundaryOffset == topBoundaryOffset)
143+ return;
144+
145+ m_topBoundaryOffset = topBoundaryOffset;
146+ Q_EMIT topBoundaryOffsetChanged(topBoundaryOffset);
147+}
148+
149+void MousePointer::itemChange(ItemChange change, const ItemChangeData &value)
150+{
151+ if (change == ItemSceneChange) {
152+ registerWindow(value.window);
153+ }
154+}
155+
156+void MousePointer::registerWindow(QWindow *window)
157+{
158+ if (window == m_registeredWindow) {
159+ return;
160+ }
161+
162+ if (m_registeredWindow) {
163+ m_registeredWindow->disconnect(this);
164+ }
165+
166+ m_registeredWindow = window;
167+
168+ if (m_registeredWindow) {
169+ connect(window, &QWindow::screenChanged, this, &MousePointer::registerScreen);
170+ registerScreen(window->screen());
171+ } else {
172+ registerScreen(nullptr);
173+ }
174+}
175+
176+void MousePointer::registerScreen(QScreen *screen)
177+{
178+ if (m_registeredScreen == screen) {
179+ return;
180+ }
181+
182+ if (m_registeredScreen) {
183+ auto previousCursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
184+ if (previousCursor) {
185+ previousCursor->setMousePointer(nullptr);
186+ } else {
187+ qCritical("QPlatformCursor is not a MirPlatformCursor! Cursor module only works in a Mir server.");
188+ }
189+ }
190+
191+ m_registeredScreen = screen;
192+
193+ if (m_registeredScreen) {
194+ auto cursor = dynamic_cast<MirPlatformCursor*>(m_registeredScreen->handle()->cursor());
195+ if (cursor) {
196+ cursor->setMousePointer(this);
197+ } else {
198+ qCritical("QPlaformCursor is not a MirPlatformCursor! Cursor module only works in Mir.");
199+ }
200+ }
201+}
202+
203+void MousePointer::setCursorName(const QString &cursorName)
204+{
205+ if (cursorName != m_cursorName) {
206+ m_cursorName = cursorName;
207+ Q_EMIT cursorNameChanged(m_cursorName);
208+ }
209+}
210+
211+void MousePointer::setThemeName(const QString &themeName)
212+{
213+ if (m_themeName != themeName) {
214+ m_themeName = themeName;
215+ Q_EMIT themeNameChanged(m_themeName);
216+ }
217+}
218+
219+void MousePointer::setCustomCursor(const QCursor &customCursor)
220+{
221+ CursorImageProvider::instance()->setCustomCursor(customCursor);
222+}
223+
224+QQuickItem* MousePointer::confiningItem() const
225+{
226+ return m_confiningItem.data();
227+}
228+
229+void MousePointer::setConfiningItem(QQuickItem *item)
230+{
231+ if (item != m_confiningItem) {
232+ m_confiningItem = item;
233+ Q_EMIT confiningItemChanged();
234+ }
235+}
plugins/Cursor/MousePointer.hnew file+92
@@ -0,0 +1,92 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef MOUSEPOINTER_H
18+#define MOUSEPOINTER_H
19+
20+// Qt
21+#include <QPointer>
22+#include <QWindow>
23+#include <QScreen>
24+
25+// Unity API
26+#include <unity/shell/application/MirMousePointerInterface.h>
27+
28+class MousePointer : public MirMousePointerInterface {
29+ Q_OBJECT
30+ Q_PROPERTY(QQuickItem* confiningItem READ confiningItem WRITE setConfiningItem NOTIFY confiningItemChanged)
31+ Q_PROPERTY(int topBoundaryOffset READ topBoundaryOffset WRITE setTopBoundaryOffset NOTIFY topBoundaryOffsetChanged)
32+public:
33+ MousePointer(QQuickItem *parent = nullptr);
34+
35+ void setCursorName(const QString &qtCursorName) override;
36+ QString cursorName() const override { return m_cursorName; }
37+
38+ void setThemeName(const QString &themeName) override;
39+ QString themeName() const override { return m_themeName; }
40+
41+ void setCustomCursor(const QCursor &) override;
42+
43+ QQuickItem* confiningItem() const;
44+ void setConfiningItem(QQuickItem*);
45+
46+ int topBoundaryOffset() const;
47+ void setTopBoundaryOffset(int topBoundaryOffset);
48+
49+public Q_SLOTS:
50+ void handleMouseEvent(ulong timestamp, QPointF movement, Qt::MouseButtons buttons,
51+ Qt::KeyboardModifiers modifiers) override;
52+ void handleWheelEvent(ulong timestamp, QPoint angleDelta, Qt::KeyboardModifiers modifiers) override;
53+
54+Q_SIGNALS:
55+ void pushedLeftBoundary(qreal amount, Qt::MouseButtons buttons);
56+ void pushedRightBoundary(qreal amount, Qt::MouseButtons buttons);
57+ void pushedTopBoundary(qreal amount, Qt::MouseButtons buttons);
58+ void pushedTopLeftCorner(qreal amount, Qt::MouseButtons buttons);
59+ void pushedTopRightCorner(qreal amount, Qt::MouseButtons buttons);
60+ void pushedBottomLeftCorner(qreal amount, Qt::MouseButtons buttons);
61+ void pushedBottomRightCorner(qreal amount, Qt::MouseButtons buttons);
62+ void pushStopped();
63+ void mouseMoved();
64+ void confiningItemChanged();
65+
66+ void topBoundaryOffsetChanged(int topBoundaryOffset);
67+
68+protected:
69+ void itemChange(ItemChange change, const ItemChangeData &value) override;
70+
71+private Q_SLOTS:
72+ void registerScreen(QScreen *screen);
73+
74+private:
75+ void registerWindow(QWindow *window);
76+ void applyItemConfinement(qreal &newX, qreal &newY);
77+
78+ QPointer<QWindow> m_registeredWindow;
79+ QPointer<QScreen> m_registeredScreen;
80+ QString m_cursorName;
81+ QString m_themeName;
82+
83+ // Accumulated, unapplied, mouse movement.
84+ QPointF m_accumulatedMovement;
85+
86+ QPointer<QQuickItem> m_confiningItem;
87+
88+ int m_topBoundaryOffset{0};
89+ bool m_pushing{false};
90+};
91+
92+#endif // MOUSEPOINTER_H
plugins/Cursor/plugin.cppnew file+41
@@ -0,0 +1,41 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+// Qt
18+#include <QtQml/qqml.h>
19+#include <QQmlContext>
20+
21+// self
22+#include "plugin.h"
23+
24+// local
25+#include "CursorImageInfo.h"
26+#include "CursorImageProvider.h"
27+#include "MousePointer.h"
28+
29+void CursorPlugin::registerTypes(const char *uri)
30+{
31+ Q_ASSERT(uri == QLatin1String("Cursor"));
32+ qmlRegisterType<CursorImageInfo>(uri, 1, 1, "CursorImageInfo");
33+ qmlRegisterType<MousePointer>(uri, 1, 1, "MousePointer");
34+}
35+
36+void CursorPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
37+{
38+ QQmlExtensionPlugin::initializeEngine(engine, uri);
39+
40+ engine->addImageProvider(QStringLiteral("cursor"), new CursorImageProvider());
41+}
plugins/Cursor/plugin.hnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef CURSOR_PLUGIN_H
18+#define CURSOR_PLUGIN_H
19+
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
22+
23+class CursorPlugin : public QQmlExtensionPlugin
24+{
25+ Q_OBJECT
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27+
28+public:
29+ void registerTypes(const char *uri) override;
30+ void initializeEngine(QQmlEngine *engine, const char *uri) override;
31+};
32+
33+#endif // CURSOR_PLUGIN_H
plugins/Cursor/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Cursor
2+plugin Cursor-qml
3+Cursor 1.1 Cursor.qml
plugins/DashViews/CMakeLists.txtdeleted−46
@@ -1,46 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# There's no cmake var for v8 include path :-/
5−# so create one
6−LIST(GET Qt5Core_INCLUDE_DIRS 0 QtCoreDir0)
7−if(${Qt5Core_VERSION_STRING} VERSION_LESS "5.1.0")
8− SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/../QtV8/${Qt5Core_VERSION_STRING}/QtV8)
9−else()
10− SET(Qt5V8_PRIVATE_INCLUDE_DIR ${QtCoreDir0}/QtV8/${Qt5Core_VERSION_STRING}/QtV8)
11−endif()
12−
13−include_directories(
14− ${CMAKE_CURRENT_SOURCE_DIR}
15− ${CMAKE_CURRENT_BINARY_DIR}
16− ${Qt5Qml_PRIVATE_INCLUDE_DIRS}
17− ${Qt5Quick_INCLUDE_DIRS}
18− ${Qt5Quick_PRIVATE_INCLUDE_DIRS}
19− ${Qt5V8_PRIVATE_INCLUDE_DIR}
20−)
21−
22−remove_definitions(-DQT_NO_KEYWORDS)
23−
24−set(QMLPLUGIN_SRC
25− plugin.cpp
26− listviewwithpageheader.cpp
27− abstractdashview.cpp
28− verticaljournal.cpp
29− horizontaljournal.cpp
30− organicgrid.cpp
31− )
32−
33−add_library(DashViews-qml MODULE
34− ${QMLPLUGIN_SRC}
35− )
36−
37−target_link_libraries(DashViews-qml
38− ${Qt5Gui_LIBRARIES}
39− ${Qt5Quick_LIBRARIES}
40− )
41−
42−qt5_use_modules(DashViews-qml Qml Quick)
43−
44−# export the qmldir qmltypes and plugin files
45−export_qmlfiles(DashViews DashViews)
46−export_qmlplugin(DashViews 0.1 DashViews TARGETS DashViews-qml)
plugins/DashViews/abstractdashview.cppdeleted−388
@@ -1,388 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "abstractdashview.h"
18−
19−static const qreal bufferRatio = 0.5;
20−
21−AbstractDashView::AbstractDashView()
22− : m_delegateModel(nullptr)
23− , m_asyncRequestedIndex(-1)
24− , m_columnSpacing(0)
25− , m_rowSpacing(0)
26− , m_delegateCreationBegin(0)
27− , m_delegateCreationEnd(0)
28− , m_delegateCreationBeginValid(false)
29− , m_delegateCreationEndValid(false)
30− , m_needsRelayout(false)
31− , m_delegateValidated(false)
32− , m_implicitHeightDirty(false)
33−{
34− connect(this, SIGNAL(widthChanged()), this, SLOT(relayout()));
35− connect(this, SIGNAL(heightChanged()), this, SLOT(onHeightChanged()));
36−}
37−
38−QAbstractItemModel *AbstractDashView::model() const
39−{
40− return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
41−}
42−
43−void AbstractDashView::setModel(QAbstractItemModel *model)
44−{
45− if (model != this->model()) {
46− if (!m_delegateModel) {
47− createDelegateModel();
48− } else {
49−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
50− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
51− }
52− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
53− connect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
54−#else
55− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
56− }
57− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
58− connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
59−#endif
60−
61− cleanupExistingItems();
62−
63− Q_EMIT modelChanged();
64− polish();
65− }
66−}
67−
68−QQmlComponent *AbstractDashView::delegate() const
69−{
70− return m_delegateModel ? m_delegateModel->delegate() : nullptr;
71−}
72−
73−void AbstractDashView::setDelegate(QQmlComponent *delegate)
74−{
75− if (delegate != this->delegate()) {
76− if (!m_delegateModel) {
77− createDelegateModel();
78− }
79−
80− cleanupExistingItems();
81−
82− m_delegateModel->setDelegate(delegate);
83−
84− Q_EMIT delegateChanged();
85− m_delegateValidated = false;
86− polish();
87− }
88−}
89−
90−qreal AbstractDashView::columnSpacing() const
91−{
92− return m_columnSpacing;
93−}
94−
95−void AbstractDashView::setColumnSpacing(qreal columnSpacing)
96−{
97− if (columnSpacing != m_columnSpacing) {
98− m_columnSpacing = columnSpacing;
99− Q_EMIT columnSpacingChanged();
100−
101− if (isComponentComplete()) {
102− relayout();
103− }
104− }
105−}
106−
107−qreal AbstractDashView::rowSpacing() const
108−{
109− return m_rowSpacing;
110−}
111−
112−void AbstractDashView::setRowSpacing(qreal rowSpacing)
113−{
114− if (rowSpacing != m_rowSpacing) {
115− m_rowSpacing = rowSpacing;
116− Q_EMIT rowSpacingChanged();
117−
118− if (isComponentComplete()) {
119− relayout();
120− }
121− }
122−}
123−
124−qreal AbstractDashView::delegateCreationBegin() const
125−{
126− return m_delegateCreationBegin;
127−}
128−
129−void AbstractDashView::setDelegateCreationBegin(qreal begin)
130−{
131− m_delegateCreationBeginValid = true;
132− if (m_delegateCreationBegin == begin)
133− return;
134− m_delegateCreationBegin = begin;
135− if (isComponentComplete()) {
136− polish();
137− }
138− emit delegateCreationBeginChanged();
139−}
140−
141−void AbstractDashView::resetDelegateCreationBegin()
142−{
143− m_delegateCreationBeginValid = false;
144− if (m_delegateCreationBegin == 0)
145− return;
146− m_delegateCreationBegin = 0;
147− if (isComponentComplete()) {
148− polish();
149− }
150− emit delegateCreationBeginChanged();
151−}
152−
153−qreal AbstractDashView::delegateCreationEnd() const
154−{
155− return m_delegateCreationEnd;
156−}
157−
158−void AbstractDashView::setDelegateCreationEnd(qreal end)
159−{
160− m_delegateCreationEndValid = true;
161− if (m_delegateCreationEnd == end)
162− return;
163− m_delegateCreationEnd = end;
164− if (isComponentComplete()) {
165− polish();
166− }
167− emit delegateCreationEndChanged();
168−}
169−
170−void AbstractDashView::resetDelegateCreationEnd()
171−{
172− m_delegateCreationEndValid = false;
173− if (m_delegateCreationEnd == 0)
174− return;
175− m_delegateCreationEnd = 0;
176− if (isComponentComplete()) {
177− polish();
178− }
179− emit delegateCreationEndChanged();
180−}
181−
182−void AbstractDashView::createDelegateModel()
183−{
184−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
185− m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
186− connect(m_delegateModel, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(itemCreated(int,QQuickItem*)));
187−#else
188− m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
189− connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
190−#endif
191− if (isComponentComplete())
192− m_delegateModel->componentComplete();
193−}
194−
195−void AbstractDashView::refill()
196−{
197− if (!isComponentComplete() || height() < 0) {
198− return;
199− }
200−
201− const bool delegateRangesValid = m_delegateCreationBeginValid && m_delegateCreationEndValid;
202− const qreal from = delegateRangesValid ? m_delegateCreationBegin : 0;
203− const qreal to = delegateRangesValid ? m_delegateCreationEnd : from + height();
204− const qreal buffer = (to - from) * bufferRatio;
205− const qreal bufferFrom = from - buffer;
206− const qreal bufferTo = to + buffer;
207−
208− bool added = addVisibleItems(from, to, false);
209− bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
210− added |= addVisibleItems(bufferFrom, bufferTo, true);
211−
212− if (added || removed) {
213− m_implicitHeightDirty = true;
214− polish();
215− }
216−}
217−
218−bool AbstractDashView::addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous)
219−{
220− if (!delegate())
221− return false;
222−
223− if (m_delegateModel->count() == 0)
224− return false;
225−
226− int modelIndex;
227− qreal yPos;
228− findBottomModelIndexToAdd(&modelIndex, &yPos);
229− bool changed = false;
230− while (modelIndex < m_delegateModel->count() && yPos <= fillToY) {
231− if (!createItem(modelIndex, asynchronous))
232− break;
233−
234− changed = true;
235− findBottomModelIndexToAdd(&modelIndex, &yPos);
236− }
237−
238− findTopModelIndexToAdd(&modelIndex, &yPos);
239− while (modelIndex >= 0 && yPos > fillFromY) {
240− if (!createItem(modelIndex, asynchronous))
241− break;
242−
243− changed = true;
244− findTopModelIndexToAdd(&modelIndex, &yPos);
245− }
246−
247− return changed;
248−}
249−
250−QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
251−{
252− if (asynchronous && m_asyncRequestedIndex != -1)
253− return nullptr;
254−
255− m_asyncRequestedIndex = -1;
256−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
257− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
258−#else
259− QObject* object = m_delegateModel->object(modelIndex, asynchronous);
260− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
261−#endif
262− if (!item) {
263−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
264− m_asyncRequestedIndex = modelIndex;
265−#else
266− if (object) {
267− m_delegateModel->release(object);
268− if (!m_delegateValidated) {
269− m_delegateValidated = true;
270− QObject* delegateObj = delegate();
271− qmlInfo(delegateObj ? delegateObj : this) << "Delegate must be of Item type";
272− }
273− } else {
274− m_asyncRequestedIndex = modelIndex;
275− }
276−#endif
277− return nullptr;
278− } else {
279− addItemToView(modelIndex, item);
280− return item;
281− }
282−}
283−
284−void AbstractDashView::releaseItem(QQuickItem *item)
285−{
286−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
287− QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
288− if (flags & QQuickVisualModel::Destroyed) {
289−#else
290− QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
291− if (flags & QQmlDelegateModel::Destroyed) {
292−#endif
293− item->setParentItem(nullptr);
294− }
295−}
296−
297−void AbstractDashView::setImplicitHeightDirty()
298−{
299− m_implicitHeightDirty = true;
300−}
301−
302−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
303−void AbstractDashView::itemCreated(int modelIndex, QQuickItem *item)
304−{
305−#else
306−void AbstractDashView::itemCreated(int modelIndex, QObject *object)
307−{
308− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
309− if (!item) {
310− qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
311− return;
312− }
313−#endif
314− item->setParentItem(this);
315−
316− // We only need to call createItem if we are here because of an asynchronous generation
317− // otherwise we are in this slot because createItem is creating the item sync
318− // and thus we don't need to call createItem again, nor need to set m_implicitHeightDirty
319− // and call polish because the sync createItem was called from addVisibleItems that
320− // is called from refill that will already do those if an item was added
321− if (modelIndex == m_asyncRequestedIndex) {
322− createItem(modelIndex, false);
323− m_implicitHeightDirty = true;
324− polish();
325− }
326−}
327−
328−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
329−void AbstractDashView::onModelUpdated(const QQuickChangeSet &changeSet, bool reset)
330−#else
331−void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
332−#endif
333−{
334− if (reset) {
335− cleanupExistingItems();
336− } else {
337− processModelRemoves(changeSet.removes());
338− }
339− polish();
340−}
341−
342−
343−void AbstractDashView::relayout()
344−{
345− m_needsRelayout = true;
346− polish();
347−}
348−
349−void AbstractDashView::onHeightChanged()
350−{
351− polish();
352−}
353−
354−void AbstractDashView::updatePolish()
355−{
356− if (!model())
357− return;
358−
359− if (m_needsRelayout) {
360− doRelayout();
361− m_needsRelayout = false;
362− m_implicitHeightDirty = true;
363− }
364−
365− refill();
366−
367− const bool delegateRangesValid = m_delegateCreationBeginValid && m_delegateCreationEndValid;
368− const qreal from = delegateRangesValid ? m_delegateCreationBegin : 0;
369− const qreal to = delegateRangesValid ? m_delegateCreationEnd : from + height();
370− updateItemCulling(from, to);
371−
372− if (m_implicitHeightDirty) {
373− calculateImplicitHeight();
374− m_implicitHeightDirty = false;
375− }
376−}
377−
378−void AbstractDashView::componentComplete()
379−{
380− if (m_delegateModel)
381− m_delegateModel->componentComplete();
382−
383− QQuickItem::componentComplete();
384−
385− m_needsRelayout = true;
386−
387− polish();
388−}
plugins/DashViews/abstractdashview.hdeleted−146
@@ -1,146 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef ABSTRACTDASHVIEW_H
18−#define ABSTRACTDASHVIEW_H
19−
20−#include <QQuickItem>
21−
22−class QAbstractItemModel;
23−class QQmlComponent;
24−#pragma GCC diagnostic push
25−#pragma GCC diagnostic ignored "-pedantic"
26−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
27−#include <private/qquickvisualdatamodel_p.h>
28−#else
29−#include <private/qqmldelegatemodel_p.h>
30−#include <qqmlinfo.h>
31−#endif
32−#pragma GCC diagnostic pop
33−
34−class AbstractDashView : public QQuickItem
35−{
36− Q_OBJECT
37−
38− Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
39− Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
40− Q_PROPERTY(qreal columnSpacing READ columnSpacing WRITE setColumnSpacing NOTIFY columnSpacingChanged)
41− Q_PROPERTY(qreal rowSpacing READ rowSpacing WRITE setRowSpacing NOTIFY rowSpacingChanged)
42− Q_PROPERTY(qreal delegateCreationBegin READ delegateCreationBegin
43− WRITE setDelegateCreationBegin
44− NOTIFY delegateCreationBeginChanged
45− RESET resetDelegateCreationBegin)
46− Q_PROPERTY(qreal delegateCreationEnd READ delegateCreationEnd
47− WRITE setDelegateCreationEnd
48− NOTIFY delegateCreationEndChanged
49− RESET resetDelegateCreationEnd)
50−
51−friend class VerticalJournalTest;
52−friend class HorizontalJournalTest;
53−friend class OrganicGridTest;
54−
55−public:
56− AbstractDashView();
57−
58− QAbstractItemModel *model() const;
59− void setModel(QAbstractItemModel *model);
60−
61− QQmlComponent *delegate() const;
62− void setDelegate(QQmlComponent *delegate);
63−
64− qreal columnSpacing() const;
65− void setColumnSpacing(qreal columnSpacing);
66−
67− qreal rowSpacing() const;
68− void setRowSpacing(qreal rowSpacing);
69−
70− qreal delegateCreationBegin() const;
71− void setDelegateCreationBegin(qreal);
72− void resetDelegateCreationBegin();
73−
74− qreal delegateCreationEnd() const;
75− void setDelegateCreationEnd(qreal);
76− void resetDelegateCreationEnd();
77−
78−Q_SIGNALS:
79− void modelChanged();
80− void delegateChanged();
81− void columnSpacingChanged();
82− void rowSpacingChanged();
83− void delegateCreationBeginChanged();
84− void delegateCreationEndChanged();
85−
86−protected Q_SLOTS:
87− void relayout();
88−
89−protected:
90− void updatePolish() override;
91− void componentComplete() override;
92−
93− void releaseItem(QQuickItem *item);
94− void setImplicitHeightDirty();
95−
96−private Q_SLOTS:
97−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
98− void itemCreated(int modelIndex, QQuickItem *item);
99− void onModelUpdated(const QQuickChangeSet &changeSet, bool reset);
100−#else
101− void itemCreated(int modelIndex, QObject *object);
102− void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
103−#endif
104− void onHeightChanged();
105−
106−private:
107− void createDelegateModel();
108− void refill();
109− bool addVisibleItems(qreal fillFromY, qreal fillToY, bool asynchronous);
110− QQuickItem *createItem(int modelIndex, bool asynchronous);
111−
112− virtual void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
113− virtual void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) = 0;
114− virtual void addItemToView(int modelIndex, QQuickItem *item) = 0;
115− virtual bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) = 0;
116− virtual void cleanupExistingItems() = 0;
117− virtual void doRelayout() = 0;
118− virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
119− virtual void calculateImplicitHeight() = 0;
120−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
121− virtual void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) = 0;
122−#else
123− virtual void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) = 0;
124−#endif
125−
126−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
127− QQuickVisualDataModel *m_delegateModel;
128−#else
129− QQmlDelegateModel *m_delegateModel;
130−#endif
131−
132− // Index we are waiting because we requested it asynchronously
133− int m_asyncRequestedIndex;
134−
135− int m_columnSpacing;
136− int m_rowSpacing;
137− qreal m_delegateCreationBegin;
138− qreal m_delegateCreationEnd;
139− bool m_delegateCreationBeginValid;
140− bool m_delegateCreationEndValid;
141− bool m_needsRelayout;
142− bool m_delegateValidated;
143− bool m_implicitHeightDirty;
144−};
145−
146−#endif
plugins/DashViews/horizontaljournal.cppdeleted−254
@@ -1,254 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−/*
18− * The implementation is centered around m_visibleItems
19− * that a list for each of the items in the view.
20− * m_firstVisibleIndex is the index of the first item in m_visibleItems
21− * m_lastInRowIndexPosition is a map that contains the x position
22− * of items that are the last ones of a row so we can reconstruct the rows
23− * when building back
24− */
25−
26−#include "horizontaljournal.h"
27−
28−#include <qqmlengine.h>
29−#pragma GCC diagnostic push
30−#pragma GCC diagnostic ignored "-pedantic"
31−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
32−#include <private/qquickvisualdatamodel_p.h>
33−#else
34−#include <private/qqmldelegatemodel_p.h>
35−#include <qqmlinfo.h>
36−#endif
37−#include <private/qquickitem_p.h>
38−#pragma GCC diagnostic pop
39−
40−static const qreal bufferRatio = 0.5;
41−
42−HorizontalJournal::HorizontalJournal()
43− : m_firstVisibleIndex(-1)
44− , m_rowHeight(0)
45−{
46−}
47−
48−qreal HorizontalJournal::rowHeight() const
49−{
50− return m_rowHeight;
51−}
52−
53−void HorizontalJournal::setRowHeight(qreal rowHeight)
54−{
55− if (rowHeight != m_rowHeight) {
56− m_rowHeight = rowHeight;
57− Q_EMIT rowHeightChanged();
58−
59− if (isComponentComplete()) {
60− Q_FOREACH(QQuickItem *item, m_visibleItems) {
61− item->setHeight(rowHeight);
62− }
63− relayout();
64− }
65− }
66−}
67−
68−void HorizontalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
69−{
70− if (m_visibleItems.isEmpty()) {
71− *modelIndex = 0;
72− *yPos = 0;
73− } else {
74− *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
75− if (m_lastInRowIndexPosition.contains(*modelIndex - 1)) {
76− *yPos = m_visibleItems.last()->y() + m_rowHeight + rowSpacing();
77− } else {
78− *yPos = m_visibleItems.last()->y();
79− }
80− }
81−}
82−
83−void HorizontalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
84−{
85− if (m_visibleItems.isEmpty()) {
86− *modelIndex = -1;
87− *yPos = INT_MIN;
88− } else {
89− *modelIndex = m_firstVisibleIndex - 1;
90− if (m_lastInRowIndexPosition.contains(*modelIndex)) {
91− *yPos = m_visibleItems.first()->y() - rowSpacing() - m_rowHeight;
92− } else {
93− *yPos = m_visibleItems.first()->y();
94− }
95− }
96−}
97−
98−bool HorizontalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
99−{
100− bool changed = false;
101−
102− while (!m_visibleItems.isEmpty() && m_visibleItems.first()->y() + m_rowHeight < bufferFromY) {
103− releaseItem(m_visibleItems.takeFirst());
104− changed = true;
105− m_firstVisibleIndex++;
106− }
107−
108− while (!m_visibleItems.isEmpty() && m_visibleItems.last()->y() > bufferToY) {
109− releaseItem(m_visibleItems.takeLast());
110− changed = true;
111− m_lastInRowIndexPosition.remove(m_firstVisibleIndex + m_visibleItems.count());
112− }
113−
114− if (m_visibleItems.isEmpty()) {
115− m_firstVisibleIndex = -1;
116− }
117−
118− return changed;
119−}
120−
121−void HorizontalJournal::addItemToView(int modelIndex, QQuickItem *item)
122−{
123− if (item->height() != m_rowHeight) {
124− qWarning() << "Item" << modelIndex << "height is not the one that the rowHeight mandates, resetting it";
125− item->setHeight(m_rowHeight);
126− }
127−
128− if (m_visibleItems.isEmpty()) {
129− Q_ASSERT(modelIndex == 0);
130− item->setY(0);
131− item->setX(0);
132− m_visibleItems << item;
133− m_firstVisibleIndex = 0;
134− } else {
135− // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count()
136− if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
137− QQuickItem *lastItem = m_visibleItems.last();
138− if (lastItem->x() + lastItem->width() + columnSpacing() + item->width() <= width()) {
139− // Fits in the row
140− item->setY(lastItem->y());
141− item->setX(lastItem->x() + lastItem->width() + columnSpacing());
142− } else {
143− // Starts a new row
144− item->setY(lastItem->y() + m_rowHeight + rowSpacing());
145− item->setX(0);
146− m_lastInRowIndexPosition[modelIndex - 1] = lastItem->x();
147− }
148− m_visibleItems << item;
149− } else if (modelIndex == m_firstVisibleIndex - 1) {
150− QQuickItem *firstItem = m_visibleItems.first();
151− if (m_lastInRowIndexPosition.contains(modelIndex)) {
152− // It is the last item of its row, so start a new one since we're going back
153− item->setY(firstItem->y() - rowSpacing() - m_rowHeight);
154− item->setX(m_lastInRowIndexPosition[modelIndex]);
155− } else {
156− item->setY(firstItem->y());
157− item->setX(firstItem->x() - columnSpacing() - item->width());
158− }
159− m_firstVisibleIndex = modelIndex;
160− m_visibleItems.prepend(item);
161− } else {
162− qWarning() << "HorizontalJournal::addItemToView - Got unexpected modelIndex"
163− << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
164− }
165− }
166−}
167−
168−void HorizontalJournal::cleanupExistingItems()
169−{
170− // Cleanup the existing items
171− Q_FOREACH(QQuickItem *item, m_visibleItems)
172− releaseItem(item);
173− m_visibleItems.clear();
174− m_lastInRowIndexPosition.clear();
175− m_firstVisibleIndex = -1;
176− setImplicitHeightDirty();
177−}
178−
179−void HorizontalJournal::calculateImplicitHeight()
180−{
181− if (m_firstVisibleIndex >= 0) {
182− const int nIndexes = m_firstVisibleIndex + m_visibleItems.count();
183− const double bottomMostY = m_visibleItems.last()->y() + m_rowHeight;
184− const double averageHeight = bottomMostY / nIndexes;
185− setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - nIndexes));
186− } else {
187− setImplicitHeight(0);
188− }
189−}
190−
191−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
192−void HorizontalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
193−#else
194−void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
195−#endif
196−{
197−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
198− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
199−#else
200− Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
201−#endif
202− for (int i = remove.count - 1; i >= 0; --i) {
203− const int indexToRemove = remove.index + i;
204− // We only support removing from the end so
205− // any of the last items of a column has to be indexToRemove
206− const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
207− if (indexToRemove == lastIndex) {
208− releaseItem(m_visibleItems.takeLast());
209− m_lastInRowIndexPosition.remove(indexToRemove);
210− } else {
211− if (indexToRemove < lastIndex) {
212− qFatal("HorizontalJournal only supports removal from the end of the model");
213− } else {
214− setImplicitHeightDirty();
215− }
216− }
217− }
218− }
219− if (m_visibleItems.isEmpty()) {
220− m_firstVisibleIndex = -1;
221− }
222−}
223−
224−
225−void HorizontalJournal::doRelayout()
226−{
227− // If m_firstVisibleIndex is not 0 we need to drop all the delegates
228− // since we can't consistently relayout without the first item being there
229−
230− if (m_firstVisibleIndex == 0) {
231− int i = 0;
232− const QList<QQuickItem*> allItems = m_visibleItems;
233− m_visibleItems.clear();
234− m_lastInRowIndexPosition.clear();
235− Q_FOREACH(QQuickItem *item, allItems) {
236− addItemToView(i, item);
237− ++i;
238− }
239− } else {
240− Q_FOREACH(QQuickItem *item, m_visibleItems) {
241− releaseItem(item);
242− }
243− m_visibleItems.clear();
244− m_lastInRowIndexPosition.clear();
245− m_firstVisibleIndex = -1;
246− }
247−}
248−
249−void HorizontalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
250−{
251− Q_FOREACH(QQuickItem *item, m_visibleItems) {
252− QQuickItemPrivate::get(item)->setCulled(item->y() + m_rowHeight <= visibleFromY || item->y() >= visibleToY);
253− }
254−}
plugins/DashViews/horizontaljournal.hdeleted−67
@@ -1,67 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef HORIZONTALJOURNAL_H
18−#define HORIZONTALJOURNAL_H
19−
20−#include "abstractdashview.h"
21−
22− /** A horizontal journal is a view that creates delegates
23− * based on a model and layouts them one after the other
24− * in the same row until there is no more free space for the next item
25− * and so that item is layouted in the next row
26− *
27− * All delegates are forced to rowHeight if they don't have it.
28− */
29− class HorizontalJournal : public AbstractDashView
30−{
31− Q_OBJECT
32−
33− Q_PROPERTY(qreal rowHeight READ rowHeight WRITE setRowHeight NOTIFY rowHeightChanged)
34−
35−friend class HorizontalJournalTest;
36−
37−public:
38− HorizontalJournal();
39−
40− qreal rowHeight() const;
41− void setRowHeight(qreal rowHeight);
42−
43−Q_SIGNALS:
44− void rowHeightChanged();
45−
46−private:
47− void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
48− void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
49− bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
50− void addItemToView(int modelIndex, QQuickItem *item) override;
51− void cleanupExistingItems() override;
52− void calculateImplicitHeight() override;
53− void doRelayout() override;
54− void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
55−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
56− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
57−#else
58− void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
59−#endif
60−
61− int m_firstVisibleIndex;
62− QList<QQuickItem*> m_visibleItems;
63− QMap<int, double> m_lastInRowIndexPosition;
64− int m_rowHeight;
65−};
66−
67−#endif
plugins/DashViews/listviewwithpageheader.cppdeleted−1300
@@ -1,1300 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−/*
18− * Some documentation on how this thing works:
19− *
20− * A flickable has two very important concepts that define the top and
21− * height of the flickable area.
22− * The top is returned in minYExtent()
23− * The height is set using setContentHeight()
24− * By changing those two values we can make the list grow up or down
25− * as needed. e.g. if we are in the middle of the list
26− * and something that is above the viewport grows, since we do not
27− * want to change the viewport because of that we just adjust the
28− * minYExtent so that the list grows up.
29− *
30− * The implementation on the list relies on the delegateModel doing
31− * most of the instantiation work. You call createItem() when you
32− * need to create an item asking for it async or not. If returns null
33− * it means the item will be created async and the model will call the
34− * itemCreated slot with the item.
35− *
36− * updatePolish is the central point of dispatch for the work of the
37− * class. It is called by the scene graph just before drawing the class.
38− * In it we:
39− * * Make sure all items are positioned correctly
40− * * Add/Remove items if needed
41− * * Update the content height if it was dirty
42− *
43− * m_visibleItems contains all the items we have created at the moment.
44− * Actually not all of them are visible since it includes the ones
45− * in the cache area we create asynchronously to help performance.
46− * The first item in m_visibleItems has the m_firstVisibleIndex in
47− * the model. If you actually want to know what is the first
48− * item in the viewport you have to find the first non culled element
49− * in m_visibleItems
50− *
51− * All the items (except the header) are childs of m_clipItem which
52− * is a child of the contentItem() of the flickable (The contentItem()
53− * is what actually 'moves' in a a flickable). This way
54− * we can implement the clipping needed so we can have the header
55− * shown in the middle of the list over the items without the items
56− * leaking under the header in case it is transparent.
57− *
58− * The first item of m_visibleItems is the one that defines the
59− * positions of all the rest of items (see updatePolish()) and
60− * this is why sometimes we move it even if it's not the item
61− * that has triggered the function (i.e. in itemGeometryChanged())
62− *
63− * m_visibleItems is a list of ListItem. Each ListItem
64− * will contain a item and potentially a sectionItem. The sectionItem
65− * is only there when the list is using sectionDelegate+sectionProperty
66− * and this is the first item of the section. Each ListItem is vertically
67− * layouted with the sectionItem first and then the item.
68− *
69− * For sectioning we also have a section item alone (m_topSectionItem)
70− * that is used for the cases we need to show the sticky section item at
71− * the top of the view.
72− *
73− * Each delegate item has a context property called heightToClip that is
74− * used to communicate to the delegate implementation in case it has to
75− * clip itself because of overlapping with the top sticky section item.
76− * This is an implementation decision since it has been agreed it
77− * is easier to implement the clipping in QML with this info than to
78− * do it at the C++ level.
79− *
80− * Note that minYExtent and height are not always totally accurate, since
81− * we don't have the items created we can't guess their heights
82− * so we can only guarantee the values are correct when the first/last
83− * items of the list are visible, otherwise we just live with good enough
84− * values that make the list scrollable
85− *
86− * There are a few things that are not really implemented or tested properly
87− * which we don't use at the moment like changing the model, changing
88− * the section delegate, having a section delegate that changes its size, etc.
89− * The known missing features are marked with TODOs along the code.
90− */
91−
92−#include "listviewwithpageheader.h"
93−
94−#include <QDebug>
95−#include <qqmlinfo.h>
96−#include <qqmlengine.h>
97−#pragma GCC diagnostic push
98−#pragma GCC diagnostic ignored "-pedantic"
99−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
100−#include <private/qquickvisualdatamodel_p.h>
101−#else
102−#include <private/qqmldelegatemodel_p.h>
103−#endif
104−#include <private/qqmlglobal_p.h>
105−#include <private/qquickitem_p.h>
106−#include <private/qquickanimation_p.h>
107−#pragma GCC diagnostic pop
108−// #include <private/qquickrectangle_p.h>
109−
110−static const qreal bufferRatio = 0.5;
111−
112−qreal ListViewWithPageHeader::ListItem::height() const
113−{
114− return m_item->height() + (m_sectionItem ? m_sectionItem->height() : 0);
115−}
116−
117−qreal ListViewWithPageHeader::ListItem::y() const
118−{
119− return m_item->y() - (m_sectionItem ? m_sectionItem->height() : 0);
120−}
121−
122−void ListViewWithPageHeader::ListItem::setY(qreal newY)
123−{
124− if (m_sectionItem) {
125− m_sectionItem->setY(newY);
126− m_item->setY(newY + m_sectionItem->height());
127− } else {
128− m_item->setY(newY);
129− }
130−}
131−
132−bool ListViewWithPageHeader::ListItem::culled() const
133−{
134− return QQuickItemPrivate::get(m_item)->culled;
135−}
136−
137−void ListViewWithPageHeader::ListItem::setCulled(bool culled)
138−{
139− QQuickItemPrivate::get(m_item)->setCulled(culled);
140− if (m_sectionItem)
141− QQuickItemPrivate::get(m_sectionItem)->setCulled(culled);
142−}
143−
144−ListViewWithPageHeader::ListViewWithPageHeader()
145− : m_delegateModel(nullptr)
146− , m_asyncRequestedIndex(-1)
147− , m_delegateValidated(false)
148− , m_firstVisibleIndex(-1)
149− , m_minYExtent(0)
150− , m_contentHeightDirty(false)
151− , m_headerItem(nullptr)
152− , m_previousContentY(0)
153− , m_headerItemShownHeight(0)
154− , m_sectionDelegate(nullptr)
155− , m_topSectionItem(nullptr)
156− , m_forceNoClip(false)
157− , m_inLayout(false)
158− , m_inContentHeightKeepHeaderShown(false)
159−{
160− m_clipItem = new QQuickItem(contentItem());
161−// m_clipItem = new QQuickRectangle(contentItem());
162−// ((QQuickRectangle*)m_clipItem)->setColor(Qt::gray);
163−
164− m_contentYAnimation = new QQuickNumberAnimation(this);
165− m_contentYAnimation->setEasing(QEasingCurve::OutQuad);
166− m_contentYAnimation->setProperty("contentY");
167− m_contentYAnimation->setDuration(200);
168− m_contentYAnimation->setTargetObject(this);
169−
170− connect(this, SIGNAL(contentWidthChanged()), this, SLOT(onContentWidthChanged()));
171− connect(this, SIGNAL(contentHeightChanged()), this, SLOT(onContentHeightChanged()));
172− connect(this, SIGNAL(heightChanged()), this, SLOT(onHeightChanged()));
173− connect(m_contentYAnimation, SIGNAL(stopped()), this, SLOT(onShowHeaderAnimationFinished()));
174−
175− setFlickableDirection(VerticalFlick);
176−}
177−
178−ListViewWithPageHeader::~ListViewWithPageHeader()
179−{
180−}
181−
182−QAbstractItemModel *ListViewWithPageHeader::model() const
183−{
184− return m_delegateModel ? m_delegateModel->model().value<QAbstractItemModel *>() : nullptr;
185−}
186−
187−void ListViewWithPageHeader::setModel(QAbstractItemModel *model)
188−{
189− if (model != this->model()) {
190− if (!m_delegateModel) {
191− createDelegateModel();
192− } else {
193−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
194− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
195− }
196− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
197− connect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
198−#else
199− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
200− }
201− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
202− connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
203−#endif
204− Q_EMIT modelChanged();
205− polish();
206− // TODO?
207−// Q_EMIT contentHeightChanged();
208−// Q_EMIT contentYChanged();
209− }
210−}
211−
212−QQmlComponent *ListViewWithPageHeader::delegate() const
213−{
214− return m_delegateModel ? m_delegateModel->delegate() : nullptr;
215−}
216−
217−void ListViewWithPageHeader::setDelegate(QQmlComponent *delegate)
218−{
219− if (delegate != this->delegate()) {
220− if (!m_delegateModel) {
221− createDelegateModel();
222− }
223−
224− // Cleanup the existing items
225− Q_FOREACH(ListItem *item, m_visibleItems)
226− releaseItem(item);
227− m_visibleItems.clear();
228− m_firstVisibleIndex = -1;
229− adjustMinYExtent();
230− setContentY(0);
231− m_clipItem->setY(0);
232− if (m_topSectionItem) {
233− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
234− }
235−
236− m_delegateModel->setDelegate(delegate);
237−
238− Q_EMIT delegateChanged();
239− m_delegateValidated = false;
240− m_contentHeightDirty = true;
241− polish();
242− }
243−}
244−
245−QQuickItem *ListViewWithPageHeader::header() const
246−{
247− return m_headerItem;
248−}
249−
250−void ListViewWithPageHeader::setHeader(QQuickItem *headerItem)
251−{
252− if (m_headerItem != headerItem) {
253− qreal oldHeaderHeight = 0;
254− qreal oldHeaderY = 0;
255− if (m_headerItem) {
256− oldHeaderHeight = m_headerItem->height();
257− oldHeaderY = m_headerItem->y();
258− m_headerItem->setParentItem(nullptr);
259− }
260− m_headerItem = headerItem;
261− if (m_headerItem) {
262− m_headerItem->setParentItem(contentItem());
263− m_headerItem->setZ(1);
264− }
265− qreal newHeaderHeight = m_headerItem ? m_headerItem->height() : 0;
266− if (!m_visibleItems.isEmpty() && newHeaderHeight != oldHeaderHeight) {
267− headerHeightChanged(newHeaderHeight, oldHeaderHeight, oldHeaderY);
268− polish();
269− m_contentHeightDirty = true;
270− }
271− Q_EMIT headerChanged();
272− }
273−}
274−
275−QQmlComponent *ListViewWithPageHeader::sectionDelegate() const
276−{
277− return m_sectionDelegate;
278−}
279−
280−void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
281−{
282− if (delegate != m_sectionDelegate) {
283− // TODO clean existing sections
284−
285− m_sectionDelegate = delegate;
286−
287− m_topSectionItem = getSectionItem(QString());
288− m_topSectionItem->setZ(3);
289− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
290− connect(m_topSectionItem, SIGNAL(heightChanged()), SIGNAL(stickyHeaderHeightChanged()));
291−
292− // TODO create sections for existing items
293−
294− Q_EMIT sectionDelegateChanged();
295− Q_EMIT stickyHeaderHeightChanged();
296− }
297−}
298−
299−QString ListViewWithPageHeader::sectionProperty() const
300−{
301− return m_sectionProperty;
302−}
303−
304−void ListViewWithPageHeader::setSectionProperty(const QString &property)
305−{
306− if (property != m_sectionProperty) {
307− m_sectionProperty = property;
308−
309− updateWatchedRoles();
310−
311− // TODO recreate sections
312−
313− Q_EMIT sectionPropertyChanged();
314− }
315−}
316−
317−bool ListViewWithPageHeader::forceNoClip() const
318−{
319− return m_forceNoClip;
320−}
321−
322−void ListViewWithPageHeader::setForceNoClip(bool noClip)
323−{
324− if (noClip != m_forceNoClip) {
325− m_forceNoClip = noClip;
326− updateClipItem();
327− Q_EMIT forceNoClipChanged();
328− }
329−}
330−
331−int ListViewWithPageHeader::stickyHeaderHeight() const
332−{
333− return m_topSectionItem ? m_topSectionItem->height() : 0;
334−}
335−
336−void ListViewWithPageHeader::positionAtBeginning()
337−{
338− if (m_delegateModel->count() <= 0)
339− return;
340−
341− qreal headerHeight = (m_headerItem ? m_headerItem->height() : 0);
342− if (m_firstVisibleIndex != 0) {
343− // TODO This could be optimized by trying to reuse the interesection
344− // of items that may end up intersecting between the existing
345− // m_visibleItems and the items we are creating in the next loop
346− Q_FOREACH(ListItem *item, m_visibleItems)
347− releaseItem(item);
348− m_visibleItems.clear();
349− m_firstVisibleIndex = -1;
350−
351− // Create the item 0, it will be already correctly positioned at createItem()
352− m_clipItem->setY(0);
353− ListItem *item = createItem(0, false);
354− // Create the subsequent items
355− int modelIndex = 1;
356− qreal pos = item->y() + item->height();
357− const qreal buffer = height() * bufferRatio;
358− const qreal bufferTo = height() + buffer;
359− while (modelIndex < m_delegateModel->count() && pos <= bufferTo) {
360− if (!(item = createItem(modelIndex, false)))
361− break;
362− pos += item->height();
363− ++modelIndex;
364− }
365−
366− m_previousContentY = m_visibleItems.first()->y() - headerHeight;
367− }
368− setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight);
369−}
370−
371−void ListViewWithPageHeader::showHeader()
372−{
373− if (!m_headerItem)
374− return;
375−
376− auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
377− if (to != contentY()) {
378− const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
379− if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
380− // We are not clipping since we are just at the top of the viewport
381− // but because of the showHeader animation we will need to, so
382− // enable the clipping without logically moving the items
383− m_headerItemShownHeight = m_headerItem->y() + m_headerItem->height() - contentY();
384− if (!m_visibleItems.isEmpty()) {
385− updateClipItem();
386− ListItem *firstItem = m_visibleItems.first();
387− firstItem->setY(firstItem->y() - m_headerItemShownHeight);
388− layout();
389− }
390− }
391− m_contentYAnimation->setTo(to);
392− contentYAnimationType = ContentYAnimationShowHeader;
393− m_contentYAnimation->start();
394− }
395−}
396−
397−QQuickItem *ListViewWithPageHeader::item(int modelIndex) const
398−{
399− ListItem *item = itemAtIndex(modelIndex);
400− if (item)
401− return item->m_item;
402− else
403− return nullptr;
404−}
405−
406−bool ListViewWithPageHeader::maximizeVisibleArea(int modelIndex)
407−{
408− ListItem *listItem = itemAtIndex(modelIndex);
409− if (listItem) {
410− return maximizeVisibleArea(listItem, listItem->height());
411− }
412−
413− return false;
414−}
415−
416−bool ListViewWithPageHeader::maximizeVisibleArea(int modelIndex, int itemHeight)
417−{
418− if (itemHeight < 0)
419− return false;
420−
421− ListItem *listItem = itemAtIndex(modelIndex);
422− if (listItem) {
423− return maximizeVisibleArea(listItem, itemHeight + (listItem->m_sectionItem ? listItem->m_sectionItem->height() : 0));
424− }
425−
426− return false;
427−}
428−
429−bool ListViewWithPageHeader::maximizeVisibleArea(ListItem *listItem, int listItemHeight)
430−{
431− if (listItem) {
432− layout();
433− const auto listItemY = m_clipItem->y() + listItem->y();
434− if (listItemY > contentY() && listItemY + listItemHeight > contentY() + height()) {
435− // we can scroll the list up to show more stuff
436− const auto to = qMin(listItemY, listItemY + listItemHeight - height());
437− m_contentYAnimation->setTo(to);
438− contentYAnimationType = ContentYAnimationMaximizeVisibleArea;
439− m_contentYAnimation->start();
440− } else if ((listItemY < contentY() && listItemY + listItemHeight < contentY() + height()) ||
441− (m_topSectionItem && !listItem->m_sectionItem && listItemY - m_topSectionItem->height() < contentY() && listItemY + listItemHeight < contentY() + height()))
442− {
443− // we can scroll the list down to show more stuff
444− auto realVisibleListItemY = listItemY;
445− if (m_topSectionItem) {
446− // If we are showing the top section sticky item and this item doesn't have a section
447− // item we have to make sure to scroll it a bit more so that it is not underlapping
448− // the top section sticky item
449− bool topSectionShown = !QQuickItemPrivate::get(m_topSectionItem)->culled;
450− if (topSectionShown && !listItem->m_sectionItem) {
451− realVisibleListItemY -= m_topSectionItem->height();
452− }
453− }
454− const auto to = qMax(realVisibleListItemY, listItemY + listItemHeight - height());
455− m_contentYAnimation->setTo(to);
456− contentYAnimationType = ContentYAnimationMaximizeVisibleArea;
457− m_contentYAnimation->start();
458− }
459− return true;
460− }
461− return false;
462−}
463−
464−qreal ListViewWithPageHeader::minYExtent() const
465−{
466−// qDebug() << "ListViewWithPageHeader::minYExtent" << m_minYExtent;
467− return m_minYExtent;
468−}
469−
470−void ListViewWithPageHeader::componentComplete()
471−{
472− if (m_delegateModel)
473− m_delegateModel->componentComplete();
474−
475− QQuickFlickable::componentComplete();
476−
477− polish();
478−}
479−
480−void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
481−{
482− // Check we are not being taken down and don't paint anything
483− // TODO Check if we still need this in 5.2
484− // For reproduction just inifnite loop testDash or testDashContent
485− if (!QQmlEngine::contextForObject(this)->parentContext())
486− return;
487−
488− QQuickFlickable::viewportMoved(orient);
489−// qDebug() << "ListViewWithPageHeader::viewportMoved" << contentY();
490− qreal diff = m_previousContentY - contentY();
491− const bool showHeaderAnimationRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationShowHeader;
492− if (m_headerItem) {
493− const auto oldHeaderItemShownHeight = m_headerItemShownHeight;
494− if (contentY() < -m_minYExtent) {
495− // Stick the header item to the top when dragging down
496− m_headerItem->setY(contentY());
497− m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
498− } else {
499− m_headerItem->setHeight(m_headerItem->implicitHeight());
500− // We are going down (but it's not because of the rebound at the end)
501− // (but the header was not shown by it's own position)
502− // or the header is partially shown and we are not doing a maximizeVisibleArea either
503− const bool scrolledUp = m_previousContentY > contentY();
504− const bool notRebounding = contentY() + height() < contentHeight();
505− const bool notShownByItsOwn = contentY() + diff >= m_headerItem->y() + m_headerItem->height();
506− const bool maximizeVisibleAreaRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationMaximizeVisibleArea;
507−
508− if (!scrolledUp && (contentY() == -m_minYExtent || (m_headerItemShownHeight == 0 && m_previousContentY == m_headerItem->y()))) {
509− m_headerItemShownHeight = 0;
510− m_headerItem->setY(-m_minYExtent);
511− } else if ((scrolledUp && notRebounding && notShownByItsOwn && !maximizeVisibleAreaRunning) || (m_headerItemShownHeight > 0) || m_inContentHeightKeepHeaderShown) {
512− if (maximizeVisibleAreaRunning && diff > 0) // If we are maximizing and the header was shown, make sure we hide it
513− m_headerItemShownHeight -= diff;
514− else
515− m_headerItemShownHeight += diff;
516− if (contentY() == -m_minYExtent) {
517− m_headerItemShownHeight = 0;
518− } else {
519− m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, m_headerItem->height());
520− }
521− if (m_headerItemShownHeight > 0) {
522− m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
523− } else {
524− m_headerItem->setY(-m_minYExtent);
525− }
526− }
527− }
528− // We will be changing the clip item, need to accomadate for it
529− // otherwise we move the firstItem down/up twice (unless the
530− // show header animation is running, where we want to keep the viewport stable)
531− if (!showHeaderAnimationRunning) {
532− diff += oldHeaderItemShownHeight - m_headerItemShownHeight;
533− } else {
534− diff = -diff;
535− }
536− }
537− if (!m_visibleItems.isEmpty()) {
538− updateClipItem();
539− ListItem *firstItem = m_visibleItems.first();
540− firstItem->setY(firstItem->y() + diff);
541− if (showHeaderAnimationRunning) {
542− adjustMinYExtent();
543− }
544− }
545−
546− m_previousContentY = contentY();
547− layout();
548− polish();
549−}
550−
551−void ListViewWithPageHeader::createDelegateModel()
552−{
553−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
554− m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
555− connect(m_delegateModel, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(itemCreated(int,QQuickItem*)));
556−#else
557− m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
558− connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
559−#endif
560− if (isComponentComplete())
561− m_delegateModel->componentComplete();
562− updateWatchedRoles();
563−}
564−
565−void ListViewWithPageHeader::refill()
566−{
567− if (m_inLayout) {
568− return;
569− }
570− if (!isComponentComplete()) {
571− return;
572− }
573−
574− const qreal buffer = height() * bufferRatio;
575− const qreal from = contentY();
576− const qreal to = from + height();
577− const qreal bufferFrom = from - buffer;
578− const qreal bufferTo = to + buffer;
579−
580− bool added = addVisibleItems(from, to, false);
581− bool removed = removeNonVisibleItems(bufferFrom, bufferTo);
582− added |= addVisibleItems(bufferFrom, bufferTo, true);
583−
584− if (added || removed) {
585− m_contentHeightDirty = true;
586− }
587−}
588−
589−bool ListViewWithPageHeader::addVisibleItems(qreal fillFrom, qreal fillTo, bool asynchronous)
590−{
591− if (!delegate())
592− return false;
593−
594− if (m_delegateModel->count() == 0)
595− return false;
596−
597− ListItem *item;
598−// qDebug() << "ListViewWithPageHeader::addVisibleItems" << fillFrom << fillTo << asynchronous;
599−
600− int modelIndex = 0;
601− qreal pos = 0;
602− if (!m_visibleItems.isEmpty()) {
603− modelIndex = m_firstVisibleIndex + m_visibleItems.count();
604− item = m_visibleItems.last();
605− pos = item->y() + item->height() + m_clipItem->y();
606− }
607− bool changed = false;
608−// qDebug() << (modelIndex < m_delegateModel->count()) << pos << fillTo;
609− while (modelIndex < m_delegateModel->count() && pos <= fillTo) {
610−// qDebug() << "refill: append item" << modelIndex << "pos" << pos << "asynchronous" << asynchronous;
611− if (!(item = createItem(modelIndex, asynchronous)))
612− break;
613− pos += item->height();
614− ++modelIndex;
615− changed = true;
616− }
617−
618− modelIndex = 0;
619− pos = 0;
620− if (!m_visibleItems.isEmpty()) {
621− modelIndex = m_firstVisibleIndex - 1;
622− item = m_visibleItems.first();
623− pos = item->y() + m_clipItem->y();
624− }
625− while (modelIndex >= 0 && pos > fillFrom) {
626−// qDebug() << "refill: prepend item" << modelIndex << "pos" << pos << "fillFrom" << fillFrom << "asynchronous" << asynchronous;
627− if (!(item = createItem(modelIndex, asynchronous)))
628− break;
629− pos -= item->height();
630− --modelIndex;
631− changed = true;
632− }
633−
634− return changed;
635−}
636−
637−void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
638−{
639− QQuickItem *item = listItem->m_item;
640−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
641− QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
642− if (flags & QQuickVisualModel::Destroyed) {
643−#else
644− QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
645− if (flags & QQmlDelegateModel::Destroyed) {
646−#endif
647− item->setParentItem(nullptr);
648− }
649− delete listItem->m_sectionItem;
650− delete listItem;
651−}
652−
653−void ListViewWithPageHeader::releaseItem(ListItem *listItem)
654−{
655− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
656− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
657− m_itemsToRelease << listItem;
658−}
659−
660−void ListViewWithPageHeader::updateWatchedRoles()
661−{
662− if (m_delegateModel) {
663− QList<QByteArray> roles;
664− if (!m_sectionProperty.isEmpty())
665− roles << m_sectionProperty.toUtf8();
666− m_delegateModel->setWatchedRoles(roles);
667− }
668−}
669−
670−QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyInserted)
671−{
672− if (!m_sectionDelegate)
673− return nullptr;
674−
675− const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
676− if (modelIndex > 0) {
677− const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
678− if (section == prevSection)
679− return nullptr;
680− }
681− if (modelIndex + 1 < model()->rowCount() && !alreadyInserted) {
682− // Already inserted items can't steal next section header
683− const QString nextSection = m_delegateModel->stringValue(modelIndex + 1, m_sectionProperty);
684− if (section == nextSection) {
685− // Steal the section header
686− ListItem *nextItem = itemAtIndex(modelIndex); // Not +1 since not yet inserted into m_visibleItems
687− if (nextItem) {
688− QQuickItem *sectionItem = nextItem->m_sectionItem;
689− nextItem->m_sectionItem = nullptr;
690− return sectionItem;
691− }
692− }
693− }
694−
695− return getSectionItem(section);
696−}
697−
698−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
699−{
700− QQuickItem *sectionItem = nullptr;
701−
702− QQmlContext *creationContext = m_sectionDelegate->creationContext();
703− QQmlContext *context = new QQmlContext(creationContext ? creationContext : qmlContext(this));
704− context->setContextProperty(QLatin1String("section"), sectionText);
705− context->setContextProperty(QLatin1String("delegateIndex"), -1);
706− QObject *nobj = m_sectionDelegate->beginCreate(context);
707− if (nobj) {
708− QQml_setParent_noEvent(context, nobj);
709− sectionItem = qobject_cast<QQuickItem *>(nobj);
710− if (!sectionItem) {
711− delete nobj;
712− } else {
713− sectionItem->setZ(2);
714− QQml_setParent_noEvent(sectionItem, m_clipItem);
715− sectionItem->setParentItem(m_clipItem);
716− }
717− } else {
718− delete context;
719− }
720− m_sectionDelegate->completeCreate();
721−
722− // TODO attach to sectionItem so we can accomodate to it changing its height
723−
724− return sectionItem;
725−}
726−
727−bool ListViewWithPageHeader::removeNonVisibleItems(qreal bufferFrom, qreal bufferTo)
728−{
729−// qDebug() << "ListViewWithPageHeader::removeNonVisibleItems" << bufferFrom << bufferTo;
730− // Do not remove items if we are overshooting up or down, since we'll come back
731− // to the "stable" position and delete/create items without any reason
732− if (contentY() < -m_minYExtent) {
733− return false;
734− } else if (contentY() + height() > contentHeight()) {
735− return false;
736− }
737− bool changed = false;
738−
739− bool foundVisible = false;
740− int i = 0;
741− int removedItems = 0;
742− const auto oldFirstVisibleIndex = m_firstVisibleIndex;
743− while (i < m_visibleItems.count()) {
744− ListItem *item = m_visibleItems[i];
745− const qreal pos = item->y() + m_clipItem->y();
746−// qDebug() << i << pos << (pos + item->height()) << bufferFrom << bufferTo;
747− if (pos + item->height() < bufferFrom || pos > bufferTo) {
748−// qDebug() << "Releasing" << i << (pos + item->height() < bufferFrom) << pos + item->height() << bufferFrom << (pos > bufferTo) << pos << bufferTo;
749− releaseItem(item);
750− m_visibleItems.removeAt(i);
751− changed = true;
752− ++removedItems;
753− } else {
754− if (!foundVisible) {
755− foundVisible = true;
756− const int itemIndex = m_firstVisibleIndex + removedItems + i;
757− m_firstVisibleIndex = itemIndex;
758− }
759− ++i;
760− }
761− }
762− if (m_firstVisibleIndex != oldFirstVisibleIndex) {
763− adjustMinYExtent();
764− }
765−
766− return changed;
767−}
768−
769−ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIndex, bool asynchronous)
770−{
771−// qDebug() << "CREATE ITEM" << modelIndex;
772− if (asynchronous && m_asyncRequestedIndex != -1)
773− return nullptr;
774−
775− m_asyncRequestedIndex = -1;
776−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
777− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
778−#else
779− QObject* object = m_delegateModel->object(modelIndex, asynchronous);
780− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
781−#endif
782− if (!item) {
783−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
784− m_asyncRequestedIndex = modelIndex;
785−#else
786− if (object) {
787− m_delegateModel->release(object);
788− if (!m_delegateValidated) {
789− m_delegateValidated = true;
790− QObject* delegateObj = delegate();
791− qmlInfo(delegateObj ? delegateObj : this) << "Delegate must be of Item type";
792− }
793− } else {
794− m_asyncRequestedIndex = modelIndex;
795− }
796−#endif
797− return 0;
798− } else {
799−// qDebug() << "ListViewWithPageHeader::createItem::We have the item" << modelIndex << item;
800− ListItem *listItem = new ListItem;
801− listItem->m_item = item;
802− listItem->m_sectionItem = getSectionItem(modelIndex, false /*Not yet inserted into m_visibleItems*/);
803− QQuickItemPrivate::get(item)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
804− ListItem *prevItem = itemAtIndex(modelIndex - 1);
805− bool lostItem = false; // Is an item that we requested async but because of model changes
806− // it is no longer attached to any of the existing items (has no prev nor next item)
807− // nor is the first item
808− if (prevItem) {
809− listItem->setY(prevItem->y() + prevItem->height());
810− } else {
811− ListItem *currItem = itemAtIndex(modelIndex);
812− if (currItem) {
813− // There's something already in m_visibleItems at out index, meaning this is an insert, so attach to its top
814− listItem->setY(currItem->y() - listItem->height());
815− } else {
816− ListItem *nextItem = itemAtIndex(modelIndex + 1);
817− if (nextItem) {
818− listItem->setY(nextItem->y() - listItem->height());
819− } else if (modelIndex == 0 && m_headerItem) {
820− listItem->setY(m_headerItem->height());
821− } else if (!m_visibleItems.isEmpty()) {
822− lostItem = true;
823− }
824− }
825− }
826− if (lostItem) {
827− releaseItem(listItem);
828− listItem = nullptr;
829− } else {
830− listItem->setCulled(listItem->y() + listItem->height() + m_clipItem->y() <= contentY() || listItem->y() + m_clipItem->y() >= contentY() + height());
831− if (m_visibleItems.isEmpty()) {
832− m_visibleItems << listItem;
833− } else {
834− m_visibleItems.insert(modelIndex - m_firstVisibleIndex, listItem);
835− }
836− if (m_firstVisibleIndex < 0 || modelIndex < m_firstVisibleIndex) {
837− m_firstVisibleIndex = modelIndex;
838− polish();
839− }
840− if (listItem->m_sectionItem) {
841− QQmlContext *context = QQmlEngine::contextForObject(listItem->m_sectionItem)->parentContext();
842− context->setContextProperty(QLatin1String("delegateIndex"), modelIndex);
843− }
844− adjustMinYExtent();
845− m_contentHeightDirty = true;
846− }
847− return listItem;
848− }
849−}
850−
851−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
852−void ListViewWithPageHeader::itemCreated(int modelIndex, QQuickItem *item)
853−{
854−#else
855−void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
856−{
857− QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
858− if (!item) {
859− qWarning() << "ListViewWithPageHeader::itemCreated got a non item for index" << modelIndex;
860− return;
861− }
862−#endif
863−// qDebug() << "ListViewWithPageHeader::itemCreated" << modelIndex << item;
864− // Check we are not being taken down and don't paint anything
865− // TODO Check if we still need this in 5.2
866− // For reproduction just inifnite loop testDash or testDashContent
867− if (!QQmlEngine::contextForObject(this)->parentContext())
868− return;
869−
870− item->setParentItem(m_clipItem);
871− QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
872− context->setContextProperty(QLatin1String("ListViewWithPageHeader"), this);
873− context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
874− if (modelIndex == m_asyncRequestedIndex) {
875− createItem(modelIndex, false);
876− refill();
877− }
878−}
879−
880−void ListViewWithPageHeader::updateClipItem()
881−{
882− m_clipItem->setHeight(height() - m_headerItemShownHeight);
883− m_clipItem->setY(contentY() + m_headerItemShownHeight);
884− m_clipItem->setClip(!m_forceNoClip && m_headerItemShownHeight > 0);
885−}
886−
887−void ListViewWithPageHeader::onContentHeightChanged()
888−{
889− updateClipItem();
890−}
891−
892−void ListViewWithPageHeader::onContentWidthChanged()
893−{
894− m_clipItem->setWidth(contentItem()->width());
895−}
896−
897−void ListViewWithPageHeader::onHeightChanged()
898−{
899− polish();
900−}
901−
902−
903−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
904−void ListViewWithPageHeader::onModelUpdated(const QQuickChangeSet &changeSet, bool /*reset*/)
905−#else
906−void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool /*reset*/)
907−#endif
908−{
909− // TODO Do something with reset
910−// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
911− const auto oldFirstVisibleIndex = m_firstVisibleIndex;
912−
913−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
914− Q_FOREACH(const QQuickChangeSet::Remove &remove, changeSet.removes()) {
915−#else
916− Q_FOREACH(const QQmlChangeSet::Remove &remove, changeSet.removes()) {
917−#endif
918−// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
919− if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
920− const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
921− // If all the items we are removing are either not created or culled
922− // we have to grow down to avoid viewport changing
923− bool growDown = true;
924− for (int i = 0; growDown && i < remove.count; ++i) {
925− const int modelIndex = remove.index + i;
926− ListItem *item = itemAtIndex(modelIndex);
927− if (item && !item->culled()) {
928− growDown = false;
929− }
930− }
931− for (int i = remove.count - 1; i >= 0; --i) {
932− const int visibleIndex = remove.index + i - m_firstVisibleIndex;
933− if (visibleIndex >= 0 && visibleIndex < m_visibleItems.count()) {
934− ListItem *item = m_visibleItems[visibleIndex];
935− // Pass the section item down if needed
936− if (item->m_sectionItem && visibleIndex + 1 < m_visibleItems.count()) {
937− ListItem *nextItem = m_visibleItems[visibleIndex + 1];
938− if (!nextItem->m_sectionItem) {
939− nextItem->m_sectionItem = item->m_sectionItem;
940− item->m_sectionItem = nullptr;
941− }
942− }
943− releaseItem(item);
944− m_visibleItems.removeAt(visibleIndex);
945− }
946− }
947− if (growDown) {
948− adjustMinYExtent();
949− } else if (remove.index <= m_firstVisibleIndex) {
950− if (!m_visibleItems.isEmpty()) {
951− // We removed the first item that is the one that positions the rest
952− // position the new first item correctly
953− m_visibleItems.first()->setY(oldFirstValidIndexPos);
954− } else {
955− m_firstVisibleIndex = -1;
956− }
957− }
958− } else if (remove.index + remove.count <= m_firstVisibleIndex) {
959− m_firstVisibleIndex -= remove.count;
960− }
961− for (int i = remove.count - 1; i >= 0; --i) {
962− const int modelIndex = remove.index + i;
963− if (modelIndex == m_asyncRequestedIndex) {
964− m_asyncRequestedIndex = -1;
965− } else if (modelIndex < m_asyncRequestedIndex) {
966− m_asyncRequestedIndex--;
967− }
968− }
969− }
970−
971−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
972− Q_FOREACH(const QQuickChangeSet::Insert &insert, changeSet.inserts()) {
973−#else
974− Q_FOREACH(const QQmlChangeSet::Insert &insert, changeSet.inserts()) {
975−#endif
976−// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
977− const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
978− const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
979− if (insertingInValidIndexes || firstItemWithViewOnTop)
980− {
981− // If the items we are adding won't be really visible
982− // we grow up instead of down to not change the viewport
983− bool growUp = false;
984− if (!firstItemWithViewOnTop) {
985− for (int i = 0; i < m_visibleItems.count(); ++i) {
986− if (!m_visibleItems[i]->culled()) {
987− if (insert.index <= m_firstVisibleIndex + i) {
988− growUp = true;
989− }
990− break;
991− }
992− }
993− }
994−
995− const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
996− for (int i = insert.count - 1; i >= 0; --i) {
997− const int modelIndex = insert.index + i;
998− ListItem *item = createItem(modelIndex, false);
999− if (growUp) {
1000− ListItem *firstItem = m_visibleItems.first();
1001− firstItem->setY(firstItem->y() - item->height());
1002− }
1003− // Adding an item may break a "same section" chain, so check
1004− // if we need adding a new section item
1005− if (m_sectionDelegate) {
1006− ListItem *nextItem = itemAtIndex(modelIndex + 1);
1007− if (nextItem && !nextItem->m_sectionItem) {
1008− nextItem->m_sectionItem = getSectionItem(modelIndex + 1, true /* alredy inserted into m_visibleItems*/);
1009− if (growUp && nextItem->m_sectionItem) {
1010− ListItem *firstItem = m_visibleItems.first();
1011− firstItem->setY(firstItem->y() - nextItem->m_sectionItem->height());
1012− }
1013− }
1014− }
1015− }
1016− if (firstItemWithViewOnTop) {
1017− ListItem *firstItem = m_visibleItems.first();
1018− firstItem->setY(oldFirstValidIndexPos);
1019− }
1020− adjustMinYExtent();
1021− } else if (insert.index <= m_firstVisibleIndex) {
1022− m_firstVisibleIndex += insert.count;
1023− }
1024−
1025− for (int i = insert.count - 1; i >= 0; --i) {
1026− const int modelIndex = insert.index + i;
1027− if (modelIndex <= m_asyncRequestedIndex) {
1028− m_asyncRequestedIndex++;
1029− }
1030− }
1031− }
1032−
1033−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1034− Q_FOREACH(const QQuickChangeSet::Change &change, changeSet.changes()) {
1035−#else
1036− Q_FOREACH(const QQmlChangeSet::Change &change, changeSet.changes()) {
1037−#endif
1038−// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
1039− for (int i = change.index; i < change.count; ++i) {
1040− ListItem *item = itemAtIndex(i);
1041− if (item && item->m_sectionItem) {
1042− QQmlContext *context = QQmlEngine::contextForObject(item->m_sectionItem)->parentContext();
1043− const QString sectionText = m_delegateModel->stringValue(i, m_sectionProperty);
1044− context->setContextProperty(QLatin1String("section"), sectionText);
1045− }
1046− }
1047− }
1048−
1049− if (m_firstVisibleIndex != oldFirstVisibleIndex) {
1050− adjustMinYExtent();
1051− }
1052−
1053− for (int i = 0; i < m_visibleItems.count(); ++i) {
1054− ListItem *item = m_visibleItems[i];
1055− if (item->m_sectionItem) {
1056− QQmlContext *context = QQmlEngine::contextForObject(item->m_sectionItem)->parentContext();
1057− context->setContextProperty(QLatin1String("delegateIndex"), m_firstVisibleIndex + i);
1058− }
1059− }
1060−
1061− layout();
1062− polish();
1063− m_contentHeightDirty = true;
1064−}
1065−
1066−void ListViewWithPageHeader::onShowHeaderAnimationFinished()
1067−{
1068− m_contentHeightDirty = true;
1069− polish();
1070−}
1071−
1072−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1073−{
1074− const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1075− if (heightDiff != 0) {
1076− if (oldGeometry.y() + oldGeometry.height() + m_clipItem->y() < contentY() && !m_visibleItems.isEmpty()) {
1077− ListItem *firstItem = m_visibleItems.first();
1078− firstItem->setY(firstItem->y() - heightDiff);
1079− adjustMinYExtent();
1080− layout();
1081− }
1082− refill();
1083− adjustMinYExtent();
1084− polish();
1085− m_contentHeightDirty = true;
1086− }
1087−}
1088−
1089−void ListViewWithPageHeader::headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY)
1090−{
1091− const qreal heightDiff = newHeaderHeight - oldHeaderHeight;
1092− if (m_headerItemShownHeight > 0) {
1093− // If the header is shown because of the clip
1094− // Change its size
1095− m_headerItemShownHeight += heightDiff;
1096− m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, newHeaderHeight);
1097− updateClipItem();
1098− adjustMinYExtent();
1099− } else {
1100− if (oldHeaderY + oldHeaderHeight > contentY()) {
1101− // If the header is shown because its position
1102− // Change its size
1103− ListItem *firstItem = m_visibleItems.first();
1104− firstItem->setY(firstItem->y() + heightDiff);
1105− layout();
1106− } else {
1107− // If the header is not on screen, just change the start of the list
1108− // so the viewport is not changed
1109− adjustMinYExtent();
1110− }
1111− }
1112−}
1113−
1114−
1115−void ListViewWithPageHeader::adjustMinYExtent()
1116−{
1117− if (m_visibleItems.isEmpty()) {
1118− m_minYExtent = 0;
1119− } else {
1120− qreal nonCreatedHeight = 0;
1121− if (m_firstVisibleIndex != 0) {
1122− // Calculate the average height of items to estimate the position of the list start
1123− const int visibleItems = m_visibleItems.count();
1124− qreal visibleItemsHeight = 0;
1125− Q_FOREACH(ListItem *item, m_visibleItems) {
1126− visibleItemsHeight += item->height();
1127− }
1128− nonCreatedHeight = m_firstVisibleIndex * visibleItemsHeight / visibleItems;
1129−// qDebug() << m_firstVisibleIndex << visibleItemsHeight << visibleItems << nonCreatedHeight;
1130− }
1131− m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + (m_headerItem ? m_headerItem->implicitHeight() : 0);
1132− }
1133−}
1134−
1135−ListViewWithPageHeader::ListItem *ListViewWithPageHeader::itemAtIndex(int modelIndex) const
1136−{
1137− const int visibleIndexedModelIndex = modelIndex - m_firstVisibleIndex;
1138− if (visibleIndexedModelIndex >= 0 && visibleIndexedModelIndex < m_visibleItems.count())
1139− return m_visibleItems[visibleIndexedModelIndex];
1140−
1141− return nullptr;
1142−}
1143−
1144−void ListViewWithPageHeader::layout()
1145−{
1146− if (m_inLayout)
1147− return;
1148−
1149− m_inLayout = true;
1150− if (!m_visibleItems.isEmpty()) {
1151− const qreal visibleFrom = contentY() - m_clipItem->y() + m_headerItemShownHeight;
1152− const qreal visibleTo = contentY() + height() - m_clipItem->y();
1153−
1154− qreal pos = m_visibleItems.first()->y();
1155−
1156−// qDebug() << "ListViewWithPageHeader::layout Updating positions and heights. contentY" << contentY() << "minYExtent" << minYExtent();
1157− int firstReallyVisibleItem = -1;
1158− int modelIndex = m_firstVisibleIndex;
1159− Q_FOREACH(ListItem *item, m_visibleItems) {
1160− const bool cull = pos + item->height() <= visibleFrom || pos >= visibleTo;
1161− item->setCulled(cull);
1162− item->setY(pos);
1163− if (!cull && firstReallyVisibleItem == -1) {
1164− firstReallyVisibleItem = modelIndex;
1165− if (m_topSectionItem) {
1166− // Positing the top section sticky item is a two step process
1167− // First we set it either we cull it (because it doesn't need to be sticked to the top)
1168− // or stick it to the top
1169− // Then after the loop we'll make sure that if there's another section just below it
1170− // pushed the sticky section up to make it disappear
1171− const qreal topSectionStickPos = m_headerItemShownHeight + contentY() - m_clipItem->y();
1172− bool showStickySectionItem;
1173− // We need to show the "top section sticky item" when the position at the "top" of the
1174− // viewport is bigger than the start of the position of the first visible item
1175− // i.e. the first visible item starts before the viewport, or when the first
1176− // visible item starts just at the viewport start and it does not have its own section item
1177− if (topSectionStickPos > pos) {
1178− showStickySectionItem = true;
1179− } else if (topSectionStickPos == pos) {
1180− showStickySectionItem = !item->m_sectionItem;
1181− } else {
1182− showStickySectionItem = false;
1183− }
1184− if (!showStickySectionItem) {
1185− QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
1186− if (item->m_sectionItem) {
1187− // This seems it should happen since why would we cull the top section
1188− // if the first visible item has no section header? This only happens briefly
1189− // when increasing the height of a list that is at the bottom, the m_topSectionItem
1190− // gets shown shortly in the next polish call
1191− QQuickItemPrivate::get(item->m_sectionItem)->setCulled(false);
1192− }
1193− } else {
1194− // Update the top sticky section header
1195− const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
1196− QQmlContext *context = QQmlEngine::contextForObject(m_topSectionItem)->parentContext();
1197− context->setContextProperty(QLatin1String("section"), section);
1198−
1199− QQuickItemPrivate::get(m_topSectionItem)->setCulled(false);
1200− m_topSectionItem->setY(topSectionStickPos);
1201− int delegateIndex = modelIndex;
1202− // Look for the first index with this section text
1203− while (delegateIndex > 0) {
1204− const QString prevSection = m_delegateModel->stringValue(delegateIndex - 1, m_sectionProperty);
1205− if (prevSection != section)
1206− break;
1207− delegateIndex--;
1208− }
1209− context->setContextProperty(QLatin1String("delegateIndex"), delegateIndex);
1210− if (item->m_sectionItem) {
1211− QQuickItemPrivate::get(item->m_sectionItem)->setCulled(true);
1212− }
1213− }
1214− }
1215− }
1216− QQmlContext *context = QQmlEngine::contextForObject(item->m_item)->parentContext();
1217− const qreal clipFrom = visibleFrom + (!item->m_sectionItem && m_topSectionItem && !QQuickItemPrivate::get(m_topSectionItem)->culled ? m_topSectionItem->height() : 0);
1218− if (!cull && pos < clipFrom) {
1219− context->setContextProperty(QLatin1String("heightToClip"), clipFrom - pos);
1220− } else {
1221− context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
1222− }
1223−// qDebug() << "ListViewWithPageHeader::layout" << item->m_item;
1224− pos += item->height();
1225− ++modelIndex;
1226− }
1227−
1228− // Second step of section sticky item positioning
1229− // Look at the next section header, check if it's pushing up the sticky one
1230− if (m_topSectionItem) {
1231− if (firstReallyVisibleItem >= 0) {
1232− for (int i = firstReallyVisibleItem - m_firstVisibleIndex + 1; i < m_visibleItems.count(); ++i) {
1233− ListItem *item = m_visibleItems[i];
1234− if (item->m_sectionItem) {
1235− if (m_topSectionItem->y() + m_topSectionItem->height() > item->y()) {
1236− m_topSectionItem->setY(item->y() - m_topSectionItem->height());
1237− }
1238− break;
1239− }
1240− }
1241− }
1242− }
1243− }
1244− m_inLayout = false;
1245−}
1246−
1247−void ListViewWithPageHeader::updatePolish()
1248−{
1249− // Check we are not being taken down and don't paint anything
1250− // TODO Check if we still need this in 5.2
1251− // For reproduction just inifnite loop testDash or testDashContent
1252− if (!QQmlEngine::contextForObject(this)->parentContext())
1253− return;
1254−
1255− Q_FOREACH(ListItem *item, m_itemsToRelease)
1256− reallyReleaseItem(item);
1257− m_itemsToRelease.clear();
1258−
1259− if (!model())
1260− return;
1261−
1262− layout();
1263−
1264− refill();
1265−
1266− if (m_contentHeightDirty) {
1267− qreal contentHeight;
1268− if (m_visibleItems.isEmpty()) {
1269− contentHeight = m_headerItem ? m_headerItem->height() : 0;
1270− } else {
1271− const int modelCount = model()->rowCount();
1272− const int visibleItems = m_visibleItems.count();
1273− const int lastValidIndex = m_firstVisibleIndex + visibleItems - 1;
1274− qreal nonCreatedHeight = 0;
1275− if (lastValidIndex != modelCount - 1) {
1276− const int visibleItems = m_visibleItems.count();
1277− qreal visibleItemsHeight = 0;
1278− Q_FOREACH(ListItem *item, m_visibleItems) {
1279− visibleItemsHeight += item->height();
1280− }
1281− const int unknownSizes = modelCount - (m_firstVisibleIndex + visibleItems);
1282− nonCreatedHeight = unknownSizes * visibleItemsHeight / visibleItems;
1283− }
1284− ListItem *item = m_visibleItems.last();
1285− contentHeight = nonCreatedHeight + item->y() + item->height() + m_clipItem->y();
1286− if (m_firstVisibleIndex != 0) {
1287− // Make sure that if we are shrinking we tell the view we still fit
1288− m_minYExtent = qMax(m_minYExtent, -(contentHeight - height()));
1289− }
1290− }
1291−
1292− m_contentHeightDirty = false;
1293− adjustMinYExtent();
1294− m_inContentHeightKeepHeaderShown = m_headerItem && m_headerItem->y() == contentY();
1295− setContentHeight(contentHeight);
1296− m_inContentHeightKeepHeaderShown = false;
1297− }
1298−}
1299−
1300−#include "moc_listviewwithpageheader.cpp"
plugins/DashViews/listviewwithpageheader.hdeleted−217
@@ -1,217 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef LISTVIEWWITHPAGEHEADER_H
18−#define LISTVIEWWITHPAGEHEADER_H
19−
20−#pragma GCC diagnostic push
21−#pragma GCC diagnostic ignored "-pedantic"
22−#include <private/qquickitemchangelistener_p.h>
23−#include <private/qquickflickable_p.h>
24−#pragma GCC diagnostic pop
25−
26−class QAbstractItemModel;
27−class QQuickNumberAnimation;
28−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
29−class QQuickChangeSet;
30−class QQuickVisualDataModel;
31−#else
32−class QQmlChangeSet;
33−class QQmlDelegateModel;
34−#endif
35−
36−
37−/**
38− Note for users of this class
39−
40− ListViewWithPageHeader already loads delegates async when appropiate so if
41− your delegate uses a Loader you should not enable the asynchronous feature since
42− that will need to introduce sizing problems
43−
44− With the double async it may happen what while we are scrolling down
45− we reach to a point where given the size of the just created delegate with loader not yet loaded (which will be very close to 0)
46− we are already "at the end" of the list, but then a few milliseconds later the loader finishes loading and we could
47− have kept scrolling. This is specially visible at the end of the list where you realize
48− that scrolling ended a bit before the end of the list but the speed of the flicking was good
49− to reach the end
50−
51− By not having the second async we get a better sizing when the delegate is created and things work better
52−*/
53−
54−class ListViewWithPageHeader : public QQuickFlickable, public QQuickItemChangeListener
55−{
56− Q_OBJECT
57− Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
58− Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
59− Q_PROPERTY(QQuickItem *pageHeader READ header WRITE setHeader NOTIFY headerChanged)
60− Q_PROPERTY(QQmlComponent *sectionDelegate READ sectionDelegate WRITE setSectionDelegate NOTIFY sectionDelegateChanged)
61− Q_PROPERTY(QString sectionProperty READ sectionProperty WRITE setSectionProperty NOTIFY sectionPropertyChanged)
62− Q_PROPERTY(bool forceNoClip READ forceNoClip WRITE setForceNoClip NOTIFY forceNoClipChanged)
63− Q_PROPERTY(int stickyHeaderHeight READ stickyHeaderHeight NOTIFY stickyHeaderHeightChanged)
64−
65− friend class ListViewWithPageHeaderTest;
66− friend class ListViewWithPageHeaderTestSection;
67− friend class ListViewWithPageHeaderTestExternalModel;
68−
69−public:
70− ListViewWithPageHeader();
71− ~ListViewWithPageHeader();
72−
73− QAbstractItemModel *model() const;
74− void setModel(QAbstractItemModel *model);
75−
76− QQmlComponent *delegate() const;
77− void setDelegate(QQmlComponent *delegate);
78−
79− QQuickItem *header() const;
80− void setHeader(QQuickItem *header);
81−
82− QQmlComponent *sectionDelegate() const;
83− void setSectionDelegate(QQmlComponent *delegate);
84−
85− QString sectionProperty() const;
86− void setSectionProperty(const QString &property);
87−
88− bool forceNoClip() const;
89− void setForceNoClip(bool noClip);
90−
91− int stickyHeaderHeight() const;
92−
93− Q_INVOKABLE void positionAtBeginning();
94− Q_INVOKABLE void showHeader();
95− Q_INVOKABLE QQuickItem *item(int modelIndex) const;
96−
97− // The index has to be created for this to try to do something
98− // Created items are those visible and the precached ones
99− // Returns if the item existed or not
100− Q_INVOKABLE bool maximizeVisibleArea(int modelIndex);
101− Q_INVOKABLE bool maximizeVisibleArea(int modelIndex, int itemHeight);
102−
103−Q_SIGNALS:
104− void modelChanged();
105− void delegateChanged();
106− void headerChanged();
107− void sectionDelegateChanged();
108− void sectionPropertyChanged();
109− void forceNoClipChanged();
110− void stickyHeaderHeightChanged();
111−
112−protected:
113− void componentComplete();
114− void viewportMoved(Qt::Orientations orient);
115− qreal minYExtent() const;
116− void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry);
117− void updatePolish();
118−
119−private Q_SLOTS:
120−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
121− void itemCreated(int modelIndex, QQuickItem *item);
122−#else
123− void itemCreated(int modelIndex, QObject *object);
124−#endif
125− void onContentHeightChanged();
126− void onContentWidthChanged();
127− void onHeightChanged();
128−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
129− void onModelUpdated(const QQuickChangeSet &changeSet, bool reset);
130−#else
131− void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
132−#endif
133− void onShowHeaderAnimationFinished();
134−
135−private:
136− class ListItem
137− {
138− public:
139− qreal height() const;
140−
141− qreal y() const;
142− void setY(qreal newY);
143−
144− bool culled() const;
145− void setCulled(bool culled);
146−
147− QQuickItem *m_item;
148− QQuickItem *m_sectionItem;
149− };
150−
151− bool maximizeVisibleArea(ListItem *listItem, int listItemHeight);
152−
153− void createDelegateModel();
154−
155− void layout();
156− void refill();
157− bool addVisibleItems(qreal fillFrom, qreal fillTo, bool asynchronous);
158− bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo);
159− ListItem *createItem(int modelIndex, bool asynchronous);
160−
161− void adjustMinYExtent();
162− void updateClipItem();
163− void headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY);
164− ListItem *itemAtIndex(int modelIndex) const; // Returns the item at modelIndex if has been created
165− void releaseItem(ListItem *item);
166− void reallyReleaseItem(ListItem *item);
167− void updateWatchedRoles();
168− QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169− QQuickItem *getSectionItem(const QString &sectionText);
170−
171−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
172− QQuickVisualDataModel *m_delegateModel;
173−#else
174− QQmlDelegateModel *m_delegateModel;
175−#endif
176−
177− // Index we are waiting because we requested it asynchronously
178− int m_asyncRequestedIndex;
179−
180− // Used to only give a warning once if the delegate does not return objects
181− bool m_delegateValidated;
182−
183− // Visible indexes, [0] is m_firstValidIndex, [0+1] is m_firstValidIndex +1, ...
184− QList<ListItem *> m_visibleItems;
185− int m_firstVisibleIndex;
186−
187− qreal m_minYExtent;
188−
189− QQuickItem *m_clipItem;
190−
191− // If any of the heights has changed
192− // or new items have been added/removed
193− bool m_contentHeightDirty;
194−
195− QQuickItem *m_headerItem;
196− qreal m_previousContentY;
197− qreal m_headerItemShownHeight; // The height of header shown when the header is shown outside its topmost position
198− // i.e. it's being shown after dragging down in the middle of the list
199− enum ContentYAnimationType { ContentYAnimationShowHeader, ContentYAnimationMaximizeVisibleArea };
200− ContentYAnimationType contentYAnimationType;
201− QQuickNumberAnimation *m_contentYAnimation;
202−
203− QQmlComponent *m_sectionDelegate;
204− QString m_sectionProperty;
205− QQuickItem *m_topSectionItem;
206−
207− bool m_forceNoClip;
208− bool m_inLayout;
209− bool m_inContentHeightKeepHeaderShown;
210−
211− // Qt 5.0 doesn't like releasing the items just after itemCreated
212− // so we delay the releasing until the next updatePolish
213− QList<ListItem *> m_itemsToRelease;
214−};
215−
216−
217−#endif
plugins/DashViews/organicgrid.cppdeleted−268
@@ -1,268 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "organicgrid.h"
18−
19−#pragma GCC diagnostic push
20−#pragma GCC diagnostic ignored "-pedantic"
21−#include <private/qquickitem_p.h>
22−#pragma GCC diagnostic pop
23−
24−static const qreal bufferRatio = 0.5;
25−
26−OrganicGrid::OrganicGrid()
27− : m_firstVisibleIndex(-1)
28− , m_numberOfModulesPerRow(-1)
29−{
30−}
31−
32−QSizeF OrganicGrid::smallDelegateSize() const
33−{
34− return m_smallDelegateSize;
35−}
36−
37−void OrganicGrid::setSmallDelegateSize(const QSizeF &size)
38−{
39− if (m_smallDelegateSize != size) {
40− m_smallDelegateSize = size;
41− Q_EMIT smallDelegateSizeChanged();
42−
43− if (isComponentComplete()) {
44− relayout();
45− }
46− }
47−}
48−
49−QSizeF OrganicGrid::bigDelegateSize() const
50−{
51− return m_bigDelegateSize;
52−}
53−
54−void OrganicGrid::setBigDelegateSize(const QSizeF &size)
55−{
56− if (m_bigDelegateSize != size) {
57− m_bigDelegateSize = size;
58− Q_EMIT bigDelegateSizeChanged();
59−
60− if (isComponentComplete()) {
61− relayout();
62− }
63− }
64−}
65−
66−QPointF OrganicGrid::positionForIndex(int modelIndex) const
67−{
68− const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
69− const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
70− const int itemsPerRow = m_numberOfModulesPerRow * 6;
71− const int rowIndex = floor(modelIndex / itemsPerRow);
72− const int columnIndex = floor((modelIndex - rowIndex * itemsPerRow) / 6);
73−
74− qreal yPos = (moduleHeight + rowSpacing()) * rowIndex;
75− const int moduleIndex = modelIndex % 6;
76− if (moduleIndex == 2) {
77− yPos += m_smallDelegateSize.height() + rowSpacing();
78− } else if (moduleIndex == 3 || moduleIndex == 5) {
79− yPos += m_bigDelegateSize.height() + rowSpacing();
80− }
81−
82− qreal xPos = (moduleWidth + columnSpacing()) * columnIndex;
83− if (moduleIndex == 1) {
84− xPos += m_smallDelegateSize.width() + columnSpacing();
85− } else if (moduleIndex == 3) {
86− xPos += m_bigDelegateSize.width() + columnSpacing();
87− } else if (moduleIndex == 4) {
88− xPos += (m_smallDelegateSize.width() + columnSpacing()) * 2;
89− } else if (moduleIndex == 5) {
90− xPos += m_bigDelegateSize.width() + m_smallDelegateSize.width() + columnSpacing() * 2;
91− }
92−
93− return QPointF(xPos, yPos);
94−}
95−
96−QSizeF OrganicGrid::sizeForIndex(int modelIndex) const
97−{
98− const int moduleIndex = modelIndex % 6;
99− if (moduleIndex == 0 || moduleIndex == 1 || moduleIndex == 3 || moduleIndex == 5) {
100− return m_smallDelegateSize;
101− } else {
102− return m_bigDelegateSize;
103− }
104−}
105−
106−void OrganicGrid::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
107−{
108− if (m_visibleItems.isEmpty()) {
109− *modelIndex = 0;
110− *yPos = 0;
111− } else {
112− *modelIndex = m_firstVisibleIndex + m_visibleItems.count();
113− // We create stuff in a 6-module basis, so always return back
114− // the y position of the first item
115− const int firstModuleIndex = ((*modelIndex) / 6) * 6;
116− *yPos = positionForIndex(firstModuleIndex).y();
117− }
118−}
119−
120−void OrganicGrid::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
121−{
122− if (m_visibleItems.isEmpty()) {
123− *modelIndex = 0;
124− *yPos = 0;
125− } else {
126− *modelIndex = m_firstVisibleIndex - 1;
127− // We create stuff in a 6-module basis, so always return back
128− // the y position of the last item bottom
129− const int lastModuleIndex = ((*modelIndex) / 6) * 6 + 5;
130− *yPos = positionForIndex(lastModuleIndex).y();
131− *yPos += sizeForIndex(lastModuleIndex).height();
132− }
133−}
134−
135−void OrganicGrid::addItemToView(int modelIndex, QQuickItem *item)
136−{
137− // modelIndex has to be either m_firstVisibleIndex - 1 or m_firstVisibleIndex + m_visibleItems.count() or the first
138− if (modelIndex == m_firstVisibleIndex + m_visibleItems.count()) {
139− m_visibleItems << item;
140− } else if (modelIndex == m_firstVisibleIndex - 1) {
141− m_firstVisibleIndex = modelIndex;
142− m_visibleItems.prepend(item);
143− } else if (modelIndex == 0) {
144− m_firstVisibleIndex = 0;
145− m_visibleItems << item;
146− } else {
147− qWarning() << "OrganicGrid::addItemToView - Got unexpected modelIndex"
148− << modelIndex << m_firstVisibleIndex << m_visibleItems.count();
149− return;
150− }
151−
152− const QPointF pos = positionForIndex(modelIndex);
153− item->setPosition(pos);
154−
155− item->setSize(sizeForIndex(modelIndex));
156−}
157−
158−bool OrganicGrid::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
159−{
160− bool changed = false;
161−
162− // As adding, we also remove in a 6-module basis
163− int lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
164− bool removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
165− while (removeIndex && !m_visibleItems.isEmpty()) {
166− releaseItem(m_visibleItems.takeFirst());
167− changed = true;
168− m_firstVisibleIndex++;
169−
170− lastModuleIndex = (m_firstVisibleIndex / 6) * 6 + 5;
171− removeIndex = positionForIndex(lastModuleIndex).y() + sizeForIndex(lastModuleIndex).height() < bufferFromY;
172− }
173−
174− int firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
175− removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
176− while (removeIndex && !m_visibleItems.isEmpty()) {
177− releaseItem(m_visibleItems.takeLast());
178− changed = true;
179−
180− firstModuleIndex = ((m_firstVisibleIndex + m_visibleItems.count() - 1) / 6) * 6;
181− removeIndex = positionForIndex(firstModuleIndex).y() > bufferToY;
182− }
183−
184− if (m_visibleItems.isEmpty()) {
185− m_firstVisibleIndex = -1;
186− }
187−
188− return changed;
189−}
190−
191−void OrganicGrid::cleanupExistingItems()
192−{
193− Q_FOREACH(QQuickItem *item, m_visibleItems)
194− releaseItem(item);
195− m_visibleItems.clear();
196− m_firstVisibleIndex = -1;
197− setImplicitHeightDirty();
198−}
199−
200−void OrganicGrid::doRelayout()
201−{
202− const qreal moduleWidth = m_smallDelegateSize.width() * 2 + columnSpacing() * 2 + m_bigDelegateSize.width();
203− m_numberOfModulesPerRow = floor((width() + columnSpacing()) / (moduleWidth + columnSpacing()));
204− m_numberOfModulesPerRow = qMax(1, m_numberOfModulesPerRow);
205−
206− int i = m_firstVisibleIndex;
207− const QList<QQuickItem*> allItems = m_visibleItems;
208− m_visibleItems.clear();
209− Q_FOREACH(QQuickItem *item, allItems) {
210− addItemToView(i, item);
211− ++i;
212− }
213−}
214−
215−void OrganicGrid::updateItemCulling(qreal visibleFromY, qreal visibleToY)
216−{
217− Q_FOREACH(QQuickItem *item, m_visibleItems) {
218− QQuickItemPrivate::get(item)->setCulled(item->y() + item->height() <= visibleFromY || item->y() >= visibleToY);
219− }
220−}
221−
222−void OrganicGrid::calculateImplicitHeight()
223−{
224− const qreal moduleHeight = m_smallDelegateSize.height() + rowSpacing() + m_bigDelegateSize.height();
225− const int itemCount = !model() ? 0 : model()->rowCount();
226− const int itemsPerRow = m_numberOfModulesPerRow * 6;
227− const int fullRows = floor(itemCount / itemsPerRow);
228− const qreal fullRowsHeight = fullRows == 0 ? 0 : fullRows * moduleHeight + rowSpacing() * (fullRows - 1);
229−
230− const int remainingItems = itemCount - fullRows * itemsPerRow;
231− if (remainingItems == 0) {
232− setImplicitHeight(fullRowsHeight);
233− } else if (remainingItems <= 2) {
234− setImplicitHeight(fullRowsHeight + m_smallDelegateSize.height() + rowSpacing());
235− } else {
236− setImplicitHeight(fullRowsHeight + rowSpacing() + moduleHeight);
237− }
238−}
239−
240−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
241−void OrganicGrid::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
242−#else
243−void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
244−#endif
245−{
246−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
247− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
248−#else
249− Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
250−#endif
251− for (int i = remove.count - 1; i >= 0; --i) {
252− const int indexToRemove = remove.index + i;
253− // We only support removing from the end
254− const int lastIndex = m_firstVisibleIndex + m_visibleItems.count() - 1;
255− if (indexToRemove == lastIndex) {
256− releaseItem(m_visibleItems.takeLast());
257− } else {
258− if (indexToRemove < lastIndex) {
259− qFatal("OrganicGrid only supports removal from the end of the model");
260− }
261− }
262− }
263− }
264− if (m_visibleItems.isEmpty()) {
265− m_firstVisibleIndex = -1;
266− }
267− setImplicitHeightDirty();
268−}
plugins/DashViews/organicgrid.hdeleted−95
@@ -1,95 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef ORGANICGRID_H
18−#define ORGANICGRID_H
19−
20−#include "abstractdashview.h"
21−
22− /** An Organic Grid is is a view that creates delegates
23− * based on a model and layouts them in groups of six items (called module).
24− *
25− * In each module there are 4 items that are forced to the small delegate size
26− * and two that are forced to the big delegate size.
27− *
28− * Example:
29− *
30− * +---+ +---+ +-----+
31− * | 1 | | 2 | | |
32− * +---+ +---+ | 5 |
33− * +-----+ | |
34− * | | +-----+
35− * | 3 | +---+ +---+
36− * | | | 4 | | 6 |
37− * +-----+ +---+ +---+
38− *
39− * Modules are positioned one after the other in a grid like fashion, i.e.
40− *
41− * +---+ +---+
42− * | 1 | | 2 |
43− * +---+ +---+
44− * +---+ +---+
45− * | 3 | | 4 |
46− * +---+ +---+
47− */
48−
49−class OrganicGrid : public AbstractDashView
50−{
51− Q_OBJECT
52−
53− Q_PROPERTY(QSizeF smallDelegateSize READ smallDelegateSize WRITE setSmallDelegateSize NOTIFY smallDelegateSizeChanged)
54− Q_PROPERTY(QSizeF bigDelegateSize READ bigDelegateSize WRITE setBigDelegateSize NOTIFY bigDelegateSizeChanged)
55−
56−friend class OrganicGridTest;
57−
58−public:
59− OrganicGrid();
60−
61− QSizeF smallDelegateSize() const;
62− void setSmallDelegateSize(const QSizeF &size);
63−
64− QSizeF bigDelegateSize() const;
65− void setBigDelegateSize(const QSizeF &size);
66−
67−Q_SIGNALS:
68− void smallDelegateSizeChanged();
69− void bigDelegateSizeChanged();
70−private:
71− QPointF positionForIndex(int modelIndex) const;
72− QSizeF sizeForIndex(int modelIndex) const;
73−
74− void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
75− void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
76− void addItemToView(int modelIndex, QQuickItem *item) override;
77− bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
78− void cleanupExistingItems() override;
79− void doRelayout() override;
80− void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
81− void calculateImplicitHeight() override;
82−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
83− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
84−#else
85− void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
86−#endif
87−
88− QSizeF m_smallDelegateSize;
89− QSizeF m_bigDelegateSize;
90− int m_firstVisibleIndex;
91− int m_numberOfModulesPerRow;
92− QList<QQuickItem*> m_visibleItems;
93−};
94−
95−#endif
plugins/DashViews/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module DashViews
2−plugin DashViews-qml
3−typeinfo plugin.qmltypes
plugins/DashViews/verticaljournal.cppdeleted−281
@@ -1,281 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−/*
18− * The implementation is centered around m_columnVisibleItems
19− * that holds a vector of lists. There's a list for each of the
20− * columns the view has. In the list the items of the column are
21− * ordered as they appear topdown in the view. m_indexColumnMap is
22− * used when re-building the list up since given a position
23− * in the middle of the list and the need to create the previous does
24− * not give us enough information to know in which column we have
25− * to position the item so that when we reach the item the view is
26− * correctly layouted at 0 for all the columns
27− */
28−#include "verticaljournal.h"
29−
30−#pragma GCC diagnostic push
31−#pragma GCC diagnostic ignored "-pedantic"
32−#include <private/qquickitem_p.h>
33−#pragma GCC diagnostic pop
34−
35−static const qreal bufferRatio = 0.5;
36−
37−VerticalJournal::VerticalJournal()
38− : m_columnWidth(0)
39−{
40−}
41−
42−qreal VerticalJournal::columnWidth() const
43−{
44− return m_columnWidth;
45−}
46−
47−void VerticalJournal::setColumnWidth(qreal columnWidth)
48−{
49− if (columnWidth != m_columnWidth) {
50− m_columnWidth = columnWidth;
51− Q_EMIT columnWidthChanged();
52−
53− if (isComponentComplete()) {
54− Q_FOREACH(const auto &column, m_columnVisibleItems) {
55− Q_FOREACH(const ViewItem &item, column) {
56− item.m_item->setWidth(columnWidth);
57− }
58− }
59− relayout();
60− }
61− }
62−}
63−
64−void VerticalJournal::findBottomModelIndexToAdd(int *modelIndex, qreal *yPos)
65−{
66− *modelIndex = 0;
67− *yPos = std::numeric_limits<qreal>::max();
68−
69− Q_FOREACH(const auto &column, m_columnVisibleItems) {
70− if (!column.isEmpty()) {
71− const ViewItem &item = column.last();
72− *yPos = qMin(*yPos, item.y() + item.height() + rowSpacing());
73− *modelIndex = qMax(*modelIndex, item.m_modelIndex + 1);
74− } else {
75− *yPos = 0;
76− }
77− }
78−}
79−
80−void VerticalJournal::findTopModelIndexToAdd(int *modelIndex, qreal *yPos)
81−{
82− *modelIndex = 0;
83− *yPos = std::numeric_limits<qreal>::lowest();
84− int columnToAddTo = -1;
85−
86− // Find the topmost free column
87− for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
88− const auto &column = m_columnVisibleItems[i];
89− if (!column.isEmpty()) {
90− const ViewItem &item = column.first();
91− const auto itemTopPos = item.y() - rowSpacing();
92− if (itemTopPos > *yPos) {
93− *yPos = itemTopPos;
94− *modelIndex = item.m_modelIndex - 1;
95− columnToAddTo = i;
96− }
97− }
98− }
99−
100− if (*modelIndex > 0) {
101− Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
102− while (m_indexColumnMap[*modelIndex] != columnToAddTo) {
103− // We found out that we have to add to columnToAddTo
104− // and thought that we had to add *modelIndex, but history tells
105− // it is not correct, so find up from *modelIndex until we found the index
106− // that has to end up in columnToAddTo
107− *modelIndex = *modelIndex - 1;
108− Q_ASSERT(m_indexColumnMap.contains(*modelIndex));
109− }
110− }
111−}
112−
113−bool VerticalJournal::removeNonVisibleItems(qreal bufferFromY, qreal bufferToY)
114−{
115− bool changed = false;
116−
117− for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
118− QList<ViewItem> &column = m_columnVisibleItems[i];
119− while (!column.isEmpty() && column.first().y() + column.first().height() < bufferFromY) {
120− releaseItem(column.takeFirst().m_item);
121− changed = true;
122− }
123−
124− while (!column.isEmpty() && column.last().y() > bufferToY) {
125− releaseItem(column.takeLast().m_item);
126− changed = true;
127− }
128− }
129−
130− return changed;
131−}
132−
133−void VerticalJournal::addItemToView(int modelIndex, QQuickItem *item)
134−{
135− if (item->width() != m_columnWidth) {
136− qWarning() << "Item" << modelIndex << "width is not the one that the columnWidth mandates, resetting it";
137− item->setWidth(m_columnWidth);
138− }
139−
140− // Check if we add it to the bottom of existing column items
141− const QList<ViewItem> &firstColumn = m_columnVisibleItems[0];
142− qreal columnToAddY = !firstColumn.isEmpty() ? firstColumn.last().y() + firstColumn.last().height() : -rowSpacing();
143− int columnToAddTo = 0;
144− for (int i = 1; i < m_columnVisibleItems.count(); ++i) {
145− const QList<ViewItem> &column = m_columnVisibleItems[i];
146− const qreal iY = !column.isEmpty() ? column.last().y() + column.last().height() : -rowSpacing();
147− if (iY < columnToAddY) {
148− columnToAddTo = i;
149− columnToAddY = iY;
150− }
151− }
152−
153− const QList<ViewItem> &columnToAdd = m_columnVisibleItems[columnToAddTo];
154− if (columnToAdd.isEmpty() || columnToAdd.last().m_modelIndex < modelIndex) {
155− item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
156− item->setY(columnToAddY + rowSpacing());
157−
158− m_columnVisibleItems[columnToAddTo] << ViewItem(item, modelIndex);
159− m_indexColumnMap[modelIndex] = columnToAddTo;
160− } else {
161− Q_ASSERT(m_indexColumnMap.contains(modelIndex));
162− columnToAddTo = m_indexColumnMap[modelIndex];
163− columnToAddY = m_columnVisibleItems[columnToAddTo].first().y();
164−
165− item->setX(columnToAddTo * (m_columnWidth + columnSpacing()));
166− item->setY(columnToAddY - rowSpacing() - item->height());
167−
168− m_columnVisibleItems[columnToAddTo].prepend(ViewItem(item, modelIndex));
169− }
170−}
171−
172−void VerticalJournal::cleanupExistingItems()
173−{
174− // Cleanup the existing items
175− for (int i = 0; i < m_columnVisibleItems.count(); ++i) {
176− QList<ViewItem> &column = m_columnVisibleItems[i];
177− Q_FOREACH(const ViewItem &item, column)
178− releaseItem(item.m_item);
179− column.clear();
180− }
181− m_indexColumnMap.clear();
182− setImplicitHeightDirty();
183−}
184−
185−void VerticalJournal::calculateImplicitHeight()
186−{
187− int lastModelIndex = -1;
188− qreal bottomMostY = 0;
189− Q_FOREACH(const auto &column, m_columnVisibleItems) {
190− if (!column.isEmpty()) {
191− const ViewItem &item = column.last();
192− lastModelIndex = qMax(lastModelIndex, item.m_modelIndex);
193− bottomMostY = qMax(bottomMostY, item.y() + item.height());
194− }
195− }
196− if (lastModelIndex >= 0) {
197− const double averageHeight = bottomMostY / (lastModelIndex + 1);
198− setImplicitHeight(bottomMostY + averageHeight * (model()->rowCount() - lastModelIndex - 1));
199− } else {
200− setImplicitHeight(0);
201− }
202−}
203−
204−void VerticalJournal::doRelayout()
205−{
206− QList<ViewItem> allItems;
207− Q_FOREACH(const auto &column, m_columnVisibleItems)
208− allItems << column;
209−
210− qSort(allItems);
211−
212− const int nColumns = qMax(1., floor((double)(width() + columnSpacing()) / (m_columnWidth + columnSpacing())));
213− m_columnVisibleItems.resize(nColumns);
214− m_indexColumnMap.clear();
215− for (int i = 0; i < nColumns; ++i)
216− m_columnVisibleItems[i].clear();
217−
218− // If the first of allItems doesn't contain index 0 we need to drop them
219− // all since we can't consistently relayout without the first item being there
220−
221− if (!allItems.isEmpty()) {
222− if (allItems.first().m_modelIndex == 0) {
223− Q_FOREACH(const ViewItem &item, allItems)
224− addItemToView(item.m_modelIndex, item.m_item);
225− } else {
226− Q_FOREACH(const ViewItem &item, allItems)
227− releaseItem(item.m_item);
228− }
229− }
230−}
231−
232−void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
233−{
234− Q_FOREACH(const auto &column, m_columnVisibleItems) {
235− Q_FOREACH(const ViewItem &item, column) {
236− const bool cull = item.y() + item.height() <= visibleFromY || item.y() >= visibleToY;
237− QQuickItemPrivate::get(item.m_item)->setCulled(cull);
238− }
239− }
240−}
241−
242−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
243−void VerticalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
244−#else
245−void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
246−#endif
247−{
248−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
249− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
250−#else
251− Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
252−#endif
253− for (int i = remove.count - 1; i >= 0; --i) {
254− const int indexToRemove = remove.index + i;
255− // Since we only support removing from the end, indexToRemove
256− // must refer to the last item of one of the columns or
257− // be bigger than them (because it's not in the viewport and
258− // thus we have not created a delegate for it)
259− bool found = false;
260− int lastCreatedIndex = INT_MIN;
261− for (int i = 0; !found && i < m_columnVisibleItems.count(); ++i) {
262− QList<ViewItem> &column = m_columnVisibleItems[i];
263− if (!column.isEmpty()) {
264− const int lastColumnIndex = column.last().m_modelIndex;
265− if (lastColumnIndex == indexToRemove) {
266− releaseItem(column.takeLast().m_item);
267− found = true;
268− }
269− lastCreatedIndex = qMax(lastCreatedIndex, lastColumnIndex);
270− }
271− }
272− if (!found) {
273− if (indexToRemove < lastCreatedIndex) {
274− qFatal("VerticalJournal only supports removal from the end of the model");
275− } else {
276− setImplicitHeightDirty();
277− }
278− }
279− }
280− }
281−}
plugins/DashViews/verticaljournal.hdeleted−104
@@ -1,104 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef VERTICALJOURNAL_H
18−#define VERTICALJOURNAL_H
19−
20−#include "abstractdashview.h"
21−
22− /** A vertical journal is a view that creates delegates
23− * based on a model and layouts them in columns following
24− * a top-left most position rule.
25− *
26− * The number of columns is calculated using the width of
27− * the view itself, the columnWidth (i.e. the width of each individual delegate)
28− * and the columnSpacing between columns.
29− *
30− * All delegates are forced to columnWidth if they don't have it.
31− *
32− * The first nColumns items are layouted at row 0 from column 0
33− * to column nColumns-1 in order. After that every new item
34− * is positioned in the column which provides the free topmost
35− * position as possible. If more than one column tie in providing
36− * the topmost free position the leftmost column will be used.
37− *
38− * Example:
39− *
40− * +-----+ +-----+ +-----+
41− * | | | 2 | | |
42− * | | | | | |
43− * | 1 | +-----+ | 3 |
44− * | | +-----+ | |
45− * | | | | +-----+
46− * +-----+ | 4 | +-----+
47− * +-----+ | | | 5 |
48− * | 6 | +-----+ | |
49− * | | +-----+
50− * +-----+
51− *
52− */
53−
54−class VerticalJournal : public AbstractDashView
55−{
56− Q_OBJECT
57−
58− Q_PROPERTY(qreal columnWidth READ columnWidth WRITE setColumnWidth NOTIFY columnWidthChanged)
59−
60−friend class VerticalJournalTest;
61−
62−public:
63− VerticalJournal();
64−
65− qreal columnWidth() const;
66− void setColumnWidth(qreal columnWidth);
67−
68−Q_SIGNALS:
69− void columnWidthChanged();
70−
71−private:
72− class ViewItem
73− {
74− public:
75− ViewItem(QQuickItem *item, int modelIndex) : m_item(item), m_modelIndex(modelIndex) {}
76− qreal x() const { return m_item->x(); }
77− qreal y() const { return m_item->y(); }
78− qreal height() const { return m_item->height(); }
79− bool operator<(const ViewItem &v) const { return m_modelIndex < v.m_modelIndex; }
80−
81− QQuickItem *m_item;
82− int m_modelIndex;
83− };
84−
85− void findBottomModelIndexToAdd(int *modelIndex, qreal *yPos) override;
86− void findTopModelIndexToAdd(int *modelIndex, qreal *yPos) override;
87− bool removeNonVisibleItems(qreal bufferFromY, qreal bufferToY) override;
88− void addItemToView(int modelIndex, QQuickItem *item) override;
89− void cleanupExistingItems() override;
90− void calculateImplicitHeight() override;
91− void doRelayout() override;
92− void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
93−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
94− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
95−#else
96− void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
97−#endif
98−
99− QVector<QList<ViewItem>> m_columnVisibleItems;
100− QHash<int, int> m_indexColumnMap;
101− int m_columnWidth;
102−};
103−
104−#endif
plugins/GlobalShortcut/CMakeLists.txtnew file+10
@@ -0,0 +1,10 @@
1+set(globalshortcutplugin_SRCS
2+ globalshortcut.cpp
3+ globalshortcutregistry.cpp
4+ plugin.cpp)
5+
6+add_library(GlobalShortcut-qml SHARED ${globalshortcutplugin_SRCS})
7+
8+target_link_libraries(GlobalShortcut-qml Qt5::Quick Qt5::Gui)
9+
10+add_unity8_plugin(GlobalShortcut 1.0 GlobalShortcut TARGETS GlobalShortcut-qml)
plugins/GlobalShortcut/globalshortcut.cppnew file+91
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "globalshortcut.h"
18+#include "globalshortcutregistry.h"
19+
20+#include <QDebug>
21+#include <QQuickItem>
22+
23+Q_GLOBAL_STATIC(GlobalShortcutRegistry, registry)
24+
25+GlobalShortcut::GlobalShortcut(QQuickItem *parent)
26+ : QQuickItem(parent)
27+{
28+}
29+
30+QVariant GlobalShortcut::shortcut() const
31+{
32+ return m_shortcut;
33+}
34+
35+void GlobalShortcut::setShortcut(const QVariant &shortcut)
36+{
37+ if (m_shortcut == shortcut)
38+ return;
39+
40+ m_shortcut = shortcut;
41+ registry->addShortcut(shortcut, this);
42+ Q_EMIT shortcutChanged(shortcut);
43+}
44+
45+bool GlobalShortcut::isActive() const
46+{
47+ return m_active;
48+}
49+
50+void GlobalShortcut::setActive(bool active)
51+{
52+ if (m_active == active)
53+ return;
54+
55+ m_active = active;
56+ Q_EMIT activeChanged(active);
57+}
58+
59+void GlobalShortcut::componentComplete()
60+{
61+ if (this->window()) {
62+ QMetaObject::invokeMethod(this, "setupFilterOnWindow", Q_ARG(QQuickWindow*, this->window()));
63+ }
64+ connect(this, &QQuickItem::windowChanged, this, &GlobalShortcut::setupFilterOnWindow);
65+}
66+
67+void GlobalShortcut::keyPressEvent(QKeyEvent * event)
68+{
69+ if (!m_active) return;
70+
71+ event->accept();
72+ Q_EMIT triggered(m_shortcut.toString());
73+}
74+
75+void GlobalShortcut::keyReleaseEvent(QKeyEvent * event)
76+{
77+ if (!m_active) return;
78+
79+ event->accept();
80+ Q_EMIT released(m_shortcut.toString());
81+}
82+
83+void GlobalShortcut::setupFilterOnWindow(QQuickWindow *window)
84+{
85+ if (!window) {
86+// qWarning() << Q_FUNC_INFO << "Failed to setup filter on window";
87+ return;
88+ }
89+
90+ registry->setupFilterOnWindow((qulonglong) window->winId());
91+}
plugins/GlobalShortcut/globalshortcut.hnew file+81
@@ -0,0 +1,81 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef GLOBALSHORTCUT_H
18+#define GLOBALSHORTCUT_H
19+
20+#include <QVariant>
21+#include <QQuickWindow>
22+#include <QQuickItem>
23+
24+/**
25+ * @brief The GlobalShortcut class
26+ *
27+ * QML component for registering a shortcut; the shortcut itself can be
28+ * specified either as a string ("Ctrl+Alt+L") or as an enum value
29+ * (Qt.ControlModifier|Qt.AltModifier|Qt.Key_L).
30+ *
31+ * When the shortcut is detected, the signal triggered() gets emitted.
32+ */
33+class GlobalShortcut: public QQuickItem
34+{
35+ Q_OBJECT
36+ /**
37+ * The shortcut itself
38+ */
39+ Q_PROPERTY(QVariant shortcut READ shortcut WRITE setShortcut NOTIFY shortcutChanged)
40+ /**
41+ * Whether the shortcut is active (true by default)
42+ */
43+ Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged)
44+
45+public:
46+ GlobalShortcut(QQuickItem *parent = nullptr);
47+ ~GlobalShortcut() = default;
48+
49+ QVariant shortcut() const;
50+ void setShortcut(const QVariant &shortcut);
51+
52+ bool isActive() const;
53+ void setActive(bool active);
54+
55+protected:
56+ void componentComplete() override;
57+ void keyPressEvent(QKeyEvent * event) override;
58+ void keyReleaseEvent(QKeyEvent * event) override;
59+
60+Q_SIGNALS:
61+ void shortcutChanged(const QVariant &shortcut);
62+ /**
63+ * Emitted when a global keypress of @p shortcut is detected
64+ */
65+ void triggered(const QString &shortcut);
66+ /**
67+ * Emitted when a global keypress of @p shortcut is released
68+ */
69+ void released(const QString &shortcut);
70+ void activeChanged(bool active);
71+
72+private Q_SLOTS:
73+ void setupFilterOnWindow(QQuickWindow* window);
74+
75+private:
76+ QVariant m_shortcut;
77+ bool m_active = true;
78+};
79+
80+
81+#endif // GLOBALSHORTCUT_H
plugins/GlobalShortcut/globalshortcutregistry.cppnew file+125
@@ -0,0 +1,125 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include <QDebug>
18+#include <QGuiApplication>
19+#include <QKeyEvent>
20+#include <QKeySequence>
21+
22+#include "globalshortcutregistry.h"
23+
24+static qulonglong s_windowId = 0;
25+
26+GlobalShortcutRegistry::GlobalShortcutRegistry(QObject *parent)
27+ : QObject(parent)
28+{
29+}
30+
31+GlobalShortcutList GlobalShortcutRegistry::shortcuts() const
32+{
33+ return m_shortcuts;
34+}
35+
36+bool GlobalShortcutRegistry::hasShortcut(const QVariant &seq) const
37+{
38+ return m_shortcuts.contains(seq);
39+}
40+
41+void GlobalShortcutRegistry::addShortcut(const QVariant &seq, GlobalShortcut *sc)
42+{
43+ if (sc) {
44+ if (!m_shortcuts.contains(seq)) { // create a new entry
45+ m_shortcuts.insert(seq, {sc});
46+ } else { // append to an existing one
47+ auto shortcuts = m_shortcuts[seq];
48+ shortcuts.append(sc);
49+ m_shortcuts.insert(seq, shortcuts);
50+ }
51+
52+ connect(sc, &GlobalShortcut::destroyed, this, &GlobalShortcutRegistry::removeShortcut);
53+ }
54+}
55+
56+void GlobalShortcutRegistry::removeShortcut(QObject *obj)
57+{
58+ QMutableMapIterator<QVariant, QVector<QPointer<GlobalShortcut>>> it(m_shortcuts);
59+ while (it.hasNext()) {
60+ it.next();
61+ GlobalShortcut * scObj = static_cast<GlobalShortcut *>(obj);
62+ if (scObj && it.value().contains(scObj)) {
63+ it.value().removeAll(scObj);
64+ if (it.value().isEmpty()) {
65+ it.remove();
66+ }
67+ }
68+ }
69+}
70+
71+bool GlobalShortcutRegistry::eventFilter(QObject *obj, QEvent *event)
72+{
73+ Q_ASSERT(m_filteredWindow);
74+ Q_ASSERT(obj == static_cast<QObject*>(m_filteredWindow.data()));
75+
76+ if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {
77+
78+ QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
79+
80+ // Make a copy of the event so we don't alter it for passing on.
81+ QKeyEvent eCopy(keyEvent->type(),
82+ keyEvent->key(),
83+ keyEvent->modifiers(),
84+ keyEvent->text(),
85+ keyEvent->isAutoRepeat(),
86+ keyEvent->count());
87+ eCopy.ignore();
88+
89+ int seq = keyEvent->key() + keyEvent->modifiers();
90+ if (m_shortcuts.contains(seq)) {
91+ const auto shortcuts = m_shortcuts.value(seq);
92+ Q_FOREACH(const auto &shortcut, shortcuts) {
93+ if (shortcut) {
94+ qApp->sendEvent(shortcut, &eCopy);
95+ }
96+ }
97+ }
98+
99+ return eCopy.isAccepted();
100+ }
101+
102+ return QObject::eventFilter(obj, event);
103+}
104+
105+void GlobalShortcutRegistry::setupFilterOnWindow(qulonglong wid)
106+{
107+ if (wid == s_windowId) {
108+ return;
109+ }
110+
111+ if (m_filteredWindow) {
112+ m_filteredWindow->removeEventFilter(this);
113+ m_filteredWindow.clear();
114+ s_windowId = 0;
115+ }
116+
117+ Q_FOREACH(QWindow *window, qApp->allWindows()) {
118+ if (window && window->winId() == wid) {
119+ m_filteredWindow = window;
120+ window->installEventFilter(this);
121+ s_windowId = wid;
122+ break;
123+ }
124+ }
125+}
plugins/GlobalShortcut/globalshortcutregistry.hnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef GLOBALSHORTCUT_REGISTRY_H
18+#define GLOBALSHORTCUT_REGISTRY_H
19+
20+#include <QObject>
21+#include <QVariantList>
22+#include <QPointer>
23+#include <QWindow>
24+
25+#include "globalshortcut.h"
26+
27+typedef QMap<QVariant, QVector<QPointer<GlobalShortcut>>> GlobalShortcutList;
28+
29+/**
30+ * @brief The GlobalShortcutRegistry class
31+ *
32+ * Serves as a central point for shortcut registration.
33+ */
34+class Q_DECL_EXPORT GlobalShortcutRegistry: public QObject
35+{
36+ Q_OBJECT
37+public:
38+ GlobalShortcutRegistry(QObject * parent = nullptr);
39+ ~GlobalShortcutRegistry() = default;
40+
41+ /**
42+ * @return the list of shortcuts currently registered
43+ */
44+ GlobalShortcutList shortcuts() const;
45+ /**
46+ * @return whether shortcut @p seq is currently registered
47+ */
48+ bool hasShortcut(const QVariant &seq) const;
49+ /**
50+ * Adds a shortcut @p seq to the registry
51+ */
52+ void addShortcut(const QVariant &seq, GlobalShortcut * sc);
53+
54+ /**
55+ * Sets up key events filtering on window @p wid
56+ */
57+ void setupFilterOnWindow(qulonglong wid);
58+
59+protected:
60+ bool eventFilter(QObject *obj, QEvent *event) override;
61+
62+private Q_SLOTS:
63+ void removeShortcut(QObject *obj);
64+
65+private:
66+ GlobalShortcutList m_shortcuts;
67+ QPointer<QWindow> m_filteredWindow = nullptr;
68+};
69+
70+#endif
plugins/GlobalShortcut/plugin.cppnew file+27
@@ -0,0 +1,27 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "plugin.h"
18+#include "globalshortcut.h"
19+
20+#include <QtQml>
21+
22+void GlobalShortcutPlugin::registerTypes(const char *uri)
23+{
24+ Q_ASSERT(uri == QLatin1String("GlobalShortcut"));
25+
26+ qmlRegisterType<GlobalShortcut>(uri, 1, 0, "GlobalShortcut");
27+}
plugins/GlobalShortcut/plugin.hnew file+32
@@ -0,0 +1,32 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef GLOBALSHORTCUTPLUGIN_H
18+#define GLOBALSHORTCUTPLUGIN_H
19+
20+#include <QQmlExtensionPlugin>
21+
22+class GlobalShortcutPlugin: public QQmlExtensionPlugin
23+{
24+ Q_OBJECT
25+ Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
26+
27+public:
28+ void registerTypes(const char *uri) override;
29+};
30+
31+
32+#endif // GLOBALSHORTCUTPLUGIN_H
plugins/GlobalShortcut/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module GlobalShortcut
2+plugin GlobalShortcut-qml
plugins/Greeter/CMakeLists.txtnew file+6
@@ -0,0 +1,6 @@
1+macro(add_unity8_greeter_plugin PLUGIN VERSION PATH)
2+ export_qmlfiles(${PLUGIN} ${PATH} DESTINATION ${SHELL_INSTALL_QML}/Greeter TARGET_PREFIX Greeter ${ARGN})
3+ export_qmlplugin(${PLUGIN} ${VERSION} ${PATH} DESTINATION ${SHELL_INSTALL_QML}/Greeter TARGET_PREFIX Greeter ${ARGN})
4+endmacro()
5+
6+add_subdirectory(Unity)
plugins/Greeter/Unity/CMakeLists.txtnew file+1
@@ -0,0 +1 @@
1+add_subdirectory(Launcher)
plugins/Greeter/Unity/Launcher/CMakeLists.txtnew file+35
@@ -0,0 +1,35 @@
1+pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
2+
3+add_definitions(-DSM_BUSNAME=systemBus)
4+
5+include_directories(
6+ ${CMAKE_CURRENT_SOURCE_DIR}
7+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService
8+ ${GSETTINGS_QT_INCLUDE_DIRS}
9+ ${libunity8-private_SOURCE_DIR}
10+)
11+
12+set(QMLLAUNCHERPLUGINAS_SRC
13+ plugin.cpp
14+ launchermodelas.cpp
15+ launcheritem.cpp
16+ quicklistmodel.cpp
17+ quicklistentry.cpp
18+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
19+ ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
20+ ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
21+ ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
22+ ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/QuickListModelInterface.h
23+ )
24+
25+add_library(UnityLauncherAS-qml MODULE
26+ ${QMLLAUNCHERPLUGINAS_SRC}
27+ )
28+
29+target_link_libraries(UnityLauncherAS-qml
30+ unity8-private
31+ ${GSETTINGS_QT_LDFLAGS}
32+ Qt5::DBus Qt5::Qml Qt5::Gui
33+ )
34+
35+add_unity8_greeter_plugin(Unity.Launcher 0.1 Unity/Launcher TARGETS UnityLauncherAS-qml)
plugins/Greeter/Unity/Launcher/launcheritem.cppnew file+218
@@ -0,0 +1,218 @@
1+/*
2+ * Copyright 2014-2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "launcheritem.h"
18+#include "quicklistmodel.h"
19+
20+#include <libintl.h>
21+
22+LauncherItem::LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent) :
23+ LauncherItemInterface(parent),
24+ m_appId(appId),
25+ m_name(name),
26+ m_icon(icon),
27+ m_pinned(false),
28+ m_running(false),
29+ m_recent(false),
30+ m_progress(-1),
31+ m_count(0),
32+ m_countVisible(false),
33+ m_focused(false),
34+ m_alerting(false),
35+ m_surfaceCount(0),
36+ m_quickList(new QuickListModel(this))
37+{
38+ QuickListEntry nameAction;
39+ nameAction.setActionId(QStringLiteral("launch_item"));
40+ nameAction.setText(m_name);
41+ m_quickList->appendAction(nameAction);
42+}
43+
44+QString LauncherItem::appId() const
45+{
46+ return m_appId;
47+}
48+
49+QString LauncherItem::name() const
50+{
51+ return m_name;
52+}
53+
54+void LauncherItem::setName(const QString &name)
55+{
56+ if (m_name != name) {
57+ m_name = name;
58+ QuickListEntry entry;
59+ entry.setActionId(QStringLiteral("launch_item"));
60+ entry.setText(m_name);
61+ m_quickList->updateAction(entry);
62+ Q_EMIT nameChanged(name);
63+ }
64+}
65+
66+QString LauncherItem::icon() const
67+{
68+ return m_icon;
69+}
70+
71+void LauncherItem::setIcon(const QString &icon)
72+{
73+ if (m_icon != icon) {
74+ m_icon = icon;
75+ Q_EMIT iconChanged(icon);
76+ }
77+}
78+
79+QStringList LauncherItem::keywords() const
80+{
81+ return m_keywords;
82+}
83+
84+void LauncherItem::setKeywords(const QStringList &keywords)
85+{
86+ if (m_keywords != keywords) {
87+ m_keywords = keywords;
88+ Q_EMIT keywordsChanged(keywords);
89+ }
90+}
91+
92+uint LauncherItem::popularity() const
93+{
94+ // Not exposing usage order in greeter session at this point.
95+ return 0;
96+}
97+
98+bool LauncherItem::pinned() const
99+{
100+ return m_pinned;
101+}
102+
103+void LauncherItem::setPinned(bool pinned)
104+{
105+ if (m_pinned != pinned) {
106+ m_pinned = pinned;
107+ Q_EMIT pinnedChanged(pinned);
108+ }
109+}
110+
111+bool LauncherItem::running() const
112+{
113+ return m_running;
114+}
115+
116+void LauncherItem::setRunning(bool running)
117+{
118+ if (m_running != running) {
119+ m_running = running;
120+ Q_EMIT runningChanged(running);
121+ }
122+}
123+
124+bool LauncherItem::recent() const
125+{
126+ return m_recent;
127+}
128+
129+void LauncherItem::setRecent(bool recent)
130+{
131+ if (m_recent != recent) {
132+ m_recent = recent;
133+ Q_EMIT recentChanged(recent);
134+ }
135+}
136+
137+int LauncherItem::progress() const
138+{
139+ return m_progress;
140+}
141+
142+void LauncherItem::setProgress(int progress)
143+{
144+ if (m_progress != progress) {
145+ m_progress = progress;
146+ Q_EMIT progressChanged(progress);
147+ }
148+}
149+
150+int LauncherItem::count() const
151+{
152+ return m_count;
153+}
154+
155+void LauncherItem::setCount(int count)
156+{
157+ if (m_count != count) {
158+ m_count = count;
159+ Q_EMIT countChanged(count);
160+ }
161+}
162+
163+bool LauncherItem::countVisible() const
164+{
165+ return m_countVisible;
166+}
167+
168+void LauncherItem::setCountVisible(bool countVisible)
169+{
170+ if (m_countVisible != countVisible) {
171+ m_countVisible = countVisible;
172+ Q_EMIT countVisibleChanged(countVisible);
173+ }
174+}
175+
176+bool LauncherItem::focused() const
177+{
178+ return m_focused;
179+}
180+
181+void LauncherItem::setFocused(bool focused)
182+{
183+ if (m_focused != focused) {
184+ m_focused = focused;
185+ Q_EMIT focusedChanged(focused);
186+ }
187+}
188+
189+bool LauncherItem::alerting() const
190+{
191+ return m_alerting;
192+}
193+
194+void LauncherItem::setAlerting(bool alerting)
195+{
196+ if (m_alerting != alerting) {
197+ m_alerting = alerting;
198+ Q_EMIT alertingChanged(alerting);
199+ }
200+}
201+
202+int LauncherItem::surfaceCount() const
203+{
204+ return m_surfaceCount;
205+}
206+
207+void LauncherItem::setSurfaceCount(int surfaceCount)
208+{
209+ if (m_surfaceCount != surfaceCount) {
210+ m_surfaceCount = surfaceCount;
211+ Q_EMIT surfaceCountChanged(surfaceCount);
212+ }
213+}
214+
215+unity::shell::launcher::QuickListModelInterface *LauncherItem::quickList() const
216+{
217+ return m_quickList;
218+}
plugins/Greeter/Unity/Launcher/launcheritem.hnew file+84
@@ -0,0 +1,84 @@
1+/*
2+ * Copyright 2014-2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef LAUNCHERITEM_H
18+#define LAUNCHERITEM_H
19+
20+#include "quicklistmodel.h"
21+
22+#include <unity/shell/launcher/LauncherItemInterface.h>
23+
24+class QuickListModel;
25+
26+using namespace unity::shell::launcher;
27+
28+class LauncherItem: public LauncherItemInterface
29+{
30+ Q_OBJECT
31+public:
32+ LauncherItem(const QString &appId, const QString &name, const QString &icon, QObject *parent = 0);
33+
34+ QString appId() const override;
35+ QString name() const override;
36+ QString icon() const override;
37+ QStringList keywords() const override;
38+ uint popularity() const override;
39+ bool pinned() const override;
40+ bool running() const override;
41+ bool recent() const override;
42+ int progress() const override;
43+ int count() const override;
44+ bool countVisible() const override;
45+ bool focused() const override;
46+ bool alerting() const override;
47+ int surfaceCount() const override;
48+
49+ unity::shell::launcher::QuickListModelInterface *quickList() const override;
50+
51+private:
52+ void setName(const QString &name);
53+ void setIcon(const QString &icon);
54+ void setKeywords(const QStringList &keywords);
55+ void setPinned(bool pinned);
56+ void setRunning(bool running);
57+ void setRecent(bool recent);
58+ void setProgress(int progress);
59+ void setCount(int count);
60+ void setCountVisible(bool countVisible);
61+ void setFocused(bool focused);
62+ void setAlerting(bool alerting);
63+ void setSurfaceCount(int surfaceCount);
64+
65+private:
66+ QString m_appId;
67+ QString m_name;
68+ QString m_icon;
69+ QStringList m_keywords;
70+ bool m_pinned;
71+ bool m_running;
72+ bool m_recent;
73+ int m_progress;
74+ int m_count;
75+ bool m_countVisible;
76+ bool m_focused;
77+ bool m_alerting;
78+ int m_surfaceCount;
79+ QuickListModel *m_quickList;
80+
81+ friend class LauncherModel;
82+};
83+
84+#endif // LAUNCHERITEM_H
plugins/Greeter/Unity/Launcher/launchermodelas.cppnew file+303
@@ -0,0 +1,303 @@
1+/*
2+ * Copyright 2014-2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "launchermodelas.h"
18+#include "launcheritem.h"
19+#include "AccountsServiceDBusAdaptor.h"
20+#include <unity/shell/application/ApplicationInfoInterface.h>
21+
22+#include <QDesktopServices>
23+#include <QDebug>
24+#include <QDBusArgument>
25+
26+using namespace unity::shell::application;
27+
28+LauncherModel::LauncherModel(QObject *parent):
29+ LauncherModelInterface(parent),
30+ m_accounts(new AccountsServiceDBusAdaptor(this)),
31+ m_onlyPinned(true)
32+{
33+ connect(m_accounts, &AccountsServiceDBusAdaptor::propertiesChanged, this, &LauncherModel::propertiesChanged);
34+ refresh();
35+}
36+
37+LauncherModel::~LauncherModel()
38+{
39+ while (!m_list.empty()) {
40+ m_list.takeFirst()->deleteLater();
41+ }
42+}
43+
44+int LauncherModel::rowCount(const QModelIndex &parent) const
45+{
46+ Q_UNUSED(parent)
47+ return m_list.count();
48+}
49+
50+QVariant LauncherModel::data(const QModelIndex &index, int role) const
51+{
52+ LauncherItem *item = m_list.at(index.row());
53+ switch(role) {
54+ case RoleAppId:
55+ return item->appId();
56+ case RoleName:
57+ return item->name();
58+ case RoleIcon:
59+ return item->icon();
60+ case RolePinned:
61+ return item->pinned();
62+ case RoleCount:
63+ return item->count();
64+ case RoleCountVisible:
65+ return item->countVisible();
66+ case RoleProgress:
67+ return item->progress();
68+ case RoleFocused:
69+ return item->focused();
70+ case RoleRunning:
71+ return item->running();
72+ case RoleSurfaceCount:
73+ return item->surfaceCount();
74+ }
75+
76+ return QVariant();
77+}
78+
79+unity::shell::launcher::LauncherItemInterface *LauncherModel::get(int index) const
80+{
81+ if (index < 0 || index >= m_list.count()) {
82+ return 0;
83+ }
84+ return m_list.at(index);
85+}
86+
87+void LauncherModel::move(int oldIndex, int newIndex)
88+{
89+ Q_UNUSED(oldIndex)
90+ Q_UNUSED(newIndex)
91+ qWarning() << "This is a read only implementation. Cannot move items.";
92+}
93+
94+void LauncherModel::pin(const QString &appId, int index)
95+{
96+ Q_UNUSED(appId)
97+ Q_UNUSED(index)
98+ qWarning() << "This is a read only implementation. Cannot pin items";
99+}
100+
101+void LauncherModel::requestRemove(const QString &appId)
102+{
103+ Q_UNUSED(appId)
104+ qWarning() << "This is a read only implementation. Cannot remove items";
105+}
106+
107+void LauncherModel::quickListActionInvoked(const QString &appId, int actionIndex)
108+{
109+ int index = findApplication(appId);
110+ if (index < 0) {
111+ return;
112+ }
113+
114+ LauncherItem *item = m_list.at(index);
115+ QuickListModel *model = qobject_cast<QuickListModel*>(item->quickList());
116+ if (model) {
117+ QString actionId = model->get(actionIndex).actionId();
118+
119+ // Check if this is one of the launcher actions we handle ourselves
120+ if (actionId == QLatin1String("launch_item")) {
121+ QDesktopServices::openUrl(getUrlForAppId(appId));
122+
123+ // Nope, we don't know this action, let the backend forward it to the application
124+ } else {
125+ // TODO: forward quicklist action to app, possibly via m_dbusIface
126+ }
127+ }
128+}
129+
130+void LauncherModel::setUser(const QString &username)
131+{
132+ if (m_user != username) {
133+ m_user = username;
134+ refresh();
135+ }
136+}
137+
138+QString LauncherModel::getUrlForAppId(const QString &appId) const
139+{
140+ // appId is either an appId or a legacy app name. Let's find out which
141+ if (appId.isEmpty()) {
142+ return QString();
143+ }
144+
145+ if (!appId.contains('_')) {
146+ return "application:///" + appId + ".desktop";
147+ }
148+
149+ QStringList parts = appId.split('_');
150+ QString package = parts.value(0);
151+ QString app = parts.value(1, QStringLiteral("first-listed-app"));
152+ return "appid://" + package + "/" + app + "/current-user-version";
153+}
154+
155+ApplicationManagerInterface *LauncherModel::applicationManager() const
156+{
157+ return nullptr;
158+}
159+
160+void LauncherModel::setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager)
161+{
162+ Q_UNUSED(appManager)
163+ qWarning() << "This plugin syncs all its states from AccountsService. Not using ApplicationManager.";
164+ return;
165+}
166+
167+bool LauncherModel::onlyPinned() const
168+{
169+ return m_onlyPinned;
170+}
171+
172+void LauncherModel::setOnlyPinned(bool onlyPinned)
173+{
174+ if (m_onlyPinned != onlyPinned) {
175+ m_onlyPinned = onlyPinned;
176+ Q_EMIT onlyPinnedChanged();
177+ refresh();
178+ }
179+}
180+
181+int LauncherModel::findApplication(const QString &appId)
182+{
183+ for (int i = 0; i < m_list.count(); ++i) {
184+ LauncherItem *item = m_list.at(i);
185+ if (item->appId() == appId) {
186+ return i;
187+ }
188+ }
189+ return -1;
190+}
191+
192+void LauncherModel::refresh()
193+{
194+ if (!m_accounts || m_user.isEmpty()) {
195+ refreshWithItems(QList<QVariantMap>());
196+ } else {
197+ QDBusPendingCall pendingCall = m_accounts->getUserPropertyAsync(m_user, QStringLiteral("com.canonical.unity.AccountsService"), QStringLiteral("LauncherItems"));
198+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall, this);
199+ connect(watcher, &QDBusPendingCallWatcher::finished,
200+ this, [this](QDBusPendingCallWatcher* watcher) {
201+
202+ QDBusPendingReply<QVariant> reply = *watcher;
203+ watcher->deleteLater();
204+ if (reply.isError()) {
205+ qWarning() << "Failed to refresh LauncherItems" << reply.error().message();
206+ return;
207+ }
208+
209+ refreshWithItems(qdbus_cast<QList<QVariantMap>>(reply.value().value<QDBusArgument>()));
210+ });
211+ }
212+}
213+
214+void LauncherModel::refreshWithItems(const QList<QVariantMap> &items)
215+{
216+ // First walk through all the existing items and see if we need to remove something
217+ QList<LauncherItem*> toBeRemoved;
218+
219+ Q_FOREACH (LauncherItem* item, m_list) {
220+ bool found = false;
221+ Q_FOREACH(const QVariant &asItem, items) {
222+ QVariantMap cachedMap = asItem.toMap();
223+ if (cachedMap.value(QStringLiteral("id")).toString() == item->appId()) {
224+ // Only keep and update it if we either show unpinned or it is pinned
225+ if (!m_onlyPinned || cachedMap.value(QStringLiteral("pinned")).toBool()) {
226+ found = true;
227+ item->setName(cachedMap.value(QStringLiteral("name")).toString());
228+ item->setIcon(cachedMap.value(QStringLiteral("icon")).toString());
229+ item->setCount(cachedMap.value(QStringLiteral("count")).toInt());
230+ item->setCountVisible(cachedMap.value(QStringLiteral("countVisible")).toBool());
231+ item->setProgress(cachedMap.value(QStringLiteral("progress")).toInt());
232+ item->setRunning(cachedMap.value(QStringLiteral("running")).toBool());
233+
234+ int idx = m_list.indexOf(item);
235+ Q_EMIT dataChanged(index(idx), index(idx), {RoleName, RoleIcon, RoleCount, RoleCountVisible, RoleRunning, RoleProgress});
236+ }
237+ break;
238+ }
239+ }
240+ if (!found) {
241+ toBeRemoved.append(item);
242+ }
243+ }
244+
245+ Q_FOREACH (LauncherItem* item, toBeRemoved) {
246+ int idx = m_list.indexOf(item);
247+ beginRemoveRows(QModelIndex(), idx, idx);
248+ m_list.takeAt(idx)->deleteLater();
249+ endRemoveRows();
250+ }
251+
252+ // Now walk through list and see if we need to add something
253+ int skipped = 0;
254+ for (int asIndex = 0; asIndex < items.count(); ++asIndex) {
255+ QVariant entry = items.at(asIndex);
256+
257+ if (m_onlyPinned && !entry.toMap().value(QStringLiteral("pinned")).toBool()) {
258+ // Skipping it as we only show pinned and it is not
259+ skipped++;
260+ continue;
261+ }
262+ int newPosition = asIndex - skipped;
263+
264+ int itemIndex = -1;
265+ for (int i = 0; i < m_list.count(); ++i) {
266+ if (m_list.at(i)->appId() == entry.toMap().value(QStringLiteral("id")).toString()) {
267+ itemIndex = i;
268+ break;
269+ }
270+ }
271+
272+ if (itemIndex == -1) {
273+ QVariantMap cachedMap = entry.toMap();
274+ // Need to add it. Just add it into the addedIndex to keep same ordering as the list in AS.
275+ LauncherItem *item = new LauncherItem(cachedMap.value(QStringLiteral("id")).toString(),
276+ cachedMap.value(QStringLiteral("name")).toString(),
277+ cachedMap.value(QStringLiteral("icon")).toString(),
278+ this);
279+ item->setPinned(true);
280+ item->setCount(cachedMap.value(QStringLiteral("count")).toInt());
281+ item->setCountVisible(cachedMap.value(QStringLiteral("countVisible")).toBool());
282+ item->setProgress(cachedMap.value(QStringLiteral("progress")).toInt());
283+ item->setRunning(cachedMap.value(QStringLiteral("running")).toBool());
284+ beginInsertRows(QModelIndex(), newPosition, newPosition);
285+ m_list.insert(newPosition, item);
286+ endInsertRows();
287+ } else if (itemIndex != newPosition) {
288+ // The item is already there, but it is in a different place than in the settings.
289+ // Move it to the addedIndex
290+ beginMoveRows(QModelIndex(), itemIndex, itemIndex, QModelIndex(), newPosition);
291+ m_list.move(itemIndex, newPosition);
292+ endMoveRows();
293+ }
294+ }
295+}
296+
297+void LauncherModel::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
298+{
299+ if (user != m_user || interface != QLatin1String("com.canonical.unity.AccountsService") || !changed.contains(QStringLiteral("LauncherItems"))) {
300+ return;
301+ }
302+ refresh();
303+}
plugins/Greeter/Unity/Launcher/launchermodelas.hnew file+77
@@ -0,0 +1,77 @@
1+/*
2+ * Copyright 2014-2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef LAUNCHERMODEL_H
18+#define LAUNCHERMODEL_H
19+
20+#include <unity/shell/launcher/LauncherModelInterface.h>
21+#include <unity/shell/application/ApplicationManagerInterface.h>
22+
23+#include <QAbstractListModel>
24+
25+class LauncherItem;
26+class GSettings;
27+class AccountsServiceDBusAdaptor;
28+
29+using namespace unity::shell::launcher;
30+using namespace unity::shell::application;
31+
32+class LauncherModel: public LauncherModelInterface
33+{
34+ Q_OBJECT
35+
36+public:
37+ LauncherModel(QObject *parent = 0);
38+ ~LauncherModel();
39+
40+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
41+
42+ QVariant data(const QModelIndex &index, int role) const override;
43+
44+ Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
45+ Q_INVOKABLE void move(int oldIndex, int newIndex) override;
46+ Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
47+ Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex) override;
48+ Q_INVOKABLE void setUser(const QString &username) override;
49+ Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
50+
51+ unity::shell::application::ApplicationManagerInterface* applicationManager() const override;
52+ void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager) override;
53+
54+ bool onlyPinned() const override;
55+ void setOnlyPinned(bool onlyPinned) override;
56+
57+ int findApplication(const QString &appId);
58+
59+public Q_SLOTS:
60+ void requestRemove(const QString &appId) override;
61+ Q_INVOKABLE void refresh();
62+
63+private Q_SLOTS:
64+ void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
65+
66+private:
67+ void refreshWithItems(const QList<QVariantMap> &items);
68+
69+ QString m_user;
70+ QList<LauncherItem*> m_list;
71+ AccountsServiceDBusAdaptor *m_accounts;
72+ bool m_onlyPinned;
73+
74+ friend class LauncherModelASTest;
75+};
76+
77+#endif // LAUNCHERMODEL_H
plugins/Greeter/Unity/Launcher/plugin.cppnew file+46
@@ -0,0 +1,46 @@
1+/*
2+ * Copyright 2014-2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+// Qt
18+#include <QtQml/qqml.h>
19+
20+// self
21+#include "plugin.h"
22+
23+// local
24+#include "launchermodelas.h"
25+#include "launcheritem.h"
26+
27+
28+using namespace unity::shell::launcher;
29+
30+static QObject* modelProvider(QQmlEngine* /* engine */, QJSEngine* /* scriptEngine */)
31+{
32+ return new LauncherModel();
33+}
34+
35+void UnityLauncherPlugin::registerTypes(const char *uri)
36+{
37+ Q_ASSERT(uri == QLatin1String("Unity.Launcher"));
38+
39+ qmlRegisterUncreatableType<LauncherModelInterface>(uri, 0, 1, "LauncherModelInterface", QStringLiteral("Abstract Interface. Cannot be instantiated."));
40+ qmlRegisterUncreatableType<LauncherItemInterface>(uri, 0, 1, "LauncherItemInterface", QStringLiteral("Abstract Interface. Cannot be instantiated."));
41+ qmlRegisterUncreatableType<QuickListModelInterface>(uri, 0, 1, "QuickListInterface", QStringLiteral("Abstract Interface. Cannot be instantiated."));
42+
43+ qmlRegisterSingletonType<LauncherModel>(uri, 0, 1, "LauncherModel", modelProvider);
44+ qmlRegisterUncreatableType<LauncherItem>(uri, 0, 1, "LauncherItem", QStringLiteral("Can't create new Launcher Items in QML. Get them from the LauncherModel."));
45+ qmlRegisterUncreatableType<QuickListModel>(uri, 0, 1, "QuickListModel", QStringLiteral("Can't create a QuickListModel in QML. Get them from the LauncherItems."));
46+}
tests/mocks/Unity/fake_unity_plugin.h → plugins/Greeter/Unity/Launcher/plugin.hrenamed+6−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014-2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,23 +12,21 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Nick Dedekind <nick.dedekind@canonical.com>
1715 */
1816
19−#ifndef FAKE_UNITY_PLUGIN_H
20−#define FAKE_UNITY_PLUGIN_H
17+#ifndef UNITY_LAUNCHER_PLUGIN_H
18+#define UNITY_LAUNCHER_PLUGIN_H
2119
22−// Qt
20+#include <QtQml/QQmlEngine>
2321#include <QtQml/QQmlExtensionPlugin>
2422
25−class FakeUnityPlugin : public QQmlExtensionPlugin
23+class UnityLauncherPlugin : public QQmlExtensionPlugin
2624{
2725 Q_OBJECT
2826 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2927
3028public:
31− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
3230};
3331
3432#endif
plugins/Greeter/Unity/Launcher/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Unity.Launcher
2+plugin UnityLauncherAS-qml
3+typeinfo Launcher.qmltypes
plugins/Unity/Launcher/common/quicklistentry.cpp → plugins/Greeter/Unity/Launcher/quicklistentry.cpprenamed+1−4
@@ -1,7 +1,4 @@
1−/* Copyright (C) 2013 Canonical, Ltd.
2− *
3− * Authors:
4− * Michael Zanetti <michael.zanetti@canonical.com>
1+/* Copyright (C) 2014-2015 Canonical, Ltd.
52 *
63 * This program is free software; you can redistribute it and/or modify
74 * it under the terms of the GNU General Public License as published by
plugins/Unity/Launcher/common/quicklistentry.h → plugins/Greeter/Unity/Launcher/quicklistentry.hrenamed+1−4
@@ -1,7 +1,4 @@
1−/* Copyright (C) 2013 Canonical, Ltd.
2− *
3− * Authors:
4− * Michael Zanetti <michael.zanetti@canonical.com>
1+/* Copyright (C) 2014-2015 Canonical, Ltd.
52 *
63 * This program is free software; you can redistribute it and/or modify
74 * it under the terms of the GNU General Public License as published by
plugins/Greeter/Unity/Launcher/quicklistmodel.cppnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright 2014-2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "quicklistmodel.h"
18+
19+QuickListModel::QuickListModel(QObject *parent) :
20+ QuickListModelInterface(parent)
21+{
22+
23+}
24+
25+QuickListModel::~QuickListModel()
26+{
27+
28+}
29+
30+void QuickListModel::appendAction(const QuickListEntry &entry)
31+{
32+ beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
33+ m_list.append(entry);
34+ endInsertRows();
35+}
36+
37+void QuickListModel::updateAction(const QuickListEntry &entry)
38+{
39+ for (int i = 0; i < m_list.count(); ++i) {
40+ if (m_list.at(i).actionId() == entry.actionId()) {
41+ m_list.replace(i, entry);
42+ Q_EMIT dataChanged(index(i), index(i));
43+ return;
44+ }
45+ }
46+}
47+
48+QuickListEntry QuickListModel::get(int index) const
49+{
50+ return m_list.at(index);
51+}
52+
53+int QuickListModel::rowCount(const QModelIndex &index) const
54+{
55+ Q_UNUSED(index)
56+ return m_list.count();
57+}
58+
59+QVariant QuickListModel::data(const QModelIndex &index, int role) const
60+{
61+ switch (role) {
62+ case RoleLabel:
63+ return m_list.at(index.row()).text();
64+ case RoleIcon:
65+ return m_list.at(index.row()).icon();
66+ case RoleClickable:
67+ return m_list.at(index.row()).clickable();
68+ case RoleIsPrivate:
69+ return false; // The greeter plugin would just not add any private entries
70+ }
71+ return QVariant();
72+}
plugins/Greeter/Unity/Launcher/quicklistmodel.hnew file+55
@@ -0,0 +1,55 @@
1+/*
2+ * Copyright 2014-2015 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef QUICKLISTMODEL_H
18+#define QUICKLISTMODEL_H
19+
20+#include "quicklistentry.h"
21+
22+#include <unity/shell/launcher/QuickListModelInterface.h>
23+
24+using namespace unity::shell::launcher;
25+
26+class QuickListModel: public QuickListModelInterface
27+{
28+ Q_OBJECT
29+
30+public:
31+ explicit QuickListModel(QObject *parent = 0);
32+
33+ ~QuickListModel();
34+
35+ void appendAction(const QuickListEntry &entry);
36+
37+ /**
38+ * @brief Update an existing action
39+ * @param entry The new, updated entry
40+ *
41+ * This will only do something if entry.actionId is found in the model.
42+ * To add a new entry, use appendAction().
43+ */
44+ void updateAction(const QuickListEntry &entry);
45+
46+ QuickListEntry get(int index) const;
47+
48+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
49+ QVariant data(const QModelIndex &index, int role) const override;
50+
51+private:
52+ QList<QuickListEntry> m_list;
53+};
54+
55+#endif // QUICKLISTMODEL_H
plugins/HudClient/CMakeLists.txtdeleted−43
@@ -1,43 +0,0 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−find_package(Qt5Core REQUIRED)
5−find_package(Qt5Quick REQUIRED)
6−pkg_search_module(DEE dee-1.0 REQUIRED)
7−pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
8−pkg_search_module(HUDCLIENT hud-client-2 REQUIRED)
9−pkg_search_module(DEEQT libdee-qt5 REQUIRED)
10−pkg_search_module(PULSE libpulse REQUIRED)
11−
12−include_directories(
13− ${CMAKE_CURRENT_BINARY_DIR}
14− ${Qt5Core_INCLUDE_DIRS}
15− ${Qt5Quick_INCLUDE_DIRS}
16− ${DEE_INCLUDE_DIRS}
17− ${DEEQT_INCLUDE_DIRS}
18− ${HUDCLIENT_INCLUDE_DIRS}
19− ${PULSE_INCLUDE_DIRS}
20−)
21−
22−set(HudQML_SOURCES
23− hudclient.cpp
24− hudtoolbarmodel.cpp
25− volumepeakdetector.cpp
26− plugin.cpp
27−)
28−
29−add_library(HudClientQml MODULE ${HudQML_SOURCES})
30−target_link_libraries(HudClientQml
31− ${Qt5Core_LIBRARIES}
32− ${Qt5Quick_LIBRARIES}
33− ${DEEQT_LDFLAGS}
34− ${HUDCLIENT_LDFLAGS}
35− ${GOBJECT_LDFLAGS}
36− ${PULSE_LDFLAGS}
37−)
38−
39−qt5_use_modules(HudClientQml Qml)
40−
41−# export the qmldir qmltypes and plugin files
42−export_qmlfiles(HudClient HudClient)
43−export_qmlplugin(HudClient 0.1 HudClient TARGETS HudClientQml)
plugins/HudClient/hudclient.cppdeleted−294
@@ -1,294 +0,0 @@
1−/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "hudclient.h"
18−
19−#include "hudtoolbarmodel.h"
20−
21−#include <deelistmodel.h>
22−
23−#include <QDebug>
24−
25−namespace
26−{
27−
28−extern "C"
29−{
30−
31−void loadingCB(GObject* /*src*/, gpointer dst)
32−{
33− static_cast<HudClient*>(dst)->voiceQueryLoading();
34−}
35−
36−void listeningCB(GObject* /*src*/, gpointer dst)
37−{
38− static_cast<HudClient*>(dst)->voiceQueryListening();
39−}
40−
41−void heardSomethingCB(GObject* /*src*/, gpointer dst)
42−{
43− static_cast<HudClient*>(dst)->voiceQueryHeardSomething();
44−}
45−
46−void failedCB(GObject* /*src*/, const gchar * /*reason*/, gpointer dst)
47−{
48− static_cast<HudClient*>(dst)->voiceQueryFailed();
49−}
50−
51−void finishedCB(GObject* /*src*/, const gchar* query, gpointer dst)
52−{
53− static_cast<HudClient*>(dst)->voiceQueryFinished(QString::fromUtf8(query));
54−}
55−
56−void modelReadyCB(GObject* /*src*/, gpointer dst)
57−{
58− static_cast<HudClient*>(dst)->modelReady(true);
59−}
60−
61−void modelReallyReadyCB(GObject* /*src*/, gint /*position*/, gint /*removed*/, gint /*added*/, gpointer dst)
62−{
63− static_cast<HudClient*>(dst)->modelReallyReady(true);
64−}
65−
66−static void modelsChangedCB(GObject* /*src*/, gpointer dst)
67−{
68− static_cast<HudClient*>(dst)->queryModelsChanged();
69−}
70−
71−static void toolBarUpdatedCB(GObject* /*src*/, gpointer dst)
72−{
73− static_cast<HudToolBarModel*>(dst)->updatedByBackend();
74−}
75−
76−} // extern "C"
77−
78−} // namespace
79−
80−HudClient::HudClient()
81−{
82− m_results = new DeeListModel();
83− m_clientQuery = hud_client_query_new("");
84− m_toolBarModel = new HudToolBarModel(m_clientQuery);
85− m_currentActionParam = NULL;
86− m_results->setModel(hud_client_query_get_results_model(m_clientQuery));
87−
88− g_signal_connect(G_OBJECT(m_clientQuery), "voice-query-loading", G_CALLBACK(loadingCB), this);
89− g_signal_connect(G_OBJECT(m_clientQuery), "voice-query-listening", G_CALLBACK(listeningCB), this);
90− g_signal_connect(G_OBJECT(m_clientQuery), "voice-query-heard-something", G_CALLBACK(heardSomethingCB), this);
91− g_signal_connect(G_OBJECT(m_clientQuery), "voice-query-finished", G_CALLBACK(finishedCB), this);
92− g_signal_connect(G_OBJECT(m_clientQuery), "voice-query-failed", G_CALLBACK(failedCB), this);
93− g_signal_connect(G_OBJECT(m_clientQuery), HUD_CLIENT_QUERY_SIGNAL_MODELS_CHANGED, G_CALLBACK(modelsChangedCB), this);
94− g_signal_connect(G_OBJECT(m_clientQuery), HUD_CLIENT_QUERY_SIGNAL_TOOLBAR_UPDATED, G_CALLBACK(toolBarUpdatedCB), m_toolBarModel);
95−}
96−
97−// Terrible hack to get around GLib. GLib stores function pointers as gpointer, which violates the C and C++ spec
98−// because data and function pointers may have different sizes. gcc rightfully emits a warning. There is no #pragma
99−// in gcc to selectively turn off the warning, however. This hack gets around the problem, by using a union (ick) to
100−// convert between the two types.
101−
102−class ToGPointer
103−{
104−public:
105− ToGPointer(void (*cb)())
106− {
107− u_.cb = cb;
108− }
109−
110− operator gpointer()
111− {
112− return u_.p;
113− }
114−
115−private:
116− union
117− {
118− void (*cb)();
119− gpointer p;
120− } u_;
121−};
122−
123−#define TO_GPOINTER(cb) (ToGPointer(reinterpret_cast<void(*)()>((cb))))
124−
125−HudClient::~HudClient()
126−{
127− g_signal_handlers_disconnect_by_func(G_OBJECT(m_clientQuery), TO_GPOINTER(loadingCB), this);
128− g_signal_handlers_disconnect_by_func(G_OBJECT(m_clientQuery), TO_GPOINTER(listeningCB), this);
129− g_signal_handlers_disconnect_by_func(G_OBJECT(m_clientQuery), TO_GPOINTER(heardSomethingCB), this);
130− g_signal_handlers_disconnect_by_func(G_OBJECT(m_clientQuery), TO_GPOINTER(finishedCB), this);
131− g_signal_handlers_disconnect_by_func(G_OBJECT(m_clientQuery), TO_GPOINTER(toolBarUpdatedCB), m_toolBarModel);
132−
133− delete m_results;
134− delete m_toolBarModel;
135−
136− g_object_unref(m_clientQuery);
137−}
138−
139−void HudClient::setQuery(const QString &new_query)
140−{
141− hud_client_query_set_query(m_clientQuery, new_query.toUtf8().constData());
142−}
143−
144−void HudClient::startVoiceQuery()
145−{
146− hud_client_query_voice_query(m_clientQuery);
147−}
148−
149−void HudClient::executeParametrizedAction(const QVariant &values)
150−{
151− updateParametrizedAction(values);
152− hud_client_param_send_commit(m_currentActionParam);
153− g_object_unref(m_currentActionParam);
154− m_currentActionParam = NULL;
155− Q_EMIT commandExecuted();
156−}
157−
158−void HudClient::updateParametrizedAction(const QVariant &values)
159−{
160− if (m_currentActionParam != NULL) {
161− const QVariantMap map = values.value<QVariantMap>();
162− GActionGroup *ag = hud_client_param_get_actions(m_currentActionParam);
163−
164− auto it = map.begin();
165− for ( ; it != map.end(); ++it) {
166− const QString action = it.key();
167− const QVariant value = it.value();
168− const GVariantType *actionType = g_action_group_get_action_parameter_type(ag, action.toUtf8().constData());
169− if (g_variant_type_equal(actionType, G_VARIANT_TYPE_DOUBLE) && value.canConvert(QVariant::Double)) {
170− g_action_group_activate_action(ag, action.toUtf8().constData(), g_variant_new_double(value.toDouble()));
171− } else {
172− qWarning() << "Unsuported action type in HudClient::executeParametrizedAction";
173− }
174− }
175− } else {
176− qWarning() << "Got to HudClient::updateParametrizedAction with no m_currentActionParam";
177− }
178−}
179−
180−void HudClient::cancelParametrizedAction()
181−{
182− if (m_currentActionParam != NULL) {
183− hud_client_param_send_cancel(m_currentActionParam);
184− g_object_unref(m_currentActionParam);
185− m_currentActionParam = NULL;
186− }
187−}
188−
189−void HudClient::executeToolBarAction(HudClientQueryToolbarItems action)
190−{
191− hud_client_query_execute_toolbar_item(m_clientQuery, action, /* timestamp */ 0);
192− Q_EMIT commandExecuted();
193−}
194−
195−DeeListModel *HudClient::results() const
196−{
197− return m_results;
198−}
199−
200−QAbstractItemModel *HudClient::toolBarModel() const
201−{
202− return m_toolBarModel;
203−}
204−
205−void HudClient::executeCommand(int index)
206−{
207− m_currentActionIndex = index;
208− DeeModel *model = hud_client_query_get_results_model(m_clientQuery);
209− DeeModelIter *iter = dee_model_get_iter_at_row(model, index);
210−
211− GVariant *command_key = dee_model_get_value(model, iter, 0);
212− GVariant *is_parametrized = dee_model_get_value(model, iter, 7);
213− if (g_variant_get_boolean(is_parametrized)) {
214− m_currentActionParam = hud_client_query_execute_param_command(m_clientQuery, command_key, /* timestamp */ 0);
215− if (m_currentActionParam != NULL) {
216− GMenuModel *menuModel = hud_client_param_get_model (m_currentActionParam);
217− if (menuModel == NULL) {
218− g_signal_connect(m_currentActionParam, HUD_CLIENT_PARAM_SIGNAL_MODEL_READY, G_CALLBACK(modelReadyCB), this);
219− } else {
220− modelReady(false);
221− }
222− } else {
223− qWarning() << "HudClient::executeCommand::Could not get the HudClientParam for parametrized action with index" << index;
224− }
225− } else {
226− hud_client_query_execute_command(m_clientQuery, command_key, /* timestamp */ 0);
227− Q_EMIT commandExecuted();
228− }
229− g_variant_unref(command_key);
230− g_variant_unref(is_parametrized);
231−}
232−
233−void HudClient::modelReady(bool needDisconnect)
234−{
235− if (needDisconnect) {
236− g_signal_handlers_disconnect_by_func(m_currentActionParam, TO_GPOINTER(modelReadyCB), this);
237− }
238− GMenuModel *menuModel = hud_client_param_get_model (m_currentActionParam);
239− if (g_menu_model_get_n_items(menuModel) == 0) {
240− g_signal_connect(menuModel, "items-changed", G_CALLBACK(modelReallyReadyCB), this);
241− } else {
242− modelReallyReady(false);
243− }
244−}
245−
246−static void addAttribute(QVariantMap &properties, GMenuModel *menuModel, int item, const char *attribute) {
247− GVariant *v = g_menu_model_get_item_attribute_value(menuModel, item, attribute, NULL);
248−
249− if (v == NULL)
250− return;
251−
252− properties.insert(attribute, DeeListModel::VariantForData(v));
253− g_variant_unref(v);
254−}
255−
256−void HudClient::modelReallyReady(bool needDisconnect)
257−{
258− GMenuModel *menuModel = hud_client_param_get_model (m_currentActionParam);
259− if (needDisconnect) {
260− g_signal_handlers_disconnect_by_func(menuModel, TO_GPOINTER(modelReallyReadyCB), this);
261− }
262−
263− QVariantList items;
264− for (int i = 0; i < g_menu_model_get_n_items(menuModel); i++) {
265− GVariant *v = g_menu_model_get_item_attribute_value(menuModel, i, "parameter-type", G_VARIANT_TYPE_STRING);
266−
267− if (v == NULL)
268− continue;
269−
270− const QString type = QString::fromUtf8(g_variant_get_string(v, NULL));
271− if (type == "slider") {
272− const char *sliderAttributes[] = { "label", "min", "max", "step", "value", "live", "action" };
273− QVariantMap properties;
274− properties.insert("parameter-type", "slider");
275− for (uint j = 0; j < sizeof(sliderAttributes)/sizeof(sliderAttributes[0]); ++j) {
276− addAttribute(properties, menuModel, i, sliderAttributes[j]);
277− }
278− items << properties;
279− }
280− g_variant_unref(v);
281− }
282−
283− DeeModel *model = hud_client_query_get_results_model(m_clientQuery);
284− DeeModelIter *iter = dee_model_get_iter_at_row(model, m_currentActionIndex);
285− GVariant *actionTextVariant = dee_model_get_value(model, iter, 1);
286− const QString actionText = QString::fromUtf8(g_variant_get_string(actionTextVariant, NULL));
287− g_variant_unref(actionTextVariant);
288− Q_EMIT showParametrizedAction(actionText, QVariant::fromValue(items));
289−}
290−
291−void HudClient::queryModelsChanged()
292−{
293− m_results->setModel(hud_client_query_get_results_model(m_clientQuery));
294−}
plugins/HudClient/hudclient.hdeleted−71
@@ -1,71 +0,0 @@
1−/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef HUDCLIENT_H
18−#define HUDCLIENT_H
19−
20−#include <QObject>
21−
22−#include <hud-client.h>
23−
24−class DeeListModel;
25−class QAbstractItemModel;
26−
27−class HudClient : public QObject
28−{
29− Q_OBJECT
30− Q_PROPERTY(DeeListModel* results READ results)
31− Q_PROPERTY(QAbstractItemModel* toolBarModel READ toolBarModel)
32−
33−public:
34− HudClient();
35− ~HudClient();
36−
37− DeeListModel *results() const;
38−
39− QAbstractItemModel *toolBarModel() const;
40−
41− Q_INVOKABLE void executeCommand(int index);
42− Q_INVOKABLE void setQuery(const QString &new_query);
43− Q_INVOKABLE void startVoiceQuery();
44− Q_INVOKABLE void executeParametrizedAction(const QVariant &values);
45− Q_INVOKABLE void updateParametrizedAction(const QVariant &values);
46− Q_INVOKABLE void cancelParametrizedAction();
47− Q_INVOKABLE void executeToolBarAction(HudClientQueryToolbarItems action);
48−
49− void modelReady(bool needDisconnect);
50− void modelReallyReady(bool needDisconnect);
51− void queryModelsChanged();
52−
53−Q_SIGNALS:
54− void voiceQueryLoading();
55− void voiceQueryListening();
56− void voiceQueryHeardSomething();
57− void voiceQueryFailed();
58− void voiceQueryFinished(const QString &query);
59− void commandExecuted();
60− void showParametrizedAction(const QString &action, const QVariant &items);
61−
62−private:
63− HudClientQuery *m_clientQuery;
64− DeeListModel *m_results;
65− QAbstractItemModel *m_toolBarModel;
66− int m_currentActionIndex;
67− HudClientParam *m_currentActionParam;
68−};
69−Q_DECLARE_METATYPE(HudClientQueryToolbarItems)
70−
71−#endif
plugins/HudClient/hudtoolbarmodel.cppdeleted−98
@@ -1,98 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "hudtoolbarmodel.h"
18−
19−#include "hudclient.h"
20−
21−static const int ActionRole = Qt::UserRole;
22−static const int EnabledRole = Qt::UserRole + 1;
23−
24−static QString iconForAction(int action)
25−{
26− switch (action) {
27− case HUD_CLIENT_QUERY_TOOLBAR_UNDO:
28− return "graphics/undo.png";
29− case HUD_CLIENT_QUERY_TOOLBAR_HELP:
30− return "graphics/help.png";
31− case HUD_CLIENT_QUERY_TOOLBAR_FULLSCREEN:
32− return "graphics/view-fullscreen.png";
33− case HUD_CLIENT_QUERY_TOOLBAR_PREFERENCES:
34− return "graphics/settings.png";
35− }
36− return QString();
37−}
38−
39−HudToolBarModel::HudToolBarModel(HudClientQuery *query)
40− : m_query(query)
41−{
42− m_actions << HUD_CLIENT_QUERY_TOOLBAR_UNDO
43− << HUD_CLIENT_QUERY_TOOLBAR_HELP
44− << HUD_CLIENT_QUERY_TOOLBAR_FULLSCREEN
45− << HUD_CLIENT_QUERY_TOOLBAR_PREFERENCES;
46−}
47−
48−HudToolBarModel::~HudToolBarModel()
49−{
50−}
51−
52−int HudToolBarModel::rowCount(const QModelIndex &parent) const
53−{
54− if (parent.isValid())
55− return 0;
56−
57− return m_actions.count();
58−}
59−
60−QVariant HudToolBarModel::data(const QModelIndex &index, int role) const
61−{
62− const int row = index.row();
63− if (row >= m_actions.count())
64− return QVariant();
65−
66− const HudClientQueryToolbarItems action = m_actions[row];
67−
68− switch (role) {
69− case Qt::DecorationRole:
70− return iconForAction(action);
71− break;
72−
73− case ActionRole:
74− return action;
75− break;
76−
77− case EnabledRole:
78− return hud_client_query_toolbar_item_active(m_query, action);
79− break;
80− }
81− return QVariant();
82−}
83−
84−QHash<int,QByteArray> HudToolBarModel::roleNames() const
85−{
86− static QHash<int,QByteArray> roles;
87− if (roles.isEmpty()) {
88− roles[Qt::DecorationRole] = "iconPath";
89− roles[ActionRole] = "action";
90− roles[EnabledRole] = "enabled";
91− }
92− return roles;
93−}
94−
95−void HudToolBarModel::updatedByBackend()
96−{
97− Q_EMIT dataChanged(index(0, 0), index(rowCount() - 1, 0), QVector<int>() << EnabledRole);
98−}
plugins/HudClient/qmldirdeleted−3
@@ -1,3 +0,0 @@
1−module HudClient
2−plugin HudClientQml
3−typeinfo plugin.qmltypes
plugins/HudClient/volumepeakdetector.cppdeleted−223
@@ -1,223 +0,0 @@
1−/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "volumepeakdetector.h"
18−
19−static void stream_read_callback(pa_stream * /*s*/, size_t /*length*/, void *userdata) {
20− PulseAudioVolumePeakDetector *peakDetector = static_cast<PulseAudioVolumePeakDetector *>(userdata);
21− peakDetector->processData();
22−}
23−
24−static void context_state_callback(pa_context *c, void *userdata) {
25− PulseAudioVolumePeakDetector *peakDetector = static_cast<PulseAudioVolumePeakDetector *>(userdata);
26−
27− switch (pa_context_get_state(c)) {
28− case PA_CONTEXT_CONNECTING:
29− case PA_CONTEXT_AUTHORIZING:
30− case PA_CONTEXT_SETTING_NAME:
31− break;
32−
33− case PA_CONTEXT_READY:
34− peakDetector->startStream();
35− break;
36−
37− case PA_CONTEXT_TERMINATED:
38− case PA_CONTEXT_FAILED:
39− default:
40− peakDetector->quit();
41− }
42−}
43−
44−PulseAudioVolumePeakDetector::PulseAudioVolumePeakDetector()
45− : m_accumulatedValue(0)
46− , m_nAccumulatedValues(0)
47− , m_accumulatedValuesLimit(1)
48− , m_context(NULL)
49− , m_mainloop_api(NULL)
50− , m_stream(NULL)
51−{
52−}
53−
54−void PulseAudioVolumePeakDetector::start()
55−{
56− pa_mainloop *mainloop = NULL;
57−
58− /* Set up a new main loop */
59− mainloop = pa_mainloop_new();
60− if (!mainloop)
61− return;
62−
63− m_mainloop_api = pa_mainloop_get_api(mainloop);
64−
65− /* Create a new connection context */
66− m_context = pa_context_new(m_mainloop_api, NULL);
67− if (!m_context) {
68− goto quit;
69− }
70−
71− pa_context_set_state_callback(m_context, context_state_callback, this);
72−
73− /* Connect the context */
74− if (pa_context_connect(m_context, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) {
75− goto quit;
76− }
77−
78− /* Run the main loop */
79− if (pa_mainloop_run(mainloop, NULL) < 0) {
80− goto quit;
81− }
82−
83−quit:
84− if (m_stream)
85− pa_stream_unref(m_stream);
86−
87− if (m_context)
88− pa_context_unref(m_context);
89−
90− if (mainloop) {
91− pa_signal_done();
92− pa_mainloop_free(mainloop);
93− }
94−
95− QThread::currentThread()->quit();
96−}
97−
98−int PulseAudioVolumePeakDetector::nAccumulatedValuesLimit() const
99−{
100− return m_accumulatedValuesLimit;
101−}
102−
103−void PulseAudioVolumePeakDetector::setNAccumulatedValuesLimit(int limit)
104−{
105− m_accumulatedValuesLimit = limit;
106−}
107−
108−// FIXME 16000 is hardcoded because julius needs it
109−// and the hardware/driver/pulse something gets confused
110−// if we use different rates
111−// We would be happier with a much smaller value like 100
112−static uint voice_needed_rate = 16000;
113−
114−void PulseAudioVolumePeakDetector::startStream()
115−{
116− pa_buffer_attr buffer_attr;
117− pa_proplist *proplist = pa_proplist_new();
118−
119− // FIXME 16000 is hardcoded because julius needs it
120− // and the hardware/driver/pulse something gets confused
121− // if we use different rates
122− // We would be happier with a much smaller value like 100
123− pa_sample_spec sample_spec;
124− sample_spec.format = PA_SAMPLE_FLOAT32;
125− sample_spec.rate = 16000;
126− sample_spec.channels = 1;
127−
128− pa_channel_map channel_map;
129−
130− pa_channel_map_init_extend(&channel_map, sample_spec.channels, PA_CHANNEL_MAP_DEFAULT);
131− pa_proplist_sets(proplist, PA_PROP_MEDIA_NAME, "HUD Peak Detector");
132−
133− m_stream = pa_stream_new_with_proplist(m_context, NULL, &sample_spec, &channel_map, proplist);
134− if (!m_stream) {
135− pa_proplist_free(proplist);
136− quit();
137− return;
138− }
139− pa_proplist_free(proplist);
140−
141− pa_stream_set_read_callback(m_stream, stream_read_callback, this);
142−
143− memset(&buffer_attr, 0, sizeof(buffer_attr));
144− buffer_attr.maxlength = (uint32_t) -1;
145− buffer_attr.fragsize = sizeof(float);
146−
147− if (pa_stream_connect_record(m_stream, NULL, &buffer_attr, (pa_stream_flags_t)(PA_STREAM_PEAK_DETECT | PA_STREAM_ADJUST_LATENCY)) < 0) {
148− quit();
149− }
150−}
151−
152−void PulseAudioVolumePeakDetector::processData()
153−{
154− while (pa_stream_readable_size(m_stream) > 0) {
155− const void *data;
156− size_t length;
157−
158− if (pa_stream_peek(m_stream, &data, &length) < 0) {
159− quit();
160− return;
161− }
162−
163− const float *values = (float*)data;
164− for (size_t i = 0; i < length / sizeof(float); ++i) {
165− float value = values[i];
166− if (value < 0) value = 0;
167− if (value > 1) value = 1;
168− m_nAccumulatedValues++;
169− m_accumulatedValue += value;
170− if (m_nAccumulatedValues == m_accumulatedValuesLimit) {
171− Q_EMIT newPeak(m_accumulatedValue / m_nAccumulatedValues);
172− m_nAccumulatedValues = 0;
173− m_accumulatedValue = 0;
174− }
175− }
176−
177− pa_stream_drop(m_stream);
178− }
179−}
180−
181−void PulseAudioVolumePeakDetector::quit()
182−{
183− m_mainloop_api->quit(m_mainloop_api, 0);
184−}
185−
186−
187−/* VolumePeakDetector */
188−
189−VolumePeakDetector::VolumePeakDetector()
190−{
191− QObject::connect(&m_thread, SIGNAL(started()), &m_volumeDetector, SLOT(start()));
192− QObject::connect(&m_volumeDetector, SIGNAL(newPeak(float)), this, SIGNAL(newPeak(float)));
193−
194− m_volumeDetector.moveToThread(&m_thread);
195−}
196−
197−bool VolumePeakDetector::enabled() const
198−{
199− return m_thread.isRunning();
200−}
201−
202−int VolumePeakDetector::desiredInterval() const
203−{
204− return m_volumeDetector.nAccumulatedValuesLimit() * 1000 / voice_needed_rate;
205−}
206−
207−void VolumePeakDetector::setDesiredInterval(int interval)
208−{
209− m_volumeDetector.setNAccumulatedValuesLimit(voice_needed_rate * interval / 1000);
210−}
211−
212−void VolumePeakDetector::setEnabled(int enabled)
213−{
214− if (enabled) {
215− if (!m_thread.isRunning()) {
216− m_thread.start();
217− }
218− } else {
219− if (m_thread.isRunning()) {
220− m_volumeDetector.quit();
221− }
222− }
223−}
plugins/HudClient/volumepeakdetector.hdeleted−78
@@ -1,78 +0,0 @@
1−/*
2− * Copyright (C) 2012, 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef VOLUMEPEAKDETECTOR_H
18−#define VOLUMEPEAKDETECTOR_H
19−
20−#include <QObject>
21−
22−#include <QThread>
23−
24−#include <pulse/pulseaudio.h>
25−
26−class PulseAudioVolumePeakDetector : public QObject
27−{
28− Q_OBJECT
29−
30−public:
31− PulseAudioVolumePeakDetector();
32−
33− int nAccumulatedValuesLimit() const;
34− void setNAccumulatedValuesLimit(int limit);
35−
36− void startStream();
37− void processData();
38− void quit();
39−
40−public Q_SLOTS:
41− void start();
42−
43−Q_SIGNALS:
44− void newPeak(float value);
45−
46−private:
47− float m_accumulatedValue;
48− int m_nAccumulatedValues;
49− int m_accumulatedValuesLimit;
50− pa_context *m_context;
51− pa_mainloop_api *m_mainloop_api;
52− pa_stream *m_stream;
53−};
54−
55−class VolumePeakDetector : public QObject
56−{
57− Q_OBJECT
58− Q_PROPERTY(bool enabled READ enabled WRITE setEnabled)
59− Q_PROPERTY(int desiredInterval READ desiredInterval WRITE setDesiredInterval)
60−
61−public:
62− VolumePeakDetector();
63−
64− bool enabled() const;
65− void setEnabled(int enabled);
66−
67− int desiredInterval() const;
68− void setDesiredInterval(int interval);
69−
70−Q_SIGNALS:
71− void newPeak(float volume);
72−
73−private:
74− QThread m_thread;
75− PulseAudioVolumePeakDetector m_volumeDetector;
76−};
77−
78−#endif
plugins/LightDM/CMakeLists.txt+10−26
@@ -1,42 +1,26 @@
1−# export_qmlplugin macro
2−include(Plugins)
3−
4−# Dependencies
5−include(FindPkgConfig)
61pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
7−# TODO: Once we split out a separate greeter process, uncomment these lines
8−#pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-2)
2+
3+find_package(Qt5Core REQUIRED)
4+find_package(Qt5Quick REQUIRED)
95
106include_directories(
117 ${CMAKE_CURRENT_SOURCE_DIR}
128 ${CMAKE_CURRENT_BINARY_DIR}
139 ${CMAKE_SOURCE_DIR}/plugins/Utils
14− ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
15− #${LIBLIGHTDM_INCLUDE_DIRS}
10+ ${libunity8-private_SOURCE_DIR}
1611 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
1712)
1813
1914set(QMLPLUGIN_SRC
20− ../Utils/qsortfilterproxymodelqml.cpp # FIXME evaluate a more generic approach for using other plugins
15+ ../Utils/unitysortfilterproxymodelqml.cpp
16+ DBusGreeter.cpp
2117 DBusGreeterList.cpp
2218 Greeter.cpp
2319 plugin.cpp
20+ PromptsModel.cpp
21+ SessionsModel.cpp
2422 UsersModel.cpp
2523 )
2624
27−add_library(LightDM-qml MODULE
28− ${QMLPLUGIN_SRC}
29− )
30−
31−target_link_libraries(LightDM-qml
32− MockLightDM-demo
33−# TODO: Once we split out a separate greeter process, uncomment these lines
34−# ${LIBLIGHTDM_LDFLAGS}
35− ${LIBUSERMETRICSOUTPUT_LDFLAGS}
36− )
37−
38−qt5_use_modules(LightDM-qml DBus Gui Qml)
39−
40−# export the qmldir qmltypes and plugin files
41−export_qmlfiles(LightDM LightDM)
42−export_qmlplugin(LightDM 0.1 LightDM TARGETS LightDM-qml)
25+add_subdirectory(FullLightDM)
26+add_subdirectory(IntegratedLightDM)
plugins/LightDM/DBusGreeter.cppnew file+50
@@ -0,0 +1,50 @@
1+/*
2+ * Copyright (C) 2014, 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "DBusGreeter.h"
18+#include "Greeter.h"
19+
20+#include <QDBusMessage>
21+#include <QStringList>
22+
23+DBusGreeter::DBusGreeter(Greeter *greeter, const QString &path)
24+ : UnityDBusObject(path, QStringLiteral("com.canonical.UnityGreeter"), true, greeter),
25+ m_greeter(greeter)
26+{
27+ connect(m_greeter, &Greeter::isActiveChanged,
28+ this, &DBusGreeter::isActiveChangedHandler);
29+}
30+
31+bool DBusGreeter::isActive() const
32+{
33+ return m_greeter->isActive();
34+}
35+
36+void DBusGreeter::ShowGreeter()
37+{
38+ Q_EMIT m_greeter->showGreeter();
39+}
40+
41+void DBusGreeter::HideGreeter()
42+{
43+ Q_EMIT m_greeter->hideGreeter();
44+}
45+
46+void DBusGreeter::isActiveChangedHandler()
47+{
48+ notifyPropertyChanged(QStringLiteral("IsActive"), isActive());
49+ Q_EMIT isActiveChanged();
50+}
plugins/LightDM/DBusGreeter.hnew file+52
@@ -0,0 +1,52 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef UNITY_DBUSGREETER_H
18+#define UNITY_DBUSGREETER_H
19+
20+#include "unitydbusobject.h"
21+#include <QDBusConnection>
22+
23+class Greeter;
24+
25+/** This is an internal class used to talk with the indicators.
26+ */
27+
28+class DBusGreeter : public UnityDBusObject
29+{
30+ Q_OBJECT
31+ Q_CLASSINFO("D-Bus Interface", "com.canonical.UnityGreeter")
32+
33+ Q_PROPERTY(bool IsActive READ isActive NOTIFY isActiveChanged) // since 14.10
34+
35+public:
36+ explicit DBusGreeter(Greeter *greeter, const QString &path);
37+
38+ bool isActive() const;
39+ Q_SCRIPTABLE void ShowGreeter(); // temporary, until we split the greeter again
40+ Q_SCRIPTABLE void HideGreeter(); // temporary, until we split the greeter again
41+
42+Q_SIGNALS:
43+ void isActiveChanged();
44+
45+private Q_SLOTS:
46+ void isActiveChangedHandler();
47+
48+private:
49+ Greeter *m_greeter;
50+};
51+
52+#endif
plugins/LightDM/DBusGreeterList.cpp+9−30
@@ -20,14 +20,12 @@
2020#include <QDBusMessage>
2121#include <QStringList>
2222
23−DBusGreeterList::DBusGreeterList(Greeter *greeter, const QDBusConnection &connection, const QString &path)
24− : QObject(greeter),
25− m_greeter(greeter),
26− m_connection(connection),
27− m_path(path)
23+DBusGreeterList::DBusGreeterList(Greeter *greeter, const QString &path)
24+ : UnityDBusObject(path, QStringLiteral("com.canonical.UnityGreeter"), true, greeter),
25+ m_greeter(greeter)
2826{
29− connect(m_greeter, SIGNAL(authenticationUserChanged(const QString &)), this, SLOT(authenticationUserChangedHandler(const QString &)));
30− connect(m_greeter, SIGNAL(promptlessChanged()), this, SLOT(promptlessChangedHandler()));
27+ connect(m_greeter, &Greeter::authenticationUserChanged, this, &DBusGreeterList::authenticationUserChangedHandler);
28+ connect(m_greeter, &Greeter::promptlessChanged, this, &DBusGreeterList::promptlessChangedHandler);
3129}
3230
3331QString DBusGreeterList::GetActiveEntry() const
@@ -45,33 +43,14 @@ bool DBusGreeterList::entryIsLocked() const
4543 return !m_greeter->promptless();
4644}
4745
48−void DBusGreeterList::authenticationUserChangedHandler(const QString &user)
46+void DBusGreeterList::authenticationUserChangedHandler()
4947{
50− notifyPropertyChanged("ActiveEntry", user);
51− Q_EMIT EntrySelected(user);
48+ notifyPropertyChanged(QStringLiteral("ActiveEntry"), m_greeter->authenticationUser());
49+ Q_EMIT EntrySelected(m_greeter->authenticationUser());
5250}
5351
5452void DBusGreeterList::promptlessChangedHandler()
5553{
56− notifyPropertyChanged("EntryIsLocked", entryIsLocked());
54+ notifyPropertyChanged(QStringLiteral("EntryIsLocked"), entryIsLocked());
5755 Q_EMIT entryIsLockedChanged();
5856}
59−
60−// Manually emit a PropertiesChanged signal over DBus, because QtDBus
61−// doesn't do it for us on Q_PROPERTIES, oddly enough.
62−void DBusGreeterList::notifyPropertyChanged(const QString& propertyName, const QVariant &value)
63−{
64− QDBusMessage message;
65− QVariantMap changedProps;
66−
67− changedProps.insert(propertyName, value);
68−
69− message = QDBusMessage::createSignal(m_path,
70− "org.freedesktop.DBus.Properties",
71− "PropertiesChanged");
72− message << "com.canonical.UnityGreeter.List";
73− message << changedProps;
74− message << QStringList();
75−
76− m_connection.send(message);
77−}
plugins/LightDM/DBusGreeterList.h+4−8
@@ -17,16 +17,15 @@
1717#ifndef UNITY_DBUSGREETERLIST_H
1818#define UNITY_DBUSGREETERLIST_H
1919
20+#include "unitydbusobject.h"
2021#include <QDBusConnection>
21−#include <QObject>
2222
2323class Greeter;
24−class QDBusInterface;
2524
2625/** This is an internal class used to talk with the indicators.
2726 */
2827
29−class DBusGreeterList : public QObject
28+class DBusGreeterList : public UnityDBusObject
3029{
3130 Q_OBJECT
3231 Q_CLASSINFO("D-Bus Interface", "com.canonical.UnityGreeter.List")
@@ -35,7 +34,7 @@ class DBusGreeterList : public QObject
3534 Q_PROPERTY(bool EntryIsLocked READ entryIsLocked NOTIFY entryIsLockedChanged) // since 14.04
3635
3736public:
38− explicit DBusGreeterList(Greeter *greeter, const QDBusConnection &connection, const QString &path);
37+ explicit DBusGreeterList(Greeter *greeter, const QString &path);
3938
4039 Q_SCRIPTABLE void SetActiveEntry(const QString &entry); // since 13.04
4140 Q_SCRIPTABLE QString GetActiveEntry() const; // since 13.10
@@ -48,14 +47,11 @@ Q_SIGNALS:
4847 void entryIsLockedChanged();
4948
5049private Q_SLOTS:
51− void authenticationUserChangedHandler(const QString &user);
50+ void authenticationUserChangedHandler();
5251 void promptlessChangedHandler();
53− void notifyPropertyChanged(const QString &propertyName, const QVariant &value);
5452
5553private:
5654 Greeter *m_greeter;
57− QDBusConnection m_connection;
58− QString m_path;
5955};
6056
6157#endif
plugins/LightDM/FullLightDM/CMakeLists.txtnew file+32
@@ -0,0 +1,32 @@
1+pkg_check_modules(LIBLIGHTDM REQUIRED liblightdm-qt5-3)
2+
3+set(PLUGIN_CLASSNAME "FullLightDM")
4+
5+add_definitions(-DFULL_LIGHTDM)
6+
7+include_directories(
8+ ../
9+ ${CMAKE_CURRENT_BINARY_DIR}
10+ )
11+
12+include_directories(
13+ SYSTEM
14+ ${LIBLIGHTDM_INCLUDE_DIRS}
15+ )
16+
17+foreach(source_file ${QMLPLUGIN_SRC})
18+ list(APPEND RELATIVE_QMLPLUGIN_SRC ../${source_file})
19+endforeach()
20+
21+add_library(FullLightDM-qml MODULE
22+ ${RELATIVE_QMLPLUGIN_SRC}
23+ )
24+
25+target_link_libraries(FullLightDM-qml
26+ unity8-private
27+ ${LIBLIGHTDM_LDFLAGS}
28+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
29+ Qt5::DBus Qt5::Gui Qt5::Qml
30+ )
31+
32+add_unity8_plugin(FullLightDM 0.1 LightDM/FullLightDM TARGETS FullLightDM-qml)
plugins/LightDM/FullLightDM/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module LightDM.FullLightDM
2+plugin FullLightDM-qml
3+typeinfo FullLightDM.qmltypes
plugins/LightDM/Greeter.cpp+182−37
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2017 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,32 +13,20 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Author: Michael Terry <michael.terry@canonical.com>
1716 */
1817
1918#include "Greeter.h"
20−#include <QLightDM/Greeter>
21−
22−class GreeterPrivate
23−{
24−public:
25− explicit GreeterPrivate(Greeter *parent);
26−
27− QLightDM::Greeter *m_greeter;
28− bool wasPrompted;
29− bool promptless;
30−
31−protected:
32− Greeter * const q_ptr;
33−
34−private:
35− Q_DECLARE_PUBLIC(Greeter)
36−};
19+#include "GreeterPrivate.h"
20+#include <QCoreApplication>
21+#include <libintl.h>
3722
23+static Greeter *singleton = nullptr;
3824
3925GreeterPrivate::GreeterPrivate(Greeter* parent)
4026 : m_greeter(new QLightDM::Greeter(parent)),
41− wasPrompted(false),
27+ m_active(false),
28+ responded(false),
29+ everResponded(false),
4230 promptless(false),
4331 q_ptr(parent)
4432{
@@ -50,16 +38,54 @@ Greeter::Greeter(QObject* parent)
5038{
5139 Q_D(Greeter);
5240
53− connect(d->m_greeter, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
54− this, SLOT(showMessageFilter(QString, QLightDM::Greeter::MessageType)));
55− connect(d->m_greeter, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType)),
56− this, SLOT(showPromptFilter(QString, QLightDM::Greeter::PromptType)));
57− connect(d->m_greeter, SIGNAL(authenticationComplete()),
58− this, SLOT(authenticationCompleteFilter()));
41+ connect(d->m_greeter, &QLightDM::Greeter::showMessage,
42+ this, &Greeter::showMessageFilter);
43+ connect(d->m_greeter, &QLightDM::Greeter::showPrompt,
44+ this, &Greeter::showPromptFilter);
45+ connect(d->m_greeter, &QLightDM::Greeter::authenticationComplete,
46+ this, &Greeter::authenticationCompleteFilter);
47+
48+ // Don't get stuck waiting for PAM as we shut down.
49+ connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit,
50+ d->m_greeter, &QLightDM::Greeter::cancelAuthentication);
5951
6052 d->m_greeter->connectSync();
6153}
6254
55+Greeter::~Greeter()
56+{
57+ singleton = nullptr;
58+}
59+
60+Greeter *Greeter::instance()
61+{
62+ if (!singleton) {
63+ singleton = new Greeter;
64+ }
65+ return singleton;
66+}
67+
68+PromptsModel *Greeter::promptsModel()
69+{
70+ Q_D(Greeter);
71+ return &d->prompts;
72+}
73+
74+bool Greeter::isActive() const
75+{
76+ Q_D(const Greeter);
77+ return d->m_active;
78+}
79+
80+void Greeter::setIsActive(bool active)
81+{
82+ Q_D(Greeter);
83+ if (d->m_active != active) {
84+ d->m_active = active;
85+ Q_EMIT isActiveChanged();
86+ }
87+}
88+
6389bool Greeter::isAuthenticated() const
6490{
6591 Q_D(const Greeter);
@@ -69,7 +95,22 @@ bool Greeter::isAuthenticated() const
6995QString Greeter::authenticationUser() const
7096{
7197 Q_D(const Greeter);
72− return d->m_greeter->authenticationUser();
98+ return d->cachedAuthUser;
99+}
100+
101+void Greeter::checkAuthenticationUser()
102+{
103+ Q_D(Greeter);
104+ if (d->cachedAuthUser != d->m_greeter->authenticationUser()) {
105+ d->cachedAuthUser = d->m_greeter->authenticationUser();
106+ Q_EMIT authenticationUserChanged();
107+ }
108+}
109+
110+QString Greeter::defaultSessionHint() const
111+{
112+ Q_D(const Greeter);
113+ return d->m_greeter->defaultSessionHint();
73114}
74115
75116bool Greeter::promptless() const
@@ -78,22 +119,68 @@ bool Greeter::promptless() const
78119 return d->promptless;
79120}
80121
122+QString Greeter::selectUser() const
123+{
124+ Q_D(const Greeter);
125+ if (hasGuestAccount() && d->m_greeter->selectGuestHint()) {
126+ return QStringLiteral("*guest");
127+ } else {
128+ return d->m_greeter->selectUserHint();
129+ }
130+}
131+
132+bool Greeter::hasGuestAccount() const
133+{
134+ Q_D(const Greeter);
135+ return d->m_greeter->hasGuestAccountHint();
136+}
137+
138+bool Greeter::showManualLoginHint() const
139+{
140+ Q_D(const Greeter);
141+ return d->m_greeter->showManualLoginHint();
142+}
143+
144+bool Greeter::hideUsersHint() const
145+{
146+ Q_D(const Greeter);
147+ return d->m_greeter->hideUsersHint();
148+}
149+
81150void Greeter::authenticate(const QString &username)
82151{
83152 Q_D(Greeter);
84− d->wasPrompted = false;
153+ d->prompts.clear();
154+ d->responded = false;
155+ d->everResponded = false;
85156 if (d->promptless) {
86157 d->promptless = false;
87158 Q_EMIT promptlessChanged();
88159 }
89160
90− d->m_greeter->authenticate(username);
91− Q_EMIT authenticationUserChanged(username);
161+ if (authenticationUser() == username) {
162+ d->prompts = d->leftovers;
163+ }
164+ d->leftovers.clear();
165+
166+ if (username == QStringLiteral("*guest")) {
167+ d->m_greeter->authenticateAsGuest();
168+ } else if (username == QStringLiteral("*other")) {
169+ d->m_greeter->authenticate(nullptr);
170+ } else {
171+ d->m_greeter->authenticate(username);
172+ }
173+
174+ Q_EMIT authenticationStarted();
175+ Q_EMIT isAuthenticatedChanged();
176+ checkAuthenticationUser();
92177}
93178
94179void Greeter::respond(const QString &response)
95180{
96181 Q_D(Greeter);
182+ d->responded = true;
183+ d->everResponded = true;
97184 d->m_greeter->respond(response);
98185}
99186
@@ -106,29 +193,87 @@ bool Greeter::startSessionSync(const QString &session)
106193void Greeter::showPromptFilter(const QString &text, QLightDM::Greeter::PromptType type)
107194{
108195 Q_D(Greeter);
109− d->wasPrompted = true;
196+
197+ checkAuthenticationUser(); // may have changed in liblightdm
198+
199+ bool isDefaultPrompt = (text == dgettext("Linux-PAM", "Password: "));
200+ bool isSecret = type == QLightDM::Greeter::PromptTypeSecret;
201+
202+ QString trimmedText;
203+ if (!isDefaultPrompt)
204+ trimmedText = text.trimmed();
110205
111206 // Strip prompt of any colons at the end
112− QString trimmedText = text.trimmed();
113− if (trimmedText.endsWith(":") || trimmedText.endsWith(":")) {
207+ if (trimmedText.endsWith(':') || trimmedText.endsWith(QStringLiteral(":"))) {
114208 trimmedText.chop(1);
115209 }
116210
117− Q_EMIT showPrompt(trimmedText, type == QLightDM::Greeter::PromptTypeSecret);
211+ if (trimmedText == "login") {
212+ // 'login' is provided untranslated by LightDM when asking for a manual
213+ // login username.
214+ trimmedText = gettext("Username");
215+ }
216+
217+ if (d->responded) {
218+ d->prompts.clear();
219+ d->responded = false;
220+ }
221+
222+ d->prompts.append(trimmedText, isSecret ? PromptsModel::Secret : PromptsModel::Question);
118223}
119224
120225void Greeter::showMessageFilter(const QString &text, QLightDM::Greeter::MessageType type)
121226{
122− Q_EMIT showMessage(text, type == QLightDM::Greeter::MessageTypeError);
227+ Q_D(Greeter);
228+
229+ checkAuthenticationUser(); // may have changed in liblightdm
230+
231+ bool isError = type == QLightDM::Greeter::MessageTypeError;
232+
233+ if (d->responded) {
234+ d->prompts.clear();
235+ d->responded = false;
236+ }
237+ d->prompts.append(text, isError? PromptsModel::Error : PromptsModel::Message);
123238}
124239
125240void Greeter::authenticationCompleteFilter()
126241{
127242 Q_D(Greeter);
128− if (!d->wasPrompted) {
243+
244+ Q_EMIT isAuthenticatedChanged();
245+
246+ bool automatic = !d->everResponded;
247+ bool pamHasLeftoverMessages = !d->prompts.hasPrompt() && d->prompts.rowCount() > 0;
248+
249+ if (isAuthenticated() && automatic) {
129250 d->promptless = true;
130251 Q_EMIT promptlessChanged();
131252 }
132253
133− Q_EMIT authenticationComplete();
254+ if (!isAuthenticated()) {
255+ if (pamHasLeftoverMessages) {
256+ d->leftovers = d->prompts; // Prefer PAM's messages
257+ } else if (automatic) {
258+ d->leftovers.append(gettext("Failed to authenticate"), PromptsModel::Error);
259+ } else {
260+ d->leftovers.append(gettext("Invalid password, please try again"), PromptsModel::Error);
261+ }
262+ } else if (pamHasLeftoverMessages) {
263+ automatic = true; // treat this successful login as automatic, so user sees message
264+ d->leftovers = d->prompts;
265+ }
266+
267+ if (automatic) {
268+ d->prompts = d->leftovers; // OK, we'll just use these now
269+ d->leftovers.clear();
270+ d->prompts.append(isAuthenticated() ? gettext("Log In") : gettext("Retry"),
271+ PromptsModel::Button);
272+ }
273+
274+ if (isAuthenticated()) {
275+ Q_EMIT loginSuccess(automatic);
276+ } else {
277+ Q_EMIT loginError(automatic);
278+ }
134279}
plugins/LightDM/Greeter.h+30−13
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,7 +13,6 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1716 */
1817
1918/* This class is a really tiny filter around QLightDM::Greeter. There are some
@@ -22,46 +21,65 @@
2221 such edits in the future, and by inserting ourselves here, we have more
2322 control. */
2423
25−#ifndef UNITY_GREETER_H
26−#define UNITY_GREETER_H
24+#pragma once
2725
2826#include <QLightDM/Greeter>
2927#include <QtCore/QObject>
3028
3129class GreeterPrivate;
30+class PromptsModel;
3231
3332class Greeter : public QObject
3433{
3534 Q_OBJECT
3635
37− Q_PROPERTY(bool authenticated READ isAuthenticated)
36+ Q_PROPERTY(bool active READ isActive WRITE setIsActive NOTIFY isActiveChanged)
37+ Q_PROPERTY(bool authenticated READ isAuthenticated NOTIFY isAuthenticatedChanged)
3838 Q_PROPERTY(QString authenticationUser READ authenticationUser NOTIFY authenticationUserChanged)
39+ Q_PROPERTY(QString defaultSession READ defaultSessionHint CONSTANT)
3940 Q_PROPERTY(bool promptless READ promptless NOTIFY promptlessChanged)
41+ Q_PROPERTY(QString selectUser READ selectUser CONSTANT)
4042
4143public:
42− explicit Greeter(QObject* parent=0);
44+ static Greeter *instance();
45+ virtual ~Greeter();
4346
47+ bool isActive() const;
4448 bool isAuthenticated() const;
4549 QString authenticationUser() const;
50+ QString defaultSessionHint() const;
4651 bool promptless() const;
52+ QString selectUser() const;
53+ bool hasGuestAccount() const;
54+ bool showManualLoginHint() const;
55+ bool hideUsersHint() const;
56+
57+ PromptsModel *promptsModel();
4758
4859public Q_SLOTS:
4960 void authenticate(const QString &username=QString());
5061 void respond(const QString &response);
5162 bool startSessionSync(const QString &session=QString());
63+ void setIsActive(bool isActive);
5264
5365Q_SIGNALS:
54− void showMessage(const QString &text, bool isError);
55− void showPrompt(const QString &text, bool isSecret);
56− void authenticationComplete();
57− void authenticationUserChanged(const QString &user);
66+ void authenticationUserChanged();
67+ void isActiveChanged();
68+ void isAuthenticatedChanged();
5869 void promptlessChanged();
70+ void showGreeter();
71+ void hideGreeter();
72+ void loginError(bool automatic);
73+ void loginSuccess(bool automatic);
74+ void authenticationStarted(); // useful for testing
5975
6076 // This signal is emitted by external agents like indicators, and the UI
6177 // should switch to this user if possible.
6278 void requestAuthenticationUser(const QString &user);
6379
64−private:
80+protected:
81+ explicit Greeter(QObject* parent=0);
82+
6583 GreeterPrivate * const d_ptr;
6684
6785 Q_DECLARE_PRIVATE(Greeter)
@@ -70,6 +88,5 @@ private Q_SLOTS:
7088 void showMessageFilter(const QString &text, QLightDM::Greeter::MessageType type);
7189 void showPromptFilter(const QString &text, QLightDM::Greeter::PromptType type);
7290 void authenticationCompleteFilter();
91+ void checkAuthenticationUser();
7392};
74−
75−#endif
tools/registry-tracker.h → plugins/LightDM/GreeterPrivate.hrenamed+22−21
@@ -1,8 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * Authors:
5− * Michal Hruby <michal.hruby@canonical.com>
2+ * Copyright (C) 2015-2017 Canonical, Ltd.
63 *
74 * This program is free software; you can redistribute it and/or modify
85 * it under the terms of the GNU General Public License as published by
@@ -17,28 +14,32 @@
1714 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1815 */
1916
20−// Qt
21−#include <QProcess>
22−#include <QTemporaryFile>
23−#include <QTemporaryDir>
24−#include <QDebug>
17+#pragma once
18+
19+#include "PromptsModel.h"
20+#include <QObject>
2521
22+namespace QLightDM {
23+ class Greeter;
24+}
2625
27−class RegistryTracker
26+class GreeterPrivate
2827{
2928public:
30− RegistryTracker(QString const&);
31− ~RegistryTracker();
29+ explicit GreeterPrivate(Greeter *parent);
3230
33− QProcess* registry() const;
31+ QLightDM::Greeter *m_greeter;
32+ bool m_active;
33+ PromptsModel prompts;
34+ PromptsModel leftovers; // prompts to show during next auth for same user
35+ bool responded;
36+ bool everResponded;
37+ bool promptless;
38+ QString cachedAuthUser;
3439
35−private:
36− void runRegistry();
40+protected:
41+ Greeter * const q_ptr;
3742
38− QString m_scopeDir;
39− QProcess m_registry;
40− QTemporaryDir m_endpoints_dir;
41− QTemporaryFile m_runtime_config;
42− QTemporaryFile m_registry_config;
43− QTemporaryFile m_mw_config;
43+private:
44+ Q_DECLARE_PUBLIC(Greeter)
4445};
plugins/LightDM/IntegratedLightDM/CMakeLists.txtnew file+33
@@ -0,0 +1,33 @@
1+set(PLUGIN_CLASSNAME "IntegratedLightDM")
2+
3+add_definitions(-DINTEGRATED_LIGHTDM)
4+
5+foreach(include_directory ${QMLPLUGIN_INCLUDES})
6+ list(APPEND RELATIVE_QMLPLUGIN_INCLUDES ../${include_directory})
7+endforeach()
8+
9+include_directories(
10+ . #QLightDM
11+ ${QMLPLUGIN_INCLUDES}
12+ ${libunity8-private_SOURCE_DIR}
13+ ${CMAKE_CURRENT_BINARY_DIR}
14+)
15+
16+foreach(source_file ${QMLPLUGIN_SRC})
17+ list(APPEND RELATIVE_QMLPLUGIN_SRC ../${source_file})
18+endforeach()
19+
20+add_library(IntegratedLightDM-qml MODULE
21+ ${RELATIVE_QMLPLUGIN_SRC}
22+ )
23+
24+target_link_libraries(IntegratedLightDM-qml
25+ integratedLightDM
26+ unity8-private
27+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28+ Qt5::DBus Qt5::Gui Qt5::Qml
29+ )
30+
31+add_unity8_plugin(IntegratedLightDM 0.1 LightDM/IntegratedLightDM TARGETS IntegratedLightDM-qml)
32+
33+add_subdirectory(liblightdm)
qml/Panel/PanelBackground.qml → plugins/LightDM/IntegratedLightDM/QLightDM/Greeterrenamed+2−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,8 +14,4 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
18−
19−Rectangle {
20− color: "black"
21−}
17+#include "../liblightdm/Greeter.h"
tests/mocks/Unity/Indicators/qml/fake_menu_widget1.qml → plugins/LightDM/IntegratedLightDM/QLightDM/SessionsModelrenamed+2−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright (C) 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,10 +14,4 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
18−
19−Rectangle {
20− width: 40
21− height: 40
22− color : "red"
23−}
17+#include "../liblightdm/SessionsModel.h"
tests/mocks/Unity/Indicators/qml/fake_menu_widget2.qml → plugins/LightDM/IntegratedLightDM/QLightDM/UsersModelrenamed+2−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright 2013 Canonical Ltd.
2+ * Copyright (C) 2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,10 +14,4 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
18−
19−Rectangle {
20− width: 40
21− height: 40
22− color : "blue"
23−}
17+#include "../liblightdm/UsersModel.h"
plugins/LightDM/IntegratedLightDM/liblightdm/CMakeLists.txtnew file+54
@@ -0,0 +1,54 @@
1+pkg_check_modules(LIBUSERMETRICSOUTPUT REQUIRED libusermetricsoutput-1)
2+
3+set(LibLightDM_SOURCES
4+ Greeter.cpp
5+ SessionsModel.cpp
6+ UsersModel.cpp
7+ GreeterPrivate.cpp
8+ SessionsModelPrivate.cpp
9+ UsersModelPrivate.cpp
10+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
11+ ${CMAKE_SOURCE_DIR}/plugins/Utils/qvariantlistmodel.cpp
12+ )
13+
14+add_library(integratedLightDM STATIC ${LibLightDM_SOURCES})
15+add_library(integratedLightDMSession STATIC ${LibLightDM_SOURCES})
16+add_library(MockLightDM-demo-shared SHARED ${LibLightDM_SOURCES})
17+
18+include_directories(
19+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService
20+ ${CMAKE_CURRENT_BINARY_DIR}
21+ ${GLIB_INCLUDE_DIRS}
22+ ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
23+)
24+
25+target_link_libraries(integratedLightDM
26+ ${GLIB_LIBRARIES}
27+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
28+ -lpam
29+ Qt5::Concurrent Qt5::DBus Qt5::Gui
30+)
31+target_link_libraries(integratedLightDMSession
32+ ${GLIB_LIBRARIES}
33+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
34+ -lpam
35+ Qt5::Concurrent Qt5::DBus Qt5::Gui
36+)
37+target_link_libraries(MockLightDM-demo-shared
38+ ${GLIB_LIBRARIES}
39+ ${LIBUSERMETRICSOUTPUT_LDFLAGS}
40+ -lpam
41+ Qt5::Concurrent Qt5::DBus Qt5::Gui
42+)
43+
44+set_target_properties(integratedLightDM PROPERTIES
45+ COMPILE_FLAGS "-DSM_BUSNAME=systemBus -fPIC")
46+set_target_properties(integratedLightDMSession PROPERTIES
47+ COMPILE_FLAGS "-DSM_BUSNAME=sessionBus -fPIC")
48+set_target_properties(MockLightDM-demo-shared PROPERTIES
49+ COMPILE_FLAGS "-DSM_BUSNAME=systemBus"
50+ OUTPUT_NAME lightdm-qt5-3)
51+
52+install(TARGETS MockLightDM-demo-shared
53+ DESTINATION ${SHELL_INSTALL_QML}/mocks/LightDM/IntegratedLightDM/demo
54+ )
tests/mocks/LightDM/Greeter.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.cpprenamed+29−14
@@ -16,9 +16,17 @@
1616 * Author: Michael Terry <michael.terry@canonical.com>
1717 */
1818
19+
20+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
22+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
23+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
24+
25+
1926#include "Greeter.h"
2027#include "GreeterPrivate.h"
2128#include <QtCore/QCoreApplication>
29+#include <QTimer>
2230
2331namespace QLightDM
2432{
@@ -41,18 +49,18 @@ QString Greeter::authenticationUser() const
4149
4250bool Greeter::hasGuestAccountHint() const
4351{
44− return true;
52+ return false;
4553}
4654
4755QString Greeter::getHint(const QString &name) const
4856{
4957 Q_UNUSED(name)
50− return "";
58+ return QLatin1String("");
5159}
5260
5361QString Greeter::defaultSessionHint() const
5462{
55− return "ubuntu";
63+ return QStringLiteral("ubuntu");
5664}
5765
5866bool Greeter::hideUsersHint() const
@@ -62,22 +70,17 @@ bool Greeter::hideUsersHint() const
6270
6371bool Greeter::showManualLoginHint() const
6472{
65− return true;
73+ return false;
6674}
6775
6876bool Greeter::showRemoteLoginHint() const
69−{
70− return true;
71−}
72−
73−bool Greeter::lockHint () const
7477{
7578 return false;
7679}
7780
7881QString Greeter::selectUserHint() const
7982{
80− return "";
83+ return QLatin1String("");
8184}
8285
8386bool Greeter::selectGuestHint() const
@@ -87,7 +90,7 @@ bool Greeter::selectGuestHint() const
8790
8891QString Greeter::autologinUserHint() const
8992{
90− return "";
93+ return QLatin1String("");
9194}
9295
9396bool Greeter::autologinGuestHint() const
@@ -107,7 +110,7 @@ bool Greeter::inAuthentication() const
107110
108111QString Greeter::hostname() const
109112{
110− return "hostname1";
113+ return QStringLiteral("hostname1");
111114}
112115
113116bool Greeter::isAuthenticated() const
@@ -127,7 +130,6 @@ void Greeter::authenticate(const QString &username)
127130
128131 d->authenticated = false;
129132 d->authenticationUser = username;
130− d->twoFactorDone = false;
131133 d->handleAuthenticate();
132134}
133135
@@ -144,7 +146,10 @@ void Greeter::authenticateRemote(const QString &session, const QString &username
144146}
145147
146148void Greeter::cancelAuthentication()
147−{}
149+{
150+ Q_D(Greeter);
151+ d->cancelAuthentication();
152+}
148153
149154void Greeter::setLanguage (const QString &language)
150155{
@@ -164,4 +169,14 @@ void Greeter::respond(const QString &response)
164169 d->handleRespond(response);
165170}
166171
172+void Greeter::sendAuthenticationComplete()
173+{
174+ if (qEnvironmentVariableIsEmpty("UNITY_TESTING")) {
175+ // simulate PAM's delay
176+ QTimer::singleShot(1000, this, &Greeter::authenticationComplete);
177+ } else {
178+ Q_EMIT authenticationComplete();
179+ }
180+}
181+
167182}
tests/mocks/LightDM/Greeter.h → plugins/LightDM/IntegratedLightDM/liblightdm/Greeter.hrenamed+9−6
@@ -24,6 +24,10 @@
2424#include <QtCore/QObject>
2525#include <QtCore/QVariant>
2626
27+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
29+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
30+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
2731
2832namespace QLightDM
2933{
@@ -41,22 +45,19 @@ class Q_DECL_EXPORT Greeter : public QObject
4145
4246 Q_PROPERTY(QString hostname READ hostname CONSTANT)
4347 Q_PROPERTY(bool hasGuestAccount READ hasGuestAccountHint CONSTANT)
44− Q_PROPERTY(bool locked READ lockHint CONSTANT)
45−
46− Q_PROPERTY(QString hostname READ hostname CONSTANT)
47−
48− Q_ENUMS(PromptType MessageType)
4948
5049public:
5150 enum PromptType {
5251 PromptTypeQuestion,
5352 PromptTypeSecret
5453 };
54+ Q_ENUM(PromptType)
5555
5656 enum MessageType {
5757 MessageTypeInfo,
5858 MessageTypeError
5959 };
60+ Q_ENUM(MessageType)
6061
6162 explicit Greeter(QObject* parent=0);
6263 virtual ~Greeter();
@@ -66,7 +67,6 @@ public:
6667 bool hideUsersHint() const;
6768 bool showManualLoginHint() const;
6869 bool showRemoteLoginHint() const;
69− bool lockHint () const;
7070 bool hasGuestAccountHint() const;
7171 QString selectUserHint() const;
7272 bool selectGuestHint() const;
@@ -96,6 +96,9 @@ Q_SIGNALS:
9696 void authenticationComplete();
9797 void autologinTimerExpired();
9898
99+protected:
100+ void sendAuthenticationComplete();
101+
99102private:
100103 GreeterPrivate *d_ptr;
101104 Q_DECLARE_PRIVATE(Greeter)
plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.cppnew file+309
@@ -0,0 +1,309 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Michael Terry <michael.terry@canonical.com>
17+ */
18+
19+#include "Greeter.h"
20+#include "GreeterPrivate.h"
21+#include <QFuture>
22+#include <QFutureInterface>
23+#include <QFutureWatcher>
24+#include <QQueue>
25+#include <QtConcurrent>
26+#include <QVector>
27+#include <security/pam_appl.h>
28+
29+namespace QLightDM
30+{
31+
32+class GreeterImpl : public QObject
33+{
34+ Q_OBJECT
35+
36+ struct AppData
37+ {
38+ GreeterImpl *impl;
39+ pam_handle *handle;
40+ };
41+
42+ typedef QFutureInterface<QString> ResponseFuture;
43+
44+public:
45+ explicit GreeterImpl(Greeter *parent, GreeterPrivate *greeterPrivate)
46+ : QObject(parent),
47+ greeter(parent),
48+ greeterPrivate(greeterPrivate),
49+ pamHandle(nullptr)
50+ {
51+ qRegisterMetaType<QLightDM::GreeterImpl::ResponseFuture>("QLightDM::GreeterImpl::ResponseFuture");
52+
53+ connect(&futureWatcher, &QFutureWatcher<int>::finished, this, &GreeterImpl::finishPam);
54+ connect(this, SIGNAL(showMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)),
55+ this, SLOT(handleMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)));
56+ // This next connect is how we pass ResponseFutures between threads
57+ connect(this, SIGNAL(showPrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
58+ this, SLOT(handlePrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
59+ Qt::BlockingQueuedConnection);
60+ }
61+
62+ ~GreeterImpl()
63+ {
64+ cancelPam();
65+ }
66+
67+ void start(QString username)
68+ {
69+ // Clear out any existing PAM interactions first
70+ cancelPam();
71+ if (pamHandle != nullptr) {
72+ // While we were cancelling pam above, we processed Qt events.
73+ // Which may have allowed someone to call start() on us again.
74+ // In which case, we'll bail on our current start() call.
75+ // This isn't racy because it's all in the same thread.
76+ return;
77+ }
78+
79+ AppData *appData = new AppData();
80+ appData->impl = this;
81+
82+ // Now actually start a new conversation with PAM
83+ pam_conv conversation;
84+ conversation.conv = converseWithPam;
85+ conversation.appdata_ptr = static_cast<void*>(appData);
86+
87+ if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
88+ appData->handle = pamHandle;
89+ futureWatcher.setFuture(QtConcurrent::mapped(QList<pam_handle*>() << pamHandle, authenticateWithPam));
90+ } else {
91+ delete appData;
92+ greeterPrivate->authenticated = false;
93+ Q_EMIT greeter->showMessage(QStringLiteral("Internal error: could not start PAM authentication"), QLightDM::Greeter::MessageTypeError);
94+ Q_EMIT greeter->authenticationComplete();
95+ }
96+ }
97+
98+ static int authenticateWithPam(pam_handle* const& pamHandle)
99+ {
100+ int pamStatus = pam_authenticate(pamHandle, 0);
101+ if (pamStatus == PAM_SUCCESS) {
102+ pamStatus = pam_acct_mgmt(pamHandle, 0);
103+ }
104+ if (pamStatus == PAM_NEW_AUTHTOK_REQD) {
105+ pamStatus = pam_chauthtok(pamHandle, PAM_CHANGE_EXPIRED_AUTHTOK);
106+ }
107+ if (pamStatus == PAM_SUCCESS) {
108+ pam_setcred(pamHandle, PAM_REINITIALIZE_CRED);
109+ }
110+ return pamStatus;
111+ }
112+
113+ static int converseWithPam(int num_msg, const pam_message** msg,
114+ pam_response** resp, void* appdata_ptr)
115+ {
116+ if (num_msg <= 0)
117+ return PAM_CONV_ERR;
118+
119+ auto* tmp_response = static_cast<pam_response*>(calloc(num_msg, sizeof(pam_response)));
120+ if (!tmp_response)
121+ return PAM_CONV_ERR;
122+
123+ AppData *appData = static_cast<AppData*>(appdata_ptr);
124+ GreeterImpl *impl = appData->impl;
125+ pam_handle *handle = appData->handle;
126+
127+ int count;
128+ QVector<ResponseFuture> responses;
129+
130+ for (count = 0; count < num_msg; ++count)
131+ {
132+ switch (msg[count]->msg_style)
133+ {
134+ case PAM_PROMPT_ECHO_ON:
135+ {
136+ QString message(msg[count]->msg);
137+ responses.append(ResponseFuture());
138+ responses.last().reportStarted();
139+ Q_EMIT impl->showPrompt(handle, message, Greeter::PromptTypeQuestion, responses.last());
140+ break;
141+ }
142+ case PAM_PROMPT_ECHO_OFF:
143+ {
144+ QString message(msg[count]->msg);
145+ responses.append(ResponseFuture());
146+ responses.last().reportStarted();
147+ Q_EMIT impl->showPrompt(handle, message, Greeter::PromptTypeSecret, responses.last());
148+ break;
149+ }
150+ case PAM_TEXT_INFO:
151+ {
152+ QString message(msg[count]->msg);
153+ Q_EMIT impl->showMessage(handle, message, Greeter::MessageTypeInfo);
154+ break;
155+ }
156+ default:
157+ {
158+ QString message(msg[count]->msg);
159+ Q_EMIT impl->showMessage(handle, message, Greeter::MessageTypeError);
160+ break;
161+ }
162+ }
163+ }
164+
165+ int i = 0;
166+ bool raise_error = false;
167+
168+ for (auto &response : responses)
169+ {
170+ pam_response* resp_item = &tmp_response[i++];
171+ resp_item->resp_retcode = 0;
172+ resp_item->resp = strdup(response.future().result().toUtf8());
173+
174+ if (!resp_item->resp)
175+ {
176+ raise_error = true;
177+ break;
178+ }
179+ }
180+
181+ delete appData;
182+
183+ if (raise_error)
184+ {
185+ for (int i = 0; i < count; ++i)
186+ free(tmp_response[i].resp);
187+
188+ free(tmp_response);
189+ return PAM_CONV_ERR;
190+ }
191+ else
192+ {
193+ *resp = tmp_response;
194+ return PAM_SUCCESS;
195+ }
196+ }
197+
198+public Q_SLOTS:
199+ bool respond(QString response)
200+ {
201+ if (!futures.isEmpty()) {
202+ futures.dequeue().reportFinished(&response);
203+ return true;
204+ } else {
205+ return false;
206+ }
207+ }
208+
209+ void cancelPam()
210+ {
211+ if (pamHandle != nullptr) {
212+ QFuture<int> pamFuture = futureWatcher.future();
213+ pam_handle *handle = pamHandle;
214+ pamHandle = nullptr; // to disable normal finishPam() handling
215+ pamFuture.cancel();
216+
217+ // Note the empty loop, we just want to clear the futures queue.
218+ // Any further prompts from the pam thread will be immediately
219+ // responded to/dismissed in handlePrompt().
220+ while (respond(QString()));
221+
222+ // Now let signal/slot handling happen so the thread can finish
223+ while (!pamFuture.isFinished()) {
224+ QCoreApplication::processEvents();
225+ }
226+
227+ pam_end(handle, PAM_CONV_ERR);
228+ }
229+ }
230+
231+Q_SIGNALS:
232+ void showMessage(pam_handle *handle, QString text, QLightDM::Greeter::MessageType type);
233+ void showPrompt(pam_handle *handle, QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
234+
235+private Q_SLOTS:
236+ void finishPam()
237+ {
238+ if (pamHandle == nullptr) {
239+ return;
240+ }
241+
242+ int pamStatus = futureWatcher.result();
243+
244+ pam_end(pamHandle, pamStatus);
245+ pamHandle = nullptr;
246+
247+ greeterPrivate->authenticated = (pamStatus == PAM_SUCCESS);
248+ Q_EMIT greeter->authenticationComplete();
249+ }
250+
251+ void handleMessage(pam_handle *handle, QString text, QLightDM::Greeter::MessageType type)
252+ {
253+ if (handle != pamHandle)
254+ return;
255+
256+ Q_EMIT greeter->showMessage(text, type);
257+ }
258+
259+ void handlePrompt(pam_handle *handle, QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture future)
260+ {
261+ if (handle != pamHandle) {
262+ future.reportResult(QString());
263+ future.reportFinished();
264+ return;
265+ }
266+
267+ futures.enqueue(future);
268+ Q_EMIT greeter->showPrompt(text, type);
269+ }
270+
271+private:
272+ Greeter *greeter;
273+ GreeterPrivate *greeterPrivate;
274+ pam_handle* pamHandle;
275+ QFutureWatcher<int> futureWatcher;
276+ QQueue<ResponseFuture> futures;
277+};
278+
279+GreeterPrivate::GreeterPrivate(Greeter* parent)
280+ : authenticated(false),
281+ authenticationUser(),
282+ m_impl(new GreeterImpl(parent, this)),
283+ q_ptr(parent)
284+{
285+}
286+
287+GreeterPrivate::~GreeterPrivate()
288+{
289+ delete m_impl;
290+}
291+
292+void GreeterPrivate::handleAuthenticate()
293+{
294+ m_impl->start(authenticationUser);
295+}
296+
297+void GreeterPrivate::handleRespond(const QString &response)
298+{
299+ m_impl->respond(response);
300+}
301+
302+void GreeterPrivate::cancelAuthentication()
303+{
304+ m_impl->cancelPam();
305+}
306+
307+}
308+
309+#include "GreeterPrivate.moc"
tests/mocks/LightDM/GreeterPrivate.h → plugins/LightDM/IntegratedLightDM/liblightdm/GreeterPrivate.hrenamed+4−2
@@ -24,22 +24,24 @@
2424namespace QLightDM
2525{
2626class Greeter;
27+class GreeterImpl;
2728
2829class GreeterPrivate
2930{
3031public:
3132 explicit GreeterPrivate(Greeter* parent=0);
32− virtual ~GreeterPrivate() = default;
33+ virtual ~GreeterPrivate();
3334
3435 // These variables may not be used by all subclasses, that's no problem
3536 bool authenticated;
3637 QString authenticationUser;
37− bool twoFactorDone;
3838
3939 void handleAuthenticate();
4040 void handleRespond(const QString &response);
41+ void cancelAuthentication();
4142
4243protected:
44+ GreeterImpl *m_impl; // if the backend needs more private data
4345 Greeter * const q_ptr;
4446
4547private:
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.cppnew file+87
@@ -0,0 +1,87 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+
19+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
20+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
21+ * COUNTERPART IN tests/mocks/LightDM/IntegratedLightDM/liblightdm
22+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
23+
24+// LightDM currently is Qt4 compatible, and so doesn't define setRoleNames.
25+// To use the same method of setting role name that it does, we
26+// set our compatibility to Qt4 here too.
27+#define QT_DISABLE_DEPRECATED_BEFORE QT_VERSION_CHECK(4, 0, 0)
28+
29+#include "SessionsModel.h"
30+#include "SessionsModelPrivate.h"
31+#include <QtCore/QDir>
32+#include <QtCore/QString>
33+
34+namespace QLightDM
35+{
36+
37+SessionsModel::SessionsModel(QObject* parent) :
38+ QAbstractListModel(parent),
39+ d_ptr(new SessionsModelPrivate(this))
40+{
41+ m_roleNames = QAbstractListModel::roleNames();
42+ m_roleNames[KeyRole] = "key";
43+ m_roleNames[TypeRole] = "type";
44+}
45+
46+SessionsModel::~SessionsModel()
47+{
48+ delete d_ptr;
49+}
50+
51+QVariant SessionsModel::data(const QModelIndex& index, int role) const
52+{
53+ Q_D(const SessionsModel);
54+
55+ if(!index.isValid()) {
56+ return QVariant();
57+ }
58+
59+ int row = index.row();
60+
61+ switch (role) {
62+ case QLightDM::SessionsModel::KeyRole:
63+ return d->sessionItems[row].key;
64+ case Qt::DisplayRole:
65+ return d->sessionItems[row].name;
66+ default:
67+ return QVariant();
68+ }
69+}
70+
71+QHash<int, QByteArray> SessionsModel::roleNames() const
72+{
73+ return m_roleNames;
74+}
75+
76+int SessionsModel::rowCount(const QModelIndex& parent) const
77+{
78+ Q_D(const SessionsModel);
79+
80+ if (parent.isValid()) {
81+ return 0;
82+ } else { // parent is root
83+ return d->sessionItems.size();
84+ }
85+}
86+
87+} // namespace QLightDM
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModel.hnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#ifndef UNITY_INTEGRATED_SESSIONSMODEL_H
19+#define UNITY_INTEGRATED_SESSIONSMODEL_H
20+
21+#include <QtCore/QAbstractListModel>
22+#include <QtCore/QString>
23+
24+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
25+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
26+ * COUNTERPART IN tests/mocks/LightDM/IntegratedLightDM/liblightdm
27+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
28+
29+// This is taken from liblightdm and modified to confirm to our syle conventions
30+namespace QLightDM
31+{
32+class SessionsModelPrivate;
33+
34+class Q_DECL_EXPORT SessionsModel : public QAbstractListModel
35+ {
36+ Q_OBJECT
37+
38+ public:
39+
40+ enum SessionModelRoles {
41+ //name is exposed as Qt::DisplayRole
42+ //comment is exposed as Qt::TooltipRole
43+ KeyRole = Qt::UserRole,
44+ IdRole = KeyRole, /** Deprecated */
45+ TypeRole
46+ };
47+ Q_ENUM(SessionModelRoles)
48+
49+ enum SessionType {
50+ LocalSessions,
51+ RemoteSessions
52+ };
53+ Q_ENUM(SessionType)
54+
55+ explicit SessionsModel(QObject* parent=0); /** Deprecated. Loads local sessions*/
56+ explicit SessionsModel(SessionsModel::SessionType, QObject* parent=0);
57+ virtual ~SessionsModel();
58+
59+ QHash<int, QByteArray> roleNames() const override;
60+ int rowCount(const QModelIndex& parent) const override;
61+ QVariant data(const QModelIndex& index, int role) const override;
62+
63+ protected:
64+ SessionsModelPrivate* const d_ptr;
65+
66+ private:
67+ QHash<int, QByteArray> m_roleNames;
68+ Q_DECLARE_PRIVATE(SessionsModel)
69+ };
70+}
71+
72+#endif // UNITY_INTEGRATED_SESSIONSMODEL_H
tests/mocks/LightDM/single/GreeterPrivate.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.cpprenamed+13−23
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,34 +13,24 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Author: Michael Terry <michael.terry@canonical.com>
1716 */
1817
19−#include "../Greeter.h"
20−#include "../GreeterPrivate.h"
18+#include "SessionsModelPrivate.h"
2119
22−namespace QLightDM
23−{
24−
25−GreeterPrivate::GreeterPrivate(Greeter* parent)
26− : authenticated(false),
27− authenticationUser(),
28− twoFactorDone(false),
29− q_ptr(parent)
30−{
31−}
20+#include <QDir>
21+#include <QSettings>
22+#include <QStringList>
3223
33−void GreeterPrivate::handleAuthenticate()
24+namespace QLightDM
3425{
35− Q_Q(Greeter);
36−
37− authenticated = true;
38− Q_EMIT q->authenticationComplete();
39−}
4026
41−void GreeterPrivate::handleRespond(QString const &response)
27+SessionsModelPrivate::SessionsModelPrivate(SessionsModel* parent)
28+ : q_ptr(parent)
4229{
43− Q_UNUSED(response)
30+ // Since this model is never visible, as there is only 1 session,
31+ // just use the session name as the key
32+ QString sessionName = qgetenv("XDG_SESSION_DESKTOP");
33+ sessionItems.append({sessionName, "", sessionName, ""});
4434}
4535
46−}
36+} // namespace QLightDM
plugins/LightDM/IntegratedLightDM/liblightdm/SessionsModelPrivate.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#ifndef UNITY_INTEGRATED_SESSIONSMODEL_PRIVATE_H
19+#define UNITY_INTEGRATED_SESSIONSMODEL_PRIVATE_H
20+
21+#include <QtCore/QList>
22+#include <QtCore/QString>
23+
24+namespace QLightDM
25+{
26+class SessionsModel;
27+
28+class SessionItem
29+{
30+public:
31+ QString key;
32+ QString type; // unused
33+ QString name;
34+ QString comment; // unused
35+};
36+
37+class SessionsModelPrivate
38+{
39+public:
40+ explicit SessionsModelPrivate(SessionsModel* parent=0);
41+ virtual ~SessionsModelPrivate() = default;
42+
43+ QList<SessionItem> sessionItems;
44+
45+protected:
46+ SessionsModel* const q_ptr;
47+
48+private:
49+ Q_DECLARE_PUBLIC(SessionsModel)
50+};
51+
52+} // namespace QLightDM
53+
54+#endif // UNITY_INTEGRATED_SESSIONSMODEL_PRIVATE_H
tests/mocks/LightDM/UsersModel.cpp → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.cpprenamed+14−21
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -16,6 +16,12 @@
1616 * Author: Michael Terry <michael.terry@canonical.com>
1717 */
1818
19+
20+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
22+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
23+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
24+
1925// LightDM currently is Qt4 compatible, and so doesn't define setRoleNames.
2026// To use the same method of setting role name that it does, we
2127// set our compatibility to Qt4 here too.
@@ -34,8 +40,6 @@ UsersModel::UsersModel(QObject *parent) :
3440 QAbstractListModel(parent),
3541 d_ptr(new UsersModelPrivate(this))
3642{
37− Q_D(UsersModel);
38−
3943 // Extend roleNames (we want to keep the "display" role)
4044 QHash<int, QByteArray> roles = roleNames();
4145 roles[NameRole] = "name";
@@ -46,26 +50,13 @@ UsersModel::UsersModel(QObject *parent) :
4650 roles[SessionRole] = "session";
4751 roles[HasMessagesRole] = "hasMessages";
4852 roles[ImagePathRole] = "imagePath";
53+ roles[UidRole] = "uid";
4954 setRoleNames(roles);
5055
51− // Now modify our mock user backgrounds
52− QDir bgdir = QDir("/usr/share/demo-assets/shell/backgrounds/");
53− QStringList backgrounds = bgdir.entryList(QDir::Files | QDir::NoDotAndDotDot);
54−
55− for (int i = 0, j = 0; i < d->entries.size(); i++) {
56− Entry &entry = d->entries[i];
57− if (entry.background.isNull() && !backgrounds.isEmpty()) {
58− entry.background = bgdir.filePath(backgrounds[j++]);
59− if (j >= backgrounds.length()) {
60− j = 0;
61− }
62− }
63− }
64−}
65−
66−UsersModel::~UsersModel()
67−{
68− delete d_ptr;
56+ connect(d_ptr, &UsersModelPrivate::dataChanged, this, [this](int i) {
57+ QModelIndex index = createIndex(i, 0);
58+ Q_EMIT dataChanged(index, index);
59+ });
6960}
7061
7162int UsersModel::rowCount(const QModelIndex &parent) const
@@ -109,6 +100,8 @@ QVariant UsersModel::data(const QModelIndex &index, int role) const
109100 return d->entries[row].has_messages;
110101 case UsersModel::ImagePathRole:
111102 return "";
103+ case UsersModel::UidRole:
104+ return d->entries[row].uid;
112105 default:
113106 return QVariant();
114107 }
tests/mocks/LightDM/UsersModel.h → plugins/LightDM/IntegratedLightDM/liblightdm/UsersModel.hrenamed+10−6
@@ -24,6 +24,10 @@
2424#include <QtCore/QSharedDataPointer>
2525#include <QAbstractListModel>
2626
27+/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
28+ * CHANGES MADE HERE MUST BE REFLECTED ON THE MOCK LIB
29+ * COUNTERPART IN tests/mocks/Lightdm/liblightdm
30+ * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
2731
2832namespace QLightDM
2933{
@@ -33,11 +37,9 @@ class Q_DECL_EXPORT UsersModel : public QAbstractListModel
3337{
3438 Q_OBJECT
3539
36− Q_ENUMS(UserModelRoles)
37−
3840public:
3941 explicit UsersModel(QObject *parent = 0);
40− virtual ~UsersModel();
42+ virtual ~UsersModel() = default;
4143
4244 enum UserModelRoles {NameRole = Qt::UserRole,
4345 RealNameRole,
@@ -46,11 +48,13 @@ public:
4648 SessionRole,
4749 HasMessagesRole,
4850 ImagePathRole,
49− BackgroundPathRole
51+ BackgroundPathRole,
52+ UidRole
5053 };
54+ Q_ENUM(UserModelRoles)
5155
52− int rowCount(const QModelIndex &parent) const;
53− QVariant data(const QModelIndex &index, int role) const;
56+ int rowCount(const QModelIndex &parent) const override;
57+ QVariant data(const QModelIndex &index, int role) const override;
5458
5559private:
5660 UsersModelPrivate * const d_ptr;
plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.cppnew file+94
@@ -0,0 +1,94 @@
1+/*
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Michael Terry <michael.terry@canonical.com>
17+ */
18+
19+#include "UsersModelPrivate.h"
20+
21+#include "AccountsServiceDBusAdaptor.h"
22+#include "UsersModel.h"
23+
24+#include <glib.h>
25+#include <QDebug>
26+#include <QDir>
27+#include <QSettings>
28+#include <QStringList>
29+#include <unistd.h>
30+
31+namespace QLightDM
32+{
33+
34+UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
35+ : QObject(parent),
36+ q_ptr(parent),
37+ m_service(new AccountsServiceDBusAdaptor(this))
38+{
39+ QFileInfo demoFile(QDir::homePath() + "/.unity8-greeter-demo");
40+ QString currentUser = g_get_user_name();
41+ uid_t currentUid = getuid();
42+
43+ if (demoFile.exists()) {
44+ QSettings settings(demoFile.filePath(), QSettings::NativeFormat);
45+ QStringList users = settings.value(QStringLiteral("users"), QStringList() << currentUser).toStringList();
46+
47+ entries.reserve(users.count());
48+ Q_FOREACH(const QString &user, users)
49+ {
50+ QString name = settings.value(user + "/name", user).toString();
51+ entries.append({user, name, 0, 0, false, false, 0, 0, currentUid++});
52+ }
53+ } else {
54+ entries.append({currentUser, 0, 0, 0, false, false, 0, 0, currentUid});
55+
56+ connect(m_service, &AccountsServiceDBusAdaptor::maybeChanged,
57+ this, [this](const QString &user) {
58+ if (user == entries[0].username) {
59+ updateName(true);
60+ }
61+ });
62+ updateName(false);
63+ }
64+}
65+
66+void UsersModelPrivate::updateName(bool async)
67+{
68+ auto pendingReply = m_service->getUserPropertyAsync(entries[0].username,
69+ QStringLiteral("org.freedesktop.Accounts.User"),
70+ QStringLiteral("RealName"));
71+ auto *watcher = new QDBusPendingCallWatcher(pendingReply, this);
72+
73+ connect(watcher, &QDBusPendingCallWatcher::finished,
74+ this, [this](QDBusPendingCallWatcher* watcher) {
75+
76+ QDBusPendingReply<QVariant> reply = *watcher;
77+ watcher->deleteLater();
78+ if (reply.isError()) {
79+ qWarning() << "Failed to get 'RealName' property - " << reply.error().message();
80+ return;
81+ }
82+
83+ const QString realName = reply.value().toString();
84+ if (entries[0].real_name != realName) {
85+ entries[0].real_name = realName;
86+ Q_EMIT dataChanged(0);
87+ }
88+ });
89+ if (!async) {
90+ watcher->waitForFinished();
91+ }
92+}
93+
94+}
plugins/LightDM/IntegratedLightDM/liblightdm/UsersModelPrivate.hnew file+72
@@ -0,0 +1,72 @@
1+/*
2+ * Copyright (C) 2013-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Michael Terry <michael.terry@canonical.com>
17+ */
18+
19+#ifndef UNITY_MOCK_USERSMODEL_PRIVATE_H
20+#define UNITY_MOCK_USERSMODEL_PRIVATE_H
21+
22+#include <QList>
23+#include <QObject>
24+#include <QString>
25+
26+class AccountsServiceDBusAdaptor;
27+
28+namespace QLightDM
29+{
30+class UsersModel;
31+
32+class Entry
33+{
34+public:
35+ QString username;
36+ QString real_name;
37+ QString background;
38+ QString layouts;
39+ bool is_active;
40+ bool has_messages;
41+ QString session;
42+ QString infographic;
43+ uid_t uid;
44+};
45+
46+class UsersModelPrivate : public QObject
47+{
48+ Q_OBJECT
49+
50+public:
51+ explicit UsersModelPrivate(UsersModel *parent = 0);
52+ virtual ~UsersModelPrivate() = default;
53+
54+ QList<Entry> entries;
55+
56+Q_SIGNALS:
57+ void dataChanged(int);
58+
59+protected:
60+ UsersModel * const q_ptr;
61+
62+private:
63+ Q_DECLARE_PUBLIC(UsersModel)
64+
65+ void updateName(bool async);
66+
67+ AccountsServiceDBusAdaptor *m_service;
68+};
69+
70+}
71+
72+#endif // UNITY_MOCK_USERSMODEL_PRIVATE_H
plugins/LightDM/IntegratedLightDM/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module LightDM.IntegratedLightDM
2+plugin IntegratedLightDM-qml
3+typeinfo IntegratedLightDM.qmltypes
plugins/LightDM/PromptsModel.cppnew file+97
@@ -0,0 +1,97 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#include "PromptsModel.h"
19+
20+PromptsModel::PromptsModel(QObject* parent)
21+ : QAbstractListModel(parent)
22+{
23+ m_roleNames[TypeRole] = "type";
24+ m_roleNames[TextRole] = "text";
25+}
26+
27+PromptsModel& PromptsModel::operator=(const PromptsModel &other)
28+{
29+ beginResetModel();
30+ m_prompts = other.m_prompts;
31+ endResetModel();
32+ Q_EMIT countChanged();
33+ return *this;
34+}
35+
36+int PromptsModel::rowCount(const QModelIndex &parent) const
37+{
38+ if (parent.isValid())
39+ return 0;
40+
41+ return m_prompts.size();
42+}
43+
44+QVariant PromptsModel::data(const QModelIndex &index, int role) const
45+{
46+ if (!index.isValid() || index.column() > 0 || index.row() >= m_prompts.size())
47+ return QVariant();
48+
49+ switch (role) {
50+ case Qt::DisplayRole: // fallthrough
51+ case TextRole: return m_prompts[index.row()].prompt;
52+ case TypeRole: return m_prompts[index.row()].type;
53+ default: return QVariant();
54+ }
55+}
56+
57+QHash<int, QByteArray> PromptsModel::roleNames() const
58+{
59+ return m_roleNames;
60+}
61+
62+void PromptsModel::prepend(const QString &text, PromptType type)
63+{
64+ beginInsertRows(QModelIndex(), 0, 0);
65+ m_prompts.prepend(PromptInfo{text, type});
66+ endInsertRows();
67+
68+ Q_EMIT countChanged();
69+}
70+
71+void PromptsModel::append(const QString &text, PromptType type)
72+{
73+ beginInsertRows(QModelIndex(), m_prompts.size(), m_prompts.size());
74+ m_prompts.append(PromptInfo{text, type});
75+ endInsertRows();
76+
77+ Q_EMIT countChanged();
78+}
79+
80+void PromptsModel::clear()
81+{
82+ beginResetModel();
83+ m_prompts.clear();
84+ endResetModel();
85+
86+ Q_EMIT countChanged();
87+}
88+
89+bool PromptsModel::hasPrompt() const
90+{
91+ Q_FOREACH(const PromptInfo &info, m_prompts) {
92+ if (info.type == PromptType::Secret || info.type == PromptType::Question) {
93+ return true;
94+ }
95+ }
96+ return false;
97+}
plugins/LightDM/PromptsModel.hnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright (C) 2017 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#pragma once
19+
20+#include <QAbstractListModel>
21+
22+class PromptsModel : public QAbstractListModel
23+{
24+ Q_OBJECT
25+
26+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
27+
28+public:
29+ enum PromptsModelRoles {
30+ TypeRole = Qt::UserRole,
31+ TextRole,
32+ };
33+ Q_ENUM(PromptsModelRoles)
34+
35+ enum PromptType {
36+ Message,
37+ Error,
38+ Secret,
39+ Question,
40+ Button,
41+ };
42+ Q_ENUM(PromptType)
43+
44+ explicit PromptsModel(QObject* parent=0);
45+
46+ PromptsModel& operator=(const PromptsModel &other);
47+
48+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
49+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
50+ QHash<int, QByteArray> roleNames() const override;
51+
52+ Q_INVOKABLE void prepend(const QString &text, PromptType type);
53+ Q_INVOKABLE void append(const QString &text, PromptType type);
54+
55+ void clear();
56+
57+ bool hasPrompt() const;
58+
59+Q_SIGNALS:
60+ void countChanged();
61+
62+private:
63+ struct PromptInfo {
64+ QString prompt;
65+ PromptType type;
66+ };
67+
68+ QList<PromptInfo> m_prompts;
69+ QHash<int, QByteArray> m_roleNames;
70+};
plugins/LightDM/SessionsModel.cppnew file+135
@@ -0,0 +1,135 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#include "SessionsModel.h"
19+#include <QtCore/QFile>
20+#include <QtCore/QSortFilterProxyModel>
21+
22+QHash<int, QByteArray> SessionsModel::roleNames() const
23+{
24+ return m_roleNames;
25+}
26+
27+int SessionsModel::rowCount(const QModelIndex& parent) const
28+{
29+ return m_model->rowCount(parent);
30+}
31+
32+QList<QUrl> SessionsModel::iconSearchDirectories() const
33+{
34+ return m_iconSearchDirectories;
35+}
36+
37+void SessionsModel::setIconSearchDirectories(const QList<QUrl> searchDirectories)
38+{
39+ // QML gives us a url with file:// prepended which breaks QFile::exists()
40+ // so convert the url to a local file
41+ QList<QUrl> localList = {};
42+ Q_FOREACH(const QUrl& searchDirectory, searchDirectories)
43+ {
44+ localList.append(searchDirectory.toLocalFile());
45+ }
46+ m_iconSearchDirectories = localList;
47+ Q_EMIT iconSearchDirectoriesChanged();
48+}
49+
50+QUrl SessionsModel::iconUrl(const QString sessionKey) const
51+{
52+ Q_FOREACH(const QUrl& searchDirectory, m_iconSearchDirectories)
53+ {
54+ // This is an established icon naming convention
55+ QString customIconUrl = searchDirectory.toString(QUrl::StripTrailingSlash) +
56+ "/custom_" + sessionKey + "_badge.png";
57+ QString iconUrl = searchDirectory.toString(QUrl::StripTrailingSlash) +
58+ "/" + sessionKey + "_badge.png";
59+
60+ QFile customIconFile(customIconUrl);
61+ QFile iconFile(iconUrl);
62+ if (customIconFile.exists()) {
63+ return QUrl(customIconUrl);
64+ } else if (iconFile.exists()) {
65+ return QUrl(iconUrl);
66+ } else {
67+ // Search the legacy way
68+ QString path = searchDirectory.toString(QUrl::StripTrailingSlash) + "/";
69+ bool iconFound = false;
70+ if (sessionKey == "ubuntu" || sessionKey == "ubuntu-2d") {
71+ path += "ubuntu_badge.png";
72+ iconFound = true;
73+ } else if(
74+ sessionKey == "gnome-classic" ||
75+ sessionKey == "gnome-flashback-compiz" ||
76+ sessionKey == "gnome-flashback-metacity" ||
77+ sessionKey == "gnome-shell" ||
78+ sessionKey == "gnome-wayland" ||
79+ sessionKey == "gnome"
80+ ){
81+ path += "gnome_badge.png";
82+ iconFound = true;
83+ } else if (sessionKey == "plasma") {
84+ path += "kde_badge.png";
85+ iconFound = true;
86+ } else if (sessionKey == "xterm") {
87+ path += "recovery_console_badge.png";
88+ iconFound = true;
89+ } else if (sessionKey == "remote-login") {
90+ path += "remote_login_help.png";
91+ iconFound = true;
92+ }
93+
94+ if (QFile(path).exists() && iconFound) {
95+ return path;
96+ }
97+ }
98+ }
99+
100+ // FIXME make this smarter
101+ return QUrl("./graphics/session_icons/unknown_badge.png");
102+}
103+
104+QVariant SessionsModel::data(const QModelIndex& index, int role) const
105+{
106+ switch (role) {
107+ case SessionsModel::IconRole:
108+ return iconUrl(m_model->data(index, QLightDM::SessionsModel::KeyRole).toString());
109+ default:
110+ return m_model->data(index, role);
111+ }
112+}
113+
114+SessionsModel::SessionsModel(QObject* parent)
115+ : UnitySortFilterProxyModelQML(parent)
116+{
117+ // Add a custom IconRole that isn't in either of the lightdm implementations
118+ m_model = new QLightDM::SessionsModel(this);
119+ m_roleNames = m_model->roleNames();
120+ m_roleNames[IconRole] = "icon_url";
121+
122+ // Update search locations to use $SNAP prefix if specified
123+ auto snapRoot = QFile::decodeName(qgetenv("SNAP"));
124+ if (!snapRoot.isEmpty()) {
125+ for (int i = 0; i < m_iconSearchDirectories.size(); i++) {
126+ m_iconSearchDirectories[i] = snapRoot + m_iconSearchDirectories[i].path();
127+ }
128+ }
129+
130+ setModel(m_model);
131+ setSortCaseSensitivity(Qt::CaseInsensitive);
132+ setSortLocaleAware(true);
133+ setSortRole(Qt::DisplayRole);
134+ sort(0);
135+}
plugins/LightDM/SessionsModel.hnew file+66
@@ -0,0 +1,66 @@
1+/*
2+ * Copyright (C) 2015-2016 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ */
17+
18+#pragma once
19+
20+#include <unitysortfilterproxymodelqml.h>
21+#include <QLightDM/SessionsModel>
22+#include <QtCore/QHash>
23+#include <QtCore/QObject>
24+#include <QtCore/QUrl>
25+
26+class SessionsModel : public UnitySortFilterProxyModelQML
27+{
28+ Q_OBJECT
29+
30+ Q_PROPERTY(QList<QUrl> iconSearchDirectories READ iconSearchDirectories
31+ WRITE setIconSearchDirectories NOTIFY iconSearchDirectoriesChanged)
32+
33+Q_SIGNALS:
34+ void iconSearchDirectoriesChanged();
35+
36+public:
37+ enum SessionModelRoles {
38+ /* This is tricky / ugly. Since we are ultimately chaining 3 enums together,
39+ * the _first_ value of this enum MUST be the _last_ value of
40+ * QLightDM::SessionsModel::SessionModelRoles and consquently, this must
41+ * also match the last value in the corresponding enum of the integrated lib
42+ */
43+ TypeRole = QLightDM::SessionsModel::SessionModelRoles::TypeRole,
44+ IconRole
45+ };
46+ Q_ENUM(SessionModelRoles)
47+
48+ explicit SessionsModel(QObject* parent=nullptr);
49+
50+ QHash<int, QByteArray> roleNames() const override;
51+ int rowCount(const QModelIndex& parent) const override;
52+ QVariant data(const QModelIndex& index, int role) const override;
53+ QList<QUrl> iconSearchDirectories() const;
54+ Q_INVOKABLE QUrl iconUrl(const QString sessionName) const;
55+
56+ void setIconSearchDirectories(const QList<QUrl> searchDirectories);
57+
58+private:
59+ QLightDM::SessionsModel* m_model;
60+ QHash<int, QByteArray> m_roleNames;
61+ QList<QUrl> m_iconSearchDirectories{
62+ QUrl("/usr/share/unity8/Greeter/graphics/session_icons"),
63+ QUrl("/usr/local/share/unity-greeter"),
64+ QUrl("/usr/share/unity-greeter/")};
65+
66+};
plugins/LightDM/UsersModel.cpp+183−15
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,53 +12,204 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Author: Michael Terry <michael.terry@canonical.com>
1715 */
1816
17+#include "Greeter.h"
1918#include "UsersModel.h"
19+#include <QIdentityProxyModel>
2020#include <QLightDM/UsersModel>
21−#include <QtCore/QSortFilterProxyModel>
21+
22+#include <libintl.h>
2223
2324// First, we define an internal class that wraps LightDM's UsersModel. This
2425// class will modify some of the data coming from LightDM. For example, we
25−// modify any empty Real Names into just normal Names.
26+// modify any empty Real Names into just normal Names. We also add optional
27+// rows, depending on configuration.
2628// (We can't modify the data directly in UsersModel below because it won't sort
2729// using the modified data.)
28−class MangleModel : public QSortFilterProxyModel
30+class MangleModel : public QIdentityProxyModel
2931{
3032 Q_OBJECT
3133
3234public:
3335 explicit MangleModel(QObject* parent=0);
3436
35− virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
37+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
38+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
39+ QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
40+
41+private:
42+ struct CustomRow {
43+ QString name;
44+ QString realName;
45+ };
46+
47+ int sourceRowCount() const;
48+
49+ void updateGuestRow();
50+ void updateManualRow();
51+ void updateCustomRows();
52+
53+ void addCustomRow(const CustomRow &newRow);
54+ void removeCustomRow(const QString &rowName);
55+
56+ QList<CustomRow> m_customRows;
57+ bool m_updatingCustomRows;
3658};
3759
3860MangleModel::MangleModel(QObject* parent)
39− : QSortFilterProxyModel(parent)
61+ : QIdentityProxyModel(parent)
62+ , m_updatingCustomRows(false)
4063{
4164 setSourceModel(new QLightDM::UsersModel(this));
65+
66+ updateCustomRows();
67+
68+ // Would be nice if there were a rowCountChanged signal in the base class.
69+ // We redo all custom rows on any row count change, because (A) some of
70+ // custom rows (manual login) use row count information and (B) when
71+ // testing, we use a modelReset signal as a way to indicate that a custom
72+ // row has been toggled off or on.
73+ connect(this, &QIdentityProxyModel::modelReset,
74+ this, &MangleModel::updateCustomRows);
75+ connect(this, &QIdentityProxyModel::rowsInserted,
76+ this, &MangleModel::updateCustomRows);
77+ connect(this, &QIdentityProxyModel::rowsRemoved,
78+ this, &MangleModel::updateCustomRows);
4279}
4380
4481QVariant MangleModel::data(const QModelIndex &index, int role) const
4582{
46− QVariant data = QSortFilterProxyModel::data(index, role);
83+ QVariant variantData;
84+
85+ if (index.row() >= rowCount())
86+ return QVariant();
87+
88+ bool isCustomRow = index.row() >= sourceRowCount();
89+ if (isCustomRow && index.column() == 0) {
90+ int customIndex = index.row() - sourceRowCount();
91+ if (role == QLightDM::UsersModel::NameRole) {
92+ variantData = m_customRows[customIndex].name;
93+ } else if (role == QLightDM::UsersModel::RealNameRole) {
94+ variantData = m_customRows[customIndex].realName;
95+ } else if (role == QLightDM::UsersModel::LoggedInRole) {
96+ variantData = false;
97+ } else if (role == QLightDM::UsersModel::SessionRole) {
98+ variantData = Greeter::instance()->defaultSessionHint();
99+ }
100+ } else {
101+ variantData = QIdentityProxyModel::data(index, role);
102+ }
47103
48104 // If user's real name is empty, switch to unix name
49− if (role == QLightDM::UsersModel::RealNameRole && data.toString().isEmpty()) {
50− data = QSortFilterProxyModel::data(index, QLightDM::UsersModel::NameRole);
51− } else if (role == QLightDM::UsersModel::BackgroundPathRole && data.toString().startsWith('#')) {
52− data = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + data.toString() + "'/></svg>";
105+ if (role == QLightDM::UsersModel::RealNameRole && variantData.toString().isEmpty()) {
106+ variantData = data(index, QLightDM::UsersModel::NameRole);
107+ } else if (role == QLightDM::UsersModel::BackgroundPathRole && variantData.toString().startsWith('#')) {
108+ const QString stringData = "data:image/svg+xml,<svg><rect width='100%' height='100%' fill='" + variantData.toString() + "'/></svg>";
109+ variantData = stringData;
110+ }
111+
112+ // Workaround for liblightdm returning "" when a user has no default session
113+ if (Q_UNLIKELY(role == QLightDM::UsersModel::SessionRole && variantData.toString().isEmpty())) {
114+ variantData = Greeter::instance()->defaultSessionHint();
53115 }
54116
55− return data;
117+ return variantData;
118+}
119+
120+void MangleModel::addCustomRow(const CustomRow &newRow)
121+{
122+ for (int i = 0; i < m_customRows.size(); i++) {
123+ if (m_customRows[i].name == newRow.name) {
124+ return; // we don't have custom rows that change content yet
125+ }
126+ }
127+
128+ beginInsertRows(QModelIndex(), rowCount(), rowCount());
129+ m_customRows << newRow;
130+ endInsertRows();
131+}
132+
133+void MangleModel::removeCustomRow(const QString &rowName)
134+{
135+ for (int i = 0; i < m_customRows.size(); i++) {
136+ if (m_customRows[i].name == rowName) {
137+ int rowNum = sourceRowCount() + i;
138+ beginRemoveRows(QModelIndex(), rowNum, rowNum);
139+ m_customRows.removeAt(i);
140+ endRemoveRows();
141+ break;
142+ }
143+ }
144+}
145+
146+void MangleModel::updateManualRow()
147+{
148+ bool hasAnotherEntry = sourceRowCount() > 0;
149+ for (int i = 0; !hasAnotherEntry && i < m_customRows.size(); i++) {
150+ if (m_customRows[i].name != QStringLiteral("*other")) {
151+ hasAnotherEntry = true;
152+ }
153+ }
154+
155+ // Show manual login if we are asked to OR if no other entry exists
156+ if (Greeter::instance()->showManualLoginHint() || !hasAnotherEntry)
157+ addCustomRow({QStringLiteral("*other"), gettext("Login")});
158+ else
159+ removeCustomRow(QStringLiteral("*other"));
160+}
161+
162+void MangleModel::updateGuestRow()
163+{
164+ if (Greeter::instance()->hasGuestAccount())
165+ addCustomRow({QStringLiteral("*guest"), gettext("Guest Session")});
166+ else
167+ removeCustomRow(QStringLiteral("*guest"));
168+}
169+
170+void MangleModel::updateCustomRows()
171+{
172+ // We update when rowCount changes, but we also insert/remove rows here.
173+ // So guard this function to avoid recursion.
174+ if (m_updatingCustomRows)
175+ return;
176+
177+ m_updatingCustomRows = true;
178+ updateGuestRow();
179+ updateManualRow();
180+ m_updatingCustomRows = false;
181+}
182+
183+int MangleModel::rowCount(const QModelIndex &parent) const
184+{
185+ if (parent.isValid())
186+ return 0;
187+ else
188+ return sourceRowCount() + m_customRows.size();
189+}
190+
191+int MangleModel::sourceRowCount() const
192+{
193+ return Greeter::instance()->hideUsersHint() ? 0 : sourceModel()->rowCount();
194+}
195+
196+QModelIndex MangleModel::index(int row, int column, const QModelIndex &parent) const
197+{
198+ if (row >= rowCount())
199+ return QModelIndex();
200+
201+ bool isCustomRow = row >= sourceRowCount();
202+ if (isCustomRow && !parent.isValid()) {
203+ return createIndex(row, column);
204+ } else {
205+ return QIdentityProxyModel::index(row, column, parent);
206+ }
56207}
57208
58209// **** Now we continue with actual UsersModel class ****
59210
60211UsersModel::UsersModel(QObject* parent)
61− : QSortFilterProxyModelQML(parent)
212+ : UnitySortFilterProxyModelQML(parent)
62213{
63214 setModel(new MangleModel(this));
64215 setSortCaseSensitivity(Qt::CaseInsensitive);
@@ -67,4 +218,21 @@ UsersModel::UsersModel(QObject* parent)
67218 sort(0);
68219}
69220
221+bool UsersModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
222+{
223+ auto leftName = source_left.data(QLightDM::UsersModel::NameRole);
224+ auto rightName = source_right.data(QLightDM::UsersModel::NameRole);
225+
226+ if (leftName == QStringLiteral("*guest"))
227+ return false;
228+ if (rightName == QStringLiteral("*guest"))
229+ return true;
230+ if (leftName == QStringLiteral("*other"))
231+ return false;
232+ if (rightName == QStringLiteral("*other"))
233+ return true;
234+
235+ return UnitySortFilterProxyModelQML::lessThan(source_left, source_right);
236+}
237+
70238#include "UsersModel.moc"
plugins/LightDM/UsersModel.h+8−10
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012-2013,2015-2016 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -12,26 +12,24 @@
1212 *
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Terry <michael.terry@canonical.com>
1715 */
1816
1917/* This class is a really tiny filter around QLightDM::UsersModel. There are
2018 some operations that we want to edit a bit for the benefit of Qml.
2119 Specifically, we want to sort users according to realName. */
2220
23−#ifndef UNITY_USERSMODEL_H
24−#define UNITY_USERSMODEL_H
21+#pragma once
2522
26−#include <qsortfilterproxymodelqml.h>
27−#include <QtCore/QObject>
23+#include <unitysortfilterproxymodelqml.h>
24+#include <QObject>
2825
29−class UsersModel : public QSortFilterProxyModelQML
26+class UsersModel : public UnitySortFilterProxyModelQML
3027{
3128 Q_OBJECT
3229
3330public:
3431 explicit UsersModel(QObject* parent=0);
35−};
3632
37−#endif
33+protected:
34+ bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;
35+};
plugins/LightDM/plugin.cpp+41−15
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,39 +13,51 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Authors: Gerry Boland <gerry.boland@canonical.com>
17− * Michael Terry <michael.terry@canonical.com>
1816 */
1917
2018#include "plugin.h"
19+#include "DBusGreeter.h"
2120#include "DBusGreeterList.h"
2221#include "Greeter.h"
22+#include "PromptsModel.h"
23+#include "SessionsModel.h"
2324#include "UsersModel.h"
2425#include <libusermetricsoutput/ColorTheme.h>
2526#include <libusermetricsoutput/UserMetrics.h>
27+#include <QLightDM/SessionsModel>
2628#include <QLightDM/UsersModel>
2729
2830#include <QAbstractItemModel>
2931#include <QDBusConnection>
3032#include <QtQml/qqml.h>
3133
32−static const char* GREETER_LIST_DBUS_PATH = "/list";
33−static const char* GREETER_DBUS_SERVICE = "com.canonical.UnityGreeter";
34−
3534static QObject *greeter_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
3635{
37− Q_UNUSED(engine)
3836 Q_UNUSED(scriptEngine)
3937
40− Greeter *greeter = new Greeter();
41− QDBusConnection connection = QDBusConnection::sessionBus();
42− DBusGreeterList *list = new DBusGreeterList(greeter, connection, GREETER_LIST_DBUS_PATH);
43− connection.registerObject(GREETER_LIST_DBUS_PATH, list, QDBusConnection::ExportScriptableContents);
44− connection.registerService(GREETER_DBUS_SERVICE);
38+ Greeter *greeter = Greeter::instance();
39+ new DBusGreeter(greeter, QStringLiteral("/"));
40+ new DBusGreeterList(greeter, QStringLiteral("/list"));
41+
42+ engine->setObjectOwnership(greeter, QQmlEngine::CppOwnership);
4543
4644 return greeter;
4745}
4846
47+static QObject *prompts_provider(QQmlEngine *engine, QJSEngine *)
48+{
49+ auto model = Greeter::instance()->promptsModel();
50+ engine->setObjectOwnership(model, QQmlEngine::CppOwnership);
51+ return model;
52+}
53+
54+static QObject *sessions_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
55+{
56+ Q_UNUSED(engine)
57+ Q_UNUSED(scriptEngine)
58+ return new SessionsModel();
59+}
60+
4961static QObject *users_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
5062{
5163 Q_UNUSED(engine)
@@ -60,14 +72,28 @@ static QObject *infographic_provider(QQmlEngine *engine, QJSEngine *scriptEngine
6072 return UserMetricsOutput::UserMetrics::getInstance();
6173}
6274
63−void LightDMPlugin::registerTypes(const char *uri)
75+void PLUGIN_CLASSNAME::registerTypes(const char *uri)
6476{
6577 qmlRegisterType<QAbstractItemModel>();
6678 qmlRegisterType<UserMetricsOutput::ColorTheme>();
6779
68− Q_ASSERT(uri == QLatin1String("LightDM"));
80+#if defined INTEGRATED_LIGHTDM
81+ Q_ASSERT(uri == QLatin1String("LightDM.IntegratedLightDM"));
6982 qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
83+#elif defined FULL_LIGHTDM
84+ Q_ASSERT(uri == QLatin1String("LightDM.FullLightDM"));
85+ qmlRegisterSingletonType<QLightDM::Greeter>(uri, 0, 1, "Greeter", greeter_provider);
86+#else
87+ #error No library defined in LightDM plugin
88+#endif
89+
90+ qmlRegisterSingletonType<PromptsModel>(uri, 0, 1, "Prompts", prompts_provider);
91+
92+ qmlRegisterSingletonType<SessionsModel>(uri, 0, 1, "Sessions", sessions_provider);
93+ qmlRegisterUncreatableType<QLightDM::SessionsModel>(uri, 0, 1, "SessionRoles", QStringLiteral("Type is not instantiable"));
94+
7095 qmlRegisterSingletonType<UsersModel>(uri, 0, 1, "Users", users_provider);
71− qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", "Type is not instantiable");
96+ qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", QStringLiteral("Type is not instantiable"));
97+
7298 qmlRegisterSingletonType<UserMetricsOutput::UserMetrics>(uri, 0, 1, "Infographic", infographic_provider);
7399}
plugins/LightDM/plugin.h+4−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2012,2013,2015 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -13,8 +13,6 @@
1313 * You should have received a copy of the GNU General Public License
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 *
16− * Authors: Gerry Boland <gerry.boland@canonical.com>
17− * Michael Terry <michael.terry@canonical.com>
1816 */
1917
2018#ifndef LIGHTDM_PLUGIN_H
@@ -23,13 +21,13 @@
2321#include <QtQml/QQmlEngine>
2422#include <QtQml/QQmlExtensionPlugin>
2523
26−class LightDMPlugin : public QQmlExtensionPlugin
24+class PLUGIN_CLASSNAME : public QQmlExtensionPlugin
2725{
2826 Q_OBJECT
2927 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
3028
3129public:
32− void registerTypes(const char *uri);
30+ void registerTypes(const char *uri) override;
3331};
3432
35−#endif
33+#endif /* LIGHTDM_PLUGIN_H */
plugins/LightDM/qmldir+3−3
@@ -1,3 +1,3 @@
1−module LightDM
2−plugin LightDM-qml
3−typeinfo plugin.qmltypes
1+module IntegratedLightDM
2+plugin IntegratedLightDM-qml
3+typeinfo IntegratedLightDM.qmltypes
plugins/Lights/CMakeLists.txtnew file+23
@@ -0,0 +1,23 @@
1+pkg_check_modules(ANDROID_HEADERS REQUIRED android-headers)
2+pkg_check_modules(ANDROID_HARDWARE REQUIRED libhardware)
3+pkg_check_modules(ANDROID_PROPERTIES REQUIRED libandroid-properties)
4+
5+include_directories(
6+ SYSTEM
7+ ${ANDROID_HEADERS_INCLUDE_DIRS}
8+)
9+
10+add_library(Lights-qml MODULE
11+ plugin.cpp
12+ Lights.cpp
13+ LegacyLights.cpp
14+ HfdLights.cpp
15+ )
16+
17+target_link_libraries(Lights-qml
18+ Qt5::Qml Qt5::Gui Qt5::DBus
19+ ${ANDROID_HARDWARE_LIBRARIES}
20+ ${ANDROID_PROPERTIES_LIBRARIES}
21+ )
22+
23+add_unity8_plugin(Lights 0.1 Lights TARGETS Lights-qml)
plugins/Lights/HfdLights.cppnew file+62
@@ -0,0 +1,62 @@
1+/*
2+ * Copyright (C) 2021 UBports Foundation.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Florian Leeber <florian@ubports.com>
17+ */
18+
19+#include "HfdLights.h"
20+#include <QtCore/QDebug>
21+#include <QDBusArgument>
22+#include <QDBusConnection>
23+#include <iostream>
24+
25+#define HFD_SERVICE_NAME "com.lomiri.hfd"
26+#define HFD_SERVICE_PATH "/com/lomiri/hfd"
27+#define HFD_SERVICE_INTERFACE "com.lomiri.hfd.Leds"
28+
29+HfdLights::HfdLights(QObject* parent)
30+ : Lights(parent)
31+{
32+ m_hfdInterface = new QDBusInterface(
33+ QStringLiteral(HFD_SERVICE_NAME),
34+ QStringLiteral(HFD_SERVICE_PATH),
35+ QStringLiteral(HFD_SERVICE_INTERFACE),
36+ QDBusConnection::systemBus(),
37+ this
38+ );
39+}
40+
41+bool HfdLights::init()
42+{
43+ // hfd does not need any initalization to be used
44+ return true;
45+}
46+
47+void HfdLights::turnOn()
48+{
49+ m_hfdInterface->call(QStringLiteral("setState"), 0);
50+ m_hfdInterface->call(QStringLiteral("setColor"), (quint32)m_color.rgba());
51+ m_hfdInterface->call(QStringLiteral("setOnMs"), m_onMs);
52+ m_hfdInterface->call(QStringLiteral("setOffMs"), m_offMs);
53+ m_hfdInterface->call(QStringLiteral("setState"), 1);
54+}
55+
56+void HfdLights::turnOff()
57+{
58+ m_hfdInterface->call(QStringLiteral("setState"), 0);
59+ m_hfdInterface->call(QStringLiteral("setColor"), (quint32)0);
60+ m_hfdInterface->call(QStringLiteral("setOnMs"), 0);
61+ m_hfdInterface->call(QStringLiteral("setOffMs"), 0);
62+}
plugins/Lights/HfdLights.hnew file+42
@@ -0,0 +1,42 @@
1+/*
2+ * Copyright (C) 2021 UBports Foundation.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Florian Leeber <florian@ubports.com>
17+ */
18+
19+#ifndef UNITY_HFDLIGHTS_H
20+#define UNITY_HFDLIGHTS_H
21+
22+#include <QtCore/QObject>
23+#include <QDBusInterface>
24+#include "Lights.h"
25+
26+class HfdLights: public Lights
27+{
28+ Q_OBJECT
29+
30+public:
31+ explicit HfdLights(QObject *parent = 0);
32+
33+protected:
34+ bool init() override;
35+ void turnOff() override;
36+ void turnOn() override;
37+
38+private:
39+ QDBusInterface* m_hfdInterface;
40+};
41+
42+#endif
plugins/Lights/LegacyLights.cppnew file+91
@@ -0,0 +1,91 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ * Copyright (C) 2021 UBports Foundation.
4+ *
5+ * This program is free software; you can redistribute it and/or modify
6+ * it under the terms of the GNU General Public License as published by
7+ * the Free Software Foundation; version 3.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
18+ */
19+
20+#include "LegacyLights.h"
21+#include <QtCore/QDebug>
22+
23+extern "C" {
24+#include "android-hardware.h"
25+#include <string.h>
26+}
27+
28+LegacyLights::~LegacyLights()
29+{
30+ if (m_lightDevice) {
31+ hw_device_t* device = (hw_device_t*) m_lightDevice;
32+ device->close(device);
33+ }
34+}
35+
36+bool LegacyLights::init()
37+{
38+ if (m_lightDevice) {
39+ return true;
40+ }
41+
42+ int err;
43+ hw_module_t* module;
44+
45+ err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
46+ if (err == 0) {
47+ hw_device_t* device;
48+ err = module->methods->open(module, LIGHT_ID_NOTIFICATIONS, &device);
49+ if (err == 0) {
50+ m_lightDevice = (light_device_t*)device;
51+ turnOff();
52+ return true;
53+ } else {
54+ qWarning() << "Failed to access notification lights";
55+ }
56+ } else {
57+ qWarning() << "Failed to initialize lights hardware.";
58+ }
59+ return false;
60+}
61+
62+void LegacyLights::turnOn()
63+{
64+ // pulse
65+ light_state_t state;
66+ memset(&state, 0, sizeof(light_state_t));
67+ state.color = m_color.rgba();
68+ state.flashMode = LIGHT_FLASH_TIMED;
69+ state.flashOnMS = m_onMs;
70+ state.flashOffMS = m_offMs;
71+ state.brightnessMode = BRIGHTNESS_MODE_USER;
72+
73+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
74+ qWarning() << "Failed to turn the light off";
75+ }
76+}
77+
78+void LegacyLights::turnOff()
79+{
80+ light_state_t state;
81+ memset(&state, 0, sizeof(light_state_t));
82+ state.color = 0x00000000;
83+ state.flashMode = LIGHT_FLASH_NONE;
84+ state.flashOnMS = 0;
85+ state.flashOffMS = 0;
86+ state.brightnessMode = 0;
87+
88+ if (m_lightDevice->set_light(m_lightDevice, &state) != 0) {
89+ qWarning() << "Failed to turn the light off";
90+ }
91+}
plugins/Lights/LegacyLights.hnew file+45
@@ -0,0 +1,45 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ * Copyright (C) 2021 UBports Foundation.
4+ *
5+ * This program is free software; you can redistribute it and/or modify
6+ * it under the terms of the GNU General Public License as published by
7+ * the Free Software Foundation; version 3.
8+ *
9+ * This program is distributed in the hope that it will be useful,
10+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ * GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License
15+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
16+ *
17+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
18+ */
19+
20+#ifndef UNITY_LEGACYLIGHTS_H
21+#define UNITY_LEGACYLIGHTS_H
22+
23+#include <QtCore/QObject>
24+#include "Lights.h"
25+
26+struct light_device_t;
27+
28+class LegacyLights: public Lights
29+{
30+ Q_OBJECT
31+
32+public:
33+ ~LegacyLights();
34+
35+protected:
36+ bool init() override;
37+ void turnOff() override;
38+ void turnOn() override;
39+
40+private:
41+ light_device_t* m_lightDevice;
42+
43+};
44+
45+#endif
plugins/Lights/Lights.cppnew file+101
@@ -0,0 +1,101 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Renato Araujo Oliveira Filho <renato.filho@canonical.com>
17+ */
18+
19+#include "Lights.h"
20+#include <QtCore/QDebug>
21+
22+extern "C" {
23+#include "android-hardware.h"
24+#include <string.h>
25+}
26+
27+Lights::Lights(QObject* parent)
28+ : QObject(parent),
29+ m_color("blue"),
30+ m_state(Lights::Off),
31+ m_onMs(1000),
32+ m_offMs(3000)
33+{
34+
35+}
36+
37+void Lights::setState(Lights::State newState)
38+{
39+ if (!init()) {
40+ qWarning() << "No lights device";
41+ return;
42+ }
43+
44+ if (m_state != newState) {
45+ if (newState == Lights::On) {
46+ turnOn();
47+ } else {
48+ turnOff();
49+ }
50+
51+ m_state = newState;
52+ Q_EMIT stateChanged(m_state);
53+ }
54+}
55+
56+Lights::State Lights::state() const
57+{
58+ return m_state;
59+}
60+
61+void Lights::setColor(const QColor &color)
62+{
63+ if (m_color != color) {
64+ m_color = color;
65+ Q_EMIT colorChanged(m_color);
66+ // FIXME: update the color if the light is already on
67+ }
68+}
69+
70+QColor Lights::color() const
71+{
72+ return m_color;
73+}
74+
75+int Lights::onMillisec() const
76+{
77+ return m_onMs;
78+}
79+
80+void Lights::setOnMillisec(int onMs)
81+{
82+ if (m_onMs != onMs) {
83+ m_onMs = onMs;
84+ Q_EMIT onMillisecChanged(m_onMs);
85+ // FIXME: update the property if the light is already on
86+ }
87+}
88+
89+int Lights::offMillisec() const
90+{
91+ return m_offMs;
92+}
93+
94+void Lights::setOffMillisec(int offMs)
95+{
96+ if (m_offMs != offMs) {
97+ m_offMs = offMs;
98+ Q_EMIT offMillisecChanged(m_offMs);
99+ // FIXME: update the property if the light is already on
100+ }
101+}
plugins/Lights/Lights.hnew file+71

This diff is too big to show here.

plugins/Lights/android-hardware.hnew file+19

This diff is too big to show here.

plugins/Lights/plugin.cppnew file+54

This diff is too big to show here.

plugins/Lights/plugin.hnew file+34

This diff is too big to show here.

plugins/Lights/qmldirnew file+3

This diff is too big to show here.

plugins/Powerd/CMakeLists.txt+8−4

This diff is too big to show here.

plugins/Powerd/Powerd.cpp+67−13

This diff is too big to show here.

plugins/Powerd/Powerd.h+25−9

This diff is too big to show here.

plugins/Powerd/plugin.h+1−1

This diff is too big to show here.

plugins/Powerd/qmldir+1−1

This diff is too big to show here.

plugins/ScreenshotDirectory/CMakeLists.txtnew file+9

This diff is too big to show here.

plugins/ScreenshotDirectory/ScreenGrabber.qmltypesnew file+17

This diff is too big to show here.

plugins/ScreenshotDirectory/ScreenshotDirectory.cppnew file+64

This diff is too big to show here.

plugins/ScreenshotDirectory/ScreenshotDirectory.hnew file+39

This diff is too big to show here.

tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp → plugins/ScreenshotDirectory/plugin.cpprenamed+7−14

This diff is too big to show here.

plugins/ScreenshotDirectory/plugin.hnew file+31

This diff is too big to show here.

plugins/ScreenshotDirectory/qmldirnew file+2

This diff is too big to show here.

plugins/SessionBroadcast/CMakeLists.txt+6−5

This diff is too big to show here.

plugins/SessionBroadcast/SessionBroadcast.cpp+40−10

This diff is too big to show here.

plugins/SessionBroadcast/SessionBroadcast.h+13−3

This diff is too big to show here.

plugins/SessionBroadcast/plugin.h+1−1

This diff is too big to show here.

plugins/SessionBroadcast/qmldir+1−1

This diff is too big to show here.

plugins/UInput/CMakeLists.txtnew file+7

This diff is too big to show here.

plugins/UInput/plugin.cppnew file+26

This diff is too big to show here.

plugins/UInput/plugin.hnew file+32

This diff is too big to show here.

plugins/UInput/qmldirnew file+3

This diff is too big to show here.

plugins/UInput/uinput.cppnew file+182

This diff is too big to show here.

plugins/UInput/uinput.hnew file+61

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/CMakeLists.txt+7−9

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/DownloadTracker.cpp+9−8

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/DownloadTracker.h+3−2

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/interface/downloadtrackeradaptor.cpp+2−2

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/interface/downloadtrackeradaptor.h+82−15

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/interface/metatypes.h+3−6

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/plugin.h+2−2

This diff is too big to show here.

plugins/Ubuntu/DownloadDaemonListener/qmldir+1−1

This diff is too big to show here.

plugins/Ubuntu/Gestures/AxisVelocityCalculator.cpp+1−1

This diff is too big to show here.

plugins/Ubuntu/Gestures/AxisVelocityCalculator.h+6−6

This diff is too big to show here.

plugins/Ubuntu/Gestures/CMakeLists.txt+31−11

This diff is too big to show here.

plugins/Ubuntu/Gestures/Damper.hdeleted−87

This diff is too big to show here.

plugins/Ubuntu/Gestures/Direction.cpp+11−4

This diff is too big to show here.

plugins/Ubuntu/Gestures/Direction.h+8−5

This diff is too big to show here.

plugins/Ubuntu/Gestures/DirectionalDragArea.cppdeleted−697

This diff is too big to show here.

plugins/Ubuntu/Gestures/DirectionalDragArea.hdeleted−288

This diff is too big to show here.

plugins/Ubuntu/Gestures/MouseEventGenerator.cppnew file+64

This diff is too big to show here.

plugins/Ubuntu/Gestures/MouseEventGenerator.hnew file+48

This diff is too big to show here.

plugins/Ubuntu/Gestures/PressedOutsideNotifier.h+1−1

This diff is too big to show here.

plugins/Ubuntu/Gestures/TimeSource.cppdeleted−49

This diff is too big to show here.

plugins/Ubuntu/Gestures/TimeSource.hdeleted−54

This diff is too big to show here.

plugins/Ubuntu/Gestures/TouchDispatcher.cppnew file+398

This diff is too big to show here.

plugins/Ubuntu/Gestures/TouchDispatcher.hnew file+96

This diff is too big to show here.

plugins/Ubuntu/Gestures/TouchGate.cppnew file+290

This diff is too big to show here.

plugins/Ubuntu/Gestures/TouchGate.hnew file+125

This diff is too big to show here.

plugins/Ubuntu/Gestures/TouchGestureArea.cppnew file+879

This diff is too big to show here.

plugins/Ubuntu/Gestures/TouchGestureArea.hnew file+229

This diff is too big to show here.

plugins/Ubuntu/Gestures/UbuntuGesturesGlobal.h → plugins/Ubuntu/Gestures/UbuntuGesturesQmlGlobal.hrenamed+3−3

This diff is too big to show here.

plugins/Ubuntu/Gestures/plugin.cpp+9−4

This diff is too big to show here.

plugins/Ubuntu/Gestures/plugin.h+2−2

This diff is too big to show here.

plugins/Ubuntu/Gestures/qmldir+2−2

This diff is too big to show here.

plugins/Unity/ApplicationMenu/CMakeLists.txtnew file+19

This diff is too big to show here.

plugins/Unity/ApplicationMenu/applicationmenuregistry.cppnew file+141

This diff is too big to show here.

plugins/Unity/ApplicationMenu/applicationmenuregistry.hnew file+83

This diff is too big to show here.

plugins/Unity/ApplicationMenu/com.ubuntu.MenuRegistrar.xmlnew file+83

This diff is too big to show here.

plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.cppnew file+44

This diff is too big to show here.

plugins/Unity/ApplicationMenu/dbusapplicationmenuregistry.hnew file+34

This diff is too big to show here.

plugins/Unity/ApplicationMenu/plugin.cppnew file+42

This diff is too big to show here.

plugins/Unity/ApplicationMenu/plugin.hnew file+32

This diff is too big to show here.

plugins/Unity/ApplicationMenu/qmldirnew file+3

This diff is too big to show here.

plugins/Unity/CMakeLists.txt+5

This diff is too big to show here.

plugins/Unity/Connectivity/CMakeLists.txtnew file+10

This diff is too big to show here.

plugins/Unity/Connectivity/Connectivity.cppnew file+33

This diff is too big to show here.

plugins/Unity/Connectivity/Connectivity.hnew file+34

This diff is too big to show here.

plugins/Unity/Connectivity/plugin.cppnew file+34

This diff is too big to show here.

plugins/Unity/Connectivity/plugin.hnew file+31

This diff is too big to show here.

plugins/Unity/Connectivity/qmldirnew file+3

This diff is too big to show here.

plugins/Unity/Indicators/CMakeLists.txt+14−27

This diff is too big to show here.

plugins/Unity/Indicators/actionrootstate.cppnew file+97

This diff is too big to show here.

plugins/Unity/Indicators/actionrootstate.hnew file+55

This diff is too big to show here.

plugins/Unity/Indicators/indicator.cpp+27−13

This diff is too big to show here.

plugins/Unity/Indicators/indicator.h+6−2

This diff is too big to show here.

plugins/Unity/Indicators/indicators.h+6−9

This diff is too big to show here.

plugins/Unity/Indicators/indicatorsmanager.cpp+45−55

This diff is too big to show here.

plugins/Unity/Indicators/indicatorsmanager.h+9−5

This diff is too big to show here.

plugins/Unity/Indicators/indicatorsmodel.cpp+50−20

This diff is too big to show here.

plugins/Unity/Indicators/indicatorsmodel.h+21−8

This diff is too big to show here.

plugins/Unity/Indicators/menucontentactivator.cpp+6−7

This diff is too big to show here.

plugins/Unity/Indicators/menucontentactivator.h+2−2

This diff is too big to show here.

plugins/Unity/Indicators/modelactionrootstate.cppnew file+204

This diff is too big to show here.

plugins/Unity/Indicators/modelactionrootstate.hnew file+72

This diff is too big to show here.

plugins/Unity/Indicators/modelprinter.cpp+30−15

This diff is too big to show here.

plugins/Unity/Indicators/modelprinter.h+4−3

This diff is too big to show here.

plugins/Unity/Indicators/plugin.cpp+17−13

This diff is too big to show here.

plugins/Unity/Indicators/plugin.h+2−2

This diff is too big to show here.

plugins/Unity/Indicators/qml/CMakeLists.txtdeleted−5

This diff is too big to show here.

plugins/Unity/Indicators/qml/CachedUnityMenuModel.qmldeleted−60

This diff is too big to show here.

plugins/Unity/Indicators/qml/MenuItemFactory.qmldeleted−500

This diff is too big to show here.

plugins/Unity/Indicators/qml/MessageMenuItemFactory.qmldeleted−253

This diff is too big to show here.

plugins/Unity/Indicators/qml/RemoveBackground.qmldeleted−55

This diff is too big to show here.

plugins/Unity/Indicators/qml/qmldirdeleted−10

This diff is too big to show here.

plugins/Unity/Indicators/qmldirnew file+3

This diff is too big to show here.

plugins/Unity/Indicators/resources/artwork/messaging/default_app.svgdeleted−42

This diff is too big to show here.

plugins/Unity/Indicators/resources/artwork/messaging/default_contact.pngdeleted

Binary file not shown.

plugins/Unity/Indicators/resources/indicators.qrcdeleted−6

This diff is too big to show here.

plugins/Unity/Indicators/rootactionstate.cppdeleted−299

This diff is too big to show here.

plugins/Unity/Indicators/rootstateparser.cppnew file+231

This diff is too big to show here.

plugins/Unity/Indicators/rootactionstate.h → plugins/Unity/Indicators/rootstateparser.hrenamed+22−37

This diff is too big to show here.

plugins/Unity/Indicators/sharedunitymenumodel.cppnew file+96

This diff is too big to show here.

plugins/Unity/Indicators/sharedunitymenumodel.hnew file+66

This diff is too big to show here.

plugins/Unity/Indicators/unitymenumodelcache.cpp+32−9

This diff is too big to show here.

plugins/Unity/Indicators/unitymenumodelcache.h+12−6

This diff is too big to show here.

plugins/Unity/Indicators/unitymenumodelstack.cpp+8−8

This diff is too big to show here.

plugins/Unity/Indicators/unitymenumodelstack.h+1−1

This diff is too big to show here.

plugins/Unity/Indicators/visibleindicatorsmodel.cppdeleted−92

This diff is too big to show here.

plugins/Unity/Indicators/visibleindicatorsmodel.hdeleted−56

This diff is too big to show here.

plugins/Unity/InputInfo/CMakeLists.txtnew file+38

This diff is too big to show here.

plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux.cppnew file+296

This diff is too big to show here.

plugins/Unity/InputInfo/linux/qinputdeviceinfo_linux_p.hnew file+96

This diff is too big to show here.

plugins/Unity/InputInfo/plugin.cppnew file+32

This diff is too big to show here.

tests/qmltests/Dash/Previews/MockPreviewWidget.qml → plugins/Unity/InputInfo/plugin.hrenamed+13−10

This diff is too big to show here.

plugins/Unity/InputInfo/qdeclarativeinputdevicemodel.cppnew file+196

This diff is too big to show here.

plugins/Unity/InputInfo/qdeclarativeinputdevicemodel_p.hnew file+102

This diff is too big to show here.

plugins/Unity/InputInfo/qinputinfo.cppnew file+270

This diff is too big to show here.

plugins/Unity/InputInfo/qinputinfo.hnew file+142

This diff is too big to show here.

plugins/Unity/InputInfo/qmldirnew file+3

This diff is too big to show here.

plugins/Unity/Launcher/CMakeLists.txt+29−12

This diff is too big to show here.

plugins/Unity/Launcher/appdrawermodel.cppnew file+192

This diff is too big to show here.

plugins/Unity/Launcher/appdrawermodel.hnew file+64

This diff is too big to show here.

plugins/Unity/Launcher/asadapter.cppnew file+67

This diff is too big to show here.

plugins/Unity/Launcher/asadapter.hnew file+46

This diff is too big to show here.

plugins/Unity/Launcher/backend/launcherbackend.cppdeleted−320

This diff is too big to show here.

plugins/Unity/Launcher/backend/launcherbackend.hdeleted−148

This diff is too big to show here.

plugins/Unity/Launcher/dbusinterface.cppnew file+226

This diff is too big to show here.

plugins/Unity/Launcher/dbusinterface.hnew file+49

This diff is too big to show here.

plugins/Unity/Launcher/gsettings.cppnew file+80

This diff is too big to show here.

plugins/Unity/Launcher/gsettings.hnew file+47

This diff is too big to show here.

plugins/Unity/Launcher/launcheritem.cpp+133−6

This diff is too big to show here.

plugins/Unity/Launcher/launcheritem.h+36−22

This diff is too big to show here.

plugins/Unity/Launcher/launchermodel.cpp+365−67

This diff is too big to show here.

plugins/Unity/Launcher/launchermodel.h+41−25

This diff is too big to show here.

plugins/Unity/Launcher/plugin.cpp+7−6

This diff is too big to show here.

plugins/Unity/Launcher/plugin.h+1−1

This diff is too big to show here.

plugins/Unity/Launcher/qmldir+1−1

This diff is too big to show here.

plugins/Unity/Launcher/quicklistentry.cppnew file+85

This diff is too big to show here.

plugins/Unity/Launcher/quicklistentry.hnew file+56

This diff is too big to show here.

plugins/Unity/Launcher/quicklistmodel.cpp+23−1

This diff is too big to show here.

plugins/Unity/Launcher/quicklistmodel.h+7−4

This diff is too big to show here.

plugins/Unity/Launcher/ualwrapper.cppnew file+74

This diff is too big to show here.

plugins/Unity/Launcher/ualwrapper.hnew file+36

This diff is too big to show here.

plugins/Unity/Launcher/xdgwatcher.cppnew file+129

This diff is too big to show here.

plugins/Unity/Launcher/xdgwatcher.hnew file+46

This diff is too big to show here.

plugins/Unity/Platform/CMakeLists.txtnew file+11

This diff is too big to show here.

plugins/Unity/Platform/platform.cppnew file+66

This diff is too big to show here.

plugins/Unity/Platform/platform.hnew file+64

This diff is too big to show here.

tests/mocks/LightDM/single-passphrase/UsersModelPrivate.cpp → plugins/Unity/Platform/plugin.cpprenamed+7−13

This diff is too big to show here.

tests/mocks/Unity/fake_applications_scope.h → plugins/Unity/Platform/plugin.hrenamed+9−10

This diff is too big to show here.

plugins/Unity/Platform/qmldirnew file+2

This diff is too big to show here.

plugins/Unity/Session/CMakeLists.txtnew file+29

This diff is too big to show here.

plugins/Unity/Session/dbusunitysessionservice.cppnew file+647

This diff is too big to show here.

plugins/Unity/Session/dbusunitysessionservice.hnew file+377

This diff is too big to show here.

plugins/Unity/Session/orientationlock.cppnew file+74

This diff is too big to show here.

plugins/Unity/Session/orientationlock.hnew file+60

This diff is too big to show here.

plugins/Unity/Session/plugin.cppnew file+48

This diff is too big to show here.

plugins/Unity/Session/plugin.hnew file+34

This diff is too big to show here.

plugins/Unity/Session/qmldirnew file+3

This diff is too big to show here.

plugins/Utils/CMakeLists.txt+33−17

This diff is too big to show here.

plugins/Utils/EdgeBarrierSettings.qmlnew file+66

This diff is too big to show here.

plugins/Utils/ElapsedTimer.hnew file+51

This diff is too big to show here.

tests/plugins/DashViews/organicgridtest.qml → plugins/Utils/Style.jsrenamed+16−22

This diff is too big to show here.

plugins/Utils/Timer.cppnew file+62

This diff is too big to show here.

plugins/Utils/Timer.hnew file+78

This diff is too big to show here.

plugins/Utils/URLDispatcher.cppnew file+80

This diff is too big to show here.

plugins/Utils/URLDispatcher.hnew file+47

This diff is too big to show here.

plugins/Utils/WindowInputMonitor.cppnew file+126

This diff is too big to show here.

plugins/Utils/WindowInputMonitor.hnew file+97

This diff is too big to show here.

plugins/Utils/activefocuslogger.cppnew file+61

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_Damper.cpp → plugins/Utils/activefocuslogger.hrenamed+15−18

This diff is too big to show here.

plugins/Utils/albumartprovider.cppdeleted−234

This diff is too big to show here.

plugins/Utils/albumartprovider.hdeleted−56

This diff is too big to show here.

plugins/Utils/appdrawerproxymodel.cppnew file+189

This diff is too big to show here.

plugins/Utils/appdrawerproxymodel.hnew file+87

This diff is too big to show here.

plugins/Utils/applicationsfiltermodel.cppnew file+101

This diff is too big to show here.

plugins/Utils/applicationsfiltermodel.hnew file+69

This diff is too big to show here.

plugins/Utils/bottombarvisibilitycommunicatorshell.cppdeleted−49

This diff is too big to show here.

plugins/Utils/bottombarvisibilitycommunicatorshell.hdeleted−59

This diff is too big to show here.

plugins/Utils/constants.cppnew file+32

This diff is too big to show here.

plugins/Utils/constants.hnew file+43

This diff is too big to show here.

plugins/Utils/deviceconfigparser.cppnew file+176

This diff is too big to show here.

plugins/Utils/deviceconfigparser.hnew file+66

This diff is too big to show here.

plugins/Utils/easingcurve.cppnew file+73

This diff is too big to show here.

plugins/Utils/easingcurve.hnew file+69

This diff is too big to show here.

plugins/Utils/expressionfiltermodel.cppnew file+49

This diff is too big to show here.

plugins/Utils/expressionfiltermodel.hnew file+42

This diff is too big to show here.

plugins/Utils/globalfunctions.cppnew file+58

This diff is too big to show here.

plugins/Utils/globalfunctions.hnew file+44

This diff is too big to show here.

plugins/Utils/inputeventgenerator.cppnew file+34

This diff is too big to show here.

plugins/Utils/inputeventgenerator.hnew file+40

This diff is too big to show here.

plugins/Utils/inputwatcher.cppnew file+118

This diff is too big to show here.

plugins/Utils/inputwatcher.hnew file+58

This diff is too big to show here.

plugins/Utils/mediaartcache.cppdeleted−178

This diff is too big to show here.

plugins/Utils/mediaartcache.hdeleted−54

This diff is too big to show here.

plugins/Utils/plugin.cpp+58−37

This diff is too big to show here.

plugins/Utils/plugin.h+1−2

This diff is too big to show here.

plugins/Utils/qlimitproxymodelqml.cpp+17−17

This diff is too big to show here.

plugins/Utils/qlimitproxymodelqml.h+2−2

This diff is too big to show here.

plugins/Utils/qmldir+3−1

This diff is too big to show here.

plugins/Utils/quicklistproxymodel.cppnew file+72

This diff is too big to show here.

plugins/Utils/quicklistproxymodel.hnew file+52

This diff is too big to show here.

plugins/Utils/qvariantlistmodel.h+6−6

This diff is too big to show here.

plugins/Utils/tabfocusfence.cppnew file+72

This diff is too big to show here.

plugins/Utils/tabfocusfence.hnew file+38

This diff is too big to show here.

plugins/Utils/timeformatter.cppdeleted−201

This diff is too big to show here.

plugins/Utils/timeformatter.hdeleted−66

This diff is too big to show here.

plugins/Utils/timezoneFormatter.cppnew file+45

This diff is too big to show here.

plugins/Utils/timezoneFormatter.hnew file+33

This diff is too big to show here.

plugins/Utils/unitysortfilterproxymodelqml.cppnew file+167

This diff is too big to show here.

plugins/Utils/unitysortfilterproxymodelqml.hnew file+68

This diff is too big to show here.

plugins/Utils/windowinputfilter.cppnew file+70

This diff is too big to show here.

plugins/Utils/windowinputfilter.hnew file+58

This diff is too big to show here.

plugins/Utils/windowstatestorage.cppnew file+383

This diff is too big to show here.

plugins/Utils/windowstatestorage.hnew file+74

This diff is too big to show here.

plugins/WindowManager/AvailableDesktopArea.cppnew file+50

This diff is too big to show here.

plugins/WindowManager/AvailableDesktopArea.hnew file+38

This diff is too big to show here.

plugins/WindowManager/CMakeLists.txtnew file+26

This diff is too big to show here.

plugins/WindowManager/InputMethodManager.cppnew file+56

This diff is too big to show here.

plugins/WindowManager/InputMethodManager.hnew file+55

This diff is too big to show here.

plugins/WindowManager/TopLevelWindowModel.cppnew file+782

This diff is too big to show here.

plugins/WindowManager/TopLevelWindowModel.hnew file+308

This diff is too big to show here.

plugins/WindowManager/Window.cppnew file+277

This diff is too big to show here.

plugins/WindowManager/Window.hnew file+176

This diff is too big to show here.

qml/Components/Circle.qml → plugins/WindowManager/WindowManagerGlobal.hrenamed+7−6

This diff is too big to show here.

plugins/WindowManager/WindowManagerPlugin.cppnew file+44

This diff is too big to show here.

plugins/WindowManager/WindowManagerPlugin.hnew file+32

This diff is too big to show here.

plugins/WindowManager/WindowMargins.cppnew file+74

This diff is too big to show here.

plugins/WindowManager/WindowMargins.hnew file+59

This diff is too big to show here.

plugins/WindowManager/qmldirnew file+2

This diff is too big to show here.

plugins/Wizard/50-com.canonical.unity.wizard.pklanew file+6

This diff is too big to show here.

plugins/Wizard/CMakeLists.txtnew file+23

This diff is too big to show here.

plugins/Wizard/Changelog.cppnew file+58

This diff is too big to show here.

plugins/Wizard/Changelog.hnew file+52

This diff is too big to show here.

plugins/Wizard/LocalePlugin.cppnew file+291

This diff is too big to show here.

plugins/Wizard/LocalePlugin.hnew file+58

This diff is too big to show here.

plugins/Wizard/PageList.cppnew file+127

This diff is too big to show here.

plugins/Wizard/PageList.hnew file+53

This diff is too big to show here.

plugins/Wizard/Status.cppnew file+143

This diff is too big to show here.

plugins/Wizard/Status.hnew file+60

This diff is too big to show here.

plugins/Wizard/System.cppnew file+182

This diff is too big to show here.

plugins/Wizard/System.hnew file+75

This diff is too big to show here.

plugins/Wizard/Unity/Application/CMakeLists.txtnew file+3

This diff is too big to show here.

tests/mocks/Unity/Application/OSKController.qml → plugins/Wizard/Unity/Application/OSKController.qmlrenamed

The content is the same.

plugins/Wizard/Unity/Application/qmldirnew file+2

This diff is too big to show here.

plugins/Wizard/Unity/CMakeLists.txtnew file+1

This diff is too big to show here.

plugins/Wizard/Utils/CMakeLists.txtnew file+27

This diff is too big to show here.

plugins/DashViews/plugin.cpp → plugins/Wizard/Utils/plugin.cpprenamed+19−13

This diff is too big to show here.

plugins/DashViews/plugin.h → plugins/Wizard/Utils/plugin.hrenamed+4−4

This diff is too big to show here.

plugins/Wizard/Utils/qmldirnew file+2

This diff is too big to show here.

plugins/Utils/qsortfilterproxymodelqml.cpp → plugins/Wizard/Utils/qsortfilterproxymodelqml.cpprenamed

The content is the same.

plugins/Utils/qsortfilterproxymodelqml.h → plugins/Wizard/Utils/qsortfilterproxymodelqml.hrenamed

The content is the same.

plugins/Wizard/keyboardLayoutsModel.cppnew file+163

This diff is too big to show here.

plugins/Wizard/keyboardLayoutsModel.hnew file+66

This diff is too big to show here.

plugins/Wizard/main.cppnew file+93

This diff is too big to show here.

plugins/Wizard/plugin.cppnew file+38

This diff is too big to show here.

qml/Components/RatingStars.qml → plugins/Wizard/plugin.hrenamed+13−7

This diff is too big to show here.

plugins/Wizard/qmldirnew file+2

This diff is too big to show here.

plugins/Wizard/timezonemodel.cppnew file+244

This diff is too big to show here.

plugins/Wizard/timezonemodel.hnew file+80

This diff is too big to show here.

plugins/Wizard/ubuntu-system-settings-wizard-cleanup.confnew file+20

This diff is too big to show here.

plugins/Wizard/ubuntu-system-settings-wizard-set-lang.confnew file+30

This diff is too big to show here.

plugins/Wizard/ubuntu-system-settings-wizard.confnew file+75

This diff is too big to show here.

po/aa.ponew file+880

This diff is too big to show here.

po/am.po+1350−114

This diff is too big to show here.

po/ar.po+1221−135

This diff is too big to show here.

po/ast.po+1350−114

This diff is too big to show here.

po/az.po+909−112

This diff is too big to show here.

po/be.ponew file+1253

This diff is too big to show here.

po/bg.po+819−114

This diff is too big to show here.

po/bn.ponew file+1062

This diff is too big to show here.

po/br.ponew file+1348

This diff is too big to show here.

po/bs.po+1061−86

This diff is too big to show here.

po/ca.po+1397−117

This diff is too big to show here.

po/ca@valencia.ponew file+1125

This diff is too big to show here.

po/ce.ponew file+816

This diff is too big to show here.

po/ckb.po+809−109

This diff is too big to show here.

po/co.ponew file+1061

This diff is too big to show here.

po/cs.po+1276−115

This diff is too big to show here.

po/cy.ponew file+1165

This diff is too big to show here.

po/da.po+1135−89

This diff is too big to show here.

po/de.po+1393−113

This diff is too big to show here.

po/el.po+1275−114

This diff is too big to show here.

po/en_AU.po+1384−111

This diff is too big to show here.

po/en_GB.po+1345−111

This diff is too big to show here.

po/en_US.ponew file+814

This diff is too big to show here.

po/eo.po+837−83

This diff is too big to show here.

po/es.po+1383−115

This diff is too big to show here.

po/et.ponew file+816

This diff is too big to show here.

po/eu.po+1168−94

This diff is too big to show here.

po/fa.po+1385−102

This diff is too big to show here.

po/fi.po+1380−113

This diff is too big to show here.

po/fo.po+829−89

This diff is too big to show here.

po/fr.po+1411−109

This diff is too big to show here.

po/ga.ponew file+1109

This diff is too big to show here.

po/gd.po+1400−118

This diff is too big to show here.

po/gl.po+1378−113

This diff is too big to show here.

po/gu.ponew file+814

This diff is too big to show here.

po/gv.ponew file+918

This diff is too big to show here.

po/he.po+1037−117

This diff is too big to show here.

po/hi.po+775−95

This diff is too big to show here.

po/hr.po+1324−113

This diff is too big to show here.

po/hu.po+1379−115

This diff is too big to show here.

po/hy.po+876−95

This diff is too big to show here.

po/ia.ponew file+1409

This diff is too big to show here.

po/id.po+920−82

This diff is too big to show here.

po/is.po+936−108

This diff is too big to show here.

po/it.po+1390−116

This diff is too big to show here.

po/ja.po+942−100

This diff is too big to show here.

po/kk.ponew file+841

This diff is too big to show here.

po/km.po+1015−117

This diff is too big to show here.

po/kn.po+747−85

This diff is too big to show here.

po/ko.po+1188−113

This diff is too big to show here.

po/ku.ponew file+978

This diff is too big to show here.

po/ky.po+747−85

This diff is too big to show here.

po/lo.po+754−90

This diff is too big to show here.

po/lt.po+976−117

This diff is too big to show here.

po/lv.po+1127−96

This diff is too big to show here.

po/ml.po+810−111

This diff is too big to show here.

po/mr.po+783−89

This diff is too big to show here.

po/ms.po+1316−110

This diff is too big to show here.

po/my.po+837−102

This diff is too big to show here.

po/nb.po+1367−112

This diff is too big to show here.

po/ne.ponew file+834

This diff is too big to show here.

po/nl.po+1378−111

This diff is too big to show here.

po/nn.ponew file+816

This diff is too big to show here.

po/oc.ponew file+1276

This diff is too big to show here.

po/or.ponew file+816

This diff is too big to show here.

po/pa.ponew file+1153

This diff is too big to show here.

po/pl.po+1374−117

This diff is too big to show here.

po/pt.po+1375−110

This diff is too big to show here.

po/pt_BR.po+1174−114

This diff is too big to show here.

po/ro.po+1172−90

This diff is too big to show here.

po/ru.po+1386−125

This diff is too big to show here.

po/sc.ponew file+904

This diff is too big to show here.

po/shn.po+727−81

This diff is too big to show here.

po/si.po+797−82

This diff is too big to show here.

po/sk.ponew file+1352

This diff is too big to show here.

po/sl.po+1347−119

This diff is too big to show here.

po/sq.po+971−94

This diff is too big to show here.

po/sr.po+1344−102

This diff is too big to show here.

po/sv.po+1375−114

This diff is too big to show here.

po/sw.po+1005−88

This diff is too big to show here.

po/ta.po+809−110

This diff is too big to show here.

po/te.po+780−81

This diff is too big to show here.

po/th.po+709−112

This diff is too big to show here.

po/tr.po+1370−113

This diff is too big to show here.

po/ug.po+1200−104

This diff is too big to show here.

po/uk.po+1375−116

This diff is too big to show here.

po/unity8.pot+719−82

This diff is too big to show here.

po/update-unity-pot+31−5

This diff is too big to show here.

po/ur.ponew file+819

This diff is too big to show here.

po/uz.ponew file+816

This diff is too big to show here.

po/vi.po+725−79

This diff is too big to show here.

po/wo.ponew file+1232

This diff is too big to show here.

po/xh.po+725−79

This diff is too big to show here.

po/zh_CN.po+1325−115

This diff is too big to show here.

po/zh_HK.po+837−109

This diff is too big to show here.

po/zh_TW.po+1273−115

This diff is too big to show here.

qml/ApplicationMenus/ApplicationMenuItemFactory.qmlnew file+135

This diff is too big to show here.

qml/ApplicationMenus/ApplicationMenusLimits.qmlnew file+24

This diff is too big to show here.

qml/ApplicationMenus/MenuBar.qmlnew file+513

This diff is too big to show here.

qml/ApplicationMenus/MenuItem.qmlnew file+146

This diff is too big to show here.

qml/ApplicationMenus/MenuNavigator.qmlnew file+101

This diff is too big to show here.

qml/ApplicationMenus/MenuPopup.qmlnew file+510

This diff is too big to show here.

qml/ApplicationMenus/RegisteredApplicationMenuModel.qmlnew file+56

This diff is too big to show here.

qml/ApplicationMenus/qmldirnew file+1

This diff is too big to show here.

qml/Bottombar/Bottombar.qmldeleted−227

This diff is too big to show here.

qml/Bottombar/HudButton.qmldeleted−64

This diff is too big to show here.

qml/Bottombar/graphics/hud@20.pngdeleted

Binary file not shown.

qml/Bottombar/graphics/hud_invoke_button_active@20.pngdeleted

Binary file not shown.

qml/CMakeLists.txt+6−5

This diff is too big to show here.

qml/Components/AnimationControllerWithSignals.qmldeleted−64

This diff is too big to show here.

qml/Components/ApplicationManagerWrapper.qmldeleted−169

This diff is too big to show here.

qml/Components/ApplicationScreenshot.qmldeleted−61

This diff is too big to show here.

qml/Components/ApplicationsModelStageFiltered.qmldeleted−49

This diff is too big to show here.

qml/Components/Background.qmlnew file+87

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_page3.qml → qml/Components/BlurLayer.qmlrenamed+18−14

This diff is too big to show here.

qml/Components/BrightnessControl.qmlnew file+54

This diff is too big to show here.

qml/Components/Carousel.qmldeleted−339

This diff is too big to show here.

qml/Components/Dialogs.qmlnew file+328

This diff is too big to show here.

qml/Components/DragHandle.qml+74−56

This diff is too big to show here.

qml/Components/DraggingArea.qml+6−2

This diff is too big to show here.

qml/Components/EdgeBarrier.qmlnew file+114

This diff is too big to show here.

qml/Components/EdgeBarrierController.qmlnew file+74

This diff is too big to show here.

qml/Components/EdgeDemo.qmldeleted−239

This diff is too big to show here.

qml/Components/EdgeDemoOverlay.qmldeleted−273

This diff is too big to show here.

qml/Components/EdgeDragArea.qmldeleted−44

This diff is too big to show here.

qml/Components/EdgeDragEvaluator.qml+20−11

This diff is too big to show here.

qml/Components/FadingLabel.qmlnew file+42

This diff is too big to show here.

qml/Components/FilterGrid.qmldeleted−110

This diff is too big to show here.

qml/Components/Flickable.qmlnew file+24

This diff is too big to show here.

qml/Components/FloatingFlickable.qmlnew file+63

This diff is too big to show here.

qml/Components/GridView.qmlnew file+24

This diff is too big to show here.

qml/Components/Handle.qmlnew file+44

This diff is too big to show here.

qml/Components/InputMethod.qmlnew file+58

This diff is too big to show here.

qml/Components/ItemGrabber.qmlnew file+86

This diff is too big to show here.

qml/Components/ItemSnapshot.qmlnew file+45

This diff is too big to show here.

qml/Components/KeyboardShortcutsOverlay.qmlnew file+336

This diff is too big to show here.

qml/Components/KeymapSwitcher.qmlnew file+102

This diff is too big to show here.

qml/Components/LazyImage.qml+32−15

This diff is too big to show here.

qml/Components/ListItems/Base.qmldeleted−125

This diff is too big to show here.

qml/Components/ListItems/Header.qmldeleted−84

This diff is too big to show here.

qml/Components/ListItems/Highlight.qmldeleted−46

This diff is too big to show here.

qml/Components/ListItems/VerticalThinDivider.qmldeleted−26

This diff is too big to show here.

qml/Components/ListItems/graphics/ListItemDividerHorizontal@18.pngdeleted

Binary file not shown.

qml/Components/ListItems/graphics/ListItemDividerVertical@18.pngdeleted

Binary file not shown.

qml/Components/ListView.qmlnew file+24

This diff is too big to show here.

qml/Components/ListViewOSKScroller.qmlnew file+53

This diff is too big to show here.

qml/Components/Lockscreen.qmlnew file+256

This diff is too big to show here.

qml/Components/MediaServices/MediaServices.qmlnew file+386

This diff is too big to show here.

qml/Components/MediaServices/MediaServicesControls.qmlnew file+192

This diff is too big to show here.

qml/Components/MediaServices/MediaServicesHeader.qmlnew file+71

This diff is too big to show here.

qml/Components/MediaServices/VideoPlayer.qmlnew file+155

This diff is too big to show here.

qml/Components/MediaServices/VideoPlayerControls.qmlnew file+158

This diff is too big to show here.

qml/Components/ModeSwitchWarningDialog.qmlnew file+101

This diff is too big to show here.

qml/Components/NotificationAudio.qmlnew file+60

This diff is too big to show here.

qml/Components/OpenEffect.qmldeleted−138

This diff is too big to show here.

qml/Components/Orientations.qmlnew file+57

This diff is too big to show here.

qml/Components/PageHeader.qmldeleted−387

This diff is too big to show here.

qml/Components/PanelState/PanelState.qmlnew file+36

This diff is too big to show here.

qml/Components/PanelState/qmldirnew file+1

This diff is too big to show here.

qml/Components/PassphraseLockscreen.qmlnew file+150

This diff is too big to show here.

qml/Components/PhysicalKeysMapper.qmlnew file+163

This diff is too big to show here.

qml/Components/PinLockscreen.qmlnew file+258

This diff is too big to show here.

qml/Components/PinPadButton.qml+45−42

This diff is too big to show here.

qml/Components/Rating.qml+3−2

This diff is too big to show here.

qml/Components/RatingStyle.qml+5−2

This diff is too big to show here.

qml/Components/ResponsiveFlowView.qmldeleted−81

This diff is too big to show here.

qml/Components/ResponsiveGridView.qmldeleted−94

This diff is too big to show here.

qml/Components/Revealer.qmldeleted−241

This diff is too big to show here.

qml/Components/ScrollCalculator.qmlnew file+100

This diff is too big to show here.

qml/Components/SearchHistoryModel.qml → qml/Components/SearchHistoryModel/SearchHistoryModel.qmlrenamed+2−1

This diff is too big to show here.

qml/Components/SearchHistoryModel/qmldirnew file+1

This diff is too big to show here.

qml/Components/SeeMore.qmldeleted−68

This diff is too big to show here.

qml/Components/SharingPicker.qmlnew file+102

This diff is too big to show here.

qml/Components/ShellDialog.qmlnew file+68

This diff is too big to show here.

qml/Components/Showable.qml+37−11

This diff is too big to show here.

qml/Components/Stage.qmldeleted−563

This diff is too big to show here.

qml/Components/StandardAnimation.qml+1−1

This diff is too big to show here.

qml/Components/TileStyle.qmldeleted−81

This diff is too big to show here.

qml/Components/UbuntuShapeForItem.qmldeleted−46

This diff is too big to show here.

qml/Components/VirtualTouchPad.qmlnew file+406

This diff is too big to show here.

qml/Components/VolumeControl.qml+28−8

This diff is too big to show here.

qml/Components/Wallpaper.qmlnew file+96

This diff is too big to show here.

qml/Components/WallpaperResolver.qmlnew file+60

This diff is too big to show here.

qml/Components/WindowControlButtons.qmlnew file+121

This diff is too big to show here.

qml/Components/WrongPasswordAnimation.qml+1−1

This diff is too big to show here.

qml/Components/ZoomableImage.qmlnew file+157

This diff is too big to show here.

tests/mocks/Unity/Notifications/notification.js → qml/Components/flickableUtils.jsrenamed+11−6

This diff is too big to show here.

qml/Components/graphics/PageHeaderBaseDivider@18.pngdeleted

Binary file not shown.

qml/Components/graphics/PageHeaderBaseDivider@18.scideleted−5

This diff is too big to show here.

qml/Components/graphics/close@20.png

Binary file not shown.

qml/Components/graphics/icon_star_empty@20.png

Binary file not shown.

qml/Components/graphics/icon_star_full@20.png

Binary file not shown.

qml/Components/graphics/icon_star_half@20.png

Binary file not shown.

qml/Components/graphics/icon_star_off@20.pngnew file

Binary file not shown.

qml/Components/graphics/icon_star_on@20.pngnew file

Binary file not shown.

qml/Components/graphics/non-selected@18.png

Binary file not shown.

qml/Components/graphics/window-close.svgnew file+164

This diff is too big to show here.

qml/Components/graphics/window-maximize.svgnew file+164

This diff is too big to show here.

qml/Components/graphics/window-minimize.svgnew file+164

This diff is too big to show here.

qml/Components/graphics/window-window.svgnew file+41

This diff is too big to show here.

qml/Dash/Apps/AppPreview.qmldeleted−167

This diff is too big to show here.

qml/Dash/Apps/CloseIcon.qmldeleted−62

This diff is too big to show here.

qml/Dash/Apps/DashPluginFilterGrid.qmldeleted−47

This diff is too big to show here.

qml/Dash/Apps/FrequentlyUsedAppsModel.qmldeleted−110

This diff is too big to show here.

qml/Dash/Apps/RunningApplicationTile.qmldeleted−139

This diff is too big to show here.

qml/Dash/Apps/RunningApplicationsGrid.qmldeleted−120

This diff is too big to show here.

qml/Dash/Apps/graphics/close_btn@9.pngdeleted

Binary file not shown.

qml/Dash/Card.qmldeleted−146

This diff is too big to show here.

qml/Dash/CardHeader.qmldeleted−140

This diff is too big to show here.

qml/Dash/CardTool.qmldeleted−140

This diff is too big to show here.

qml/Dash/Dash.qmldeleted−78

This diff is too big to show here.

qml/Dash/DashApps.qmldeleted−56

This diff is too big to show here.

qml/Dash/DashCarousel.qmldeleted−47

This diff is too big to show here.

qml/Dash/DashContent.qmldeleted−219

This diff is too big to show here.

qml/Dash/DashContentOpenEffect.qmldeleted−57

This diff is too big to show here.

qml/Dash/DashContentTabBarStyle.qmldeleted−21

This diff is too big to show here.

qml/Dash/DashFilterGrid.qmldeleted−65

This diff is too big to show here.

qml/Dash/DashPreview.qmldeleted−208

This diff is too big to show here.

qml/Dash/DashRenderer.qmldeleted−65

This diff is too big to show here.

qml/Dash/Generic/FlatTileStyle.qmldeleted−79

This diff is too big to show here.

qml/Dash/Generic/GenericCarousel.qmldeleted−53

This diff is too big to show here.

qml/Dash/Generic/GenericFilterGrid.qmldeleted−46

This diff is too big to show here.

qml/Dash/Generic/GenericFilterGridPotrait.qmldeleted−28

This diff is too big to show here.

qml/Dash/Generic/GenericPreview.qmldeleted−197

This diff is too big to show here.

qml/Dash/Generic/WeatherFilterGrid.qmldeleted−47

This diff is too big to show here.

qml/Dash/GenericScopeView.qmldeleted−400

This diff is too big to show here.

qml/Dash/Movie/MoviePreview.qmldeleted−71

This diff is too big to show here.

qml/Dash/Music/MusicFilterGrid.qmldeleted−48

This diff is too big to show here.

qml/Dash/Music/MusicPreview.qmldeleted−203

This diff is too big to show here.

qml/Dash/Music/MusicTileStyle.qmldeleted−102

This diff is too big to show here.

qml/Dash/PreviewDelegateMapper.qmldeleted−38

This diff is too big to show here.

qml/Dash/PreviewListView.qmldeleted−218

This diff is too big to show here.

qml/Dash/Previews/Header.qmldeleted−109

This diff is too big to show here.

qml/Dash/Previews/Preview.qmldeleted−104

This diff is too big to show here.

qml/Dash/Previews/PreviewActionCombo.qmldeleted−66

This diff is too big to show here.

qml/Dash/Previews/PreviewActions.qmldeleted−64

This diff is too big to show here.

qml/Dash/Previews/PreviewAudioPlayback.qmldeleted−204

This diff is too big to show here.

qml/Dash/Previews/PreviewImageGallery.qmldeleted−58

This diff is too big to show here.

qml/Dash/Previews/PreviewProgress.qmldeleted−64

This diff is too big to show here.

qml/Dash/Previews/PreviewRating.qmldeleted−160

This diff is too big to show here.

qml/Dash/Previews/PreviewTextSummary.qmldeleted−83

This diff is too big to show here.

qml/Dash/Previews/PreviewVideoPlayback.qmldeleted−72

This diff is too big to show here.

qml/Dash/Previews/PreviewWidgetFactory.qmldeleted−69

This diff is too big to show here.

qml/Dash/Previews/Reviews.qmldeleted−194

This diff is too big to show here.

qml/Dash/Previews/graphics/music_progress_bg.pngdeleted

Binary file not shown.

qml/Dash/SearchableResultModel.qmldeleted−44

This diff is too big to show here.

qml/Dash/Video/VideoCarousel.qmldeleted−34

This diff is too big to show here.

qml/Dash/Video/VideoFilterGrid.qmldeleted−47

This diff is too big to show here.

qml/Dash/Video/VideoTileStyle.qmldeleted−87

This diff is too big to show here.

qml/Dash/Video/graphics/icon_button_amazon@20.pngdeleted

Binary file not shown.

qml/Dash/Video/graphics/icon_button_u1@20.pngdeleted

Binary file not shown.

qml/Dash/Video/graphics/movie_icon_holder@27.pngdeleted

Binary file not shown.

qml/Dash/graphics/checkers.pngdeleted

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/header_handlearrow@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/icon_clear@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/icon_listview_clear@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/icon_search_active@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/icon_search_inactive@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/browser@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/camera@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/facebook@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/map@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/music@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/phone@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/settings@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/phone/screenshots/twitter@12.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button@18.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button_active@18.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button_active_big@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/play_button_big@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/tabbarchevron@27.pngdeleted

Binary file not shown.

qml/Dash/graphics/tablet/icon_close_preview@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/tooltip_arrow@27.pngdeleted

Binary file not shown.

qml/DeviceConfiguration.qmlnew file+161

This diff is too big to show here.

qml/DisabledScreenNotice.qmlnew file+81

This diff is too big to show here.

qml/Greeter/ButtonPrompt.qmlnew file+51

This diff is too big to show here.

qml/Greeter/Circle.qmlnew file+57

This diff is too big to show here.

qml/Greeter/Clock.qml+25−19

This diff is too big to show here.

qml/Greeter/CoverPage.qmlnew file+271

This diff is too big to show here.

qml/Greeter/DelayedLockscreen.qmlnew file+86

This diff is too big to show here.

qml/Greeter/Dot.qml+1−1

This diff is too big to show here.

qml/Greeter/FullLightDMImpl.qmlnew file+31

This diff is too big to show here.

qml/Greeter/Greeter.qml+580−70

This diff is too big to show here.

qml/Greeter/GreeterContent.qmldeleted−166

This diff is too big to show here.

qml/Greeter/GreeterPrompt.qmlnew file+127

This diff is too big to show here.

qml/Greeter/GreeterView.qmlnew file+534

This diff is too big to show here.

qml/Greeter/Infographics.qml+108−134

This diff is too big to show here.

qml/Greeter/IntegratedLightDMImpl.qmlnew file+30

This diff is too big to show here.

qml/Greeter/LightDMService.qmlnew file+54

This diff is too big to show here.

qml/Greeter/Lockscreen.qmldeleted−156

This diff is too big to show here.

qml/Greeter/LoginAreaContainer.qmlnew file+38

This diff is too big to show here.

qml/Greeter/LoginList.qml+174−186

This diff is too big to show here.

qml/Greeter/ObjectPositioner.qml+2−2

This diff is too big to show here.

qml/Greeter/PassphraseLockscreen.qmldeleted−88

This diff is too big to show here.

qml/Greeter/PinLockscreen.qmldeleted−216

This diff is too big to show here.

qml/Greeter/PinPrompt.qmlnew file+184

This diff is too big to show here.

qml/Greeter/PromptList.qmlnew file+151

This diff is too big to show here.

qml/Greeter/SessionIcon.qmlnew file+47

This diff is too big to show here.

qml/Greeter/SessionsList.qmlnew file+205

This diff is too big to show here.

qml/Greeter/ShimGreeter.qmlnew file+47

This diff is too big to show here.

qml/Greeter/TextPrompt.qmlnew file+198

This diff is too big to show here.

qml/Greeter/graphics/dot_empty.png

Binary file not shown.

qml/Greeter/graphics/dot_filled.png

Binary file not shown.

qml/Greeter/graphics/dot_pointer.png

Binary file not shown.

qml/Greeter/graphics/icon_arrow.png

Binary file not shown.

qml/Greeter/graphics/infographic_circle_back.pngdeleted

Binary file not shown.

qml/Greeter/graphics/session_icons/gnome_badge.pngnew file

Binary file not shown.

qml/Greeter/graphics/session_icons/kde_badge.pngnew file

Binary file not shown.

qml/Greeter/graphics/session_icons/recovery_console_badge.pngnew file

Binary file not shown.

qml/Greeter/graphics/session_icons/ubuntu_badge.pngnew file

Binary file not shown.

qml/Greeter/graphics/session_icons/unknown_badge.pngnew file

Binary file not shown.

qml/Greeter/qmldirnew file+1

This diff is too big to show here.

qml/Hud/Hud.qmldeleted−496

This diff is too big to show here.

qml/Hud/HudParametrizedActionsPage.qmldeleted−172

This diff is too big to show here.

qml/Hud/Result.qmldeleted−84

This diff is too big to show here.

qml/Hud/ResultList.qmldeleted−106

This diff is too big to show here.

qml/Hud/SearchBar.qmldeleted−100

This diff is too big to show here.

qml/Hud/ShowingAnimation.qmldeleted−54

This diff is too big to show here.

qml/Hud/SliderLabel.qmldeleted−76

This diff is too big to show here.

qml/Hud/SoundAmplitudeDelegate.qmldeleted−52

This diff is too big to show here.

qml/Hud/SoundAmplitudeVisual.qmldeleted−146

This diff is too big to show here.

qml/Hud/graphics/divider@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/divider@20.scideleted−5

This diff is too big to show here.

qml/Hud/graphics/dropshadow_right@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/help@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/hud_bg@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/hud_handlearrow@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/hud_handlebar@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/icon_arrow@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/icon_clear@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/icon_search@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/microphone@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/popup_triangle@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/settings@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/undo@20.pngdeleted

Binary file not shown.

qml/Hud/graphics/view-fullscreen@20.pngdeleted

Binary file not shown.

qml/Launcher/BackgroundBlur.qmlnew file+81

This diff is too big to show here.

qml/Launcher/Drawer.qmlnew file+413

This diff is too big to show here.

qml/Launcher/DrawerGridView.qmlnew file+85

This diff is too big to show here.

qml/Launcher/FoldingLauncherDelegate.qml+2−2

This diff is too big to show here.

qml/Launcher/Launcher.qml+479−71

This diff is too big to show here.

qml/Launcher/LauncherDelegate.qml+167−55

This diff is too big to show here.

qml/Launcher/LauncherPanel.qml+509−126

This diff is too big to show here.

qml/Launcher/PullToRefreshScopeStyle.qmlnew file+83

This diff is too big to show here.

qml/Launcher/Tooltip.qmlnew file+72

This diff is too big to show here.

qml/Launcher/graphics/divider-line.pngnew file

Binary file not shown.

qml/Launcher/graphics/focused_app_arrow@30.png

Binary file not shown.

qml/Launcher/graphics/highlight@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/home.svgnew file+243

This diff is too big to show here.

qml/Launcher/graphics/home@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/launcher_bg@30.pngdeleted

Binary file not shown.

qml/Launcher/graphics/launcher_bg@30.scideleted−5

This diff is too big to show here.

qml/Launcher/graphics/non-selected@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/non-selected@18.scideleted−5

This diff is too big to show here.

qml/Launcher/graphics/notification@30.pngdeleted

Binary file not shown.

qml/Launcher/graphics/notification@30.scideleted−5

This diff is too big to show here.

qml/Launcher/graphics/progressbar-fill@30.pngdeleted

Binary file not shown.

qml/Launcher/graphics/progressbar-fill@30.scideleted−5

This diff is too big to show here.

qml/Launcher/graphics/progressbar-trough@30.pngdeleted

Binary file not shown.

qml/Launcher/graphics/progressbar-trough@30.scideleted−5

This diff is too big to show here.

qml/Launcher/graphics/quicklist_tooltip@30.png

Binary file not shown.

qml/Launcher/graphics/selected@18.pngdeleted

Binary file not shown.

qml/Launcher/graphics/selected@18.scideleted−5

This diff is too big to show here.

qml/Launcher/graphics/triangle@18.pngdeleted

Binary file not shown.

qml/Notifications/Notification.qml+396−131

This diff is too big to show here.

qml/Notifications/NotificationButton.qmlnew file+73

This diff is too big to show here.

qml/Notifications/NotificationMenuItemFactory.qml+133−19

This diff is too big to show here.

qml/Notifications/Notifications.qml+46−11

This diff is too big to show here.

qml/Notifications/OptionToggle.qmlnew file+125

This diff is too big to show here.

qml/Notifications/ShapedIcon.qml+8−5

This diff is too big to show here.

qml/Notifications/SwipeToAct.qmlnew file+275

This diff is too big to show here.

qml/OrientedShell.qmlnew file+336

This diff is too big to show here.

qml/Panel/ActiveCallHint.qmlnew file+211

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_scopeView1.qml → qml/Panel/FakePanelMenu.qmlrenamed+8−6

This diff is too big to show here.

qml/Panel/IndicatorItem.qmldeleted−55

This diff is too big to show here.

qml/Panel/IndicatorRow.qmldeleted−162

This diff is too big to show here.

qml/Panel/Indicators.qmldeleted−436

This diff is too big to show here.

qml/Panel/Indicators/DefaultIndicatorPage.qmldeleted−222

This diff is too big to show here.

qml/Panel/Indicators/DefaultIndicatorWidget.qmldeleted−127

This diff is too big to show here.

plugins/Unity/Indicators/qml/IndicatorBase.qml → qml/Panel/Indicators/IndicatorBase.qmlrenamed+10−13

This diff is too big to show here.

qml/Panel/Indicators/IndicatorDelegate.qml+4−13

This diff is too big to show here.

qml/Panel/Indicators/IndicatorItem.qmlnew file+310

This diff is too big to show here.

qml/Panel/Indicators/IndicatorMenuItemFactory.qmlnew file+1113

This diff is too big to show here.

qml/Panel/Indicators/IndicatorsLight.qmlnew file+234

This diff is too big to show here.

qml/Panel/Indicators/MessageMenuItemFactory.qmlnew file+244

This diff is too big to show here.

qml/Panel/Indicators/VisibleIndicators.qmldeleted−84

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorRepresentation.qmlnew file+121

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorsClient.qml+14−4

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorsList.qml+23−21

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorsPage.qmldeleted−91

This diff is too big to show here.

qml/Panel/Indicators/client/IndicatorsTree.qml+12−36

This diff is too big to show here.

qml/Panel/MenuContent.qml+42−116

This diff is too big to show here.

qml/Panel/Panel.qml+459−109

This diff is too big to show here.

qml/Panel/PanelBar.qmlnew file+330

This diff is too big to show here.

qml/Panel/PanelItemRow.qmlnew file+270

This diff is too big to show here.

qml/Panel/PanelMenu.qmlnew file+414

This diff is too big to show here.

qml/Panel/PanelMenuPage.qmlnew file+226

This diff is too big to show here.

qml/Panel/PanelVelocityCalculator.qmlnew file+54

This diff is too big to show here.

qml/Panel/SearchIndicator.qmldeleted−82

This diff is too big to show here.

qml/Panel/graphics/Battery@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Bluetooth@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Clock@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Location@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Messages@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Network@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Sound@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Sync@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/System@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/Time@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/VerticalDivider@18.pngdeleted

Binary file not shown.

qml/Panel/graphics/handle@12.pngdeleted

Binary file not shown.

qml/Panel/graphics/handle@12.scideleted−5

This diff is too big to show here.

qml/Panel/graphics/rectangular_dropshadow@30.png

Binary file not shown.

qml/Panel/graphics/search@12.pngdeleted

Binary file not shown.

qml/Panel/graphics/time_and_date@18.pngdeleted

Binary file not shown.

qml/Rotation/HalfLoopRotationAnimation.qmlnew file+47

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_page2.qml → qml/Rotation/ImmediateRotationAction.qmlrenamed+14−15

This diff is too big to show here.

qml/Rotation/NinetyRotationAnimation.qmlnew file+88

This diff is too big to show here.

qml/Rotation/RotationStates.qmlnew file+289

This diff is too big to show here.

qml/Rotation/UpdateShellTransformations.qmlnew file+42

This diff is too big to show here.

qml/ScopeTool.qmldeleted−175

This diff is too big to show here.

qml/Shell.qml+754−612

This diff is too big to show here.

qml/SideStage/SideStage.qmldeleted−73

This diff is too big to show here.

qml/SideStage/graphics/sidestage_handle@20.pngdeleted

Binary file not shown.

qml/Stage/ApplicationWindow.qmlnew file+416

This diff is too big to show here.

qml/Stage/ChildWindow.qmlnew file+203

This diff is too big to show here.

qml/Stage/ChildWindowRepeater.qmlnew file+39

This diff is too big to show here.

qml/Stage/ChildWindowTree.qmlnew file+138

This diff is too big to show here.

qml/Stage/DecoratedWindow.qmlnew file+319

This diff is too big to show here.

qml/Stage/FakeMaximizeDelegate.qmlnew file+233

This diff is too big to show here.

qml/Stage/MainViewStyle.qmlnew file+87

This diff is too big to show here.

qml/Stage/MoveHandler.qmlnew file+201

This diff is too big to show here.

qml/Stage/OrientationChangeAnimation.qmlnew file+265

This diff is too big to show here.

qml/Stage/PromptSurfaceAnimations.qmlnew file+80

This diff is too big to show here.

qml/Dash/Video/CarouselDelegateVideo.qml → qml/Stage/ResizeGrip.qmlrenamed+25−21

This diff is too big to show here.

qml/Stage/SideStage.qmlnew file+121

This diff is too big to show here.

qml/Stage/Splash.qmlnew file+150

This diff is too big to show here.

qml/Stage/Spread/BezierCurve.qmlnew file+45

This diff is too big to show here.

qml/Stage/Spread/KeySpline.jsnew file+66

This diff is too big to show here.

qml/Stage/Spread/MathUtils.jsnew file+95

This diff is too big to show here.

qml/Stage/Spread/OpacityMask.qmlnew file+82

This diff is too big to show here.

qml/Stage/Spread/Spread.qmlnew file+173

This diff is too big to show here.

qml/Stage/Spread/SpreadDelegateInputArea.qmlnew file+189

This diff is too big to show here.

qml/Stage/Spread/SpreadMaths.qmlnew file+78

This diff is too big to show here.

qml/Stage/Spread/StagedRightEdgeMaths.qmlnew file+174

This diff is too big to show here.

qml/Stage/Spread/WindowedRightEdgeMaths.qmlnew file+96

This diff is too big to show here.

qml/Stage/Spread/cubic-bezier.jsnew file+39

This diff is too big to show here.

qml/Stage/Stage.qmlnew file+2241

This diff is too big to show here.

qml/Stage/StageMaths.qmlnew file+93

This diff is too big to show here.

qml/Stage/StagedFullscreenPolicy.qmlnew file+50

This diff is too big to show here.

qml/Stage/SurfaceContainer.qmlnew file+108

This diff is too big to show here.

qml/Stage/TabletSideStageTouchGesture.qmlnew file+157

This diff is too big to show here.

qml/Stage/WindowControlsOverlay.qmlnew file+254

This diff is too big to show here.

qml/Stage/WindowDecoration.qmlnew file+163

This diff is too big to show here.

qml/Stage/WindowInfoItem.qmlnew file+69

This diff is too big to show here.

qml/Stage/WindowResizeArea.qmlnew file+300

This diff is too big to show here.

qml/Stage/WindowStateSaver.qmlnew file+64

This diff is too big to show here.

qml/Dash/ScopeDelegateMapper.qml → qml/Stage/WindowedFullscreenPolicy.qmlrenamed+11−12

This diff is too big to show here.

qml/Stage/graphics/PageHeaderBaseDividerBottom@18.pngnew file

Binary file not shown.

qml/Stage/graphics/PageHeaderBaseDividerLight@18.pngnew file

Binary file not shown.

qml/Stage/graphics/PageHeaderBaseDividerLight@18.scinew file+5

This diff is too big to show here.

qml/Stage/graphics/arrows-centre.pngnew file

Binary file not shown.

qml/Stage/graphics/arrows.pngnew file

Binary file not shown.

qml/Stage/graphics/sidestage_drag.svgnew file+207

This diff is too big to show here.

qml/Stage/graphics/sidestage_handle@20.pngnew file

Binary file not shown.

qml/SideStage/graphics/sidestage_handle@20.sci → qml/Stage/graphics/sidestage_handle@20.scirenamed

The content is the same.

qml/Stage/graphics/sidestage_open.svgnew file+181

This diff is too big to show here.

qml/Stage/graphics/window-close.svgnew file+64

This diff is too big to show here.

qml/Tutorial/InactivityTimer.qmlnew file+78

This diff is too big to show here.

qml/Tutorial/Tutorial.qmlnew file+105

This diff is too big to show here.

qml/Tutorial/TutorialContent.qmlnew file+225

This diff is too big to show here.

qml/Tutorial/TutorialLeft.qmlnew file+54

This diff is too big to show here.

qml/Tutorial/TutorialLeftLong.qmlnew file+56

This diff is too big to show here.

qml/Tutorial/TutorialPage.qmlnew file+121

This diff is too big to show here.

qml/Tutorial/TutorialRight.qmlnew file+61

This diff is too big to show here.

qml/Tutorial/TutorialTop.qmlnew file+60

This diff is too big to show here.

qml/Tutorial/graphics/arrow.svgnew file+19

This diff is too big to show here.

qml/Tutorial/graphics/background1.pngnew file

Binary file not shown.

qml/Tutorial/graphics/background2.pngnew file

Binary file not shown.

qml/Wizard/CheckableSetting.qmlnew file+92

This diff is too big to show here.

qml/Wizard/Components/InputMethod.qmlnew file+113

This diff is too big to show here.

qml/Wizard/Page.qmlnew file+340

This diff is too big to show here.

qml/Wizard/Pages.qmlnew file+269

This diff is too big to show here.

qml/Wizard/Pages/10-welcome-update.qmlnew file+137

This diff is too big to show here.

qml/Wizard/Pages/10-welcome.qmlnew file+197

This diff is too big to show here.

qml/Wizard/Pages/11-changelog.qmlnew file+95

This diff is too big to show here.

qml/Wizard/Pages/20-keyboard.qmlnew file+161

This diff is too big to show here.

qml/Wizard/Pages/30-wifi.qmlnew file+219

This diff is too big to show here.

qml/Wizard/Pages/50-timezone.qmlnew file+278

This diff is too big to show here.

qml/Wizard/Pages/60-account.qmlnew file+76

This diff is too big to show here.

qml/Wizard/Pages/70-passwd-type.qmlnew file+168

This diff is too big to show here.

qml/Wizard/Pages/78-firmware-update.qml.disablednew file+246

This diff is too big to show here.

qml/Wizard/Pages/79-system-update.qmlnew file+148

This diff is too big to show here.

qml/Wizard/Pages/80-finished.qmlnew file+137

This diff is too big to show here.

qml/Wizard/Pages/data/Desktop_header_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Desktop_splash_screen_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Phone_header_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Phone_splash_screen_bkg.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/Tick@30.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/map.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/pin.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-1.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-10.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-11.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-2.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-3.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-3.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-4.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-4.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-6.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-7.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-8.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-9.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_-9.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_0.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_1.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_10.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_10.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_11.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_12.75.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_12.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_13.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_2.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_3.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_3.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_4.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_4.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.75.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_6.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_6.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_7.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_8.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_8.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_9.5.pngnew file

Binary file not shown.

qml/Wizard/Pages/data/timezonemap/timezone_9.pngnew file

Binary file not shown.

qml/Wizard/Pages/passcode-confirm.qmlnew file+69

This diff is too big to show here.

qml/Wizard/Pages/passcode-desktop.qmlnew file+159

This diff is too big to show here.

qml/Wizard/Pages/passcode-set.qmlnew file+78

This diff is too big to show here.

qml/Wizard/Pages/password-set.qmlnew file+158

This diff is too big to show here.

qml/Wizard/Pages/sim.qmlnew file+108

This diff is too big to show here.

qml/Wizard/PasswordMeter.qmlnew file+108

This diff is too big to show here.

qml/Components/Tile.qml → qml/Wizard/StackButton.qmlrenamed+19−16

This diff is too big to show here.

qml/Wizard/Wizard.qmlnew file+58

This diff is too big to show here.

qml/Wizard/WizardItemSelector.qmlnew file+129

This diff is too big to show here.

qml/Wizard/WizardTextField.qmlnew file+25

This diff is too big to show here.

qml/graphics/12_10_background_wide@12.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/browser@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/calendar@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/camera@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/contacts-app@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/dash@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/evernote@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/facebook@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/gallery@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/gmail@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/map@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/messages-app@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/notepad@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/phone-app@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/pinterest@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/soundcloud@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/system-settings@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/twitter@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/weather@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/wikipedia@18.pngdeleted

Binary file not shown.

qml/graphics/applicationIcons/youtube@18.pngdeleted

Binary file not shown.

qml/graphics/avatars/amanda@12.pngdeleted

Binary file not shown.

qml/graphics/avatars/anna_olsson@12.pngdeleted

Binary file not shown.

qml/graphics/avatars/funky@12.pngdeleted

Binary file not shown.

qml/graphics/clock@18.pngdeleted

Binary file not shown.

qml/graphics/dropshadow2gu@30.pngnew file

Binary file not shown.

qml/graphics/dropshadow2gu@30.scinew file+5

This diff is too big to show here.

qml/graphics/dropshadow_left@20.pngnew file

Binary file not shown.

qml/graphics/dropshadow_right@20.pngnew file

Binary file not shown.

qml/graphics/phone_background.jpgdeleted

Binary file not shown.

qml/graphics/tablet_background.jpgdeleted

Binary file not shown.

rundeleted−75

This diff is too big to show here.

run_on_devicedeleted−165

This diff is too big to show here.

runtests.sh+4−1

This diff is too big to show here.

src/ApplicationArguments.cppnew file+22

This diff is too big to show here.

src/ApplicationArguments.h+23−14

This diff is too big to show here.

src/CMakeLists.txt+37−12

This diff is too big to show here.

src/CachingNetworkManagerFactory.cppnew file+54

This diff is too big to show here.

src/CachingNetworkManagerFactory.hnew file+47

This diff is too big to show here.

src/DebuggingController.cppnew file+92

This diff is too big to show here.

src/DebuggingController.hnew file+57

This diff is too big to show here.

src/MouseTouchAdaptor.cpp+293−27

This diff is too big to show here.

src/MouseTouchAdaptor.h+31−8

This diff is too big to show here.

src/Panel/CMakeLists.txtdeleted−1

This diff is too big to show here.

src/Panel/Indicators/CMakeLists.txtdeleted−1

This diff is too big to show here.

src/SecondaryWindow.cppnew file+40

This diff is too big to show here.

qml/Components/ListItems/ThinDivider.qml → src/SecondaryWindow.hrenamed+13−10

This diff is too big to show here.

src/ShellApplication.cppnew file+231

This diff is too big to show here.

src/ShellApplication.hnew file+61

This diff is too big to show here.

src/ShellView.cppnew file+85

This diff is too big to show here.

src/ShellView.hnew file+34

This diff is too big to show here.

src/UnityCommandLineParser.cppnew file+130

This diff is too big to show here.

src/UnityCommandLineParser.hnew file+60

This diff is too big to show here.

src/UnixSignalHandler.cppnew file+139

This diff is too big to show here.

src/UnixSignalHandler.hnew file+54

This diff is too big to show here.

src/libunity8-private/CMakeLists.txtnew file+27

This diff is too big to show here.

src/libunity8-private/abstractdbusservicemonitor.cppnew file+100

This diff is too big to show here.

src/libunity8-private/abstractdbusservicemonitor.hnew file+70

This diff is too big to show here.

src/libunity8-private/unitydbusobject.cppnew file+86

This diff is too big to show here.

src/libunity8-private/unitydbusobject.hnew file+46

This diff is too big to show here.

src/libunity8-private/unitydbusvirtualobject.cppnew file+83

This diff is too big to show here.

src/libunity8-private/unitydbusvirtualobject.hnew file+47

This diff is too big to show here.

src/main.cpp+30−152

This diff is too big to show here.

qml/Hud/ToolBar.qml → src/qmldebuggerutils.hrenamed+14−14

This diff is too big to show here.

tests/CMakeLists.txt+148−9

This diff is too big to show here.

tests/autopilot/setup.py+2−2

This diff is too big to show here.

tests/autopilot/unity8/__init__.py+11−4

This diff is too big to show here.

tests/autopilot/unity8/application_lifecycle/tests/__init__.py+49

This diff is too big to show here.

tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+87−79

This diff is too big to show here.

tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+12−77

This diff is too big to show here.

tests/autopilot/unity8/fixture_setup.pynew file+329

This diff is too big to show here.

tests/autopilot/unity8/greeter/__init__.pynew file+97

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/__init__.py → tests/autopilot/unity8/greeter/tests/__init__.pyrenamed+8−12

This diff is too big to show here.

tests/autopilot/unity8/greeter/tests/test_args.pynew file+49

This diff is too big to show here.

tests/autopilot/unity8/indicators/__init__.py+203

This diff is too big to show here.

tests/autopilot/unity8/indicators/tests/__init__.py+42

This diff is too big to show here.

tests/autopilot/unity8/indicators/tests/test_action_latency.pynew file+237

This diff is too big to show here.

tests/autopilot/unity8/indicators/tests/test_display_indicator.pynew file+52

This diff is too big to show here.

tests/autopilot/unity8/indicators/tests/test_indicators.py+57−19

This diff is too big to show here.

tests/autopilot/unity8/launcher.pynew file+66

This diff is too big to show here.

tests/autopilot/unity8/process_helpers.py+107−77

This diff is too big to show here.

tests/autopilot/unity8/sensors.pynew file+93

This diff is too big to show here.

tests/autopilot/unity8/shell/__init__.py+230−27

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/create_interactive_notification.py → tests/autopilot/unity8/shell/create_interactive_notification.pyrenamed+3−4

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/launcher.py → tests/autopilot/unity8/shell/emulators.pyrenamed+27−15

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/dash.pydeleted−214

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/greeter.pydeleted−40

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/hud.pydeleted−87

This diff is too big to show here.

tests/autopilot/unity8/shell/emulators/main_window.pydeleted−119

This diff is too big to show here.

tests/autopilot/unity8/shell/fixture_setup.py+35−23

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/__init__.py+178−200

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_emulators.pydeleted−215

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_greeter.pydeleted−38

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_helpers.pynew file+44

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_hud.pydeleted−188

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_lock_screen.py+55−88

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_notifications.py+192−203

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_rotation.pynew file+113

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_system_integration.py+16−8

This diff is too big to show here.

tests/autopilot/unity8/shell/tests/test_upstart.py+58−20

This diff is too big to show here.

tests/copyright/CMakeLists.txt+1−1

This diff is too big to show here.

tests/copyright/check_copyright.sh+35−4

This diff is too big to show here.

tests/data/unity/backgrounds/20x30.pngnew file

Binary file not shown.

tests/data/unity/backgrounds/black.pngnew file

Binary file not shown.

tests/data/unity/backgrounds/blue.png

Binary file not shown.

tests/data/unity/backgrounds/red.png

Binary file not shown.

tests/graphics/applicationIcons/browser@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/calendar@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/camera@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/contacts-app@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/dash@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/dialer-app@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/evernote@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/facebook@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/gallery@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/gmail@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/libreoffice@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/map@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/messages-app@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/notepad@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/pinterest@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/soundcloud@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/system-settings@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/twitter@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/weather@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/wikipedia@18.pngnew file

Binary file not shown.

tests/graphics/applicationIcons/youtube@18.pngnew file

Binary file not shown.

tests/graphics/avatars/amanda@12.pngnew file

Binary file not shown.

tests/graphics/avatars/anna_olsson@12.pngnew file

Binary file not shown.

tests/graphics/avatars/funky@12.pngnew file

Binary file not shown.

tests/graphics/clock@18.pngnew file

Binary file not shown.

qml/Dash/graphics/phone/screenshots/gallery@12.png → tests/graphics/screenshots/gallery@12.pngrenamed

Binary file not shown.

tests/imports/CMakeLists.txtnew file+5

This diff is too big to show here.

tests/imports/check_imports.pynew file+183

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.cpp+156−10

This diff is too big to show here.

tests/mocks/AccountsService/AccountsService.h+86−8

This diff is too big to show here.

tests/mocks/AccountsService/CMakeLists.txt+15−12

This diff is too big to show here.

tests/mocks/AccountsService/plugin.cpp+1

This diff is too big to show here.

tests/mocks/AccountsService/plugin.h+1−1

This diff is too big to show here.

tests/mocks/AccountsService/qmldir+1

This diff is too big to show here.

tests/mocks/Biometryd/CMakeLists.txtnew file+14

This diff is too big to show here.

tests/mocks/Biometryd/MockBiometryd.cppnew file+43

This diff is too big to show here.

tests/mocks/Biometryd/MockBiometryd.hnew file+50

This diff is too big to show here.

tests/mocks/Biometryd/MockDevice.cppnew file+29

This diff is too big to show here.

tests/mocks/Biometryd/MockDevice.hnew file+40

This diff is too big to show here.

tests/mocks/Biometryd/MockIdentifier.cppnew file+28

This diff is too big to show here.

tests/mocks/Biometryd/MockIdentifier.hnew file+36

This diff is too big to show here.

tests/mocks/Biometryd/MockObserver.cppnew file+22

This diff is too big to show here.

tests/mocks/Unity/iconutils.h → tests/mocks/Biometryd/MockObserver.hrenamed+17−9

This diff is too big to show here.

tests/mocks/Biometryd/MockOperation.cppnew file+56

This diff is too big to show here.

tests/mocks/Biometryd/MockOperation.hnew file+47

This diff is too big to show here.

qml/Dash/Previews/PreviewWidget.qml → tests/mocks/Biometryd/plugin.cpprenamed+19−17

This diff is too big to show here.

tests/mocks/Biometryd/plugin.hnew file+31

This diff is too big to show here.

tests/mocks/Biometryd/qmldirnew file+3

This diff is too big to show here.

tests/mocks/CMakeLists.txt+40−2

This diff is too big to show here.

tests/mocks/Cursor/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/mocks/Cursor/Cursor.qmlnew file+34

This diff is too big to show here.

tests/mocks/Cursor/qmldirnew file+2

This diff is too big to show here.

tests/mocks/GSettings.1.0/CMakeLists.txt+2−6

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.cpp+335−20

This diff is too big to show here.

tests/mocks/GSettings.1.0/fake_gsettings.h+103−13

This diff is too big to show here.

tests/mocks/GSettings.1.0/plugin.h+1−1

This diff is too big to show here.

tests/mocks/GSettings.1.0/qmldir+1

This diff is too big to show here.

tests/mocks/HudClient/CMakeLists.txtdeleted−41

This diff is too big to show here.

tests/mocks/HudClient/fake_hud_plugin.cppdeleted−39

This diff is too big to show here.

tests/mocks/HudClient/fake_libhud_client.cppdeleted−240

This diff is too big to show here.

tests/mocks/HudClient/libhud_client_stub.cppdeleted−93

This diff is too big to show here.

tests/mocks/HudClient/libhud_client_stub.hdeleted−64

This diff is too big to show here.

tests/mocks/HudClient/qmldirdeleted−1

This diff is too big to show here.

tests/mocks/LightDM/CMakeLists.txtdeleted−57

This diff is too big to show here.

tests/mocks/LightDM/QLightDM/Greeterdeleted−1

This diff is too big to show here.

tests/mocks/LightDM/QLightDM/InfographicModeldeleted−1

This diff is too big to show here.

tests/mocks/LightDM/QLightDM/UsersModeldeleted−1

This diff is too big to show here.

tests/mocks/LightDM/full/CMakeLists.txtdeleted−18

This diff is too big to show here.

tests/mocks/LightDM/full/UsersModelPrivate.cppdeleted−52

This diff is too big to show here.

tests/mocks/LightDM/single-passphrase/CMakeLists.txtdeleted−19

This diff is too big to show here.

tests/mocks/LightDM/single-passphrase/GreeterPrivate.cppdeleted−53

This diff is too big to show here.

tests/mocks/LightDM/single-pin/CMakeLists.txtdeleted−19

This diff is too big to show here.

tests/mocks/LightDM/single-pin/GreeterPrivate.cppdeleted−53

This diff is too big to show here.

tests/mocks/LightDM/single/CMakeLists.txtdeleted−18

This diff is too big to show here.

tests/mocks/LightDMController/CMakeLists.txtnew file+14

This diff is too big to show here.

tests/mocks/LightDMController/plugin.cppnew file+35

This diff is too big to show here.

tests/mocks/HudClient/fake_hud_plugin.h → tests/mocks/LightDMController/plugin.hrenamed+6−8

This diff is too big to show here.

tests/mocks/LightDMController/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Lights/CMakeLists.txtnew file+8

This diff is too big to show here.

tests/mocks/Lights/Lights.cppnew file+84

This diff is too big to show here.

tests/mocks/Lights/Lights.hnew file+66

This diff is too big to show here.

plugins/HudClient/plugin.cpp → tests/mocks/Lights/plugin.cpprenamed+12−15

This diff is too big to show here.

tests/mocks/Lights/plugin.hnew file+32

This diff is too big to show here.

tests/mocks/Lights/qmldirnew file+3

This diff is too big to show here.

tests/mocks/MeeGo/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/CMakeLists.txtnew file+11

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/MockOfonoSimManager.qmlnew file+53

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/MockQOfono.cppnew file+90

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/MockQOfono.hnew file+61

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/MockQOfonoManager.cppnew file+66

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/MockQOfonoManager.hnew file+49

This diff is too big to show here.

qml/Dash/Previews/PreviewZoomableImage.qml → tests/mocks/MeeGo/QOfono/plugin.cpprenamed+15−21

This diff is too big to show here.

plugins/HudClient/plugin.h → tests/mocks/MeeGo/QOfono/plugin.hrenamed+7−7

This diff is too big to show here.

tests/mocks/MeeGo/QOfono/qmldirnew file+3

This diff is too big to show here.

tests/mocks/Powerd/CMakeLists.txt+2−13

This diff is too big to show here.

tests/mocks/Powerd/Powerd.cpp+15−1

This diff is too big to show here.

tests/mocks/Powerd/Powerd.h+17−8

This diff is too big to show here.

tests/mocks/Powerd/plugin.h+1−1

This diff is too big to show here.

tests/mocks/Powerd/qmldir+1

This diff is too big to show here.

tests/mocks/QMenuModel/CMakeLists.txt+5−14

This diff is too big to show here.

tests/mocks/QMenuModel/QDBusActionGroup.qml+30−5

This diff is too big to show here.

tests/mocks/QMenuModel/UnityMenuAction.qml+1−1

This diff is too big to show here.

tests/mocks/QMenuModel/actiondata.hnew file+54

This diff is too big to show here.

tests/mocks/QMenuModel/dbus-enums.hnew file+51

This diff is too big to show here.

tests/mocks/QMenuModel/plugin.cpp+13

This diff is too big to show here.

tests/mocks/QMenuModel/plugin.h+1−1

This diff is too big to show here.

tests/mocks/QMenuModel/qmldir+1

This diff is too big to show here.

tests/mocks/QMenuModel/unitymenumodel.cpp+92−24

This diff is too big to show here.

tests/mocks/QMenuModel/unitymenumodel.h+28−9

This diff is too big to show here.

tests/mocks/QtMultimedia/CMakeLists.txt+10−14

This diff is too big to show here.

tests/mocks/QtMultimedia/VideoSurface.qmlnew file+111

This diff is too big to show here.

tests/mocks/QtMultimedia/audio.cppdeleted−107

This diff is too big to show here.

tests/mocks/QtMultimedia/audio.hdeleted−78

This diff is too big to show here.

tests/mocks/QtMultimedia/declarativeplaylist.cppnew file+73

This diff is too big to show here.

tests/mocks/QtMultimedia/declarativeplaylist.hnew file+54

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.cppnew file+319

This diff is too big to show here.

tests/mocks/QtMultimedia/mediaplayer.hnew file+224

This diff is too big to show here.

tests/mocks/QtMultimedia/plugin.cpp+9−2

This diff is too big to show here.

tests/mocks/QtMultimedia/plugin.h+1−1

This diff is too big to show here.

tests/mocks/QtMultimedia/qmldir+1

This diff is too big to show here.

tests/mocks/QtMultimedia/videooutput.cppnew file+127

This diff is too big to show here.

tests/mocks/QtMultimedia/videooutput.hnew file+52

This diff is too big to show here.

tests/mocks/SessionBroadcast/CMakeLists.txtnew file+8

This diff is too big to show here.

tests/mocks/SessionBroadcast/SessionBroadcast.cppnew file+34

This diff is too big to show here.

tests/mocks/SessionBroadcast/SessionBroadcast.hnew file+39

This diff is too big to show here.

tests/mocks/SessionBroadcast/plugin.cppnew file+31

This diff is too big to show here.

tests/mocks/SessionBroadcast/plugin.hnew file+32

This diff is too big to show here.

tests/mocks/SessionBroadcast/qmldirnew file+2

This diff is too big to show here.

tests/mocks/UInput/CMakeLists.txtnew file+7

This diff is too big to show here.

tests/mocks/UInput/mockuinput.cppnew file+73

This diff is too big to show here.

tests/mocks/UInput/mockuinput.hnew file+63

This diff is too big to show here.

tests/mocks/UInput/plugin.cppnew file+26

This diff is too big to show here.

tests/mocks/UInput/plugin.hnew file+32

This diff is too big to show here.

tests/mocks/UInput/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/CMakeLists.txt+5

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/CMakeLists.txtnew file+10

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/networking-status.cppnew file+70

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/networking-status.hnew file+74

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/plugin.cppnew file+47

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/plugin.hnew file+35

This diff is too big to show here.

tests/mocks/Ubuntu/Connectivity/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/DownloadDaemonListener/CMakeLists.txt+2−10

This diff is too big to show here.

tests/mocks/Ubuntu/DownloadDaemonListener/MockDownloadTracker.cpp+3−1

This diff is too big to show here.

tests/mocks/Ubuntu/DownloadDaemonListener/MockDownloadTracker.h+2−1

This diff is too big to show here.

tests/mocks/Ubuntu/DownloadDaemonListener/plugin.h+1−1

This diff is too big to show here.

tests/mocks/Ubuntu/DownloadDaemonListener/qmldir+1

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/CMakeLists.txtnew file+5

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Diagnostics/CMakeLists.txtnew file+1

This diff is too big to show here.

qml/Dash/DashPreviewPlaceholder.qml → tests/mocks/Ubuntu/SystemSettings/Diagnostics/MockDiagnostics.qmlrenamed+6−7

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Diagnostics/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/mocks/Unity/Application/InputFilterArea.qml → tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockKeyboardPlugin.qmlrenamed+3−3

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/MockLanguagePlugin.qmlnew file+24

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/LanguagePlugin/qmldirnew file+3

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/CMakeLists.txtnew file+10

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.cppnew file+35

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/MockSecurityPrivacy.hnew file+50

This diff is too big to show here.

tests/mocks/LightDM/single/UsersModelPrivate.cpp → tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/plugin.cpprenamed+7−14

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/plugin.hnew file+31

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/CMakeLists.txtnew file+1

This diff is too big to show here.

qml/Dash/DashHome.qml → tests/mocks/Ubuntu/SystemSettings/TimeDate/MockTimeDate.qmlrenamed+14−16

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/TimeDate/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Update/CMakeLists.txtnew file+1

This diff is too big to show here.

qml/Dash/ScopeListView.qml → tests/mocks/Ubuntu/SystemSettings/Update/MockSystemImage.qmlrenamed+11−9

This diff is too big to show here.

tests/mocks/Ubuntu/SystemSettings/Update/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/CMakeLists.txtnew file+14

This diff is too big to show here.

qml/Dash/Previews/PreviewHeader.qml → tests/mocks/Ubuntu/Telephony/ContactWatcherData.cpprenamed+22−17

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/ContactWatcherData.hnew file+46

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockCallEntry.cppnew file+91

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockCallEntry.hnew file+65

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockCallManager.cppnew file+80

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockCallManager.hnew file+60

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockContactWatcher.cppnew file+50

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockContactWatcher.hnew file+49

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.cppnew file+62

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/MockTelepathyHelper.hnew file+58

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/plugin.cppnew file+52

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/plugin.hnew file+37

This diff is too big to show here.

tests/mocks/Ubuntu/Telephony/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/mocks/Ubuntu/Thumbnailer/qmldirnew file+4

This diff is too big to show here.

tests/mocks/Ubuntu/Web/CMakeLists.txtnew file+1

This diff is too big to show here.

qml/Components/BaseCarouselDelegate.qml → tests/mocks/Ubuntu/Web/WebView.qmlrenamed+7−5

This diff is too big to show here.

tests/mocks/Ubuntu/Web/qmldirnew file+4

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationImage.cppdeleted−123

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationImage.hdeleted−79

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.cpp+362−47

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationInfo.h+123−63

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.cpp+321−238

This diff is too big to show here.

tests/mocks/Unity/Application/ApplicationManager.h+55−66

This diff is too big to show here.

tests/mocks/Unity/Application/CMakeLists.txt+23−24

This diff is too big to show here.

tests/mocks/Unity/Application/MirMock.cppnew file+62

This diff is too big to show here.

tests/mocks/Unity/Application/MirMock.hnew file+43

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.cppnew file+559

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurface.hnew file+237

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceItem.cppnew file+415

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceItem.hnew file+138

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.cppnew file+136

This diff is too big to show here.

tests/mocks/Unity/Application/MirSurfaceListModel.hnew file+54

This diff is too big to show here.

tests/mocks/Unity/Application/ObjectListModel.hnew file+108

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.cppnew file+281

This diff is too big to show here.

tests/mocks/Unity/Application/SurfaceManager.hnew file+116

This diff is too big to show here.

tests/mocks/Unity/Application/VirtualKeyboard.cppnew file+58

This diff is too big to show here.

tests/mocks/Unity/Application/VirtualKeyboard.hnew file+37

This diff is too big to show here.

tests/mocks/Unity/Application/plugin.cpp+38−9

This diff is too big to show here.

tests/mocks/Unity/Application/plugin.h+2−1

This diff is too big to show here.

tests/mocks/Unity/Application/qmldir+1−2

This diff is too big to show here.

tests/mocks/Unity/Application/resources/Kate.qmlnew file+49

This diff is too big to show here.

tests/mocks/Unity/Application/resources/KateDialog.qmlnew file+48

This diff is too big to show here.

qml/Dash/Music/CarouselDelegateMusic.qml → tests/mocks/Unity/Application/resources/KateMenu.qmlrenamed+20−21

This diff is too big to show here.

tests/mocks/Unity/Application/resources/MirSurfaceItem.qmlnew file+126

This diff is too big to show here.

tests/mocks/Unity/Application/resources/VirtualKeyboard.qmlnew file+41

This diff is too big to show here.

tests/mocks/Unity/Application/resources/screenshots/browser@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/camera@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/dialer@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/facebook@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/gallery@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/gmail-webapp.svgnew file+343

This diff is too big to show here.

tests/mocks/Unity/Application/resources/screenshots/libreoffice@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/map@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/music@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/twitter@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/ubuntu-weather-app.svgnew file+201

This diff is too big to show here.

tests/mocks/Unity/Application/resources/screenshots/unity8-dash@12.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/screenshots/vkb_portrait.pngnew file

Binary file not shown.

tests/mocks/Unity/Application/resources/surfaces.qrcnew file+23

This diff is too big to show here.

tests/mocks/Unity/Application/resources/vkb_portrait.pngnew file

Binary file not shown.

tests/mocks/Unity/ApplicationMenu/CMakeLists.txtnew file+18

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.cppnew file+47

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/mockapplicationmenuregistry.hnew file+41

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/plugin.cppnew file+42

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/plugin.hnew file+32

This diff is too big to show here.

tests/mocks/Unity/ApplicationMenu/qmldirnew file+3

This diff is too big to show here.

tests/mocks/Unity/CMakeLists.txt+5−49

This diff is too big to show here.

tests/mocks/Unity/Connectivity/CMakeLists.txtnew file+10

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_scopeView2.qml → tests/mocks/Unity/Connectivity/MockConnectivity.cpprenamed+9−6

This diff is too big to show here.

qml/Dash/Previews/PreviewActionButton.qml → tests/mocks/Unity/Connectivity/MockConnectivity.hrenamed+18−12

This diff is too big to show here.

tests/mocks/Unity/Connectivity/plugin.cppnew file+34

This diff is too big to show here.

tests/mocks/Unity/Connectivity/plugin.hnew file+31

This diff is too big to show here.

tests/mocks/Unity/Connectivity/qmldirnew file+3

This diff is too big to show here.

tests/mocks/Unity/Indicators/RootActionState.qml → tests/mocks/Unity/Indicators/ActionRootState.qmlrenamed+14−9

This diff is too big to show here.

tests/mocks/Unity/Indicators/CMakeLists.txt+11−24

This diff is too big to show here.

tests/mocks/Unity/Indicators/IndicatorsModel.qml+241−42

This diff is too big to show here.

tests/mocks/Unity/Indicators/ModelActionRootState.qmlnew file+81

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeindicatorsmodel.cppnew file+157

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeindicatorsmodel.hnew file+70

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeindicatorsmodeldata.jsnew file+1328

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeplugin.cpp+22−3

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeplugin.h+1−1

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeunitymenumodelcache.cppnew file+59

This diff is too big to show here.

tests/mocks/Unity/Indicators/fakeunitymenumodelcache.hnew file+45

This diff is too big to show here.

tests/mocks/Unity/Indicators/indicators_fake.qrcdeleted−14

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/FakeMenuPage.qmldeleted−37

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_page4.qmldeleted−35

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_page5.qmldeleted−35

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_widget4.qmldeleted−23

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_widget5.qmldeleted−23

This diff is too big to show here.

tests/mocks/Unity/Indicators/qmldir+3−5

This diff is too big to show here.

tests/mocks/Unity/InputInfo/CMakeLists.txtnew file+31

This diff is too big to show here.

tests/mocks/Unity/InputInfo/mockcontroller.cppnew file+35

This diff is too big to show here.

tests/mocks/Unity/InputInfo/mockcontroller.hnew file+34

This diff is too big to show here.

tests/mocks/Unity/InputInfo/plugin.cppnew file+46

This diff is too big to show here.

tests/mocks/Unity/InputInfo/plugin.hnew file+30

This diff is too big to show here.

tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock.cppnew file+56

This diff is too big to show here.

tests/mocks/Unity/InputInfo/qinputdeviceinfo_mock_p.hnew file+58

This diff is too big to show here.

tests/mocks/Unity/InputInfo/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Unity/Launcher/CMakeLists.txt+7−10

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.cppnew file+98

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockAppDrawerModel.hnew file+43

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherItem.cpp+79−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherItem.h+34−17

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherModel.cpp+112−5

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockLauncherModel.h+22−11

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockQuickListModel.cpp+6−2

This diff is too big to show here.

tests/mocks/Unity/Launcher/MockQuickListModel.h+4−2

This diff is too big to show here.

tests/mocks/Unity/Launcher/plugin.cpp+4

This diff is too big to show here.

tests/mocks/Unity/Launcher/plugin.h+1−1

This diff is too big to show here.

tests/mocks/Unity/Launcher/qmldir+1

This diff is too big to show here.

tests/mocks/Unity/Notifications/CMakeLists.txt+13−8

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockActionModel.cppnew file+74

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockActionModel.hnew file+53

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockNotification.cppnew file+198

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockNotification.hnew file+101

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockNotificationModel.cppnew file+169

This diff is too big to show here.

tests/mocks/Unity/Notifications/MockNotificationModel.hnew file+70

This diff is too big to show here.

tests/mocks/Unity/Indicators/IndicatorBase.qml → tests/mocks/Unity/Notifications/plugin.cpprenamed+13−18

This diff is too big to show here.

tests/mocks/Unity/Indicators/MenuItemFactory.qml → tests/mocks/Unity/Notifications/plugin.hrenamed+13−17

This diff is too big to show here.

tests/mocks/Unity/Notifications/qmldir+3−1

This diff is too big to show here.

tests/mocks/Unity/Platform/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_generic_scopeView.qml → tests/mocks/Unity/Platform/MockPlatform.qmlrenamed+7−6

This diff is too big to show here.

tests/mocks/Unity/Platform/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Unity/Screens/CMakeLists.txtnew file+14

This diff is too big to show here.

tests/mocks/Unity/Screens/plugin.cppnew file+29

This diff is too big to show here.

tests/mocks/Unity/Screens/plugin.hnew file+25

This diff is too big to show here.

tests/mocks/Unity/Screens/qmldirnew file+2

This diff is too big to show here.

tests/mocks/Unity/Screens/screens.cppnew file+71

This diff is too big to show here.

tests/mocks/Unity/Screens/screens.hnew file+82

This diff is too big to show here.

tests/mocks/Unity/categoryresults.cppdeleted−121

This diff is too big to show here.

tests/mocks/Unity/categoryresults.hdeleted−68

This diff is too big to show here.

tests/mocks/Unity/fake_applications_scope.cppdeleted−76

This diff is too big to show here.

tests/mocks/Unity/fake_categories.cppdeleted−259

This diff is too big to show here.

tests/mocks/Unity/fake_categories.hdeleted−75

This diff is too big to show here.

tests/mocks/Unity/fake_preview.cppdeleted−73

This diff is too big to show here.

tests/mocks/Unity/fake_preview.hdeleted−65

This diff is too big to show here.

tests/mocks/Unity/fake_scope.cppdeleted−255

This diff is too big to show here.

tests/mocks/Unity/fake_scope.hdeleted−127

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.cppdeleted−152

This diff is too big to show here.

tests/mocks/Unity/fake_scopes.hdeleted−80

This diff is too big to show here.

tests/mocks/Unity/fake_unity_plugin.cppdeleted−52

This diff is too big to show here.

tests/mocks/Unity/iconutils.cppdeleted−124

This diff is too big to show here.

tests/mocks/Unity/qmldirdeleted−2

This diff is too big to show here.

tests/mocks/Unity/scopes-ng/fake_preview_model.cppdeleted−96

This diff is too big to show here.

tests/mocks/Unity/scopes-ng/fake_preview_model.hdeleted−68

This diff is too big to show here.

tests/mocks/Utils/CMakeLists.txtnew file+61

This diff is too big to show here.

tests/mocks/Utils/EdgeBarrierSettings.qmlnew file+22

This diff is too big to show here.

tests/mocks/Utils/Style.jsnew file+37

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_page1.qml → tests/mocks/Utils/URLDispatcher.cpprenamed+17−14

This diff is too big to show here.

tests/mocks/Utils/URLDispatcher.hnew file+47

This diff is too big to show here.

qml/SideStage/SidestageHandle.qml → tests/mocks/Utils/WindowInputMonitor.qmlrenamed+6−5

This diff is too big to show here.

tests/mocks/Utils/constants.cppnew file+24

This diff is too big to show here.

tests/mocks/Utils/constants.hnew file+43

This diff is too big to show here.

tests/mocks/Utils/plugin.cppnew file+93

This diff is too big to show here.

tests/mocks/Utils/plugin.hnew file+32

This diff is too big to show here.

tests/mocks/Utils/qmldirnew file+6

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.cppnew file+100

This diff is too big to show here.

tests/mocks/Utils/windowstatestorage.hnew file+77

This diff is too big to show here.

tests/mocks/Wizard/CMakeLists.txtnew file+20

This diff is too big to show here.

tests/mocks/Wizard/MockSystem.cppnew file+64

This diff is too big to show here.

tests/mocks/Wizard/MockSystem.hnew file+61

This diff is too big to show here.

tests/mocks/Wizard/mockplugin.cppnew file+38

This diff is too big to show here.

tests/mocks/Wizard/mockplugin.hnew file+32

This diff is too big to show here.

tests/mocks/Wizard/qmldirnew file+3

This diff is too big to show here.

tests/mocks/data/applications/camera-app.desktop → tests/mocks/data/applications/webbrowser-app.desktoprenamed

The content is the same.

tests/mocks/data/unity/indicators/com.canonical.indicator.mocknew file+10

This diff is too big to show here.

tests/mocks/indicator-service/CMakeLists.txtnew file+19

This diff is too big to show here.

tests/mocks/indicator-service/mock-indicator-service.cnew file+325

This diff is too big to show here.

tests/mocks/liblightdm/CMakeLists.txtnew file+18

This diff is too big to show here.

tests/mocks/LightDM/full/GreeterPrivate.cpp → tests/mocks/liblightdm/GreeterPrivate.cpprenamed+44−10

This diff is too big to show here.

tests/mocks/liblightdm/GreeterPrivate.hnew file+54

This diff is too big to show here.

tests/mocks/liblightdm/MockController.cppnew file+192

This diff is too big to show here.

tests/mocks/liblightdm/MockController.hnew file+106

This diff is too big to show here.

tests/mocks/liblightdm/MockGreeter.cppnew file+316

This diff is too big to show here.

tests/mocks/liblightdm/MockGreeter.hnew file+102

This diff is too big to show here.

tests/mocks/liblightdm/MockSessionsModel.cppnew file+118

This diff is too big to show here.

tests/mocks/liblightdm/MockSessionsModel.hnew file+64

This diff is too big to show here.

tests/mocks/liblightdm/MockUsersModel.cppnew file+220

This diff is too big to show here.

tests/mocks/liblightdm/MockUsersModel.hnew file+61

This diff is too big to show here.

tests/mocks/liblightdm/SessionsModelPrivate.cppnew file+83

This diff is too big to show here.

tests/mocks/liblightdm/SessionsModelPrivate.hnew file+63

This diff is too big to show here.

tests/mocks/liblightdm/UsersModelPrivate.cppnew file+124

This diff is too big to show here.

tests/mocks/LightDM/UsersModelPrivate.h → tests/mocks/liblightdm/UsersModelPrivate.hrenamed+8−3

This diff is too big to show here.

tests/mocks/LightDM/demo/CMakeLists.txt → tests/mocks/liblightdm/demo/CMakeLists.txtrenamed+1−1

This diff is too big to show here.

tests/mocks/LightDM/demo/GreeterPrivate.cpp → tests/mocks/liblightdm/demo/GreeterPrivate.cpprenamed

The content is the same.

tests/mocks/LightDM/demo/UsersModelPrivate.cpp → tests/mocks/liblightdm/demo/UsersModelPrivate.cpprenamed

The content is the same.

tests/mocks/LightDM/qmldir → tests/mocks/liblightdm/qmldirrenamed+1

This diff is too big to show here.

tests/mocks/libusermetrics/CMakeLists.txt+2−1

This diff is too big to show here.

tests/mocks/libusermetrics/ColorTheme.cpp+4

This diff is too big to show here.

tests/mocks/libusermetrics/ColorTheme.h+2−1

This diff is too big to show here.

tests/mocks/libusermetrics/UserMetrics.cpp+55−25

This diff is too big to show here.

tests/mocks/libusermetrics/UserMetrics.h+2

This diff is too big to show here.

tests/mocks/libusermetrics/libusermetricsoutput/ColorTheme.hdeleted−1

This diff is too big to show here.

tests/mocks/libusermetrics/libusermetricsoutput/UserMetrics.hdeleted−1

This diff is too big to show here.

tests/plugins/AccountsService/AccountsServer.cpp+28−6

This diff is too big to show here.

tests/plugins/AccountsService/AccountsServer.h+5

This diff is too big to show here.

tests/plugins/AccountsService/CMakeLists.txt+33−12

This diff is too big to show here.

tests/plugins/AccountsService/PropertiesServer.cpp+104−7

This diff is too big to show here.

tests/plugins/AccountsService/PropertiesServer.h+17−3

This diff is too big to show here.

tests/plugins/AccountsService/UscServer.cppnew file+28

This diff is too big to show here.

tests/plugins/AccountsService/UscServer.hnew file+39

This diff is too big to show here.

tests/plugins/AccountsService/client.cpp+303−9

This diff is too big to show here.

tests/plugins/AccountsService/interfaces.xml+50

This diff is too big to show here.

tests/plugins/AccountsService/server.cpp+17−6

This diff is too big to show here.

tests/plugins/AccountsService/types.hnew file+25

This diff is too big to show here.

tests/plugins/CMakeLists.txt+6−1

This diff is too big to show here.

tests/plugins/Cursor/CMakeLists.txtnew file+8

This diff is too big to show here.

tests/plugins/Cursor/TextEntry.qmlnew file+34

This diff is too big to show here.

tests/plugins/Cursor/tst_Cursor.qmlnew file+151

This diff is too big to show here.

tests/plugins/DashViews/CMakeLists.txtdeleted−84

This diff is too big to show here.

tests/plugins/DashViews/horizontaljournaltest.cppdeleted−491

This diff is too big to show here.

tests/plugins/DashViews/horizontaljournaltest.qmldeleted−43

This diff is too big to show here.

tests/plugins/DashViews/horizontaljournaltry.cppdeleted−90

This diff is too big to show here.

tests/plugins/DashViews/horizontaljournaltry.qmldeleted−99

This diff is too big to show here.

tests/plugins/DashViews/listviewwithpageheadertest.cppdeleted−1882

This diff is too big to show here.

tests/plugins/DashViews/listviewwithpageheadertest.qmldeleted−96

This diff is too big to show here.

tests/plugins/DashViews/listviewwithpageheadertestsection.cppdeleted−2172

This diff is too big to show here.

tests/plugins/DashViews/listviewwithpageheadertestsection.qmldeleted−106

This diff is too big to show here.

tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.cppdeleted−251

This diff is too big to show here.

tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.qmldeleted−74

This diff is too big to show here.

tests/plugins/DashViews/organicgridtest.cppdeleted−531

This diff is too big to show here.

tests/plugins/DashViews/organicgridtry.cppdeleted−98

This diff is too big to show here.

tests/plugins/DashViews/organicgridtry.qmldeleted−94

This diff is too big to show here.

tests/plugins/DashViews/tst_listviewwithpageheaderqml.qmldeleted−138

This diff is too big to show here.

tests/plugins/DashViews/verticaljournaltest.cppdeleted−502

This diff is too big to show here.

tests/plugins/DashViews/verticaljournaltest.qmldeleted−44

This diff is too big to show here.

tests/plugins/DashViews/verticaljournaltry.cppdeleted−90

This diff is too big to show here.

tests/plugins/DashViews/verticaljournaltry.qmldeleted−100

This diff is too big to show here.

tests/plugins/GlobalShortcut/CMakeLists.txtnew file+19

This diff is too big to show here.

tests/plugins/GlobalShortcut/GlobalShortcutTest.cppnew file+78

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/TestButton.qml → tests/plugins/GlobalShortcut/shortcut.qmlrenamed+17−19

This diff is too big to show here.

tests/plugins/Greeter/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/plugins/Greeter/Unity/CMakeLists.txtnew file+1

This diff is too big to show here.

tests/plugins/Greeter/Unity/Launcher/CMakeLists.txtnew file+42

This diff is too big to show here.

tests/plugins/Greeter/Unity/Launcher/launchermodelastest.cppnew file+240

This diff is too big to show here.

tests/plugins/LightDM/CMakeLists.txt+1−25

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/CMakeLists.txtnew file+157

This diff is too big to show here.

tests/plugins/LightDM/dbus.cpp → tests/plugins/LightDM/IntegratedLightDM/dbus.cpprenamed+69−12

This diff is too big to show here.

tests/plugins/LightDM/greeter.qml → tests/plugins/LightDM/IntegratedLightDM/greeter.qmlrenamed+3−3

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/integrated.cppnew file+88

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/pam.cppnew file+54

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/promptsmodel.cppnew file+175

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/sessionsmodel.cppnew file+134

This diff is too big to show here.

tests/plugins/LightDM/IntegratedLightDM/usersmodel.cppnew file+168

This diff is too big to show here.

tests/plugins/SessionBroadcast/BroadcastServer.cppnew file+33

This diff is too big to show here.

tests/plugins/SessionBroadcast/BroadcastServer.hnew file+40

This diff is too big to show here.

tests/plugins/SessionBroadcast/CMakeLists.txtnew file+51

This diff is too big to show here.

tests/plugins/SessionBroadcast/interfaces.xmlnew file+18

This diff is too big to show here.

tests/plugins/SessionBroadcast/server.cppnew file+37

This diff is too big to show here.

tests/plugins/SessionBroadcast/sessionbroadcasttest.cppnew file+111

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+48−37

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/DownwardsLauncher.qmldeleted−79

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/GestureTest.cpp+143−4

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/GestureTest.h+58−2

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/LeftwardsLauncher.qmldeleted−82

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/RightwardsLauncher.qmldeleted−80

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/TestItem.cppnew file+30

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/TestItem.hnew file+33

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/UpwardsLauncher.qmldeleted−82

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/empty.qmlnew file+22

This diff is too big to show here.

tests/mocks/Unity/Indicators/qml/fake_menu_widget3.qml → tests/plugins/Ubuntu/Gestures/touchGateExample.qmlrenamed+9−5

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_AxisVelocityCalculator.cpp+2−2

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cppdeleted−709

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.qmldeleted−46

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.cppnew file+131

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.qmlnew file+81

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.cpp+6−6

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.qml+2−2

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchDispatcher.cppnew file+148

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGate.cppnew file+392

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.cppnew file+300

This diff is too big to show here.

tests/plugins/Ubuntu/Gestures/tst_TouchGestureArea.qmlnew file+90

This diff is too big to show here.

tests/plugins/Unity/CMakeLists.txt+2

This diff is too big to show here.

tests/plugins/Unity/Indicators/CMakeLists.txt+20−16

This diff is too big to show here.

tests/plugins/Unity/Indicators/indicatorsmanagertest.cpp → tests/plugins/Unity/Indicators/IndicatorsManagerTest.cpprenamed+32−9

This diff is too big to show here.

tests/plugins/Unity/Indicators/indicatorsmodeltest.cpp → tests/plugins/Unity/Indicators/IndicatorsModelTest.cpprenamed+8−7

This diff is too big to show here.

tests/plugins/Unity/Indicators/menucontentactivatortest.cpp → tests/plugins/Unity/Indicators/MenuContentActivatorTest.cpprenamed+4−3

This diff is too big to show here.

tests/plugins/Unity/Indicators/RootActionStateTest.cppnew file+95

This diff is too big to show here.

tests/plugins/Unity/Indicators/SharedUnityMenuModelTest.cppnew file+102

This diff is too big to show here.

tests/plugins/Unity/Indicators/unitymenumodelstacktest.cpp → tests/plugins/Unity/Indicators/UnityMenuModelStackTest.cpprenamed+10−14

This diff is too big to show here.

tests/plugins/Unity/Indicators/rootactionstatetest.cppdeleted−58

This diff is too big to show here.

tests/plugins/Unity/Launcher/CMakeLists.txt+78−44

This diff is too big to show here.

tests/plugins/Unity/Launcher/appdrawermodeltest.cppnew file+68

This diff is too big to show here.

tests/plugins/Unity/Launcher/abs-icon.desktop → tests/plugins/Unity/Launcher/applications/abs-icon.desktoprenamed+1

This diff is too big to show here.

tests/plugins/Unity/Launcher/click-icon.desktop → tests/plugins/Unity/Launcher/applications/click-icon.desktoprenamed+1

This diff is too big to show here.

tests/plugins/Unity/Launcher/click-icon.svg → tests/plugins/Unity/Launcher/applications/click-icon.svgrenamed

The content is the same.

tests/plugins/Unity/Launcher/no-name.desktop → tests/plugins/Unity/Launcher/applications/no-name.desktoprenamed+1

This diff is too big to show here.

tests/plugins/Unity/Launcher/rel-icon.desktop → tests/plugins/Unity/Launcher/applications/rel-icon.desktoprenamed+1

This diff is too big to show here.

tests/plugins/Unity/Launcher/rel-icon.svg → tests/plugins/Unity/Launcher/applications/rel-icon.svgrenamed

The content is the same.

tests/plugins/Unity/Launcher/gsettings.cppnew file+45

This diff is too big to show here.

tests/plugins/Unity/Launcher/gsettings.hnew file+47

This diff is too big to show here.

tests/plugins/Unity/Launcher/launcherbackendtest.cppdeleted−72

This diff is too big to show here.

tests/plugins/Unity/Launcher/launchermodeltest.cpp+590−29

This diff is too big to show here.

tests/plugins/Unity/Launcher/no-icon.desktopdeleted−2

This diff is too big to show here.

tests/plugins/Unity/Launcher/ualwrapper.cppnew file+58

This diff is too big to show here.

tests/plugins/Unity/Launcher/ualwrapper.hnew file+55

This diff is too big to show here.

tests/plugins/Unity/Launcher/xdgwatcher.cppnew file+45

This diff is too big to show here.

plugins/HudClient/hudtoolbarmodel.h → tests/plugins/Unity/Launcher/xdgwatcher.hrenamed+17−22

This diff is too big to show here.

tests/plugins/Unity/Platform/CMakeLists.txtnew file+30

This diff is too big to show here.

tests/plugins/Unity/Platform/platformtest.cppnew file+142

This diff is too big to show here.

tests/plugins/Unity/Session/CMakeLists.txtnew file+72

This diff is too big to show here.

tests/plugins/Unity/Session/LightDMServer.cppnew file+29

This diff is too big to show here.

tests/plugins/Unity/Session/LightDMServer.hnew file+38

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.cppnew file+43

This diff is too big to show here.

tests/plugins/Unity/Session/LogindServer.hnew file+48

This diff is too big to show here.

tests/plugins/Unity/Session/interfaces.xmlnew file+29

This diff is too big to show here.

tests/plugins/Unity/Session/preload.cnew file+43

This diff is too big to show here.

tests/plugins/Unity/Session/server.cppnew file+50

This diff is too big to show here.

tests/plugins/Unity/Session/sessionbackendtest.cppnew file+289

This diff is too big to show here.

tests/plugins/Utils/CMakeLists.txt+34−20

This diff is too big to show here.

tests/plugins/Utils/DeviceConfigParserTest.cppnew file+76

This diff is too big to show here.

tests/plugins/Utils/modeltest.cpp → tests/plugins/Utils/ModelTest.cpprenamed+25−42

This diff is too big to show here.

tests/plugins/Utils/modeltest.h → tests/plugins/Utils/ModelTest.hrenamed

The content is the same.

tests/plugins/Utils/qlimitproxymodeltest.cpp → tests/plugins/Utils/QLimitProxyModelTest.cpprenamed+31−31

This diff is too big to show here.

tests/plugins/Utils/URLDispatcherTest.cppnew file+78

This diff is too big to show here.

tests/plugins/Utils/qsortfilterproxymodeltest.cpp → tests/plugins/Utils/UnitySortFilterProxyModelTest.cpprenamed+25−25

This diff is too big to show here.

tests/plugins/Utils/WindowInputMonitorTest.cppnew file+461

This diff is too big to show here.

tests/plugins/Utils/WindowStateStorageTest.cppnew file+121

This diff is too big to show here.

tests/plugins/Utils/timeformattertest.cppdeleted−68

This diff is too big to show here.

tests/plugins/Utils/tst_UtilsStyle.qmlnew file+47

This diff is too big to show here.

tests/plugins/WindowManager/CMakeLists.txtnew file+36

This diff is too big to show here.

tests/plugins/WindowManager/UnityApplicationMocks.hnew file+211

This diff is too big to show here.

tests/plugins/WindowManager/tst_TopLevelWindowModel.cppnew file+193

This diff is too big to show here.

tests/plugins/Wizard/CMakeLists.txtnew file+24

This diff is too big to show here.

tests/plugins/Wizard/tst_pagelist.cppnew file+183

This diff is too big to show here.

tests/plugins/Wizard/tst_system.cppnew file+124

This diff is too big to show here.

tests/qmltests/ApplicationMenuDataLoader.qmlnew file+99

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuBar.qml+437

This diff is too big to show here.

tests/qmltests/ApplicationMenus/tst_MenuPopup.qml+361

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+71−93

This diff is too big to show here.

tests/qmltests/Components/CMakeLists.txt+40−13

This diff is too big to show here.

tests/qmltests/Components/RevealingRectangle.qml−78

This diff is too big to show here.

tests/qmltests/Components/tst_AnimationControllerWithSignals.qml−142

This diff is too big to show here.

tests/qmltests/Components/tst_Background.qml+91

This diff is too big to show here.

tests/qmltests/Components/tst_Carousel.qml−194

This diff is too big to show here.

tests/qmltests/Components/tst_Dialogs.qml+112

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle.cpp+110−55

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle.qml+132−56

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/BidirectionalShowable.qml+69

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/BottomEdgeShowable.qml+108

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/LeftEdgeShowable.qml+7−7

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/RightEdgeShowable.qml+108

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/SimpleButton.qml+16−12

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/TopEdgeShowable.qml+14−14

This diff is too big to show here.

tests/qmltests/Components/tst_DragHandle/UnityLogo.png

This diff is too big to show here.

tests/qmltests/Components/tst_DraggingArea.qml+7−7

This diff is too big to show here.

tests/qmltests/Components/tst_EdgeDemoOverlay.qml−123

This diff is too big to show here.

tests/qmltests/Components/tst_EdgeDragEvaluator.cpp+166

This diff is too big to show here.

tests/qmltests/Components/tst_EdgeDragEvaluator.qml+9−7

This diff is too big to show here.

tests/qmltests/Components/tst_FilterGrid.qml−190

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage.qml+38−13

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/ImageControls.qml+2−2

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/portrait.png

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/square.png

This diff is too big to show here.

tests/qmltests/Components/tst_LazyImage/wide.png

This diff is too big to show here.

tests/qmltests/Components/tst_Lockscreen.qml+474

This diff is too big to show here.

tests/qmltests/Components/tst_MediaServices.qml+231

This diff is too big to show here.

tests/qmltests/Components/tst_ModeSwitchWarningDialog.qml+75

This diff is too big to show here.

tests/qmltests/Components/tst_OpenEffect.qml−71

This diff is too big to show here.

tests/qmltests/Components/tst_PageHeaderLabel.qml−255

This diff is too big to show here.

tests/qmltests/Components/tst_PhysicalKeysMapper.qml+174

This diff is too big to show here.

tests/qmltests/Components/tst_Rating.qml+5−5

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveFlowView.qml−192

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveGridView.qml−193

This diff is too big to show here.

tests/qmltests/Components/tst_Revealer.qml−262

This diff is too big to show here.

tests/qmltests/Components/tst_SeeMore.qml−52

This diff is too big to show here.

tests/qmltests/Components/tst_SharingPicker.qml+73

This diff is too big to show here.

tests/qmltests/Components/tst_Showable.qml+15−2

This diff is too big to show here.

tests/qmltests/Components/tst_Stage.qml−278

This diff is too big to show here.

tests/qmltests/Components/tst_Stage/FakeApplicationScreenshot.qml−53

This diff is too big to show here.

tests/qmltests/Components/tst_Tile.qml−71

This diff is too big to show here.

tests/qmltests/Components/tst_VirtualTouchPad.qml+197

This diff is too big to show here.

tests/qmltests/Components/tst_Wallpaper.qml+118

This diff is too big to show here.

tests/qmltests/Components/tst_WallpaperResolver.qml+161

This diff is too big to show here.

tests/qmltests/Components/tst_ZoomableImage.qml+204

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_AppPreview.qml−276

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml−263

This diff is too big to show here.

tests/qmltests/Dash/CardHelpers.js−120

This diff is too big to show here.

tests/qmltests/Dash/Movie/tst_MoviePreview.qml−86

This diff is too big to show here.

tests/qmltests/Dash/Music/tst_MusicPreview.qml−174

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qml−120

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewActions.qml−148

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml−179

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewHeader.qml−56

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml−56

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewProgress.qml−85

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRating.qml−182

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewTextSummary.qml−101

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−67

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml−97

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml−57

This diff is too big to show here.

tests/qmltests/Dash/artwork/avatar@12.png

This diff is too big to show here.

tests/qmltests/Dash/artwork/music-player-design.png

This diff is too big to show here.

tests/qmltests/Dash/qml/FakeScopeView.qml−50

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_scopeView3.qml−24

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_scopeView4.qml−24

This diff is too big to show here.

tests/qmltests/Dash/tst_Card.qml−358

This diff is too big to show here.

tests/qmltests/Dash/tst_CardHeader.qml−143

This diff is too big to show here.

tests/qmltests/Dash/tst_CardTool.qml−306

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qml−137

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml−359

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPreview.qml−202

This diff is too big to show here.

tests/qmltests/Dash/tst_FilterGrids.qml−143

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericPreview.qml−125

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml−426

This diff is too big to show here.

tests/qmltests/EdgeBarrierControls.qml+97

This diff is too big to show here.

tests/qmltests/Greeter/TestView.qml+101

This diff is too big to show here.

tests/qmltests/Greeter/tst_Clock.qml+52−37

This diff is too big to show here.

tests/qmltests/Greeter/tst_Greeter.qml+683

This diff is too big to show here.

tests/qmltests/Greeter/tst_GreeterView.qml+1366

This diff is too big to show here.

tests/qmltests/Greeter/tst_Infographics.qml+81−16

This diff is too big to show here.

tests/qmltests/Greeter/tst_Lockscreen.qml−278

This diff is too big to show here.

tests/qmltests/Greeter/tst_Phone.qml−152

This diff is too big to show here.

tests/qmltests/Greeter/tst_Tablet.qml−339

This diff is too big to show here.

tests/qmltests/Hud/tst_Hud.qml−239

This diff is too big to show here.

tests/qmltests/Hud/tst_Result.qml−98

This diff is too big to show here.

tests/qmltests/Launcher/tst_Drawer.qml+520

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+1334−149

This diff is too big to show here.

tests/qmltests/Notifications/Notification.qml+13−11

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+792−375

This diff is too big to show here.

tests/qmltests/Notifications/tst_OptionToggle.qml+290

This diff is too big to show here.

tests/qmltests/Notifications/tst_SwipeToAct.qml+326

This diff is too big to show here.

tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+232

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_DefaultIndicatorPage.qml−175

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_DefaultIndicatorWidget.qml−97

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_IndicatorItem.qml+205

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_IndicatorMenuItemFactory.qml+369−86

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml+292

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+44−59

This diff is too big to show here.

tests/qmltests/Panel/PanelTest.qml+70

This diff is too big to show here.

tests/qmltests/Panel/PanelUI.qml+286

This diff is too big to show here.

tests/qmltests/Panel/tst_ActiveCallHint.qml+198

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorItem.qml−50

This diff is too big to show here.

tests/qmltests/Panel/tst_IndicatorRow.qml−160

This diff is too big to show here.

tests/qmltests/Panel/tst_Indicators.qml−241

This diff is too big to show here.

tests/qmltests/Panel/tst_MenuContent.qml+36−82

This diff is too big to show here.

tests/qmltests/Panel/tst_Panel.qml+593−180

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelBar.qml+240

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelItemRow.qml+318

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelMenu.qml+364

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelMenuPage.qml+200

This diff is too big to show here.

tests/qmltests/Panel/tst_PanelSmallScreen.qml+133

This diff is too big to show here.

tests/qmltests/Panel/tst_SearchIndicator.qml−62

This diff is too big to show here.

tests/qmltests/SideStage/tst_SideStage.qml−52

This diff is too big to show here.

tests/qmltests/Stage/ApplicationCheckBox.qml+189

This diff is too big to show here.

tests/qmltests/Stage/SizeHintField.qml+15−16

This diff is too big to show here.

tests/qmltests/Stage/SurfaceManagerControls.qml+32

This diff is too big to show here.

tests/qmltests/Stage/SurfaceManagerField.qml+19−20

This diff is too big to show here.

tests/qmltests/Stage/tst_ApplicationWindow.qml+513

This diff is too big to show here.

tests/qmltests/Stage/tst_DecoratedWindow.qml+267

This diff is too big to show here.

tests/qmltests/Stage/tst_DesktopStage.qml+1085

This diff is too big to show here.

tests/qmltests/Stage/tst_PhoneStage.qml+624

This diff is too big to show here.

tests/qmltests/Stage/tst_QMLTopLevelWindowModel.qml+191

This diff is too big to show here.

tests/qmltests/Stage/tst_Splash.qml+131

This diff is too big to show here.

tests/qmltests/Stage/tst_SurfaceContainer.qml+258

This diff is too big to show here.

tests/qmltests/Stage/tst_TabletStage.qml+764

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowDecoration.qml+244

This diff is too big to show here.

tests/qmltests/Stage/tst_WindowResizeArea.qml+465

This diff is too big to show here.

tests/qmltests/Tutorial/tst_Tutorial.qml+813

This diff is too big to show here.

tests/qmltests/UnityLogo.png

This diff is too big to show here.

tests/qmltests/Wizard/licenses/en_US.html+1

This diff is too big to show here.

tests/qmltests/Wizard/licenses/fr_CA.html+1

This diff is too big to show here.

tests/qmltests/Wizard/licenses/fr_FR.html+1

This diff is too big to show here.

tests/qmltests/Wizard/tst_Wizard.qml+487

This diff is too big to show here.

tests/qmltests/tst_DeviceConfiguration.qml+49

This diff is too big to show here.

tests/qmltests/tst_DisabledScreenNotice.qml+133

This diff is too big to show here.

tests/qmltests/tst_OrientedShell.qml+1705

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+3204−375

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qml+549

This diff is too big to show here.

tests/qmltests/utils/Unity/Test/MockObjectForInstanceOfTest.qml+1−1

This diff is too big to show here.

tests/qmltests/utils/Unity/Test/MockObjectForInstanceOfTestChild.qml+1−1

This diff is too big to show here.

tests/qmltests/utils/Unity/Test/tst_UnityTest.qml+36−8

This diff is too big to show here.

tests/scripts/README+9

This diff is too big to show here.

tests/scripts/alert-launcher-icon.sh+19

This diff is too big to show here.

tests/scripts/get-progress.sh+19

This diff is too big to show here.

tests/scripts/list-launcher-icons.sh+19

This diff is too big to show here.

tests/scripts/set-count-visible.sh+19

This diff is too big to show here.

tests/scripts/set-count.sh+19

This diff is too big to show here.

tests/scripts/set-progress.sh+19

This diff is too big to show here.

tests/uqmlscene/CMakeLists.txt+17−3

This diff is too big to show here.

tests/uqmlscene/README+3−1

This diff is too big to show here.

tests/uqmlscene/main.cpp+39−12

This diff is too big to show here.

tests/utils/modules/Unity/Test/CMakeLists.txt+23−7

This diff is too big to show here.

tests/utils/modules/Unity/Test/MouseTouchEmulationCheckbox.qml+23−17

This diff is too big to show here.

tests/utils/modules/Unity/Test/StageTestCase.qml+64

This diff is too big to show here.

tests/utils/modules/Unity/Test/TouchEventSequenceWrapper.cpp+23−2

This diff is too big to show here.

tests/utils/modules/Unity/Test/TouchEventSequenceWrapper.h+7−2

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+441−132

This diff is too big to show here.

tests/utils/modules/Unity/Test/plugin.cpp+25−2

This diff is too big to show here.

tests/utils/modules/Unity/Test/plugin.h+1−1

This diff is too big to show here.

tests/utils/modules/Unity/Test/qmldir+4

This diff is too big to show here.

tests/utils/modules/Unity/Test/testutil.cpp+49−6

This diff is too big to show here.

tests/utils/modules/Unity/Test/testutil.h+4−2

This diff is too big to show here.

tests/whitespace/CMakeLists.txt+1−1

This diff is too big to show here.

tests/whitespace/check_whitespace.py+22−12

This diff is too big to show here.

tools/CMakeLists.txt+3−10

This diff is too big to show here.

tools/indicatorsclient/CMakeLists.txt+1−3

This diff is too big to show here.

tools/indicatorsclient/indicatorsclient.cpp+18−17

This diff is too big to show here.

tools/indicatorsclient/indicatorsclient.h−2

This diff is too big to show here.

tools/indicatorsclient/main.cpp

This diff is too big to show here.

tools/menutool/CMakeLists.txt+5

This diff is too big to show here.

tools/menutool/README+11

This diff is too big to show here.

tools/menutool/menutool.cpp+62

This diff is too big to show here.

tools/menutool/menutool.qml+118

This diff is too big to show here.

tools/registry-tracker.cpp−116

This diff is too big to show here.

tools/scopetool.cpp−84

This diff is too big to show here.

tools/unlock-device+51

This diff is too big to show here.