Merge lp:~aacid/unity8/makeSureMenuPositionOnScreen into lp:unity8
- makeSureMenuPositionOnScreen
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Michael Zanetti |
Approved revision: | 2776 |
Merged at revision: | 2811 |
Proposed branch: | lp:~aacid/unity8/makeSureMenuPositionOnScreen |
Merge into: | lp:unity8 |
Prerequisite: | lp:~aacid/unity8/clickOpenMenuClosesIt |
Diff against target: |
282 lines (+174/-17) 5 files modified
qml/ApplicationMenus/ApplicationMenusLimits.qml (+24/-0) qml/ApplicationMenus/MenuBar.qml (+2/-2) qml/ApplicationMenus/MenuPopup.qml (+47/-15) qml/ApplicationMenus/qmldir (+1/-0) tests/qmltests/Stage/tst_DesktopStage.qml (+100/-0) |
To merge this branch: | bzr merge lp:~aacid/unity8/makeSureMenuPositionOnScreen |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michael Zanetti (community) | Approve | ||
Unity8 CI Bot | continuous-integration | Approve | |
Review via email: mp+315655@code.launchpad.net |
This proposal supersedes a proposal from 2017-01-24.
Commit message
Make the menus and submenus do not go outside the screen when popping out
Description of the change
* Are there any related MPs required for this MP to build/function as expected?
No
* Did you perform an exploratory manual test run of your code change and any related functionality?
Yes
* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
N/A
* If you changed the UI, has there been a design review?
N/A
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2773
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
PASSED: Continuous integration, rev:2774
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
PASSED: Continuous integration, rev:2775
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2776
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
FAILURE: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:2776
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Michael Zanetti (mzanetti) wrote : | # |
code looks fine, it also works great in my testing.
Visually it allows getting in rather unpleasant situations like for example this: http://
should we report a bug for design for this? wdyt?
Albert Astals Cid (aacid) wrote : | # |
> code looks fine, it also works great in my testing.
>
> Visually it allows getting in rather unpleasant situations like for example
> this: http://
>
> should we report a bug for design for this? wdyt?
Yes, i agree we should open a bug for design about this. Will you or want me to?
Meanwhile if possible I'd like to get this landed as defenitely improves the situation.
Michael Zanetti (mzanetti) wrote : | # |
Reported the bug: https:/
apart from this, it works fine. code looks good
- 2777. By Albert Astals Cid
-
Merge
Preview Diff
1 | === added file 'qml/ApplicationMenus/ApplicationMenusLimits.qml' | |||
2 | --- qml/ApplicationMenus/ApplicationMenusLimits.qml 1970-01-01 00:00:00 +0000 | |||
3 | +++ qml/ApplicationMenus/ApplicationMenusLimits.qml 2017-02-07 15:45:21 +0000 | |||
4 | @@ -0,0 +1,24 @@ | |||
5 | 1 | /* | ||
6 | 2 | * Copyright (C) 2017 Canonical, Ltd. | ||
7 | 3 | * | ||
8 | 4 | * This program is free software; you can redistribute it and/or modify | ||
9 | 5 | * it under the terms of the GNU General Public License as published by | ||
10 | 6 | * the Free Software Foundation; version 3. | ||
11 | 7 | * | ||
12 | 8 | * This program is distributed in the hope that it will be useful, | ||
13 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | 11 | * GNU General Public License for more details. | ||
16 | 12 | * | ||
17 | 13 | * You should have received a copy of the GNU General Public License | ||
18 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
19 | 15 | */ | ||
20 | 16 | |||
21 | 17 | pragma Singleton | ||
22 | 18 | import QtQuick 2.4 | ||
23 | 19 | import QtQuick.Window 2.2 | ||
24 | 20 | |||
25 | 21 | QtObject { | ||
26 | 22 | property real screenWidth: Screen.width | ||
27 | 23 | property real screenHeight: Screen.height | ||
28 | 24 | } | ||
29 | 0 | 25 | ||
30 | === modified file 'qml/ApplicationMenus/MenuBar.qml' | |||
31 | --- qml/ApplicationMenus/MenuBar.qml 2017-02-07 15:45:21 +0000 | |||
32 | +++ qml/ApplicationMenus/MenuBar.qml 2017-02-07 15:45:21 +0000 | |||
33 | @@ -149,8 +149,8 @@ | |||
34 | 149 | Component { | 149 | Component { |
35 | 150 | id: menuComponent | 150 | id: menuComponent |
36 | 151 | MenuPopup { | 151 | MenuPopup { |
39 | 152 | x: visualItem.x - units.gu(1) | 152 | desiredX: visualItem.x - units.gu(1) |
40 | 153 | anchors.top: parent.bottom | 153 | desiredY: parent.height |
41 | 154 | unityMenuModel: root.unityMenuModel.submenu(visualItem.__ownIndex) | 154 | unityMenuModel: root.unityMenuModel.submenu(visualItem.__ownIndex) |
42 | 155 | 155 | ||
43 | 156 | Component.onCompleted: reset(); | 156 | Component.onCompleted: reset(); |
44 | 157 | 157 | ||
45 | === modified file 'qml/ApplicationMenus/MenuPopup.qml' | |||
46 | --- qml/ApplicationMenus/MenuPopup.qml 2017-02-07 15:45:21 +0000 | |||
47 | +++ qml/ApplicationMenus/MenuPopup.qml 2017-02-07 15:45:21 +0000 | |||
48 | @@ -16,10 +16,10 @@ | |||
49 | 16 | 16 | ||
50 | 17 | import QtQuick 2.4 | 17 | import QtQuick 2.4 |
51 | 18 | import QtQuick.Layouts 1.1 | 18 | import QtQuick.Layouts 1.1 |
52 | 19 | import QtQuick.Window 2.2 | ||
53 | 20 | import Ubuntu.Components 1.3 | 19 | import Ubuntu.Components 1.3 |
54 | 21 | import Ubuntu.Components.ListItems 1.3 as ListItems | 20 | import Ubuntu.Components.ListItems 1.3 as ListItems |
55 | 22 | import "../Components" | 21 | import "../Components" |
56 | 22 | import "." | ||
57 | 23 | 23 | ||
58 | 24 | UbuntuShape { | 24 | UbuntuShape { |
59 | 25 | id: root | 25 | id: root |
60 | @@ -28,6 +28,38 @@ | |||
61 | 28 | 28 | ||
62 | 29 | signal childActivated() | 29 | signal childActivated() |
63 | 30 | 30 | ||
64 | 31 | // true for submenus that need to show on the other side of their parent | ||
65 | 32 | // if they don't fit when growing right | ||
66 | 33 | property bool substractWidth: false | ||
67 | 34 | |||
68 | 35 | property real desiredX | ||
69 | 36 | x: { | ||
70 | 37 | var dummy = visible; // force recalc when shown/hidden | ||
71 | 38 | var parentTopLeft = parent.mapToItem(null, 0, 0); | ||
72 | 39 | var farX = ApplicationMenusLimits.screenWidth; | ||
73 | 40 | if (parentTopLeft.x + width + desiredX <= farX) { | ||
74 | 41 | return desiredX; | ||
75 | 42 | } else { | ||
76 | 43 | if (substractWidth) { | ||
77 | 44 | return -width; | ||
78 | 45 | } else { | ||
79 | 46 | return farX - parentTopLeft.x - width; | ||
80 | 47 | } | ||
81 | 48 | } | ||
82 | 49 | } | ||
83 | 50 | |||
84 | 51 | property real desiredY | ||
85 | 52 | y: { | ||
86 | 53 | var dummy = visible; // force recalc when shown/hidden | ||
87 | 54 | var parentTopLeft = parent.mapToItem(null, 0, 0); | ||
88 | 55 | var bottomY = ApplicationMenusLimits.screenHeight; | ||
89 | 56 | if (parentTopLeft.y + height + desiredY <= bottomY) { | ||
90 | 57 | return desiredY; | ||
91 | 58 | } else { | ||
92 | 59 | return bottomY - parentTopLeft.y - height; | ||
93 | 60 | } | ||
94 | 61 | } | ||
95 | 62 | |||
96 | 31 | property alias unityMenuModel: repeater.model | 63 | property alias unityMenuModel: repeater.model |
97 | 32 | 64 | ||
98 | 33 | function show() { | 65 | function show() { |
99 | @@ -66,9 +98,9 @@ | |||
100 | 66 | readonly property int currentIndex: currentItem ? currentItem.__ownIndex : -1 | 98 | readonly property int currentIndex: currentItem ? currentItem.__ownIndex : -1 |
101 | 67 | 99 | ||
102 | 68 | property real __minimumWidth: units.gu(20) | 100 | property real __minimumWidth: units.gu(20) |
104 | 69 | property real __maximumWidth: Screen.width * 0.7 | 101 | property real __maximumWidth: ApplicationMenusLimits.screenWidth * 0.7 |
105 | 70 | property real __minimumHeight: units.gu(2) | 102 | property real __minimumHeight: units.gu(2) |
107 | 71 | property real __maximumHeight: Screen.height * 0.7 | 103 | property real __maximumHeight: ApplicationMenusLimits.screenHeight * 0.7 |
108 | 72 | 104 | ||
109 | 73 | signal dismissAll() | 105 | signal dismissAll() |
110 | 74 | 106 | ||
111 | @@ -259,8 +291,9 @@ | |||
112 | 259 | popup = submenuComponent.createObject(focusScope, { | 291 | popup = submenuComponent.createObject(focusScope, { |
113 | 260 | objectName: loader.objectName + "-", | 292 | objectName: loader.objectName + "-", |
114 | 261 | unityMenuModel: model, | 293 | unityMenuModel: model, |
117 | 262 | x: Qt.binding(function() { return root.width }), | 294 | substractWidth: true, |
118 | 263 | y: Qt.binding(function() { | 295 | desiredX: Qt.binding(function() { return root.width }), |
119 | 296 | desiredY: Qt.binding(function() { | ||
120 | 264 | var dummy = listView.contentY; // force a recalc on contentY change. | 297 | var dummy = listView.contentY; // force a recalc on contentY change. |
121 | 265 | return mapToItem(container, 0, y).y; | 298 | return mapToItem(container, 0, y).y; |
122 | 266 | }) | 299 | }) |
123 | @@ -383,20 +416,19 @@ | |||
124 | 383 | id: submenuLoader | 416 | id: submenuLoader |
125 | 384 | source: "MenuPopup.qml" | 417 | source: "MenuPopup.qml" |
126 | 385 | 418 | ||
127 | 419 | property real desiredX | ||
128 | 420 | property real desiredY | ||
129 | 421 | property bool substractWidth | ||
130 | 386 | property var unityMenuModel: null | 422 | property var unityMenuModel: null |
131 | 387 | signal retreat() | 423 | signal retreat() |
132 | 388 | signal childActivated() | 424 | signal childActivated() |
133 | 389 | 425 | ||
144 | 390 | Binding { | 426 | onLoaded: { |
145 | 391 | target: item | 427 | item.unityMenuModel = Qt.binding(function() { return submenuLoader.unityMenuModel; }); |
146 | 392 | property: "unityMenuModel" | 428 | item.objectName = Qt.binding(function() { return submenuLoader.objectName + "menu"; }); |
147 | 393 | value: submenuLoader.unityMenuModel | 429 | item.desiredX = Qt.binding(function() { return submenuLoader.desiredX; }); |
148 | 394 | } | 430 | item.desiredY = Qt.binding(function() { return submenuLoader.desiredY; }); |
149 | 395 | 431 | item.substractWidth = Qt.binding(function() { return submenuLoader.substractWidth; }); | |
140 | 396 | Binding { | ||
141 | 397 | target: item | ||
142 | 398 | property: "objectName" | ||
143 | 399 | value: submenuLoader.objectName + "menu" | ||
150 | 400 | } | 432 | } |
151 | 401 | 433 | ||
152 | 402 | Keys.onLeftPressed: retreat() | 434 | Keys.onLeftPressed: retreat() |
153 | 403 | 435 | ||
154 | === added file 'qml/ApplicationMenus/qmldir' | |||
155 | --- qml/ApplicationMenus/qmldir 1970-01-01 00:00:00 +0000 | |||
156 | +++ qml/ApplicationMenus/qmldir 2017-02-07 15:45:21 +0000 | |||
157 | @@ -0,0 +1,1 @@ | |||
158 | 1 | singleton ApplicationMenusLimits 0.1 ApplicationMenusLimits.qml | ||
159 | 0 | 2 | ||
160 | === modified file 'tests/qmltests/Stage/tst_DesktopStage.qml' | |||
161 | --- tests/qmltests/Stage/tst_DesktopStage.qml 2017-01-10 14:44:29 +0000 | |||
162 | +++ tests/qmltests/Stage/tst_DesktopStage.qml 2017-02-07 15:45:21 +0000 | |||
163 | @@ -29,6 +29,7 @@ | |||
164 | 29 | import "../../../qml/Stage" | 29 | import "../../../qml/Stage" |
165 | 30 | import "../../../qml/Components" | 30 | import "../../../qml/Components" |
166 | 31 | import "../../../qml/Components/PanelState" | 31 | import "../../../qml/Components/PanelState" |
167 | 32 | import "../../../qml/ApplicationMenus" | ||
168 | 32 | 33 | ||
169 | 33 | Item { | 34 | Item { |
170 | 34 | id: root | 35 | id: root |
171 | @@ -44,6 +45,8 @@ | |||
172 | 44 | } | 45 | } |
173 | 45 | 46 | ||
174 | 46 | Component.onCompleted: { | 47 | Component.onCompleted: { |
175 | 48 | ApplicationMenusLimits.screenWidth = Qt.binding( function() { return stageLoader.width; } ); | ||
176 | 49 | ApplicationMenusLimits.screenHeight = Qt.binding( function() { return stageLoader.height; } ); | ||
177 | 47 | QuickUtils.keyboardAttached = true; | 50 | QuickUtils.keyboardAttached = true; |
178 | 48 | theme.name = "Ubuntu.Components.Themes.SuruDark"; | 51 | theme.name = "Ubuntu.Components.Themes.SuruDark"; |
179 | 49 | resetGeometry(); | 52 | resetGeometry(); |
180 | @@ -830,5 +833,102 @@ | |||
181 | 830 | mouseRelease(decoration); | 833 | mouseRelease(decoration); |
182 | 831 | tryCompare(Mir, "cursorName", ""); | 834 | tryCompare(Mir, "cursorName", ""); |
183 | 832 | } | 835 | } |
184 | 836 | |||
185 | 837 | function test_menuPositioning_data() { | ||
186 | 838 | return [ | ||
187 | 839 | {tag: "good", | ||
188 | 840 | windowPosition: Qt.point(units.gu(10), units.gu(10)) | ||
189 | 841 | }, | ||
190 | 842 | {tag: "collides right", | ||
191 | 843 | windowPosition: Qt.point(units.gu(100), units.gu(10)), | ||
192 | 844 | minimumXDifference: units.gu(8) | ||
193 | 845 | }, | ||
194 | 846 | {tag: "collides bottom", | ||
195 | 847 | windowPosition: Qt.point(units.gu(10), units.gu(80)), | ||
196 | 848 | minimumYDifference: units.gu(7) | ||
197 | 849 | }, | ||
198 | 850 | ] | ||
199 | 851 | } | ||
200 | 852 | |||
201 | 853 | function test_menuPositioning(data) { | ||
202 | 854 | var appDelegate = startApplication("dialer-app"); | ||
203 | 855 | appDelegate.windowedX = data.windowPosition.x; | ||
204 | 856 | appDelegate.windowedY = data.windowPosition.y; | ||
205 | 857 | |||
206 | 858 | var menuItem = findChild(appDelegate, "menuBar-item3"); | ||
207 | 859 | menuItem.show(); | ||
208 | 860 | |||
209 | 861 | var menu = findChild(appDelegate, "menuBar-item3-menu"); | ||
210 | 862 | tryCompare(menu, "visible", true); | ||
211 | 863 | |||
212 | 864 | var normalPositioningX = menuItem.x - units.gu(1); | ||
213 | 865 | var normalPositioningY = menuItem.height; | ||
214 | 866 | |||
215 | 867 | // We do this fuzzy checking because otherwise we would be duplicating the code | ||
216 | 868 | // that calculates the coordinates and any bug it may have, what we want is really | ||
217 | 869 | // to check that on collision with the border the menu is shifted substantially | ||
218 | 870 | if (data.minimumXDifference) { | ||
219 | 871 | verify(menu.x < normalPositioningX - data.minimumXDifference); | ||
220 | 872 | } else { | ||
221 | 873 | compare(menu.x, normalPositioningX); | ||
222 | 874 | } | ||
223 | 875 | |||
224 | 876 | if (data.minimumYDifference) { | ||
225 | 877 | verify(menu.y < normalPositioningY - data.minimumYDifference); | ||
226 | 878 | } else { | ||
227 | 879 | compare(menu.y, normalPositioningY); | ||
228 | 880 | } | ||
229 | 881 | } | ||
230 | 882 | |||
231 | 883 | function test_submenuPositioning_data() { | ||
232 | 884 | return [ | ||
233 | 885 | {tag: "good", | ||
234 | 886 | windowPosition: Qt.point(units.gu(10), units.gu(10)) | ||
235 | 887 | }, | ||
236 | 888 | {tag: "collides right", | ||
237 | 889 | windowPosition: Qt.point(units.gu(100), units.gu(10)), | ||
238 | 890 | minimumXDifference: units.gu(35) | ||
239 | 891 | }, | ||
240 | 892 | {tag: "collides bottom", | ||
241 | 893 | windowPosition: Qt.point(units.gu(10), units.gu(80)), | ||
242 | 894 | minimumYDifference: units.gu(8) | ||
243 | 895 | }, | ||
244 | 896 | ] | ||
245 | 897 | } | ||
246 | 898 | |||
247 | 899 | function test_submenuPositioning(data) { | ||
248 | 900 | var appDelegate = startApplication("dialer-app"); | ||
249 | 901 | appDelegate.windowedX = data.windowPosition.x; | ||
250 | 902 | appDelegate.windowedY = data.windowPosition.y; | ||
251 | 903 | |||
252 | 904 | var menuItem = findChild(appDelegate, "menuBar-item3"); | ||
253 | 905 | menuItem.show(); | ||
254 | 906 | |||
255 | 907 | var menu = findChild(appDelegate, "menuBar-item3-menu"); | ||
256 | 908 | menuItem = findChild(menu, "menuBar-item3-menu-item3-actionItem"); | ||
257 | 909 | tryCompare(menuItem, "visible", true); | ||
258 | 910 | mouseMove(menuItem); | ||
259 | 911 | mouseClick(menuItem); | ||
260 | 912 | |||
261 | 913 | menu = findChild(appDelegate, "menuBar-item3-menu-item3-menu"); | ||
262 | 914 | |||
263 | 915 | var normalPositioningX = menuItem.width; | ||
264 | 916 | var normalPositioningY = menuItem.parent.y; | ||
265 | 917 | |||
266 | 918 | // We do this fuzzy checking because otherwise we would be duplicating the code | ||
267 | 919 | // that calculates the coordinates and any bug it may have, what we want is really | ||
268 | 920 | // to check that on collision with the border the menu is shifted substantially | ||
269 | 921 | if (data.minimumXDifference) { | ||
270 | 922 | verify(menu.x < normalPositioningX - data.minimumXDifference); | ||
271 | 923 | } else { | ||
272 | 924 | compare(menu.x, normalPositioningX); | ||
273 | 925 | } | ||
274 | 926 | |||
275 | 927 | if (data.minimumYDifference) { | ||
276 | 928 | verify(menu.y < normalPositioningY - data.minimumYDifference); | ||
277 | 929 | } else { | ||
278 | 930 | compare(menu.y, normalPositioningY); | ||
279 | 931 | } | ||
280 | 932 | } | ||
281 | 833 | } | 933 | } |
282 | 834 | } | 934 | } |
FAILED: Continuous integration, rev:2772 /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/3011/ /unity8- jenkins. ubuntu. com/job/ build/3916 /unity8- jenkins. ubuntu. com/job/ test-0- autopkgtest/ label=amd64, release= xenial+ overlay, testname= qmluitests. sh/2294 /unity8- jenkins. ubuntu. com/job/ test-0- autopkgtest/ label=amd64, release= zesty,testname= qmluitests. sh/2294 /unity8- jenkins. ubuntu. com/job/ build-0- fetch/3944 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= xenial+ overlay/ 3789 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= xenial+ overlay/ 3789/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= zesty/3789 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= zesty/3789/ artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= xenial+ overlay/ 3789 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= xenial+ overlay/ 3789/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= zesty/3789 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= zesty/3789/ artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= xenial+ overlay/ 3789 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= xenial+ overlay/ 3789/artifact/ output/ *zip*/output. zip /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= zesty/3789 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= zesty/3789/ artifact/ output/ *zip*/output. zip
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild: /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/3011/ rebuild
https:/