on 34fcaf6 help sign in
29 files changed+832−90
since splitsnapshots
unifiedsplit
Jenkinsfile+29−12 README.md+16 data/CMakeLists.txt+1 data/com.canonical.Unity.gschema.xml+255 data/unity8.conf+33−32 debian/changelog+12 debian/control+14−3 debian/unity8-common.install−1 debian/unity8-schemas.install+1 plugins/Dash/abstractdashview.cpp+1−1 plugins/Dash/listviewwithpageheader.cpp+4−6 plugins/Dash/listviewwithpageheader.h+1−1 plugins/Dash/verticaljournal.cpp+6−8 plugins/Dash/verticaljournal.h+1−1 plugins/Ubuntu/CMakeLists.txt+1−1 qml/Dash/DashBackground.qml+1−1 qml/Dash/Previews/PreviewWidgetFactory.qml−1 qml/Stage/Stage.qml+8−2 qml/Stage/WindowResizeArea.qml+4−1 qml/Wizard/Pages/78-app-update.qml+434 tests/plugins/CMakeLists.txt+1−1 tests/plugins/Ubuntu/CMakeLists.txt+1−1 tests/plugins/Ubuntu/Gestures/GestureTest.cpp+1−1 tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+1−1 tests/plugins/Utils/ModelTest.cpp+1−1 tests/qmltests/CMakeLists.txt+2−2 tests/qmltests/Components/tst_DragHandle.cpp+2−2 tests/utils/CMakeLists.txt+1−1 tests/utils/modules/Unity/Test/TouchEventSequenceWrapper.cpp−9
Jenkinsfile+29−12
@@ -12,25 +12,40 @@ pipeline {
1212 steps {
1313 parallel(
1414 "Build binary - armhf": {
15− node(label: 'xenial-arm64') {
15+ node(label: 'arm64') {
16+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
1617 unstash 'source'
1718 sh '''export architecture="armhf"
19+ export DEBBUILDOPTS="-sa"
20+ export SKIP_ARCH_BUILD=false
21+ export SKIP_SOURCE_REMOVAL=true
1822build-binary.sh'''
19− stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build')
23+ stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-armhf')
2024 cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
2125 }
2226
2327
2428 },
25− "Build binary - all": {
26− node(label: 'xenial-arm64') {
29+ "Build binary - arm64": {
30+ node(label: 'arm64') {
31+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
2732 unstash 'source'
28− sh '''export architecture="armhf"
29− export DEBBUILDOPTS="-A"
33+ sh '''export architecture="arm64"
34+ export DEBBUILDOPTS="-sa"
3035 export SKIP_ARCH_BUILD=false
3136 export SKIP_SOURCE_REMOVAL=true
32− build-binary.sh'''
33− stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-all')
37+ #build-binary.sh'''
38+ stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-arm64')
39+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
40+ }
41+ },
42+ "Build binary - amd64": {
43+ node(label: 'amd64') {
44+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
45+ unstash 'source'
46+ sh '''export architecture="amd64"
47+ #build-binary.sh'''
48+ stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-amd64')
3449 cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
3550 }
3651 }
@@ -39,11 +54,12 @@ build-binary.sh'''
3954 }
4055 stage('Results') {
4156 steps {
42− unstash 'build'
43− unstash 'build-all'
57+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
58+ unstash 'build-armhf'
59+ unstash 'build-arm64'
60+ unstash 'build-amd64'
4461 archiveArtifacts(artifacts: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo', fingerprint: true, onlyIfSuccessful: true)
45− sh '''export architecture="armhf"
46−/usr/bin/build-repo.sh'''
62+ sh '''/usr/bin/build-repo.sh'''
4763 }
4864 }
4965 stage('Cleanup') {
@@ -53,3 +69,4 @@ build-binary.sh'''
5369 }
5470 }
5571}
72+
README.mdnew file+16
@@ -0,0 +1,16 @@
1+# Unity8
2+
3+A convergent desktop environment.
4+
5+Only issues with this (the latest) version of Unity8 should be reported in [the issue tracker](https://github.com/ubports/unity8/issues) on this repository. Issues with the version of Unity8 that's currently running on Ubuntu Touch devices should be reported on [the Ubuntu Touch tracker](https://github.com/ubports/unity8/issues). This will change once Ubuntu Touch moves to the latest version of Unity8.
6+
7+[![Unity 8](http://ubuntufun.de/wp-content/uploads/2016/05/screenshot20160518_232322980.png)](https://unity8.io)
8+
9+See [CODING](CODING) for build instructions. The latest development preview can be [installed on Ubuntu 16.04 and 18.04](https://github.com/ubports/unity8-desktop-install-tools).
10+
11+### Get involved
12+
13+* [Kanban-Board](https://github.com/ubports/unity8/projects/1)
14+* If you are interesting in helping us in any way you can join [Unity8 Forum](https://forums.ubports.com/category/36/unity8).
15+* For reporting bugs or filing feature-requests, please use the project’s [issues page](https://github.com/ubports/unity8/issues).
16+* For IM you can join our Telegram group [for Developer users](https://t.me/UBports_Unity8).
data/CMakeLists.txt+1
@@ -31,5 +31,6 @@ install(FILES
3131add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
3232
3333install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
34+install(FILES com.canonical.Unity.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
3435install(FILES unity8-dash.url-dispatcher DESTINATION ${CMAKE_INSTALL_DATADIR}/url-dispatcher/urls)
3536install(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:///webbrowser-app.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/unity8.conf+33−32
@@ -8,31 +8,44 @@ stop on desktop-end
88
99kill timeout 120
1010
11+#
12+# Ensure the shell always gets unthrottled touch events, so that applications
13+# who want full speed low-latency input can get it (LP: #1497105) and so that
14+# apps can use QML touch compression safely (the QML touch compression
15+# algorithm does not support nesting well - LP: #1486341, LP: #1556763 - so
16+# must be fed by the raw input event stream from Unity8).
17+#
18+env QML_NO_TOUCH_COMPRESSION=1
19+
1120respawn
1221expect stop
1322
23+# FIXME Create an autopilot test that makes sure start+stop and restart
24+# work fine at least 2 times
25+
1426pre-start script
1527 # Tell unity-mir to raise SIGSTOP after we start
1628 initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
1729
18− if [ -n "$MIR_SOCKET" ]; then
19− # FIXME Create an autopilot test that makes sure start+stop and restart
20− # work fine at least 2 times
21− # Save original value of MIR_SOCKET in case we are stopped,
22− # as we modify the variable for future jobs, including ourself.
23− UNITY_MIR_SOCKET=$(initctl get-env --global MIR_SOCKET)
24− initctl set-env --global UNITY_MIR_SOCKET=$UNITY_MIR_SOCKET
30+ # Save original value of MIR_SOCKET so that we can restore it when stopped,
31+ # as we modify the variable for future jobs, including ourself.
32+ initctl set-env UNITY_MIR_SOCKET=$MIR_SOCKET
2533
26− # Point unity8 at unity-system-compositor
34+ # Decide where we are going to put our own socket file
35+ if [ -n "$SNAP" ]; then
36+ # In snappy, we want to hard code our path because our apparmor profile
37+ # only lets us put the socket in one place. And consumers expect it
38+ # there.
39+ MIR_SERVER_FILE=/run/user/$(id -u)/mir_socket
40+ else
2741 MIR_SERVER_FILE=$XDG_RUNTIME_DIR/mir_socket
28− initctl set-env MIR_SERVER_FILE=$MIR_SERVER_FILE
29− initctl set-env MIR_SERVER_HOST_SOCKET=$UNITY_MIR_SOCKET
30−
31− # Point all future jobs in this session to our Mir socket instead of
32− # unity-system-compositor's socket.
33− initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
34− gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3542 fi
43+ initctl set-env MIR_SERVER_FILE=$MIR_SERVER_FILE
44+
45+ # Point all future jobs in this session to our Mir socket instead of
46+ # unity-system-compositor's socket.
47+ initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
48+ gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3649
3750 # Remove the normal and trusted sockets if still there
3851 if [ -S "$MIR_SERVER_FILE" ]; then
@@ -46,6 +59,7 @@ pre-start script
4659 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
4760
4861 # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
62+
4963 # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
5064 # the lag seen in the indicator panel pull-down (LP: #1488327) and also
5165 # reduces lag seen in apps:
@@ -54,7 +68,6 @@ pre-start script
5468 # Workaround for text not rendering correctly
5569 initctl set-env --global QT_ENABLE_GLYPH_CACHE_WORKAROUND=1
5670
57−
5871 if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
5972 # On Ubuntu Touch, we currently use a trick where we auto-login the
6073 # user without a LightDM greeter at all. In this case, we want to
@@ -66,32 +79,20 @@ pre-start script
6679 fi
6780
6881 # HACK! WORKAROUND FOR HALIUM MISSING UBUNTU_PLATFORM_API
69− initctl set-env --global UBUNTU_PLATFORM_API_BACKEND=test.so.3
70− initctl set-env --global UBUNTU_PLATFORM_API_SENSOR_TEST=/etc/ubuntusensors/test.sensors
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
85+ fi
7186end script
7287
7388exec ${BINARY:-unity8} --mode=$MODE $ARGS
7489
7590post-start script
76− # If no MIR_SOCKET was defined on launch, we try to set one here
77− if [ -z "$(initctl get-env --global UNITY_MIR_SOCKET)" ]; then
78− if [ -S "$XDG_RUNTIME_DIR/mir_socket" ]; then
79− mir_socket=$XDG_RUNTIME_DIR/mir_socket
80− elif [ -S "/tmp/mir_socket" ]; then
81− mir_socket=/tmp/mir_socket
82− fi
83−
84− if [ -n "$mir_socket" ]; then
85− initctl set-env --global MIR_SOCKET="$mir_socket"
86− fi
87− fi
88−
8991 initctl emit --no-wait indicator-services-start
9092end script
9193
9294post-stop script
9395 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
94− initctl unset-env --global UNITY_MIR_SOCKET
9596 initctl unset-env --global MIR_SERVER_PROMPT_FILE
9697 initctl emit application-end
9798end script
debian/changelog+12
@@ -1,3 +1,15 @@
1+unity8 (8.17+ubports2) xenial; urgency=medium
2+
3+ * Fix for https://github.com/ubports/ubuntu-touch/issues/624
4+
5+ -- Dalton Durst <dalton@ubports.com> Fri, 1 Jun 2018 16:14:11 -0500
6+
7+unity8 (8.17+ubports1) UNRELEASED; urgency=medium
8+
9+ * No change rebuild to generate sources in ubports repo
10+
11+ -- Dan Chapman <dan@ubports.com> Tue, 20 Feb 2018 07:09:11 +0000
12+
113unity8 (8.16+ubports) xenial; urgency=medium
214
315 * Imported to UBports
debian/control+14−3
@@ -26,7 +26,6 @@ Build-Depends: cmake,
2626 libhardware-dev,
2727 liblightdm-qt5-3-dev,
2828 libpam0g-dev,
29− libpay2-dev,
3029 libpulse-dev,
3130 libqmenumodel-dev (>= 0.2.10),
3231 libqt5svg5-dev,
@@ -165,6 +164,7 @@ Depends: qml-module-qtquick-layouts,
165164 unity-plugin-scopes | unity-scopes-impl,
166165 unity-scopes-impl-12,
167166 unity8-fake-env | unity-application-impl,
167+ unity8-schemas,
168168 ${misc:Depends},
169169Breaks: unity8 (<< 7.86),
170170Replaces: unity8 (<< 7.86),
@@ -219,8 +219,7 @@ Pre-Depends: ${misc:Pre-Depends},
219219Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
220220 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
221221 libhardware2,
222− pay-service,
223− unity-schemas (>= 7.3.1+14.10.20140915),
222+ unity8-schemas,
224223 qtdeclarative5-gsettings1.0,
225224 qml-module-qtmultimedia,
226225 ${misc:Depends},
@@ -233,6 +232,18 @@ Description: Unity 8 private libs
233232 This package contains the private libraries for QML and other components
234233 only used by the shell.
235234
235+
236+Package: unity8-schemas
237+Architecture: all
238+Multi-Arch: foreign
239+Depends: ${misc:Depends},
240+Replaces: unity-schemas (>= 7.3.1+14.10.20140915),
241+Breaks: unity-schemas (>= 7.3.1+14.10.20140915),
242+Description: Unity 8 schemas
243+ The Unity 8 shell is the primary user interface for Ubuntu devices.
244+ .
245+ This package contains the configuration schemas used by unity.
246+
236247Package: unity8-doc
237248Section: doc
238249Architecture: all
debian/unity8-common.install−1
@@ -1,4 +1,3 @@
1−usr/share/glib-2.0/schemas
21usr/share/locale
32usr/share/unity8/Components
43usr/share/unity8/Dash
debian/unity8-schemas.installnew file+1
@@ -0,0 +1 @@
1+usr/share/glib-2.0/schemas
plugins/Dash/abstractdashview.cpp+1−1
@@ -236,7 +236,7 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
236236 return nullptr;
237237
238238 m_asyncRequestedIndex = -1;
239− QObject* object = m_delegateModel->object(modelIndex, asynchronous);
239+ QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
240240 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
241241 if (!item) {
242242 if (object) {
plugins/Dash/listviewwithpageheader.cpp+4−6
@@ -871,7 +871,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
871871 return nullptr;
872872
873873 m_asyncRequestedIndex = -1;
874− QObject* object = m_delegateModel->object(modelIndex, asynchronous);
874+ QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
875875 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
876876 if (!item) {
877877 if (object) {
@@ -1141,11 +1141,10 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
11411141 }
11421142}
11431143
1144−/*
1145−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1144+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &oldGeometry)
11461145{
1147− const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1148− if (heightDiff != 0) {
1146+ if (change.heightChange()) {
1147+ const qreal heightDiff = height() - oldGeometry.height();
11491148 if (!m_visibleItems.isEmpty()) {
11501149 ListItem *firstItem = m_visibleItems.first();
11511150 const auto prevFirstItemY = firstItem->y();
@@ -1166,7 +1165,6 @@ void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF
11661165 m_contentHeightDirty = true;
11671166 }
11681167}
1169−*/
11701168
11711169void ListViewWithPageHeader::itemImplicitHeightChanged(QQuickItem *item)
11721170{
plugins/Dash/listviewwithpageheader.h+1−1
@@ -116,7 +116,7 @@ protected:
116116 void viewportMoved(Qt::Orientations orient) override;
117117 qreal minYExtent() const override;
118118 qreal maxYExtent() const override;
119− //void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
119+ void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &oldGeometry) override;
120120 void itemImplicitHeightChanged(QQuickItem *item) override;
121121 void updatePolish() override;
122122
plugins/Dash/verticaljournal.cpp+6−8
@@ -271,11 +271,9 @@ void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &
271271 }
272272}
273273
274−
275−//void VerticalJournal::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
276−//{
277−// const qreal heightDiff = newGeometry.height() - oldGeometry.height();
278−// if (heightDiff != 0) {
279−// relayout();
280−// }
281−//}
274+void VerticalJournal::itemGeometryChanged(QQuickItem * /*item*/, QQuickGeometryChange change, const QRectF &)
275+{
276+ if (change.verticalChange()) {
277+ relayout();
278+ }
279+}
plugins/Dash/verticaljournal.h+1−1
@@ -66,7 +66,7 @@ public:
6666 void setColumnWidth(qreal columnWidth);
6767
6868protected:
69−// void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
69+ void itemGeometryChanged(QQuickItem * /*item*/, QQuickGeometryChange change, const QRectF &oldGeometry) override;
7070
7171Q_SIGNALS:
7272 void columnWidthChanged();
plugins/Ubuntu/CMakeLists.txt+1−1
@@ -1,4 +1,4 @@
11add_subdirectory(Gestures)
22add_subdirectory(DownloadDaemonListener)
3−add_subdirectory(Payments)
3+#add_subdirectory(Payments)
44add_subdirectory(SystemImage)
qml/Dash/DashBackground.qml+1−1
@@ -31,6 +31,6 @@ Rectangle {
3131 source: AccountsService.backgroundFile
3232 anchors.fill: parent
3333 fillMode: Image.PreserveAspectCrop
34− opacity: 0.6
34+ opacity: settings.backgroundOpacity
3535 }
3636}
qml/Dash/Previews/PreviewWidgetFactory.qml−1
@@ -67,7 +67,6 @@ Loader {
6767 case "icon-actions": return "PreviewIconActions.qml";
6868 case "image": return "PreviewZoomableImage.qml";
6969 case "progress": return "PreviewProgress.qml";
70− case "payments": return "PreviewPayments.qml";
7170 case "rating-input": return "PreviewRatingInput.qml";
7271 case "rating-edit": return "PreviewRatingEdit.qml";
7372 case "reviews": return "PreviewRatingDisplay.qml";
qml/Stage/Stage.qml+8−2
@@ -1726,11 +1726,12 @@ FocusScope {
17261726
17271727 property int scrollAreaWidth: width / 3
17281728 property bool progressiveScrollingEnabled: false
1729+ property bool wasTouchPress: false
17291730
17301731 onMouseXChanged: {
17311732 mouse.accepted = false
17321733
1733− if (hoverMouseArea.pressed) {
1734+ if (hoverMouseArea.pressed || wasTouchPress) {
17341735 return;
17351736 }
17361737
@@ -1766,7 +1767,12 @@ FocusScope {
17661767 }
17671768 }
17681769
1769− onPressed: mouse.accepted = false
1770+ onPressed: {
1771+ mouse.accepted = false;
1772+ wasTouchPress = mouse.source === Qt.MouseEventSynthesizedByQt;
1773+ }
1774+
1775+ onExited: wasTouchPress = false;
17701776 }
17711777
17721778 FloatingFlickable {
qml/Stage/WindowResizeArea.qml+4−1
@@ -101,7 +101,10 @@ MouseArea {
101101 state = WindowStateStorage.WindowStateNormal;
102102 }
103103 windowStateStorage.saveState(root.windowId, state & ~WindowStateStorage.WindowStateMinimized); // clear the minimized bit when saving
104− windowStateStorage.saveGeometry(root.windowId, Qt.rect(priv.normalX, priv.normalY, priv.normalWidth, priv.normalHeight));
104+ // do not store window sizes if they are zero. this happens in staged mode
105+ if ( priv.normalWidth && priv.normalHeight ) {
106+ windowStateStorage.saveGeometry(root.windowId, Qt.rect(priv.normalX, priv.normalY, priv.normalWidth, priv.normalHeight));
107+ }
105108 }
106109
107110 QtObject {
qml/Wizard/Pages/78-app-update.qmlnew file+434
@@ -0,0 +1,434 @@
1+/*
2+ * This file is part of system-settings
3+ *
4+ * Copyright (C) 2013-2016 Canonical Ltd.
5+ *
6+ * Contact: Didier Roche <didier.roches@canonical.com>
7+ * Diego Sarmentero <diego.sarmentero@canonical.com>
8+ * Jonas G. Drange <jonas.drange@canonical.com>
9+ *
10+ * This program is free software: you can redistribute it and/or modify it
11+ * under the terms of the GNU General Public License version 3, as published
12+ * by the Free Software Foundation.
13+ *
14+ * This program is distributed in the hope that it will be useful, but
15+ * WITHOUT ANY WARRANTY; without even the implied warranties of
16+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
17+ * PURPOSE. See the GNU General Public License for more details.
18+ *
19+ * You should have received a copy of the GNU General Public License along
20+ * with this program. If not, see <http://www.gnu.org/licenses/>.
21+ */
22+
23+import QMenuModel 0.1
24+import QtQuick 2.4
25+import QtQuick.Layouts 1.1
26+import SystemSettings 1.0
27+import Ubuntu.Components 1.3
28+import Ubuntu.Components.ListItems 1.3 as ListItem
29+import Ubuntu.Components.Popups 1.3
30+import Ubuntu.SystemSettings.Update 1.0
31+import Ubuntu.Connectivity 1.0
32+import Wizard 0.1
33+import ".." as LocalComponents
34+
35+LocalComponents.Page {
36+ id: appUpdatePage
37+ objectName: "appUpdatePage"
38+
39+ title: i18n.tr("Update Apps")
40+ forwardButtonSourceComponent: forwardButton
41+
42+ property bool batchMode: false
43+ property bool havePower: (indicatorPower.deviceState === "charging") ||
44+ (indicatorPower.batteryLevel > 25)
45+ property bool online: NetworkingStatus.online
46+ property bool authenticated: UpdateManager.authenticated
47+ property bool forceCheck: false
48+
49+ property int updatesCount: {
50+ var count = 0;
51+ if (authenticated) {
52+ count += clickRepeater.count;
53+ }
54+ count += imageRepeater.count;
55+ return count;
56+ }
57+
58+ function check(force) {
59+ UpdateManager.check(UpdateManager.CheckClickIgnoreVersion);
60+ }
61+
62+ QDBusActionGroup {
63+ id: indicatorPower
64+ busType: 1
65+ busName: "com.canonical.indicator.power"
66+ objectPath: "/com/canonical/indicator/power"
67+ property var batteryLevel: action("battery-level").state || 0
68+ property var deviceState: action("device-state").state
69+ Component.onCompleted: start()
70+ }
71+
72+ DownloadHandler {
73+ id: downloadHandler
74+ updateModel: UpdateManager.model
75+ }
76+
77+ Flickable {
78+ id: scrollWidget
79+ anchors {
80+ top: parent.top
81+ left: parent.left
82+ right: parent.right
83+ bottom: configuration.top
84+ }
85+ clip: true
86+ contentHeight: content.height
87+ boundsBehavior: (contentHeight > parent.height) ?
88+ Flickable.DragAndOvershootBounds :
89+ Flickable.StopAtBounds
90+ flickableDirection: Flickable.VerticalFlick
91+
92+ Column {
93+ id: content
94+ anchors { left: parent.left; right: parent.right }
95+
96+ Global {
97+ id: glob
98+ objectName: "global"
99+ anchors { left: parent.left; right: parent.right }
100+
101+ height: hidden ? 0 : units.gu(8)
102+ clip: true
103+ status: UpdateManager.status
104+ batchMode: root.batchMode
105+ requireRestart: imageRepeater.count > 0
106+ updatesCount: root.updatesCount
107+ online: root.online
108+ onStop: UpdateManager.cancel()
109+
110+ onRequestInstall: {
111+ if (requireRestart) {
112+ var popup = PopupUtils.open(
113+ Qt.resolvedUrl("ImageUpdatePrompt.qml"), null, {
114+ havePowerForUpdate: root.havePower
115+ }
116+ );
117+ popup.requestSystemUpdate.connect(function () {
118+ install();
119+ });
120+ } else {
121+ install();
122+ }
123+ }
124+ onInstall: {
125+ root.batchMode = true
126+ if (requireRestart) {
127+ postAllBatchHandler.target = root;
128+ } else {
129+ postClickBatchHandler.target = root;
130+ }
131+ }
132+ }
133+
134+ Rectangle {
135+ id: overlay
136+ objectName: "overlay"
137+ anchors {
138+ left: parent.left
139+ leftMargin: units.gu(2)
140+ right: parent.right
141+ rightMargin: units.gu(2)
142+ }
143+ visible: placeholder.text
144+ color: theme.palette.normal.background
145+ height: units.gu(10)
146+
147+ Label {
148+ id: placeholder
149+ objectName: "overlayText"
150+ anchors.fill: parent
151+ verticalAlignment: Text.AlignVCenter
152+ horizontalAlignment: Text.AlignHCenter
153+ wrapMode: Text.WordWrap
154+ text: {
155+ var s = UpdateManager.status;
156+ if (!root.online) {
157+ return i18n.tr("Connect to the Internet to check for updates.");
158+ } else if (s === UpdateManager.StatusIdle && updatesCount === 0) {
159+ return i18n.tr("Software is up to date");
160+ } else if (s === UpdateManager.StatusServerError ||
161+ s === UpdateManager.StatusNetworkError) {
162+ return i18n.tr("The update server is not responding. Try again later.");
163+ }
164+ return "";
165+ }
166+ }
167+ }
168+
169+ SettingsItemTitle {
170+ id: updatesAvailableHeader
171+ text: i18n.tr("Updates Available")
172+ visible: imageUpdateCol.visible || clickUpdatesCol.visible
173+ }
174+
175+ Column {
176+ id: imageUpdateCol
177+ objectName: "imageUpdates"
178+ anchors { left: parent.left; right: parent.right }
179+ visible: {
180+ var s = UpdateManager.status;
181+ var haveUpdates = imageRepeater.count > 0;
182+ switch (s) {
183+ case UpdateManager.StatusCheckingClickUpdates:
184+ case UpdateManager.StatusIdle:
185+ return haveUpdates && online;
186+ }
187+ return false;
188+ }
189+
190+ Repeater {
191+ id: imageRepeater
192+ model: UpdateManager.imageUpdates
193+
194+ delegate: UpdateDelegate {
195+ objectName: "imageUpdatesDelegate-" + index
196+ width: imageUpdateCol.width
197+ updateState: model.updateState
198+ progress: model.progress
199+ version: remoteVersion
200+ size: model.size
201+ changelog: model.changelog
202+ error: model.error
203+ kind: model.kind
204+ iconUrl: model.iconUrl
205+ name: title
206+
207+ onResume: download()
208+ onRetry: download()
209+ onDownload: {
210+ if (SystemImage.downloadMode < 2) {
211+ SystemImage.downloadUpdate();
212+ SystemImage.forceAllowGSMDownload();
213+ } else {
214+ SystemImage.downloadUpdate();
215+ }
216+ }
217+ onPause: SystemImage.pauseDownload();
218+ onInstall: {
219+ var popup = PopupUtils.open(
220+ Qt.resolvedUrl("ImageUpdatePrompt.qml"), null, {
221+ havePowerForUpdate: root.havePower
222+ }
223+ );
224+ popup.requestSystemUpdate.connect(SystemImage.applyUpdate);
225+ }
226+ }
227+ }
228+ }
229+
230+ Column {
231+ id: clickUpdatesCol
232+ objectName: "clickUpdates"
233+ anchors { left: parent.left; right: parent.right }
234+ visible: {
235+ var s = UpdateManager.status;
236+ var haveUpdates = clickRepeater.count > 0;
237+ switch (s) {
238+ case UpdateManager.StatusCheckingImageUpdates:
239+ case UpdateManager.StatusIdle:
240+ return haveUpdates && online && authenticated;
241+ }
242+ return false;
243+ }
244+
245+ Repeater {
246+ id: clickRepeater
247+ model: UpdateManager.clickUpdates
248+
249+ delegate: ClickUpdateDelegate {
250+ objectName: "clickUpdatesDelegate" + index
251+ width: clickUpdatesCol.width
252+ updateState: model.updateState
253+ progress: model.progress
254+ version: remoteVersion
255+ size: model.size
256+ name: title
257+ iconUrl: model.iconUrl
258+ kind: model.kind
259+ changelog: model.changelog
260+ error: model.error
261+ signedUrl: signedDownloadUrl
262+
263+ onInstall: downloadHandler.createDownload(model);
264+ onPause: downloadHandler.pauseDownload(model)
265+ onResume: downloadHandler.resumeDownload(model)
266+ onRetry: {
267+ /* This creates a new signed URL with which we can
268+ retry the download. See onSignedUrlChanged. */
269+ UpdateManager.retry(model.identifier,
270+ model.revision);
271+ }
272+
273+ onSignedUrlChanged: {
274+ // If we have a signedUrl, user intend to retry.
275+ if (signedUrl) {
276+ downloadHandler.retryDownload(model);
277+ }
278+ }
279+
280+ Connections {
281+ target: glob
282+ onInstall: install()
283+ }
284+
285+ /* If we a downloadId, we expect UDM to restore it
286+ after some time. Workaround for lp:1603770. */
287+ Timer {
288+ id: downloadTimeout
289+ interval: 30000
290+ running: true
291+ onTriggered: {
292+ var s = updateState;
293+ if (model.downloadId
294+ || s === Update.StateQueuedForDownload
295+ || s === Update.StateDownloading) {
296+ downloadHandler.assertDownloadExist(model);
297+ }
298+ }
299+ }
300+ }
301+ }
302+ }
303+
304+ SettingsItemTitle {
305+ text: i18n.tr("Recent updates")
306+ visible: installedCol.visible
307+ }
308+
309+ Column {
310+ id: installedCol
311+ objectName: "installedUpdates"
312+ anchors { left: parent.left; right: parent.right }
313+ visible: installedRepeater.count > 0
314+
315+ Repeater {
316+ id: installedRepeater
317+ model: UpdateManager.installedUpdates
318+
319+ delegate: UpdateDelegate {
320+ objectName: "installedUpdateDelegate-" + index
321+ width: installedCol.width
322+ version: remoteVersion
323+ size: model.size
324+ name: title
325+ kind: model.kind
326+ iconUrl: model.iconUrl
327+ changelog: model.changelog
328+ updateState: Update.StateInstalled
329+ updatedAt: model.updatedAt
330+
331+ leadingActions: ListItemActions {
332+ actions: [
333+ Action {
334+ iconName: "delete"
335+ onTriggered: UpdateManager.remove(
336+ model.identifier, model.revision
337+ )
338+ }
339+ ]
340+ }
341+
342+ // Launchable if there's a package name on a click.
343+ launchable: (!!packageName &&
344+ model.kind === Update.KindClick)
345+
346+ onLaunch: UpdateManager.launch(identifier, revision);
347+ }
348+ }
349+ }
350+ } // Column inside flickable.
351+ } // Flickable
352+
353+ Column {
354+ id: configuration
355+
356+ height: childrenRect.height
357+
358+ anchors {
359+ bottom: parent.bottom
360+ left: parent.left
361+ right: parent.right
362+ }
363+
364+ ListItem.ThinDivider {}
365+
366+ ListItem.SingleValue {
367+ objectName: "configuration"
368+ text: i18n.tr("Update settings")
369+ progression: true
370+ onClicked: pageStack.addPageToNextColumn(
371+ root, Qt.resolvedUrl("UpdateSettings.qml"))
372+ }
373+ }
374+
375+ Connections {
376+ id: postClickBatchHandler
377+ ignoreUnknownSignals: true
378+ target: null
379+ onUpdatesCountChanged: {
380+ if (target.updatesCount === 0) {
381+ root.batchMode = false;
382+ target = null;
383+ }
384+ }
385+ }
386+
387+ Connections {
388+ id: postAllBatchHandler
389+ ignoreUnknownSignals: true
390+ target: null
391+ onUpdatesCountChanged: {
392+ if (target.updatesCount === 1) {
393+ SystemImage.updateDownloaded.connect(function () {
394+ SystemImage.applyUpdate();
395+ });
396+ SystemImage.downloadUpdate();
397+ }
398+ }
399+ }
400+
401+ Connections {
402+ target: NetworkingStatus
403+ onOnlineChanged: {
404+ if (!online) {
405+ UpdateManager.cancel();
406+ } else {
407+ UpdateManager.check(UpdateManager.CheckClickIgnoreVersion);
408+ }
409+ }
410+ }
411+
412+ Connections {
413+ target: SystemImage
414+ onUpdateFailed: {
415+ if (consecutiveFailureCount > SystemImage.failuresBeforeWarning) {
416+ var popup = PopupUtils.open(
417+ Qt.resolvedUrl("InstallationFailed.qml"), null, {
418+ text: lastReason
419+ }
420+ );
421+ }
422+ }
423+ }
424+
425+ Component {
426+ id: forwardButton
427+ LocalComponents.StackButton {
428+ text: i18n.tr("Skip")
429+ onClicked: pageStack.next()
430+ }
431+ }
432+
433+ Component.onCompleted: check()
434+}
tests/plugins/CMakeLists.txt+1−1
@@ -8,5 +8,5 @@ add_subdirectory(LightDM)
88add_subdirectory(SessionBroadcast)
99add_subdirectory(Ubuntu)
1010add_subdirectory(Unity)
11−#add_subdirectory(Utils) #FIXME broken with qt 5.9
11+add_subdirectory(Utils)
1212add_subdirectory(Wizard)
tests/plugins/Ubuntu/CMakeLists.txt+1−1
@@ -1 +1 @@
1−#add_subdirectory(Gestures) #FIXME broken with qt 5.9
1+add_subdirectory(Gestures)
tests/plugins/Ubuntu/Gestures/GestureTest.cpp+1−1
@@ -107,7 +107,7 @@ void GestureTest::sendTouch(qint64 timestamp, int id, QPointF pos,
107107 QCoreApplication::sendEvent(m_view, &touchEvent);
108108
109109 QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(m_view);
110− windowPrivate->flushDelayedTouchEvent();
110+ windowPrivate->flushFrameSynchronousEvents();
111111}
112112
113113void GestureTest::passTime(qint64 timeSpanMs)
tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+1−1
@@ -189,7 +189,7 @@ void tst_TouchGate::holdsEventsUntilGainsOwnership()
189189 if (!ownershipAfterTouchEnd) {
190190 touchRegistry->removeCandidateOwnerForTouch(0, candidateItem);
191191 QQuickWindowPrivate *wp = QQuickWindowPrivate::get(testItem->window());
192− wp->flushDelayedTouchEvent();
192+ wp->flushFrameSynchronousEvents();
193193 // TouchGate should now open its flood gates and let testItem get all
194194 // events from touch 0 produced so far
195195 QCOMPARE(testItem->touchEventsReceived.count(), 2);
tests/plugins/Utils/ModelTest.cpp+1−1
@@ -441,7 +441,7 @@ void ModelTest::data()
441441 QVariant textAlignmentVariant = model->data ( model->index ( 0, 0 ), Qt::TextAlignmentRole );
442442 if ( textAlignmentVariant.isValid() ) {
443443 int alignment = textAlignmentVariant.toInt();
444− QCOMPARE( alignment, ( alignment & ( Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask ) ) );
444+ QCOMPARE( alignment, (int) ( alignment & ( Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask ) ));
445445 }
446446
447447 // General Purpose roles that should return a QColor
tests/qmltests/CMakeLists.txt+2−2
@@ -1,5 +1,5 @@
11
2−#add_subdirectory(Components) #FIXME broken with qt 5.9
2+add_subdirectory(Components)
33
44add_unity8_qmltest(. OrientedShell)
55add_unity8_qmltest(. DisabledScreenNotice)
@@ -44,7 +44,7 @@ add_unity8_qmltest(Dash/Previews PreviewIconActions)
4444add_unity8_qmltest(Dash/Previews PreviewImageGallery)
4545add_unity8_qmltest(Dash/Previews PreviewInlineVideo)
4646add_unity8_qmltest(Dash/Previews PreviewMediaToolbar)
47−add_unity8_qmltest(Dash/Previews PreviewPayments)
47+#add_unity8_qmltest(Dash/Previews PreviewPayments)
4848add_unity8_qmltest(Dash/Previews PreviewProgress)
4949add_unity8_qmltest(Dash/Previews PreviewRatingDisplay)
5050add_unity8_qmltest(Dash/Previews PreviewRatingDisplayCreationRanges)
tests/qmltests/Components/tst_DragHandle.cpp+2−2
@@ -177,7 +177,7 @@ void tst_DragHandle::flickAndHold(QQuickItem *dragHandle,
177177 QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
178178
179179 QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(m_view);
180− windowPrivate->flushDelayedTouchEvent();
180+ windowPrivate->flushFrameSynchronousEvents();
181181}
182182
183183void tst_DragHandle::drag(QPointF &touchPoint, const QPointF& direction, qreal distance,
@@ -192,7 +192,7 @@ void tst_DragHandle::drag(QPointF &touchPoint, const QPointF& direction, qreal d
192192 m_fakeTimeSource->m_msecsSinceReference += timeStep;
193193 QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
194194
195− windowPrivate->flushDelayedTouchEvent();
195+ windowPrivate->flushFrameSynchronousEvents();
196196 }
197197}
198198
tests/utils/CMakeLists.txt+1−1
@@ -1 +1 @@
1−#add_subdirectory(modules) #FIXME broken with qt 5.9
1+add_subdirectory(modules)
tests/utils/modules/Unity/Test/TouchEventSequenceWrapper.cpp−9
@@ -26,16 +26,7 @@ TouchEventSequenceWrapper::TouchEventSequenceWrapper(QTest::QTouchEventSequence
2626
2727void TouchEventSequenceWrapper::commit(bool processEvents)
2828{
29− // Item might be deleted as a consequence of this event sequence being handled
30− // So store its window beforehand
31− QQuickWindow *window = m_item->window();
32−
3329 m_eventSequence.commit(processEvents);
34−
35− if (window) {
36− QQuickWindowPrivate *wp = QQuickWindowPrivate::get(window);
37− wp->flushDelayedTouchEvent();
38− }
3930}
4031
4132void TouchEventSequenceWrapper::move(int touchId, int x, int y)