aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@canonical.com>2012-11-23 12:03:07 -0300
committerRenato Araujo Oliveira Filho <renato.filho@canonical.com>2012-11-23 12:03:07 -0300
commit6078bd7ddc6819d2650435313bb824442bbe033d (patch)
tree510e14d5585b7fa2777a1a51b9616be07e25de30
parent04391e9723278f8bb0a0985abd50aa9c3455980d (diff)
downloadqmenumodel-6078bd7ddc6819d2650435313bb824442bbe033d.tar.gz
qmenumodel-6078bd7ddc6819d2650435313bb824442bbe033d.tar.bz2
qmenumodel-6078bd7ddc6819d2650435313bb824442bbe033d.zip
Fixed QMenumodel behaviour when the GMenuModel is destroyed.
-rw-r--r--libqmenumodel/src/qdbusmenumodel.cpp6
-rw-r--r--libqmenumodel/src/qmenumodel.cpp19
-rw-r--r--libqmenumodel/src/qmenumodel.h3
-rw-r--r--tests/client/modeltest.cpp27
-rw-r--r--tests/script/menuscript.py3
5 files changed, 56 insertions, 2 deletions
diff --git a/libqmenumodel/src/qdbusmenumodel.cpp b/libqmenumodel/src/qdbusmenumodel.cpp
index 97990b4..070381f 100644
--- a/libqmenumodel/src/qdbusmenumodel.cpp
+++ b/libqmenumodel/src/qdbusmenumodel.cpp
@@ -89,7 +89,11 @@ void QDBusMenuModel::stop()
/*! \internal */
void QDBusMenuModel::serviceVanish(GDBusConnection *)
{
- setMenuModel(NULL);
+ GMenuModel *model = menuModel();
+ if (model != NULL) {
+ setMenuModel(NULL);
+ g_object_unref(model);
+ }
}
/*! \internal */
diff --git a/libqmenumodel/src/qmenumodel.cpp b/libqmenumodel/src/qmenumodel.cpp
index 8735e6c..a45d647 100644
--- a/libqmenumodel/src/qmenumodel.cpp
+++ b/libqmenumodel/src/qmenumodel.cpp
@@ -56,7 +56,11 @@ void QMenuModel::setMenuModel(GMenuModel *other)
if (m_menuModel == other) {
return;
}
+ setMenuModelImpl(other);
+}
+void QMenuModel::setMenuModelImpl(GMenuModel *other)
+{
beginResetModel();
clearModel();
@@ -64,6 +68,9 @@ void QMenuModel::setMenuModel(GMenuModel *other)
m_menuModel = other;
if (m_menuModel) {
+ g_object_weak_ref(reinterpret_cast<GObject*>(m_menuModel),
+ reinterpret_cast<GWeakNotify>(QMenuModel::onGMenuModelDestroyed),
+ this);
// this will trigger the menu load
(void) g_menu_model_get_n_items(m_menuModel);
m_signalChangedId = g_signal_connect(m_menuModel,
@@ -85,9 +92,11 @@ GMenuModel *QMenuModel::menuModel() const
void QMenuModel::clearModel()
{
if (m_menuModel) {
+ g_object_weak_unref(reinterpret_cast<GObject*>(m_menuModel),
+ reinterpret_cast<GWeakNotify>(QMenuModel::onGMenuModelDestroyed),
+ this);
g_signal_handler_disconnect(m_menuModel, m_signalChangedId);
m_signalChangedId = 0;
- g_object_unref(m_menuModel);
m_menuModel = NULL;
}
@@ -223,6 +232,14 @@ QVariant QMenuModel::getExtraProperties(const QModelIndex &index) const
return extra;
}
+/*! \internal */
+void QMenuModel::onGMenuModelDestroyed(gpointer data,
+ GObject *oldObject)
+{
+ QMenuModel *self = reinterpret_cast<QMenuModel*>(data);
+ self->m_menuModel = NULL;
+ self->setMenuModelImpl(NULL);
+}
/*! \internal */
void QMenuModel::onItemsChanged(GMenuModel *,
diff --git a/libqmenumodel/src/qmenumodel.h b/libqmenumodel/src/qmenumodel.h
index beec7ba..f3b431c 100644
--- a/libqmenumodel/src/qmenumodel.h
+++ b/libqmenumodel/src/qmenumodel.h
@@ -26,6 +26,7 @@ typedef int gint;
typedef unsigned int guint;
typedef void* gpointer;
typedef struct _GMenuModel GMenuModel;
+typedef struct _GObject GObject;
class QMenuModel : public QAbstractListModel
{
@@ -62,8 +63,10 @@ private:
QVariant getExtraProperties(const QModelIndex &index) const;
QString parseExtraPropertyName(const QString &name) const;
void clearModel();
+ void setMenuModelImpl(GMenuModel *model);
static void onItemsChanged(GMenuModel *model, gint position, gint removed, gint added, gpointer data);
+ static void onGMenuModelDestroyed(gpointer data, GObject *oldObject);
};
#endif
diff --git a/tests/client/modeltest.cpp b/tests/client/modeltest.cpp
index c6b2f0e..0aa4b52 100644
--- a/tests/client/modeltest.cpp
+++ b/tests/client/modeltest.cpp
@@ -25,6 +25,19 @@
#include <QtTest>
#include <QDebug>
+extern "C" {
+#include <gio/gio.h>
+}
+
+class TestMenuModel : public QMenuModel
+{
+public:
+ TestMenuModel(GMenuModel *other, QObject *parent=0)
+ : QMenuModel(other, parent)
+ {
+ }
+};
+
class ModelTest : public QObject
{
Q_OBJECT
@@ -242,6 +255,20 @@ private Q_SLOTS:
delete model;
}
+ /*
+ * Test if the model is clearead after GMenuModel be destroyed
+ */
+ void testDestroyGMenuModel()
+ {
+ GMenu *menu = g_menu_new();
+ g_menu_append(menu, "test-menu0", NULL);
+ g_menu_append(menu, "test-menu1", NULL);
+ TestMenuModel model(reinterpret_cast<GMenuModel*>(menu));
+ QCOMPARE(model.rowCount(), 2);
+
+ g_object_unref(menu);
+ QCOMPARE(model.rowCount(), 0);
+ }
};
QTEST_MAIN(ModelTest)
diff --git a/tests/script/menuscript.py b/tests/script/menuscript.py
index 60cb33b..d25bb30 100644
--- a/tests/script/menuscript.py
+++ b/tests/script/menuscript.py
@@ -205,6 +205,9 @@ class ActionList(object):
if self._ownNameID:
Gio.bus_unown_name(self._ownNameID)
self._ownNameID = None
+
+ self._root = None
+ self._rootAction = None
self._restore()
def _onActionActivated(self, action, parameter):