From c07f87e35062e39e9d4b3b978362dbf94dd36fbb Mon Sep 17 00:00:00 2001 From: Renato Araujo Oliveira Filho Date: Tue, 9 Oct 2012 15:44:25 -0300 Subject: Fixed crash during model destruction in QML. --- libqmenumodel/src/qdbusmenumodel.cpp | 4 ++-- libqmenumodel/src/qmenumodel.cpp | 14 +++++++++----- libqmenumodel/src/qmenumodel.h | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) (limited to 'libqmenumodel/src') diff --git a/libqmenumodel/src/qdbusmenumodel.cpp b/libqmenumodel/src/qdbusmenumodel.cpp index ae88c35..6d4746c 100644 --- a/libqmenumodel/src/qdbusmenumodel.cpp +++ b/libqmenumodel/src/qdbusmenumodel.cpp @@ -85,7 +85,7 @@ void QDBusMenuModel::stop() /*! \internal */ void QDBusMenuModel::serviceVanish(GDBusConnection *) { - setMenuModel(NULL); + setMenuModel(NULL, true); } /*! \internal */ @@ -94,7 +94,7 @@ void QDBusMenuModel::serviceAppear(GDBusConnection *connection) GMenuModel *model = reinterpret_cast(g_dbus_menu_model_get(connection, busName().toLatin1(), objectPath().toLatin1())); - setMenuModel(model); + setMenuModel(model, true); if (model == NULL) { stop(); } diff --git a/libqmenumodel/src/qmenumodel.cpp b/libqmenumodel/src/qmenumodel.cpp index 4c0fc23..cac2f1a 100644 --- a/libqmenumodel/src/qmenumodel.cpp +++ b/libqmenumodel/src/qmenumodel.cpp @@ -46,23 +46,25 @@ QMenuModel::QMenuModel(GMenuModel *other, QObject *parent) rolesNames[Extra] = "extra"; } setRoleNames(rolesNames); - setMenuModel(other); + setMenuModel(other, true); } /*! \internal */ QMenuModel::~QMenuModel() { - setMenuModel(NULL); + setMenuModel(NULL, false); } /*! \internal */ -void QMenuModel::setMenuModel(GMenuModel *other) +void QMenuModel::setMenuModel(GMenuModel *other, bool notify) { if (m_menuModel == other) { return; } - beginResetModel(); + if (notify) { + beginResetModel(); + } if (m_menuModel) { g_signal_handler_disconnect(m_menuModel, m_signalChangedId); @@ -81,7 +83,9 @@ void QMenuModel::setMenuModel(GMenuModel *other) this); } - endResetModel(); + if (notify) { + endResetModel(); + } } /*! \internal */ diff --git a/libqmenumodel/src/qmenumodel.h b/libqmenumodel/src/qmenumodel.h index 7520480..e482e9b 100644 --- a/libqmenumodel/src/qmenumodel.h +++ b/libqmenumodel/src/qmenumodel.h @@ -48,7 +48,7 @@ public: protected: QMenuModel(GMenuModel *other=0, QObject *parent=0); - void setMenuModel(GMenuModel *model); + void setMenuModel(GMenuModel *model, bool notify); GMenuModel *menuModel() const; private: -- cgit v1.2.3 From 1e659aed9b6882dbe05d812363715c8e0583fc9a Mon Sep 17 00:00:00 2001 From: Renato Araujo Oliveira Filho Date: Wed, 10 Oct 2012 09:47:23 -0300 Subject: Created a new private function "clearModel" instead of change signature of "setModel" function. --- libqmenumodel/src/qdbusmenumodel.cpp | 4 ++-- libqmenumodel/src/qmenumodel.cpp | 31 +++++++++++++++++-------------- libqmenumodel/src/qmenumodel.h | 3 ++- 3 files changed, 21 insertions(+), 17 deletions(-) (limited to 'libqmenumodel/src') diff --git a/libqmenumodel/src/qdbusmenumodel.cpp b/libqmenumodel/src/qdbusmenumodel.cpp index 6d4746c..ae88c35 100644 --- a/libqmenumodel/src/qdbusmenumodel.cpp +++ b/libqmenumodel/src/qdbusmenumodel.cpp @@ -85,7 +85,7 @@ void QDBusMenuModel::stop() /*! \internal */ void QDBusMenuModel::serviceVanish(GDBusConnection *) { - setMenuModel(NULL, true); + setMenuModel(NULL); } /*! \internal */ @@ -94,7 +94,7 @@ void QDBusMenuModel::serviceAppear(GDBusConnection *connection) GMenuModel *model = reinterpret_cast(g_dbus_menu_model_get(connection, busName().toLatin1(), objectPath().toLatin1())); - setMenuModel(model, true); + setMenuModel(model); if (model == NULL) { stop(); } diff --git a/libqmenumodel/src/qmenumodel.cpp b/libqmenumodel/src/qmenumodel.cpp index cac2f1a..0fedd62 100644 --- a/libqmenumodel/src/qmenumodel.cpp +++ b/libqmenumodel/src/qmenumodel.cpp @@ -46,31 +46,25 @@ QMenuModel::QMenuModel(GMenuModel *other, QObject *parent) rolesNames[Extra] = "extra"; } setRoleNames(rolesNames); - setMenuModel(other, true); + setMenuModel(other); } /*! \internal */ QMenuModel::~QMenuModel() { - setMenuModel(NULL, false); + clearModel(); } /*! \internal */ -void QMenuModel::setMenuModel(GMenuModel *other, bool notify) +void QMenuModel::setMenuModel(GMenuModel *other) { if (m_menuModel == other) { return; } - if (notify) { - beginResetModel(); - } + beginResetModel(); - if (m_menuModel) { - g_signal_handler_disconnect(m_menuModel, m_signalChangedId); - m_signalChangedId = 0; - g_object_unref(m_menuModel); - } + clearModel(); m_menuModel = other; @@ -83,9 +77,7 @@ void QMenuModel::setMenuModel(GMenuModel *other, bool notify) this); } - if (notify) { - endResetModel(); - } + endResetModel(); } /*! \internal */ @@ -94,6 +86,17 @@ GMenuModel *QMenuModel::menuModel() const return m_menuModel; } +/*! \internal */ +void QMenuModel::clearModel() +{ + if (m_menuModel) { + g_signal_handler_disconnect(m_menuModel, m_signalChangedId); + m_signalChangedId = 0; + g_object_unref(m_menuModel); + m_menuModel = NULL; + } +} + /*! \internal */ QVariant QMenuModel::data(const QModelIndex &index, int role) const { diff --git a/libqmenumodel/src/qmenumodel.h b/libqmenumodel/src/qmenumodel.h index e482e9b..5f17dd6 100644 --- a/libqmenumodel/src/qmenumodel.h +++ b/libqmenumodel/src/qmenumodel.h @@ -48,7 +48,7 @@ public: protected: QMenuModel(GMenuModel *other=0, QObject *parent=0); - void setMenuModel(GMenuModel *model, bool notify); + void setMenuModel(GMenuModel *model); GMenuModel *menuModel() const; private: @@ -59,6 +59,7 @@ private: QVariant getLink(const QModelIndex &index, const QString &linkName) const; QVariant getExtraProperties(const QModelIndex &index) const; QString parseExtraPropertyName(const QString &name) const; + void clearModel(); static void onItemsChanged(GMenuModel *model, gint position, gint removed, gint added, gpointer data); }; -- cgit v1.2.3