on f0dad4e help sign in
Jenkinsfile+29−12
since splitsnapshots
unifiedsplit
@@ -12,25 +12,40 @@ pipeline {
12 steps {
12 steps {
13 parallel(
13 parallel(
14 "Build binary - armhf": {
14 "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)
16 unstash 'source'
17 unstash 'source'
17 sh '''export architecture="armhf"
18 sh '''export architecture="armhf"
19+ export DEBBUILDOPTS="-sa"
20+ export SKIP_ARCH_BUILD=false
21+ export SKIP_SOURCE_REMOVAL=true
18build-binary.sh'''
22build-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')
20 cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
24 cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
21 }
25 }
22
26
23
27
24 },
28 },
25− "Build binary - all": {
29+ "Build binary - arm64": {
26− node(label: 'xenial-arm64') {
30+ node(label: 'arm64') {
31+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
27 unstash 'source'
32 unstash 'source'
28− sh '''export architecture="armhf"
33+ sh '''export architecture="arm64"
29− export DEBBUILDOPTS="-A"
34+ export DEBBUILDOPTS="-sa"
30 export SKIP_ARCH_BUILD=false
35 export SKIP_ARCH_BUILD=false
31 export SKIP_SOURCE_REMOVAL=true
36 export SKIP_SOURCE_REMOVAL=true
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"
32− build-binary.sh'''
47+ #build-binary.sh'''
33− stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-all')
48+ stash(includes: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo,lintian.txt', name: 'build-amd64')
34 cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
49 cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
35 }
50 }
36 }
51 }
@@ -39,11 +54,12 @@ build-binary.sh'''
39 }
54 }
40 stage('Results') {
55 stage('Results') {
41 steps {
56 steps {
57+ cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true, cleanWhenSuccess: true, cleanWhenUnstable: true, deleteDirs: true)
42− unstash 'build'
58+ unstash 'build-armhf'
43− unstash 'build-all'
59+ unstash 'build-arm64'
60+ unstash 'build-amd64'
44 archiveArtifacts(artifacts: '*.gz,*.bz2,*.xz,*.deb,*.dsc,*.changes,*.buildinfo', fingerprint: true, onlyIfSuccessful: true)
61 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'''
47 }
63 }
48 }
64 }
49 stage('Cleanup') {
65 stage('Cleanup') {
@@ -53,3 +69,4 @@ build-binary.sh'''
53 }
69 }
54 }
70 }
55}
71}
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
31add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
31add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
32
32
33install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
33install(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)
34install(FILES unity8-dash.url-dispatcher DESTINATION ${CMAKE_INSTALL_DATADIR}/url-dispatcher/urls)
35install(FILES unity8-dash.url-dispatcher DESTINATION ${CMAKE_INSTALL_DATADIR}/url-dispatcher/urls)
35install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
36install(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
8
8
9kill timeout 120
9kill timeout 120
10
10
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+
11respawn
20respawn
12expect stop
21expect stop
13
22
23+# FIXME Create an autopilot test that makes sure start+stop and restart
24+# work fine at least 2 times
25+
14pre-start script
26pre-start script
15 # Tell unity-mir to raise SIGSTOP after we start
27 # Tell unity-mir to raise SIGSTOP after we start
16 initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
28 initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
17
29
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,
30+ # Save original value of MIR_SOCKET so that we can restore it when stopped,
22− # as we modify the variable for future jobs, including ourself.
31+ # 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
32+ initctl set-env UNITY_MIR_SOCKET=$MIR_SOCKET
25
33
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
27 MIR_SERVER_FILE=$XDG_RUNTIME_DIR/mir_socket
41 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'}"
35 fi
42 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'}"
36
49
37 # Remove the normal and trusted sockets if still there
50 # Remove the normal and trusted sockets if still there
38 if [ -S "$MIR_SERVER_FILE" ]; then
51 if [ -S "$MIR_SERVER_FILE" ]; then
@@ -46,6 +59,7 @@ pre-start script
46 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
59 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
47
60
48 # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
61 # Disable Qt's stuttering 'touch compression' to fix scrolling smoothness
62+
49 # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
63 # issues (LP: #1486341, LP: #1556763). As a bonus, this eliminates most of
50 # the lag seen in the indicator panel pull-down (LP: #1488327) and also
64 # the lag seen in the indicator panel pull-down (LP: #1488327) and also
51 # reduces lag seen in apps:
65 # reduces lag seen in apps:
@@ -54,7 +68,6 @@ pre-start script
54 # Workaround for text not rendering correctly
68 # Workaround for text not rendering correctly
55 initctl set-env --global QT_ENABLE_GLYPH_CACHE_WORKAROUND=1
69 initctl set-env --global QT_ENABLE_GLYPH_CACHE_WORKAROUND=1
56
70
57−
58 if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
71 if [ "$XDG_SESSION_DESKTOP" = "ubuntu-touch" ]; then
59 # On Ubuntu Touch, we currently use a trick where we auto-login the
72 # On Ubuntu Touch, we currently use a trick where we auto-login the
60 # user without a LightDM greeter at all. In this case, we want to
73 # user without a LightDM greeter at all. In this case, we want to
@@ -66,32 +79,20 @@ pre-start script
66 fi
79 fi
67
80
68 # HACK! WORKAROUND FOR HALIUM MISSING UBUNTU_PLATFORM_API
81 # HACK! WORKAROUND FOR HALIUM MISSING UBUNTU_PLATFORM_API
82+ if [ ! -f /system/lib/libubuntu_application_api.so ]; then
69− initctl set-env --global UBUNTU_PLATFORM_API_BACKEND=test.so.3
83+ 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
84+ initctl set-env --global UBUNTU_PLATFORM_API_SENSOR_TEST=/etc/ubuntusensors/test.sensors
85+ fi
71end script
86end script
72
87
73exec ${BINARY:-unity8} --mode=$MODE $ARGS
88exec ${BINARY:-unity8} --mode=$MODE $ARGS
74
89
75post-start script
90post-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−
89 initctl emit --no-wait indicator-services-start
91 initctl emit --no-wait indicator-services-start
90end script
92end script
91
93
92post-stop script
94post-stop script
93 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
95 initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
94− initctl unset-env --global UNITY_MIR_SOCKET
95 initctl unset-env --global MIR_SERVER_PROMPT_FILE
96 initctl unset-env --global MIR_SERVER_PROMPT_FILE
96 initctl emit application-end
97 initctl emit application-end
97end script
98end 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+
1unity8 (8.16+ubports) xenial; urgency=medium
13unity8 (8.16+ubports) xenial; urgency=medium
2
14
3 * Imported to UBports
15 * Imported to UBports
debian/control+14−3
@@ -26,7 +26,6 @@ Build-Depends: cmake,
26 libhardware-dev,
26 libhardware-dev,
27 liblightdm-qt5-3-dev,
27 liblightdm-qt5-3-dev,
28 libpam0g-dev,
28 libpam0g-dev,
29− libpay2-dev,
30 libpulse-dev,
29 libpulse-dev,
31 libqmenumodel-dev (>= 0.2.10),
30 libqmenumodel-dev (>= 0.2.10),
32 libqt5svg5-dev,
31 libqt5svg5-dev,
@@ -165,6 +164,7 @@ Depends: qml-module-qtquick-layouts,
165 unity-plugin-scopes | unity-scopes-impl,
164 unity-plugin-scopes | unity-scopes-impl,
166 unity-scopes-impl-12,
165 unity-scopes-impl-12,
167 unity8-fake-env | unity-application-impl,
166 unity8-fake-env | unity-application-impl,
167+ unity8-schemas,
168 ${misc:Depends},
168 ${misc:Depends},
169Breaks: unity8 (<< 7.86),
169Breaks: unity8 (<< 7.86),
170Replaces: unity8 (<< 7.86),
170Replaces: unity8 (<< 7.86),
@@ -219,8 +219,7 @@ Pre-Depends: ${misc:Pre-Depends},
219Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
219Depends: accountsservice-ubuntu-schemas (>= 0.0.7),
220 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
220 gsettings-ubuntu-schemas (>= 0.0.2+14.10.20140815),
221 libhardware2,
221 libhardware2,
222− pay-service,
222+ unity8-schemas,
223− unity-schemas (>= 7.3.1+14.10.20140915),
224 qtdeclarative5-gsettings1.0,
223 qtdeclarative5-gsettings1.0,
225 qml-module-qtmultimedia,
224 qml-module-qtmultimedia,
226 ${misc:Depends},
225 ${misc:Depends},
@@ -233,6 +232,18 @@ Description: Unity 8 private libs
233 This package contains the private libraries for QML and other components
232 This package contains the private libraries for QML and other components
234 only used by the shell.
233 only used by the shell.
235
234
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+
236Package: unity8-doc
247Package: unity8-doc
237Section: doc
248Section: doc
238Architecture: all
249Architecture: all
debian/unity8-common.install−1
@@ -1,4 +1,3 @@
1−usr/share/glib-2.0/schemas
2usr/share/locale
1usr/share/locale
3usr/share/unity8/Components
2usr/share/unity8/Components
4usr/share/unity8/Dash
3usr/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)
236 return nullptr;
236 return nullptr;
237
237
238 m_asyncRequestedIndex = -1;
238 m_asyncRequestedIndex = -1;
239− QObject* object = m_delegateModel->object(modelIndex, asynchronous);
239+ QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
240 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
240 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
241 if (!item) {
241 if (!item) {
242 if (object) {
242 if (object) {
plugins/Dash/listviewwithpageheader.cpp+4−6
@@ -871,7 +871,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
871 return nullptr;
871 return nullptr;
872
872
873 m_asyncRequestedIndex = -1;
873 m_asyncRequestedIndex = -1;
874− QObject* object = m_delegateModel->object(modelIndex, asynchronous);
874+ QObject* object = m_delegateModel->object(modelIndex, asynchronous ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested);
875 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
875 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
876 if (!item) {
876 if (!item) {
877 if (object) {
877 if (object) {
@@ -1141,11 +1141,10 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1141 }
1141 }
1142}
1142}
1143
1143
1144−/*
1145−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1144+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &oldGeometry)
1146{
1145{
1146+ if (change.heightChange()) {
1147− const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1147+ const qreal heightDiff = height() - oldGeometry.height();
1148− if (heightDiff != 0) {
1149 if (!m_visibleItems.isEmpty()) {
1148 if (!m_visibleItems.isEmpty()) {
1150 ListItem *firstItem = m_visibleItems.first();
1149 ListItem *firstItem = m_visibleItems.first();
1151 const auto prevFirstItemY = firstItem->y();
1150 const auto prevFirstItemY = firstItem->y();
@@ -1166,7 +1165,6 @@ void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF
1166 m_contentHeightDirty = true;
1165 m_contentHeightDirty = true;
1167 }
1166 }
1168}
1167}
1169−*/
1170
1168
1171void ListViewWithPageHeader::itemImplicitHeightChanged(QQuickItem *item)
1169void ListViewWithPageHeader::itemImplicitHeightChanged(QQuickItem *item)
1172{
1170{
plugins/Dash/listviewwithpageheader.h+1−1
@@ -116,7 +116,7 @@ protected:
116 void viewportMoved(Qt::Orientations orient) override;
116 void viewportMoved(Qt::Orientations orient) override;
117 qreal minYExtent() const override;
117 qreal minYExtent() const override;
118 qreal maxYExtent() const override;
118 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;
120 void itemImplicitHeightChanged(QQuickItem *item) override;
120 void itemImplicitHeightChanged(QQuickItem *item) override;
121 void updatePolish() override;
121 void updatePolish() override;
122
122
plugins/Dash/verticaljournal.cpp+6−8
@@ -271,11 +271,9 @@ void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Change> &
271 }
271 }
272}
272}
273
273
274−
275−//void VerticalJournal::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
274+void VerticalJournal::itemGeometryChanged(QQuickItem * /*item*/, QQuickGeometryChange change, const QRectF &)
276−//{
275+{
277−// const qreal heightDiff = newGeometry.height() - oldGeometry.height();
276+ if (change.verticalChange()) {
278−// if (heightDiff != 0) {
279−// relayout();
277+ relayout();
280−// }
278+ }
281−//}
279+}
plugins/Dash/verticaljournal.h+1−1
@@ -66,7 +66,7 @@ public:
66 void setColumnWidth(qreal columnWidth);
66 void setColumnWidth(qreal columnWidth);
67
67
68protected:
68protected:
69−// void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) override;
69+ void itemGeometryChanged(QQuickItem * /*item*/, QQuickGeometryChange change, const QRectF &oldGeometry) override;
70
70
71Q_SIGNALS:
71Q_SIGNALS:
72 void columnWidthChanged();
72 void columnWidthChanged();
plugins/Ubuntu/CMakeLists.txt+1−1
@@ -1,4 +1,4 @@
1add_subdirectory(Gestures)
1add_subdirectory(Gestures)
2add_subdirectory(DownloadDaemonListener)
2add_subdirectory(DownloadDaemonListener)
3−add_subdirectory(Payments)
3+#add_subdirectory(Payments)
4add_subdirectory(SystemImage)
4add_subdirectory(SystemImage)
qml/Dash/DashBackground.qml+1−1
@@ -31,6 +31,6 @@ Rectangle {
31 source: AccountsService.backgroundFile
31 source: AccountsService.backgroundFile
32 anchors.fill: parent
32 anchors.fill: parent
33 fillMode: Image.PreserveAspectCrop
33 fillMode: Image.PreserveAspectCrop
34− opacity: 0.6
34+ opacity: settings.backgroundOpacity
35 }
35 }
36}
36}
qml/Dash/Previews/PreviewWidgetFactory.qml−1
@@ -67,7 +67,6 @@ Loader {
67 case "icon-actions": return "PreviewIconActions.qml";
67 case "icon-actions": return "PreviewIconActions.qml";
68 case "image": return "PreviewZoomableImage.qml";
68 case "image": return "PreviewZoomableImage.qml";
69 case "progress": return "PreviewProgress.qml";
69 case "progress": return "PreviewProgress.qml";
70− case "payments": return "PreviewPayments.qml";
71 case "rating-input": return "PreviewRatingInput.qml";
70 case "rating-input": return "PreviewRatingInput.qml";
72 case "rating-edit": return "PreviewRatingEdit.qml";
71 case "rating-edit": return "PreviewRatingEdit.qml";
73 case "reviews": return "PreviewRatingDisplay.qml";
72 case "reviews": return "PreviewRatingDisplay.qml";
qml/Stage/Stage.qml+8−2
@@ -1726,11 +1726,12 @@ FocusScope {
1726
1726
1727 property int scrollAreaWidth: width / 3
1727 property int scrollAreaWidth: width / 3
1728 property bool progressiveScrollingEnabled: false
1728 property bool progressiveScrollingEnabled: false
1729+ property bool wasTouchPress: false
1729
1730
1730 onMouseXChanged: {
1731 onMouseXChanged: {
1731 mouse.accepted = false
1732 mouse.accepted = false
1732
1733
1733− if (hoverMouseArea.pressed) {
1734+ if (hoverMouseArea.pressed || wasTouchPress) {
1734 return;
1735 return;
1735 }
1736 }
1736
1737
@@ -1766,7 +1767,12 @@ FocusScope {
1766 }
1767 }
1767 }
1768 }
1768
1769
1770+ onPressed: {
1769− onPressed: mouse.accepted = false
1771+ mouse.accepted = false;
1772+ wasTouchPress = mouse.source === Qt.MouseEventSynthesizedByQt;
1773+ }
1774+
1775+ onExited: wasTouchPress = false;
1770 }
1776 }
1771
1777
1772 FloatingFlickable {
1778 FloatingFlickable {
qml/Stage/WindowResizeArea.qml+4−1
@@ -101,7 +101,10 @@ MouseArea {
101 state = WindowStateStorage.WindowStateNormal;
101 state = WindowStateStorage.WindowStateNormal;
102 }
102 }
103 windowStateStorage.saveState(root.windowId, state & ~WindowStateStorage.WindowStateMinimized); // clear the minimized bit when saving
103 windowStateStorage.saveState(root.windowId, state & ~WindowStateStorage.WindowStateMinimized); // clear the minimized bit when saving
104+ // do not store window sizes if they are zero. this happens in staged mode
105+ if ( priv.normalWidth && priv.normalHeight ) {
104− windowStateStorage.saveGeometry(root.windowId, Qt.rect(priv.normalX, priv.normalY, priv.normalWidth, priv.normalHeight));
106+ windowStateStorage.saveGeometry(root.windowId, Qt.rect(priv.normalX, priv.normalY, priv.normalWidth, priv.normalHeight));
107+ }
105 }
108 }
106
109
107 QtObject {
110 QtObject {
qml/Wizard/Pages/78-app-update.qmlnew file+245
@@ -0,0 +1,245 @@
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 Ubuntu.Components 1.3
27+import Ubuntu.Components.ListItems 1.3 as ListItem
28+import Ubuntu.Components.Popups 1.3
29+import Ubuntu.SystemSettings.Update 1.0
30+import Ubuntu.Connectivity 1.0
31+import Wizard 0.1
32+import ".." as LocalComponents
33+
34+LocalComponents.Page {
35+ id: appUpdatePage
36+ objectName: "appUpdatePage"
37+
38+ title: i18n.tr("Update Apps")
39+ forwardButtonSourceComponent: forwardButton
40+
41+ property bool batchMode: false
42+ property bool online: NetworkingStatus.online
43+ property bool authenticated: UpdateManager.authenticated
44+ property bool forceCheck: false
45+
46+ property int updatesCount: {
47+ var count = 0;
48+ if (authenticated) {
49+ count += clickRepeater.count;
50+ }
51+ return count;
52+ }
53+
54+ function check(force) {
55+ UpdateManager.check(UpdateManager.CheckClickIgnoreVersion);
56+ }
57+
58+ Flickable {
59+ id: scrollWidget
60+ anchors {
61+ top: parent.top
62+ left: parent.left
63+ right: parent.right
64+ bottom: parent.bottom
65+ }
66+ clip: true
67+ contentHeight: content.height
68+ boundsBehavior: (contentHeight > parent.height) ?
69+ Flickable.DragAndOvershootBounds :
70+ Flickable.StopAtBounds
71+ flickableDirection: Flickable.VerticalFlick
72+
73+ Column {
74+ id: content
75+ anchors { left: parent.left; right: parent.right }
76+
77+ AppUpdateList {
78+ id: appUpdateList
79+ objectName: "appUpdateList"
80+ anchors { left: parent.left; right: parent.right }
81+
82+ height: hidden ? 0 : units.gu(8)
83+ clip: true
84+ status: UpdateManager.status
85+ batchMode: root.batchMode
86+ updatesCount: root.updatesCount
87+ online: root.online
88+ onStop: UpdateManager.cancel()
89+
90+ onRequestInstall: {
91+ install();
92+ }
93+ onInstall: {
94+ root.batchMode = true
95+ if (requireRestart) {
96+ postAllBatchHandler.target = root;
97+ } else {
98+ postClickBatchHandler.target = root;
99+ }
100+ }
101+ }
102+
103+ Rectangle {
104+ id: overlay
105+ objectName: "overlay"
106+ anchors {
107+ left: parent.left
108+ leftMargin: units.gu(2)
109+ right: parent.right
110+ rightMargin: units.gu(2)
111+ }
112+ visible: placeholder.text
113+ color: theme.palette.normal.background
114+ height: units.gu(10)
115+
116+ Label {
117+ id: placeholder
118+ objectName: "overlayText"
119+ anchors.fill: parent
120+ verticalAlignment: Text.AlignVCenter
121+ horizontalAlignment: Text.AlignHCenter
122+ wrapMode: Text.WordWrap
123+ text: {
124+ var s = UpdateManager.status;
125+ if (!root.online) {
126+ return i18n.tr("Connect to the Internet to check for updates.");
127+ } else if (s === UpdateManager.StatusIdle && updatesCount === 0) {
128+ return i18n.tr("Software is up to date");
129+ } else if (s === UpdateManager.StatusServerError ||
130+ s === UpdateManager.StatusNetworkError) {
131+ return i18n.tr("The update server is not responding. Try again later.");
132+ }
133+ return "";
134+ }
135+ }
136+ }
137+
138+ Column {
139+ id: clickUpdatesCol
140+ objectName: "clickUpdates"
141+ anchors { left: parent.left; right: parent.right }
142+ visible: {
143+ var s = UpdateManager.status;
144+ var haveUpdates = clickRepeater.count > 0;
145+ switch (s) {
146+ case UpdateManager.StatusCheckingImageUpdates:
147+ case UpdateManager.StatusIdle:
148+ return haveUpdates && online && authenticated;
149+ }
150+ return false;
151+ }
152+
153+ Repeater {
154+ id: clickRepeater
155+ model: UpdateManager.clickUpdates
156+
157+ delegate: ClickUpdateDelegate {
158+ objectName: "clickUpdatesDelegate" + index
159+ width: clickUpdatesCol.width
160+ updateState: model.updateState
161+ progress: model.progress
162+ version: remoteVersion
163+ size: model.size
164+ name: title
165+ iconUrl: model.iconUrl
166+ kind: model.kind
167+ error: model.error
168+ signedUrl: signedDownloadUrl
169+
170+ onInstall: downloadHandler.createDownload(model);
171+ onPause: downloadHandler.pauseDownload(model)
172+ onResume: downloadHandler.resumeDownload(model)
173+ onRetry: {
174+ /* This creates a new signed URL with which we can
175+ retry the download. See onSignedUrlChanged. */
176+ UpdateManager.retry(model.identifier,
177+ model.revision);
178+ }
179+
180+ onSignedUrlChanged: {
181+ // If we have a signedUrl, user intend to retry.
182+ if (signedUrl) {
183+ downloadHandler.retryDownload(model);
184+ }
185+ }
186+
187+ Connections {
188+ target: appUpdateList
189+ onInstall: install()
190+ }
191+
192+ /* If we a downloadId, we expect UDM to restore it
193+ after some time. Workaround for lp:1603770. */
194+ Timer {
195+ id: downloadTimeout
196+ interval: 30000
197+ running: true
198+ onTriggered: {
199+ var s = updateState;
200+ if (model.downloadId
201+ || s === Update.StateQueuedForDownload
202+ || s === Update.StateDownloading) {
203+ downloadHandler.assertDownloadExist(model);
204+ }
205+ }
206+ }
207+ }
208+ }
209+ }
210+ } // Column inside flickable.
211+ } // Flickable
212+
213+ Connections {
214+ id: postClickBatchHandler
215+ ignoreUnknownSignals: true
216+ target: null
217+ onUpdatesCountChanged: {
218+ if (target.updatesCount === 0) {
219+ root.batchMode = false;
220+ target = null;
221+ }
222+ }
223+ }
224+
225+ Connections {
226+ target: NetworkingStatus
227+ onOnlineChanged: {
228+ if (!online) {
229+ UpdateManager.cancel();
230+ } else {
231+ UpdateManager.check(UpdateManager.CheckClickIgnoreVersion);
232+ }
233+ }
234+ }
235+
236+ Component.onCompleted: check()
237+
238+ Component {
239+ id: forwardButton
240+ LocalComponents.StackButton {
241+ text: i18n.tr("Skip")
242+ onClicked: pageStack.next()
243+ }
244+ }
245+}
qml/Wizard/Pages/AppUpdateList.qmlnew file+144
@@ -0,0 +1,144 @@
1+/*
2+ *
3+ * Copyright (C) 2016 Canonical Ltd.
4+ *
5+ * This program is free software: you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 3, as published
7+ * by the Free Software Foundation.
8+ *
9+ * This program is distributed in the hope that it will be useful, but
10+ * WITHOUT ANY WARRANTY; without even the implied warranties of
11+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
12+ * PURPOSE. See the GNU General Public License for more details.
13+ *
14+ * You should have received a copy of the GNU General Public License along
15+ * with this program. If not, see <http://www.gnu.org/licenses/>.
16+ */
17+
18+import QtQuick 2.4
19+import QtQuick.Layouts 1.1
20+import Ubuntu.Components 1.3
21+import Ubuntu.Components.ListItems 1.3 as ListItems
22+import Ubuntu.SystemSettings.Update 1.0
23+
24+Item {
25+ id: g
26+
27+ property bool batchMode
28+ property int status // A UpdateManager::Status
29+ property bool requireRestart: false
30+ property int updatesCount: 0
31+ property bool online: false
32+
33+ property bool hidden: {
34+ switch (status) {
35+ case UpdateManager.StatusNetworkError:
36+ case UpdateManager.StatusServerError:
37+ return true;
38+ }
39+ return !online ||
40+ (updatesCount <= 1 && status === UpdateManager.StatusIdle) ||
41+ batchMode
42+ }
43+
44+ signal stop()
45+ signal requestInstall()
46+ signal install()
47+
48+ Behavior on height {
49+ UbuntuNumberAnimation {}
50+ }
51+
52+ RowLayout {
53+ id: checking
54+ spacing: units.gu(2)
55+ anchors {
56+ fill: parent
57+ margins: units.gu(2)
58+ }
59+
60+ Behavior on opacity {
61+ UbuntuNumberAnimation {}
62+ }
63+
64+ opacity: visible ? 1 : 0
65+ visible: {
66+ switch (g.status) {
67+ case UpdateManager.StatusCheckingClickUpdates:
68+ case UpdateManager.StatusCheckingImageUpdates:
69+ case UpdateManager.StatusCheckingAllUpdates:
70+ return true;
71+ }
72+ return false;
73+ }
74+
75+ ActivityIndicator {
76+ running: parent.visible
77+ }
78+
79+ Label {
80+ objectName: "checkLabel"
81+ Layout.fillWidth: true
82+ elide: Text.ElideRight
83+ text: i18n.tr("Checking for updates…")
84+ }
85+
86+ Button {
87+ objectName: "updatesGlobalStopButton"
88+ text: i18n.tr("Stop")
89+ onClicked: g.stop()
90+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
91+ }
92+ }
93+
94+ RowLayout {
95+ id: install
96+ anchors {
97+ fill: parent
98+ margins: units.gu(2)
99+ }
100+ spacing: units.gu(2)
101+
102+ Behavior on opacity {
103+ UbuntuNumberAnimation {}
104+ }
105+
106+ opacity: visible ? 1 : 0
107+ visible: {
108+ var canInstall = g.status === UpdateManager.StatusIdle;
109+ return canInstall && updatesCount > 1;
110+ }
111+
112+ Label {
113+ objectName: "updatesGlobalInfoLabel"
114+ // // TRANSLATORS: %1 is number of software updates available.
115+ text: i18n.tr("%1 update available",
116+ "%1 updates available",
117+ updatesCount).arg(updatesCount)
118+ Layout.fillWidth: true
119+ }
120+
121+ Button {
122+ objectName: "updatesGlobalInstallButton"
123+ text: {
124+ if (g.requireRestart === true) {
125+ return i18n.tr("Update all…");
126+ } else {
127+ return i18n.tr("Update all");
128+ }
129+ }
130+ onClicked: g.requestInstall()
131+ color: theme.palette.normal.positive
132+ strokeColor: "transparent"
133+ }
134+ }
135+
136+ ListItems.ThinDivider {
137+ visible: !g.hidden
138+ anchors {
139+ left: parent.left
140+ right: parent.right
141+ bottom: parent.bottom
142+ }
143+ }
144+}
qml/Wizard/Pages/ClickUpdateDelegate.qmlnew file+26
@@ -0,0 +1,26 @@
1+/*
2+ * This file is part of system-settings
3+ *
4+ * Copyright (C) 2016 Canonical Ltd.
5+ *
6+ * This program is free software: you can redistribute it and/or modify it
7+ * under the terms of the GNU General Public License version 3, as published
8+ * by the Free Software Foundation.
9+ *
10+ * This program is distributed in the hope that it will be useful, but
11+ * WITHOUT ANY WARRANTY; without even the implied warranties of
12+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
13+ * PURPOSE. See the GNU General Public License for more details.
14+ *
15+ * You should have received a copy of the GNU General Public License along
16+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17+ */
18+
19+import QtQuick 2.4
20+import Ubuntu.SystemSettings.Update 1.0
21+
22+UpdateDelegate {
23+ id: update
24+
25+ property string signedUrl
26+}
qml/Wizard/Pages/UpdateDelegate.qmlnew file+372
@@ -0,0 +1,372 @@
1+/*
2+ * This file is part of system-settings
3+ *
4+ * Copyright (C) 2016 Canonical Ltd.
5+ *
6+ * Contact: Jonas G. Drange <jonas.drange@canonical.com>
7+ *
8+ * This program is free software: you can redistribute it and/or modify it
9+ * under the terms of the GNU General Public License version 3, as published
10+ * by the Free Software Foundation.
11+ *
12+ * This program is distributed in the hope that it will be useful, but
13+ * WITHOUT ANY WARRANTY; without even the implied warranties of
14+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
15+ * PURPOSE. See the GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License along
18+ * with this program. If not, see <http://www.gnu.org/licenses/>.
19+ *
20+ */
21+
22+import QtQuick 2.4
23+import QtQuick.Layouts 1.1
24+import Ubuntu.Components 1.3
25+import Ubuntu.Components.ListItems 1.3 as ListItems
26+import Ubuntu.Components.Themes 1.3
27+import Ubuntu.SystemSettings.Update 1.0
28+
29+ListItem {
30+ id: update
31+
32+ property int updateState // This is an Update::State
33+ property int kind // This is an Update::Kind
34+ property real size
35+ property string version
36+ property string downloadId
37+ property date updatedAt
38+ property bool launchable: false
39+
40+ property alias name: nameLabel.text
41+ property alias error: errorElementDetail.text
42+ property alias iconUrl: icon.source
43+ property alias progress: progressBar.value
44+
45+ signal retry()
46+ signal download()
47+ signal pause()
48+ signal resume()
49+ signal install()
50+ signal launch()
51+
52+ height: layout.height + (divider.visible ? divider.height : 0)
53+ Behavior on height {
54+ animation: UbuntuNumberAnimation {}
55+ }
56+
57+ SlotsLayout {
58+ id: layout
59+ mainSlot: ColumnLayout {
60+ spacing: units.gu(1)
61+ // Width the parent, minus the icon and some padding
62+ width: parent.width - (icon.width + (layout.padding.top * 3))
63+
64+ RowLayout {
65+ spacing: units.gu(2)
66+
67+ Label {
68+ id: nameLabel
69+ verticalAlignment: Text.AlignVCenter
70+ elide: Text.ElideMiddle
71+ Layout.fillWidth: true
72+ Layout.fillHeight: true
73+ }
74+
75+ Button {
76+ id: button
77+ objectName: "updateButton"
78+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
79+ visible: {
80+ switch (updateState) {
81+ case Update.StateInstalled:
82+ return launchable;
83+ default:
84+ return true;
85+ }
86+ }
87+ enabled: {
88+ switch(updateState) {
89+ case Update.StateAvailable:
90+ case Update.StateDownloading:
91+ case Update.StateDownloadingAutomatically:
92+ case Update.StateDownloadPaused:
93+ case Update.StateAutomaticDownloadPaused:
94+ case Update.StateInstallPaused:
95+ case Update.StateDownloaded:
96+ case Update.StateFailed:
97+ return true;
98+
99+ // Enabled if installed and a click app (can launch).
100+ case Update.StateInstalled:
101+ return kind === Update.KindClick;
102+
103+ case Update.StateInstalling:
104+ case Update.StateInstallingAutomatically:
105+ case Update.StateUnavailable:
106+ case Update.StateInstallFinished:
107+ case Update.StateQueuedForDownload:
108+ case Update.StateUnknown:
109+ default:
110+ return false;
111+ }
112+ }
113+ text: {
114+ switch(updateState) {
115+ case Update.StateUnknown:
116+ case Update.StateUnavailable:
117+ case Update.StateFailed:
118+ return i18n.tr("Retry");
119+
120+ case Update.StateAvailable:
121+ case Update.StateQueuedForDownload:
122+ if (update.kind === Update.KindClick) {
123+ return i18n.tr("Update");
124+ } else {
125+ return i18n.tr("Download");
126+ }
127+
128+ case Update.StateDownloadPaused:
129+ case Update.StateAutomaticDownloadPaused:
130+ case Update.StateInstallPaused:
131+ return i18n.tr("Resume");
132+
133+ case Update.StateDownloading:
134+ case Update.StateDownloadingAutomatically:
135+ case Update.StateInstalling:
136+ case Update.StateInstallingAutomatically:
137+ case Update.StateInstallFinished:
138+ return i18n.tr("Pause");
139+
140+ case Update.StateDownloaded:
141+ if (kind === Update.KindImage) {
142+ return i18n.tr("Install…");
143+ } else {
144+ return i18n.tr("Install");
145+ }
146+
147+ case Update.StateInstalled:
148+ return i18n.tr("Open");
149+
150+ default:
151+ console.error("Unknown update state", updateState);
152+ }
153+ }
154+
155+ onClicked: {
156+ switch (updateState) {
157+
158+ // Retries.
159+ case Update.StateUnknown:
160+ case Update.StateUnavailable:
161+ case Update.StateFailed:
162+ update.retry();
163+ break;
164+
165+ case Update.StateDownloadPaused:
166+ case Update.StateAutomaticDownloadPaused:
167+ case Update.StateInstallPaused:
168+ update.resume();
169+ break;
170+
171+ case Update.StateAvailable:
172+ if (kind === Update.KindClick) {
173+ update.install();
174+ } else {
175+ update.download();
176+ }
177+ break;
178+
179+ case Update.StateDownloaded:
180+ update.install();
181+ break;
182+
183+ case Update.StateDownloading:
184+ case Update.StateDownloadingAutomatically:
185+ case Update.StateInstalling:
186+ case Update.StateInstallingAutomatically:
187+ update.pause();
188+ break;
189+
190+ case Update.StateInstalled:
191+ update.launch();
192+ break;
193+ }
194+ }
195+ } // Button
196+ } // Name/button RowLayout
197+
198+ RowLayout {
199+ spacing: units.gu(2)
200+
201+ Label {
202+ id: downloadLabel
203+ objectName: "updateDownloadLabel"
204+
205+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
206+
207+ visible: text !== ""
208+
209+ fontSize: "small"
210+ text: {
211+ switch (updateState) {
212+
213+ case Update.StateInstalling:
214+ case Update.StateInstallingAutomatically:
215+ case Update.StateInstallPaused:
216+ return i18n.tr("Installing");
217+
218+ case Update.StateInstallPaused:
219+ case Update.StateDownloadPaused:
220+ return i18n.tr("Paused");
221+
222+ case Update.StateQueuedForDownload:
223+ return i18n.tr("Waiting to download");
224+
225+ case Update.StateDownloading:
226+ return i18n.tr("Downloading");
227+
228+ default:
229+ return "";
230+ }
231+ }
232+ }
233+
234+ Label {
235+ id: statusLabel
236+ objectName: "updateStatusLabel"
237+
238+ visible: text !== ""
239+ Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
240+ Layout.fillWidth: true
241+
242+ horizontalAlignment: Text.AlignRight
243+ fontSize: "small"
244+
245+ text: {
246+ switch (updateState) {
247+ case Update.StateAvailable:
248+ return Utilities.formatSize(size);
249+
250+ case Update.StateDownloading:
251+ case Update.StateDownloadingAutomatically:
252+ case Update.StateDownloadPaused:
253+ case Update.StateAutomaticDownloadPaused:
254+ var down = Utilities.formatSize((size / 100) * progress);
255+ var left = Utilities.formatSize(size);
256+ if (progress > 100) {
257+ return left;
258+ } else {
259+ /* TRANSLATORS: %1 is the human readable amount
260+ of bytes downloaded, and %2 is the total to be
261+ downloaded. */
262+ return i18n.tr("%1 of %2").arg(down).arg(left);
263+ }
264+
265+ case Update.StateDownloaded:
266+ return i18n.tr("Downloaded");
267+
268+ case Update.StateInstallFinished:
269+ return i18n.tr("Installed");
270+
271+ case Update.StateInstalled:
272+ /* TRANSLATORS: %1 is the date at which this
273+ update was applied. */
274+ return i18n.tr("Updated %1").arg(
275+ updatedAt.toLocaleDateString(Qt.locale(), "d MMMM")
276+ );
277+ default:
278+ return "";
279+ }
280+ }
281+
282+ /* Seems AlignRight causes a rendering issue that can be
283+ fixed by doing an explicit doLayout. */
284+ Component.onCompleted: doLayout()
285+ }
286+ }
287+
288+ Column {
289+ id: error
290+ objectName: "updateError"
291+ spacing: units.gu(1)
292+ height: childrenRect.height
293+ Layout.fillWidth: true
294+ visible: errorElementDetail.text
295+
296+ Label {
297+ id: errorElementTitle
298+ text: i18n.tr("Update failed")
299+ color: UbuntuColors.red
300+ }
301+
302+ Label {
303+ id: errorElementDetail
304+ anchors { left: parent.left; right: parent.right }
305+ fontSize: "small"
306+ wrapMode: Text.WrapAnywhere
307+ }
308+ } // Error column
309+
310+ ProgressBar {
311+ id: progressBar
312+ objectName: "updateProgressbar"
313+
314+ visible: {
315+ switch (updateState) {
316+ case Update.StateQueuedForDownload:
317+ case Update.StateDownloading:
318+ case Update.StateDownloadPaused:
319+ case Update.StateInstalling:
320+ case Update.StateInstallPaused:
321+ return true;
322+
323+ default:
324+ return false;
325+ }
326+ }
327+ Layout.maximumHeight: units.gu(0.5)
328+ Layout.fillWidth: true
329+ indeterminate: update.progress < 0 || update.progress > 100
330+ minimumValue: 0
331+ maximumValue: 100
332+ showProgressPercentage: false
333+
334+ Behavior on value {
335+ animation: UbuntuNumberAnimation {}
336+ }
337+ } // Progress bar
338+ } // Layout for the rest of the stuff
339+
340+ Item {
341+ SlotsLayout.position: SlotsLayout.Leading;
342+ width: units.gu(4)
343+ height: width
344+
345+ Image {
346+ id: icon
347+ visible: kind === Update.KindImage && !fallback.visible
348+ anchors.fill: parent
349+ asynchronous: true
350+ smooth: true
351+ mipmap: true
352+ }
353+
354+ UbuntuShape {
355+ id: shape
356+ visible: kind !== Update.KindImage && !fallback.visible
357+ anchors.fill: parent
358+ source: icon
359+ }
360+
361+ Image {
362+ id: fallback
363+ visible: icon.status === Image.Error
364+ source : Qt.resolvedUrl("/usr/share/icons/suru/apps/scalable/ubuntu-logo-symbolic.svg")
365+ anchors.fill: parent
366+ asynchronous: true
367+ smooth: true
368+ mipmap: true
369+ }
370+ }
371+ }
372+}
tests/plugins/CMakeLists.txt+1−1
@@ -8,5 +8,5 @@ add_subdirectory(LightDM)
8add_subdirectory(SessionBroadcast)
8add_subdirectory(SessionBroadcast)
9add_subdirectory(Ubuntu)
9add_subdirectory(Ubuntu)
10add_subdirectory(Unity)
10add_subdirectory(Unity)
11−#add_subdirectory(Utils) #FIXME broken with qt 5.9
11+add_subdirectory(Utils)
12add_subdirectory(Wizard)
12add_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,
107 QCoreApplication::sendEvent(m_view, &touchEvent);
107 QCoreApplication::sendEvent(m_view, &touchEvent);
108
108
109 QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(m_view);
109 QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(m_view);
110− windowPrivate->flushDelayedTouchEvent();
110+ windowPrivate->flushFrameSynchronousEvents();
111}
111}
112
112
113void GestureTest::passTime(qint64 timeSpanMs)
113void GestureTest::passTime(qint64 timeSpanMs)
tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+1−1
@@ -189,7 +189,7 @@ void tst_TouchGate::holdsEventsUntilGainsOwnership()
189 if (!ownershipAfterTouchEnd) {
189 if (!ownershipAfterTouchEnd) {
190 touchRegistry->removeCandidateOwnerForTouch(0, candidateItem);
190 touchRegistry->removeCandidateOwnerForTouch(0, candidateItem);
191 QQuickWindowPrivate *wp = QQuickWindowPrivate::get(testItem->window());
191 QQuickWindowPrivate *wp = QQuickWindowPrivate::get(testItem->window());
192− wp->flushDelayedTouchEvent();
192+ wp->flushFrameSynchronousEvents();
193 // TouchGate should now open its flood gates and let testItem get all
193 // TouchGate should now open its flood gates and let testItem get all
194 // events from touch 0 produced so far
194 // events from touch 0 produced so far
195 QCOMPARE(testItem->touchEventsReceived.count(), 2);
195 QCOMPARE(testItem->touchEventsReceived.count(), 2);
tests/plugins/Utils/ModelTest.cpp+1−1
@@ -441,7 +441,7 @@ void ModelTest::data()
441 QVariant textAlignmentVariant = model->data ( model->index ( 0, 0 ), Qt::TextAlignmentRole );
441 QVariant textAlignmentVariant = model->data ( model->index ( 0, 0 ), Qt::TextAlignmentRole );
442 if ( textAlignmentVariant.isValid() ) {
442 if ( textAlignmentVariant.isValid() ) {
443 int alignment = textAlignmentVariant.toInt();
443 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 ) ));
445 }
445 }
446
446
447 // General Purpose roles that should return a QColor
447 // General Purpose roles that should return a QColor
tests/qmltests/CMakeLists.txt+2−2
@@ -1,5 +1,5 @@
1
1
2−#add_subdirectory(Components) #FIXME broken with qt 5.9
2+add_subdirectory(Components)
3
3
4add_unity8_qmltest(. OrientedShell)
4add_unity8_qmltest(. OrientedShell)
5add_unity8_qmltest(. DisabledScreenNotice)
5add_unity8_qmltest(. DisabledScreenNotice)
@@ -44,7 +44,7 @@ add_unity8_qmltest(Dash/Previews PreviewIconActions)
44add_unity8_qmltest(Dash/Previews PreviewImageGallery)
44add_unity8_qmltest(Dash/Previews PreviewImageGallery)
45add_unity8_qmltest(Dash/Previews PreviewInlineVideo)
45add_unity8_qmltest(Dash/Previews PreviewInlineVideo)
46add_unity8_qmltest(Dash/Previews PreviewMediaToolbar)
46add_unity8_qmltest(Dash/Previews PreviewMediaToolbar)
47−add_unity8_qmltest(Dash/Previews PreviewPayments)
47+#add_unity8_qmltest(Dash/Previews PreviewPayments)
48add_unity8_qmltest(Dash/Previews PreviewProgress)
48add_unity8_qmltest(Dash/Previews PreviewProgress)
49add_unity8_qmltest(Dash/Previews PreviewRatingDisplay)
49add_unity8_qmltest(Dash/Previews PreviewRatingDisplay)
50add_unity8_qmltest(Dash/Previews PreviewRatingDisplayCreationRanges)
50add_unity8_qmltest(Dash/Previews PreviewRatingDisplayCreationRanges)
tests/qmltests/Components/tst_DragHandle.cpp+2−2
@@ -177,7 +177,7 @@ void tst_DragHandle::flickAndHold(QQuickItem *dragHandle,
177 QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
177 QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
178
178
179 QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(m_view);
179 QQuickWindowPrivate *windowPrivate = QQuickWindowPrivate::get(m_view);
180− windowPrivate->flushDelayedTouchEvent();
180+ windowPrivate->flushFrameSynchronousEvents();
181}
181}
182
182
183void tst_DragHandle::drag(QPointF &touchPoint, const QPointF& direction, qreal distance,
183void 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
192 m_fakeTimeSource->m_msecsSinceReference += timeStep;
192 m_fakeTimeSource->m_msecsSinceReference += timeStep;
193 QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
193 QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
194
194
195− windowPrivate->flushDelayedTouchEvent();
195+ windowPrivate->flushFrameSynchronousEvents();
196 }
196 }
197}
197}
198
198
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
26
26
27void TouchEventSequenceWrapper::commit(bool processEvents)
27void TouchEventSequenceWrapper::commit(bool processEvents)
28{
28{
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−
33 m_eventSequence.commit(processEvents);
29 m_eventSequence.commit(processEvents);
34−
35− if (window) {
36− QQuickWindowPrivate *wp = QQuickWindowPrivate::get(window);
37− wp->flushDelayedTouchEvent();
38− }
39}
30}
40
31
41void TouchEventSequenceWrapper::move(int touchId, int x, int y)
32void TouchEventSequenceWrapper::move(int touchId, int x, int y)