on xenial help sign in
Go for a simpler fix than making greeter load async
commit60930ec502bb80e8ffc873c06f14999d0bde2f1f authorMichael Terry <michael.terry@canonical.com> dateThu 11 Dec 2014, 12:19 (12 years ago) parent6020150
4 files changed+40−28
qml/Greeter/Greeter.qml+3−17 qml/Greeter/GreeterContent.qml+15−10 qml/Greeter/Infographics.qml+2 qml/Shell.qml+20−1
qml/Greeter/Greeter.qml+3−17
@@ -23,6 +23,7 @@ import "../Components"
2323Showable {
2424 id: greeter
2525 enabled: shown
26+ created: greeterContentLoader.status == Loader.Ready && greeterContentLoader.item.ready
2627
2728 property url background
2829 property bool loadContent: required
@@ -57,13 +58,13 @@ Showable {
5758 }
5859
5960 function tryToUnlock() {
60− if (greeterContentLoader.item) {
61+ if (created) {
6162 greeterContentLoader.item.tryToUnlock()
6263 }
6364 }
6465
6566 function reset() {
66− if (greeterContentLoader.item) {
67+ if (created) {
6768 greeterContentLoader.item.reset()
6869 }
6970 }
@@ -134,12 +135,6 @@ Showable {
134135 enabled: targetItem.enabled
135136 }
136137
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−
143138 Loader {
144139 id: greeterContentLoader
145140 objectName: "greeterContentLoader"
@@ -147,20 +142,11 @@ Showable {
147142 property var model: LightDM.Users
148143 property int currentIndex: 0
149144 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
158145
159146 source: loadContent ? "GreeterContent.qml" : ""
160147
161148 onLoaded: {
162149 greeterContentLoader.item.selected(currentIndex);
163− everLoaded = true;
164150 }
165151
166152 Connections {
qml/Greeter/GreeterContent.qml+15−10
@@ -41,6 +41,13 @@ Item {
4141 }
4242 }
4343
44+ Rectangle {
45+ // In case background fails to load
46+ id: backgroundBackup
47+ anchors.fill: parent
48+ color: "black"
49+ }
50+
4451 CrossFadeImage {
4552 id: background
4653 objectName: "greeterBackground"
@@ -109,23 +116,21 @@ Item {
109116 id: infographics
110117 objectName: "infographics"
111118 height: narrowMode ? parent.height : 0.75 * parent.height
112− model: LightDM.Infographic
113− visible: LightDM.Infographic.label !== ""
119+ model: greeterContentLoader.infographicModel
114120
115121 property string selectedUser
122+ property string infographicUser: AccountsService.statsWelcomeScreen ? selectedUser : ""
123+ onInfographicUserChanged: greeterContentLoader.infographicModel.username = infographicUser
116124
117− Binding {
118− target: LightDM.Infographic
119− property: "username"
120− value: AccountsService.statsWelcomeScreen ? infographics.selectedUser : ""
125+ Component.onCompleted {
126+ selectedUser = greeterContentLoader.model.data(greeterContentLoader.currentIndex, LightDM.UserRoles.NameRole)
127+ greeterContentLoader.infographicModel.username = infographicUser
128+ greeterContentLoader.infographicModel.readyForDataChange()
121129 }
122130
123131 Connections {
124132 target: root
125− onSelected: {
126− infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole);
127− LightDM.Infographic.readyForDataChange();
128− }
133+ onSelected: infographics.selectedUser = greeterContentLoader.model.data(uid, LightDM.UserRoles.NameRole)
129134 }
130135
131136 Connections {
qml/Greeter/Infographics.qml+2
@@ -72,6 +72,8 @@ Item {
7272 notification.hideAnim.start()
7373 }
7474
75+ visible: model.label !== ""
76+
7577 Component.onCompleted: startShowAnimation()
7678
7779 Item {
qml/Shell.qml+20−1
@@ -580,6 +580,15 @@ Item {
580580 enabled = true;
581581 }
582582
583+ Timer {
584+ // See powerConnection for why this is useful
585+ id: showGreeterDelayed
586+ interval: 1
587+ onTriggered: {
588+ greeter.showNow();
589+ }
590+ }
591+
583592 onShownChanged: {
584593 if (shown) {
585594 // Disable everything so that user can't swipe greeter or
@@ -645,7 +654,17 @@ Item {
645654 onStatusChanged: {
646655 if (Powerd.status === Powerd.Off && reason !== Powerd.Proximity &&
647656 !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();
649668 }
650669 }
651670 }