on xenial help sign in
Go for a simpler fix than making greeter load async
60930ecMichael Terry
qml/Greeter/Greeter.qml+3−17
@@ -23,6 +23,7 @@ import "../Components"
23Showable {
23Showable {
24 id: greeter
24 id: greeter
25 enabled: shown
25 enabled: shown
26+ created: greeterContentLoader.status == Loader.Ready && greeterContentLoader.item.ready
26
27
27 property url background
28 property url background
28 property bool loadContent: required
29 property bool loadContent: required
@@ -57,13 +58,13 @@ Showable {
57 }
58 }
58
59
59 function tryToUnlock() {
60 function tryToUnlock() {
60− if (greeterContentLoader.item) {
61+ if (created) {
61 greeterContentLoader.item.tryToUnlock()
62 greeterContentLoader.item.tryToUnlock()
62 }
63 }
63 }
64 }
64
65
65 function reset() {
66 function reset() {
66− if (greeterContentLoader.item) {
67+ if (created) {
67 greeterContentLoader.item.reset()
68 greeterContentLoader.item.reset()
68 }
69 }
69 }
70 }
@@ -134,12 +135,6 @@ Showable {
134 enabled: targetItem.enabled
135 enabled: targetItem.enabled
135 }
136 }
136
137
137− Rectangle {
138− // While greeterContent is loading, and in case it's background fails to load
139− anchors.fill: parent
140− color: "black"
141− }
142−
143 Loader {
138 Loader {
144 id: greeterContentLoader
139 id: greeterContentLoader
145 objectName: "greeterContentLoader"
140 objectName: "greeterContentLoader"
@@ -147,20 +142,11 @@ Showable {
147 property var model: LightDM.Users
142 property var model: LightDM.Users
148 property int currentIndex: 0
143 property int currentIndex: 0
149 readonly property int backgroundTopMargin: -greeter.y
144 readonly property int backgroundTopMargin: -greeter.y
150− property bool everLoaded: false
151−
152− // We only want to be async after the first one, because during boot,
153− // if we load async, the panel will appear a bit before the greeter
154− // does. We'd rather everything appear at once. But other times,
155− // we don't want to block handling power button presses on loading the
156− // greeter.
157− asynchronous: everLoaded
158
145
159 source: loadContent ? "GreeterContent.qml" : ""
146 source: loadContent ? "GreeterContent.qml" : ""
160
147
161 onLoaded: {
148 onLoaded: {
162 greeterContentLoader.item.selected(currentIndex);
149 greeterContentLoader.item.selected(currentIndex);
163− everLoaded = true;
164 }
150 }
165
151
166 Connections {
152 Connections {
qml/Greeter/GreeterContent.qml+15−10
@@ -41,6 +41,13 @@ Item {
41 }
41 }
42 }
42 }
43
43
44+ Rectangle {
45+ // In case background fails to load
46+ id: backgroundBackup
47+ anchors.fill: parent
48+ color: "black"
49+ }
50+
44 CrossFadeImage {
51 CrossFadeImage {
45 id: background
52 id: background
46 objectName: "greeterBackground"
53 objectName: "greeterBackground"
@@ -109,23 +116,21 @@ Item {
109 id: infographics
116 id: infographics
110 objectName: "infographics"
117 objectName: "infographics"
111 height: narrowMode ? parent.height : 0.75 * parent.height
118 height: narrowMode ? parent.height : 0.75 * parent.height
112− model: LightDM.Infographic
119+ model: greeterContentLoader.infographicModel
113− visible: LightDM.Infographic.label !== ""
114
120
115 property string selectedUser
121 property string selectedUser
122+ property string infographicUser: AccountsService.statsWelcomeScreen ? selectedUser : ""
123+ onInfographicUserChanged: greeterContentLoader.infographicModel.username = infographicUser
116
124
117− Binding {
125+ Component.onCompleted {
118− target: LightDM.Infographic
126+ selectedUser = greeterContentLoader.model.data(greeterContentLoader.currentIndex, LightDM.UserRoles.NameRole)
119− property: "username"
127+ greeterContentLoader.infographicModel.username = infographicUser
120− value: AccountsService.statsWelcomeScreen ? infographics.selectedUser : ""
128+ greeterContentLoader.infographicModel.readyForDataChange()
121 }
129 }
122
130
123 Connections {
131 Connections {
124 target: root
132 target: root
125− onSelected: {
126− infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole);
133+ onSelected: infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
127− LightDM.Infographic.readyForDataChange();
128− }
129 }
134 }
130
135
131 Connections {
136 Connections {
qml/Greeter/Infographics.qml+2
@@ -72,6 +72,8 @@ Item {
72 notification.hideAnim.start()
72 notification.hideAnim.start()
73 }
73 }
74
74
75+ visible: model.label !== ""
76+
75 Component.onCompleted: startShowAnimation()
77 Component.onCompleted: startShowAnimation()
76
78
77 Item {
79 Item {
qml/Shell.qml+20−1
@@ -580,6 +580,15 @@ Item {
580 enabled = true;
580 enabled = true;
581 }
581 }
582
582
583+ Timer {
584+ // See powerConnection for why this is useful
585+ id: showGreeterDelayed
586+ interval: 1
587+ onTriggered: {
588+ greeter.showNow();
589+ }
590+ }
591+
583 onShownChanged: {
592 onShownChanged: {
584 if (shown) {
593 if (shown) {
585 // Disable everything so that user can't swipe greeter or
594 // Disable everything so that user can't swipe greeter or
@@ -645,7 +654,17 @@ Item {
645 onStatusChanged: {
654 onStatusChanged: {
646 if (Powerd.status === Powerd.Off && reason !== Powerd.Proximity &&
655 if (Powerd.status === Powerd.Off && reason !== Powerd.Proximity &&
647 !callManager.hasCalls && !edgeDemo.running) {
656 !callManager.hasCalls && !edgeDemo.running) {
648− greeter.showNow()
657+ // We don't want to simply call greeter.showNow() here, because
658+ // that will take too long (especially if the wallpaper image
659+ // is large). Qt will delay button event handling until the
660+ // greeter is done loading and may think the user held down the
661+ // power button the whole time, leading to a power dialog being
662+ // shown. Instead, delay showing the greeter until we've
663+ // finished handling the event. We could make the greeter load
664+ // asynchronously instead, but that introduces a whole host of
665+ // timing issues, especially with its animations. So this is
666+ // simpler.
667+ showGreeterDelayed.start();
649 }
668 }
650 }
669 }
651 }
670 }