on xenial help sign in
performance improvements

* Prevent processing of built-in AccountsService properties if we know it's not a built-in that changed * don't reload the launcher settings after we just set them ourselves Fixes: #1425087, #1430233 Approved by: Michael Terry

commit1dee16b17771f91aded8cb31d0283e86d4e03ce8 authorMichael Zanetti <michael.zanetti@canonical.com> dateWed 18 Mar 2015, 10:17 (12 years ago) parente4df71e328b4b3
5 files changed+23−4
plugins/AccountsService/AccountsService.cpp+1−1 plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+11−2 plugins/AccountsService/AccountsServiceDBusAdaptor.h+2 plugins/Unity/Launcher/gsettings.cpp+8−1 plugins/Unity/Launcher/gsettings.h+1
plugins/AccountsService/AccountsService.cpp+1−1
@@ -152,7 +152,7 @@ void AccountsService::updateEnableIndicatorsWhileLocked()
152152
153153void AccountsService::updateBackgroundFile()
154154{
155− auto backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
155+ QString backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
156156 if (m_backgroundFile != backgroundFile) {
157157 m_backgroundFile = backgroundFile;
158158 Q_EMIT backgroundFileChanged();
plugins/AccountsService/AccountsServiceDBusAdaptor.cpp+11−2
@@ -25,7 +25,8 @@
2525AccountsServiceDBusAdaptor::AccountsServiceDBusAdaptor(QObject* parent)
2626 : QObject(parent),
2727 m_accountsManager(nullptr),
28− m_users()
28+ m_users(),
29+ m_ignoreNextChanged(false)
2930{
3031 QDBusConnection connection = QDBusConnection::SM_BUSNAME();
3132 QDBusConnectionInterface *interface = connection.interface();
@@ -75,11 +76,19 @@ void AccountsServiceDBusAdaptor::propertiesChangedSlot(const QString &interface,
7576 combined.removeDuplicates();
7677
7778 Q_EMIT propertiesChanged(getUserForPath(message().path()), interface, combined);
79+
80+ // In case a non-builtin property changes, we're getting propertiesChanged *and* changed
81+ // As the generic changed requires asking back over DBus, it's quite slow to process.
82+ // We don't want to trigger that when we know it's not a built-in property change.
83+ m_ignoreNextChanged = true;
7884}
7985
8086void AccountsServiceDBusAdaptor::maybeChangedSlot()
8187{
82− Q_EMIT maybeChanged(getUserForPath(message().path()));
88+ if (!m_ignoreNextChanged) {
89+ Q_EMIT maybeChanged(getUserForPath(message().path()));
90+ }
91+ m_ignoreNextChanged = false;
8392}
8493
8594QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path)
plugins/AccountsService/AccountsServiceDBusAdaptor.h+2
@@ -61,6 +61,8 @@ private:
6161
6262 QDBusInterface *m_accountsManager;
6363 QMap<QString, QDBusInterface *> m_users;
64+
65+ bool m_ignoreNextChanged;
6466};
6567
6668#endif
plugins/Unity/Launcher/gsettings.cpp+8−1
@@ -59,12 +59,19 @@ void GSettings::setStoredApplications(const QStringList &storedApplications)
5959 Q_FOREACH(const QString &entry, storedApplications) {
6060 gSettingsList << QString("appid://%1").arg(entry);
6161 }
62+ // GSettings will emit a changed signal to ourselves. Let's cache the items
63+ // and only forward the changed signal when the list did actually change.
64+ m_cachedItems = gSettingsList;
6265 m_gSettings->set("items", gSettingsList);
6366}
6467
6568void GSettings::onSettingsChanged(const QString &key)
6669{
6770 if (key == "items") {
68− Q_EMIT changed();
71+ QStringList cachedItems = m_gSettings->get("items").toStringList();
72+ if (m_cachedItems != cachedItems) {
73+ m_cachedItems = cachedItems;
74+ Q_EMIT changed();
75+ }
6976 }
7077}
plugins/Unity/Launcher/gsettings.h+1
@@ -41,6 +41,7 @@ private Q_SLOTS:
4141
4242private:
4343 QGSettings *m_gSettings;
44+ QStringList m_cachedItems;
4445};
4546
4647#endif