Hello community,

here is the log from the commit of package libdbusmenu-qt for openSUSE:Factory 
checked in at 2012-04-17 21:58:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libdbusmenu-qt (Old)
 and      /work/SRC/openSUSE:Factory/.libdbusmenu-qt.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libdbusmenu-qt", Maintainer is ""

Changes:
--------
--- /work/SRC/openSUSE:Factory/libdbusmenu-qt/libdbusmenu-qt.changes    
2011-09-23 02:08:05.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.libdbusmenu-qt.new/libdbusmenu-qt.changes       
2012-04-17 21:59:03.000000000 +0200
@@ -1,0 +2,12 @@
+Wed Apr 11 20:02:44 UTC 2012 - asterios.dra...@gmail.com
+
+- Update to 0.9.2:
+  * Fix disabling and hiding actions
+  * Avoid spamming dbus at startup
+  * Do not print warnings when not necessary
+  From 0.9.1:
+  * Add support for "opened" and "closed" events
+  * Add support for icon-data (LP BUG 633339)
+- Install also the development documentation.
+
+-------------------------------------------------------------------

Old:
----
  libdbusmenu-qt-0.9.0.tar.bz2

New:
----
  libdbusmenu-qt-0.9.2.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libdbusmenu-qt.spec ++++++
--- /var/tmp/diff_new_pack.Jkw1w7/_old  2012-04-17 21:59:05.000000000 +0200
+++ /var/tmp/diff_new_pack.Jkw1w7/_new  2012-04-17 21:59:05.000000000 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package libdbusmenu-qt
 #
-# Copyright (c) 2011 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -15,27 +15,26 @@
 # Please submit bugfixes or comments via http://bugs.opensuse.org/
 #
 
-# norootforbuild
-
 
 Name:           libdbusmenu-qt
-Version:        0.9.0
-Release:        1
-License:        LGPL-2.0+
+Version:        0.9.2
+Release:        0
 Url:            https://launchpad.net/libdbusmenu-qt/
 Summary:        A Qt implementation of the DBusMenu protocol
+License:        LGPL-2.0+
 Group:          System/Libraries
 Source0:        
http://launchpad.net/libdbusmenu-qt/trunk/%{version}/+download/%{name}-%{version}.tar.bz2
 Source99:       baselibs.conf
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  cmake
 BuildRequires:  doxygen
+BuildRequires:  fdupes
 BuildRequires:  gcc-c++
 BuildRequires:  libqjson-devel
 BuildRequires:  libqt4-devel
 BuildRequires:  pkg-config
 Provides:       dbusmenu-qt = 0.3.3
 Obsoletes:      dbusmenu-qt < 0.3.3
+BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 
 %description
 This library provides a Qt implementation of the DBusMenu protocol.
@@ -44,7 +43,6 @@
 their menus over DBus.
 
 %package devel
-License:        LGPL-2.0+
 Summary:        Development package for libdbusmenu-qt
 Group:          Development/Libraries/Other
 Requires:       libdbusmenu-qt2 = %{version}
@@ -55,7 +53,6 @@
 This package contains development files for libdbusmenu-qt.
 
 %package -n libdbusmenu-qt2
-License:        LGPL-2.0+
 Summary:        Development package for dbusmenu-qt
 Group:          System/Libraries
 %requires_ge    libqt4-x11
@@ -69,6 +66,9 @@
 %prep
 %setup -q
 
+# Remove build time references so build-compare can do its work
+sed -i "s/HTML_TIMESTAMP         = YES/HTML_TIMESTAMP         = NO/" 
Doxyfile.in
+
 %build
 mkdir build
 cd build
@@ -87,22 +87,25 @@
 %makeinstall
 cd ..
 
-rm -rf %{buildroot}%{_datadir}/doc/dbusmenu-qt/
+# Install the documentation in the correct location
+mkdir -p %{buildroot}%{_docdir}/%{name}-devel
+mv %{buildroot}%{_datadir}/doc/dbusmenu-qt/ 
%{buildroot}%{_docdir}/%{name}-devel/html/
+# Install additional documentation
+install -pm 0644 COPYING NEWS README %{buildroot}%{_docdir}/%{name}-devel/
+
+%fdupes -s %{buildroot}
 
 %post -n libdbusmenu-qt2 -p /sbin/ldconfig
 
 %postun -n libdbusmenu-qt2 -p /sbin/ldconfig
 
-%clean
-rm -rf %{buildroot}
-
 %files -n libdbusmenu-qt2
 %defattr(-,root,root,-)
 %{_libdir}/libdbusmenu-qt.so.2*
 
 %files devel
 %defattr(-,root,root,-)
-%doc COPYING NEWS README
+%doc %{_docdir}/%{name}-devel/
 %{_libdir}/libdbusmenu-qt.so
 %{_includedir}/dbusmenu-qt/
 %{_libdir}/pkgconfig/dbusmenu-qt.pc

++++++ libdbusmenu-qt-0.9.0.tar.bz2 -> libdbusmenu-qt-0.9.2.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/CMakeLists.txt 
new/libdbusmenu-qt-0.9.2/CMakeLists.txt
--- old/libdbusmenu-qt-0.9.0/CMakeLists.txt     2011-08-30 11:40:07.000000000 
+0200
+++ new/libdbusmenu-qt-0.9.2/CMakeLists.txt     2012-03-29 17:47:52.000000000 
+0200
@@ -9,7 +9,7 @@
 ## Package version
 set(dbusmenu_qt_VERSION_MAJOR 0)
 set(dbusmenu_qt_VERSION_MINOR 9)
-set(dbusmenu_qt_VERSION_PATCH 0)
+set(dbusmenu_qt_VERSION_PATCH 2)
 set(dbusmenu_qt_VERSION 
${dbusmenu_qt_VERSION_MAJOR}.${dbusmenu_qt_VERSION_MINOR}.${dbusmenu_qt_VERSION_PATCH})
 
 ## Lib version
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/NEWS 
new/libdbusmenu-qt-0.9.2/NEWS
--- old/libdbusmenu-qt-0.9.0/NEWS       2011-08-30 11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/NEWS       2012-03-29 17:47:52.000000000 +0200
@@ -1,3 +1,12 @@
+# 0.9.2 - 2012.03.29
+- Fix disabling and hiding actions (Aurelien Gateau)
+- Avoid spamming dbus at startup (Aurelien Gateau)
+- Do not print warnings when not necessary (Aurelien Gateau)
+
+# 0.9.1 - 2012.03.26
+- Add support for "opened" and "closed" events (Aurelien Gateau)
+- Add support for icon-data (LP BUG 633339) (Christoph Spielmann)
+
 # 0.9.0 - 2011.08.30
 - Add support for the "Status" dbusmenu property. Will be used by appmenu-qt 
for LP BUG 737419 (Aurelien Gateau)
 - Collapse multiple separators, get rid of starting and trailing separators 
(LP BUG 793339) (Aurelien Gateau)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/RELEASE_CHECK_LIST 
new/libdbusmenu-qt-0.9.2/RELEASE_CHECK_LIST
--- old/libdbusmenu-qt-0.9.0/RELEASE_CHECK_LIST 2011-08-30 11:40:07.000000000 
+0200
+++ new/libdbusmenu-qt-0.9.2/RELEASE_CHECK_LIST 2012-03-29 17:47:52.000000000 
+0200
@@ -9,22 +9,10 @@
 - Create tarball
 - Unpack tarball, build and run tests
 - Test with KDE trunk
-- Sync the gitorious repository (at least the version number changes)
-  bzr format-patch -r tag:x.y.z-1..
-  mv *.diff $gitorious
-  cd $gitorious
-  git am --reject *.diff
 - If ok, create tag
   tag=x.y.z
   bzr tag $tag
-  cd $gitorious
-  git tag $tag.kde
-  cd -
 - Push
   bzr push
-  cd $gitorious
-  git push
-  git push --tags
-  cd -
 - Upload tarball
   lp-project-upload libdbusmenu-qt $tag libdbusmenu-qt-$tag.tar.bz2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/src/dbusmenuexporter.cpp 
new/libdbusmenu-qt-0.9.2/src/dbusmenuexporter.cpp
--- old/libdbusmenu-qt-0.9.0/src/dbusmenuexporter.cpp   2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/src/dbusmenuexporter.cpp   2012-03-29 
17:47:52.000000000 +0200
@@ -21,6 +21,7 @@
 #include "dbusmenuexporter.h"
 
 // Qt
+#include <QBuffer>
 #include <QDateTime>
 #include <QMap>
 #include <QMenu>
@@ -242,7 +243,9 @@
         return;
     }
 
-    // "icon-data";
+    QBuffer buffer;
+    icon.pixmap(16).save(&buffer, "PNG");
+    map->insert("icon-data", buffer.data());
 }
 
 static void collapseSeparator(QAction* action)
@@ -331,6 +334,7 @@
     d->m_rootMenu = menu;
     d->m_nextId = 1;
     d->m_revision = 1;
+    d->m_emittedLayoutUpdatedOnce = false;
     d->m_itemUpdatedTimer = new QTimer(this);
     d->m_layoutUpdatedTimer = new QTimer(this);
     d->m_dbusObject = new DBusMenuExporterDBus(this);
@@ -374,24 +378,34 @@
         QVariantMap  updatedProperties;
         QStringList  removedProperties;
 
-        // Fill removedProperties and updatedProperties
+        // Find updated and removed properties
+        QVariantMap::ConstIterator newEnd = newProperties.constEnd();
+
         QVariantMap::ConstIterator
             oldIt = oldProperties.constBegin(),
             oldEnd = oldProperties.constEnd();
-        QVariantMap::Iterator newEnd = newProperties.end();
-
         for(; oldIt != oldEnd; ++oldIt) {
             QString key = oldIt.key();
             QVariantMap::ConstIterator newIt = newProperties.find(key);
             if (newIt != newEnd) {
                 if (newIt.value() != oldIt.value()) {
-                    updatedProperties.insert(newIt.key(), newIt.value());
+                    updatedProperties.insert(key, newIt.value());
                 }
             } else {
                 removedProperties << key;
             }
         }
 
+        // Find new properties (treat them as updated properties)
+        QVariantMap::ConstIterator newIt = newProperties.constBegin();
+        for (; newIt != newEnd; ++newIt) {
+            QString key = newIt.key();
+            oldIt = oldProperties.find(key);
+            if (oldIt == oldEnd) {
+                updatedProperties.insert(key, newIt.value());
+            }
+        }
+
         // Update our data (oldProperties is a reference)
         oldProperties = newProperties;
         QMenu *menu = action->menu();
@@ -413,6 +427,14 @@
         }
     }
     d->m_itemUpdatedIds.clear();
+    if (!d->m_emittedLayoutUpdatedOnce) {
+        // No need to tell the world about action changes: nobody knows the
+        // menu layout so nobody knows about the actions.
+        // Note: We can't stop in DBusMenuExporterPrivate::addAction(), we
+        // still need to reach this method because we want our properties to be
+        // updated, even if we don't announce changes.
+        return;
+    }
     if (!updatedList.isEmpty() || !removedList.isEmpty()) {
         d->m_dbusObject->ItemsPropertiesUpdated(updatedList, removedList);
     }
@@ -420,12 +442,24 @@
 
 void DBusMenuExporter::doEmitLayoutUpdated()
 {
+    // Collapse separators for all updated menus
     Q_FOREACH(int id, d->m_layoutUpdatedIds) {
         QMenu* menu = d->menuForId(id);
         if (menu && menu->separatorsCollapsible()) {
             d->collapseSeparators(menu);
         }
-        d->m_dbusObject->LayoutUpdated(d->m_revision, id);
+    }
+
+    // Tell the world about the update
+    if (d->m_emittedLayoutUpdatedOnce) {
+        Q_FOREACH(int id, d->m_layoutUpdatedIds) {
+            d->m_dbusObject->LayoutUpdated(d->m_revision, id);
+        }
+    } else {
+        // First time we emit LayoutUpdated, no need to emit several layout
+        // updates, signals the whole layout (id==0) has been updated
+        d->m_dbusObject->LayoutUpdated(d->m_revision, 0);
+        d->m_emittedLayoutUpdatedOnce = true;
     }
     d->m_layoutUpdatedIds.clear();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/src/dbusmenuexporterprivate_p.h 
new/libdbusmenu-qt-0.9.2/src/dbusmenuexporterprivate_p.h
--- old/libdbusmenu-qt-0.9.0/src/dbusmenuexporterprivate_p.h    2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/src/dbusmenuexporterprivate_p.h    2012-03-29 
17:47:52.000000000 +0200
@@ -50,6 +50,7 @@
     QMap<QAction *, int> m_idForAction;
     int m_nextId;
     uint m_revision;
+    bool m_emittedLayoutUpdatedOnce;
 
     QSet<int> m_itemUpdatedIds;
     QTimer *m_itemUpdatedTimer;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/src/dbusmenuimporter.cpp 
new/libdbusmenu-qt-0.9.2/src/dbusmenuimporter.cpp
--- old/libdbusmenu-qt-0.9.0/src/dbusmenuimporter.cpp   2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/src/dbusmenuimporter.cpp   2012-03-29 
17:47:52.000000000 +0200
@@ -47,26 +47,14 @@
 static QTime sChrono;
 #endif
 
-typedef void (DBusMenuImporter::*DBusMenuImporterMethod)(int, 
QDBusPendingCallWatcher*);
-
 static const char *DBUSMENU_INTERFACE = "com.canonical.dbusmenu";
 
 static const int ABOUT_TO_SHOW_TIMEOUT = 3000;
 static const int REFRESH_TIMEOUT = 4000;
 
 static const char *DBUSMENU_PROPERTY_ID = "_dbusmenu_id";
-static const char *DBUSMENU_PROPERTY_ICON = "_dbusmenu_icon";
-
-struct Task
-{
-    Task()
-    : m_id(0)
-    , m_method(0)
-    {}
-
-    int m_id;
-    DBusMenuImporterMethod m_method;
-};
+static const char *DBUSMENU_PROPERTY_ICON_NAME = "_dbusmenu_icon_name";
+static const char *DBUSMENU_PROPERTY_ICON_DATA_HASH = 
"_dbusmenu_icon_data_hash";
 
 static QAction *createKdeTitle(QAction *action, QWidget *parent)
 {
@@ -91,7 +79,6 @@
 
     QDBusAbstractInterface *m_interface;
     QMenu *m_menu;
-    QMap<QDBusPendingCallWatcher *, Task> m_taskForWatcher;
     typedef QMap<int, QPointer<QAction> > ActionForId;
     ActionForId m_actionForId;
     QSignalMapper m_mapper;
@@ -110,13 +97,9 @@
         #endif
         QDBusPendingCall call = m_interface->asyncCall("GetLayout", id, 1, 
QStringList());
         QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, 
q);
+        watcher->setProperty(DBUSMENU_PROPERTY_ID, id);
         QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
-            q, SLOT(dispatch(QDBusPendingCallWatcher*)));
-
-        Task task;
-        task.m_id = id;
-        task.m_method = &DBusMenuImporter::GetLayoutCallback;
-        m_taskForWatcher.insert(watcher, task);
+            q, SLOT(slotGetLayoutFinished(QDBusPendingCallWatcher*)));
 
         return watcher;
     }
@@ -126,6 +109,8 @@
         QMenu *menu = q->createMenu(parent);
         QObject::connect(menu, SIGNAL(aboutToShow()),
             q, SLOT(slotMenuAboutToShow()));
+        QObject::connect(menu, SIGNAL(aboutToHide()),
+            q, SLOT(slotMenuAboutToHide()));
         return menu;
     }
 
@@ -197,7 +182,9 @@
         } else if (key == "toggle-state") {
             updateActionChecked(action, value);
         } else if (key == "icon-name") {
-            updateActionIcon(action, value);
+            updateActionIconByName(action, value);
+        } else if (key == "icon-data") {
+            updateActionIconByData(action, value);
         } else if (key == "visible") {
             updateActionVisible(action, value);
         } else if (key == "shortcut") {
@@ -225,14 +212,14 @@
         }
     }
 
-    void updateActionIcon(QAction *action, const QVariant &value)
+    void updateActionIconByName(QAction *action, const QVariant &value)
     {
         QString iconName = value.toString();
-        QString previous = action->property(DBUSMENU_PROPERTY_ICON).toString();
+        QString previous = 
action->property(DBUSMENU_PROPERTY_ICON_NAME).toString();
         if (previous == iconName) {
             return;
         }
-        action->setProperty(DBUSMENU_PROPERTY_ICON, iconName);
+        action->setProperty(DBUSMENU_PROPERTY_ICON_NAME, iconName);
         if (iconName.isEmpty()) {
             action->setIcon(QIcon());
             return;
@@ -240,6 +227,24 @@
         action->setIcon(q->iconForName(iconName));
     }
 
+    void updateActionIconByData(QAction *action, const QVariant &value)
+    {
+        QByteArray data = value.toByteArray();
+        uint dataHash = qHash(data);
+        uint previousDataHash = 
action->property(DBUSMENU_PROPERTY_ICON_DATA_HASH).toUInt();
+        if (previousDataHash == dataHash) {
+            return;
+        }
+        action->setProperty(DBUSMENU_PROPERTY_ICON_DATA_HASH, dataHash);
+        QPixmap pix;
+        if (!pix.loadFromData(data)) {
+            DMWARNING << "Failed to decode icon-data property for action" << 
action->text();
+            action->setIcon(QIcon());
+            return;
+        }
+        action->setIcon(QIcon(pix));
+    }
+
     void updateActionVisible(QAction *action, const QVariant &value)
     {
         action->setVisible(value.isValid() ? value.toBool() : true);
@@ -260,11 +265,20 @@
             return q->menu();
         }
         QAction *action = m_actionForId.value(id);
-        DMRETURN_VALUE_IF_FAIL(action, 0);
+        if (!action) {
+            return 0;
+        }
         return action->menu();
     }
 
     void slotItemsPropertiesUpdated(const DBusMenuItemList &updatedList, const 
DBusMenuItemKeysList &removedList);
+
+    void sendEvent(int id, const QString &eventId)
+    {
+        QVariant empty = QVariant::fromValue(QDBusVariant(QString()));
+        uint timestamp = QDateTime::currentDateTime().toTime_t();
+        m_interface->asyncCall("Event", id, eventId, empty, timestamp);
+    }
 };
 
 DBusMenuImporter::DBusMenuImporter(const QString &service, const QString 
&path, QObject *parent)
@@ -333,22 +347,12 @@
     return d->m_menu;
 }
 
-void DBusMenuImporter::dispatch(QDBusPendingCallWatcher *watcher)
-{
-    Task task = d->m_taskForWatcher.take(watcher);
-    if (!task.m_method) {
-        DMWARNING << "No task for watcher!";
-        return;
-    }
-    (this->*task.m_method)(task.m_id, watcher);
-}
-
 void DBusMenuImporterPrivate::slotItemsPropertiesUpdated(const 
DBusMenuItemList &updatedList, const DBusMenuItemKeysList &removedList)
 {
     Q_FOREACH(const DBusMenuItem &item, updatedList) {
         QAction *action = m_actionForId.value(item.id);
         if (!action) {
-            DMWARNING << "No action for id" << item.id;
+            // We don't know this action. It probably is in a menu we haven't 
fetched yet.
             continue;
         }
 
@@ -363,7 +367,7 @@
     Q_FOREACH(const DBusMenuItemKeys &item, removedList) {
         QAction *action = m_actionForId.value(item.id);
         if (!action) {
-            DMWARNING << "No action for id" << item.id;
+            // We don't know this action. It probably is in a menu we haven't 
fetched yet.
             continue;
         }
 
@@ -380,33 +384,10 @@
     actionActivationRequested(action);
 }
 
-void DBusMenuImporter::GetPropertiesCallback(int id, QDBusPendingCallWatcher 
*watcher)
+void DBusMenuImporter::slotGetLayoutFinished(QDBusPendingCallWatcher *watcher)
 {
-    #ifdef BENCHMARK
-    DMDEBUG << "- Parsing updated properties for id" << id << 
sChrono.elapsed() << "ms";
-    #endif
-    QStringList requestedProperties = 
watcher->property("requestedProperties").toStringList();
-    QDBusReply<QVariantMap> reply = *watcher;
-    if (!reply.isValid()) {
-        DMWARNING << reply.error().message();
-        return;
-    }
-
-    QVariantMap properties = reply.value();
+    int parentId = watcher->property(DBUSMENU_PROPERTY_ID).toInt();
 
-    QAction *action = d->m_actionForId.value(id);
-    if (!action) {
-        DMWARNING << "No action for id" << id;
-        return;
-    }
-    d->updateAction(action, properties, requestedProperties);
-    #ifdef BENCHMARK
-    DMDEBUG << "- Item updated" << id << sChrono.elapsed() << "ms";
-    #endif
-}
-
-void DBusMenuImporter::GetLayoutCallback(int parentId, QDBusPendingCallWatcher 
*watcher)
-{
     QDBusPendingReply<uint, DBusMenuLayoutItem> reply = *watcher;
     if (!reply.isValid()) {
         DMWARNING << reply.error().message();
@@ -419,7 +400,10 @@
     DBusMenuLayoutItem rootItem = reply.argumentAt<1>();
 
     QMenu *menu = d->menuForId(parentId);
-    DMRETURN_IF_FAIL(menu);
+    if (!menu) {
+        DMWARNING << "No menu for id" << parentId;
+        return;
+    }
 
     menu->clear();
 
@@ -445,9 +429,7 @@
 
 void DBusMenuImporter::sendClickedEvent(int id)
 {
-    QVariant empty = QVariant::fromValue(QDBusVariant(QString()));
-    uint timestamp = QDateTime::currentDateTime().toTime_t();
-    d->m_interface->asyncCall("Event", id, QString("clicked"), empty, 
timestamp);
+    d->sendEvent(id, QString("clicked"));
 }
 
 void DBusMenuImporter::updateMenu()
@@ -525,6 +507,8 @@
     if (menu == d->m_menu) {
         menuReadyToBeShown();
     }
+
+    d->sendEvent(id, QString("opened"));
 }
 
 void DBusMenuImporter::slotAboutToShowDBusCallFinished(QDBusPendingCallWatcher 
*watcher)
@@ -550,6 +534,18 @@
     }
 }
 
+void DBusMenuImporter::slotMenuAboutToHide()
+{
+    QMenu *menu = qobject_cast<QMenu*>(sender());
+    Q_ASSERT(menu);
+
+    QAction *action = menu->menuAction();
+    Q_ASSERT(action);
+
+    int id = action->property(DBUSMENU_PROPERTY_ID).toInt();
+    d->sendEvent(id, QString("closed"));
+}
+
 QMenu *DBusMenuImporter::createMenu(QWidget *parent)
 {
     return new QMenu(parent);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/src/dbusmenuimporter.h 
new/libdbusmenu-qt-0.9.2/src/dbusmenuimporter.h
--- old/libdbusmenu-qt-0.9.0/src/dbusmenuimporter.h     2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/src/dbusmenuimporter.h     2012-03-29 
17:47:52.000000000 +0200
@@ -106,22 +106,20 @@
     virtual QIcon iconForName(const QString &);
 
 private Q_SLOTS:
-    void dispatch(QDBusPendingCallWatcher *);
     void sendClickedEvent(int);
     void slotMenuAboutToShow();
+    void slotMenuAboutToHide();
     void slotAboutToShowDBusCallFinished(QDBusPendingCallWatcher *);
     void slotItemActivationRequested(int id, uint timestamp);
     void processPendingLayoutUpdates();
     void slotLayoutUpdated(uint revision, int parentId);
+    void slotGetLayoutFinished(QDBusPendingCallWatcher *);
 
 private:
     Q_DISABLE_COPY(DBusMenuImporter)
     DBusMenuImporterPrivate *const d;
     friend class DBusMenuImporterPrivate;
 
-    void GetLayoutCallback(int id, QDBusPendingCallWatcher *);
-    void GetPropertiesCallback(int id, QDBusPendingCallWatcher *);
-
     // Use Q_PRIVATE_SLOT to avoid exposing DBusMenuItemList
     Q_PRIVATE_SLOT(d, void slotItemsPropertiesUpdated(const DBusMenuItemList 
&updatedList, const DBusMenuItemKeysList &removedList));
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/tests/dbusmenuexportertest.cpp 
new/libdbusmenu-qt-0.9.2/tests/dbusmenuexportertest.cpp
--- old/libdbusmenu-qt-0.9.0/tests/dbusmenuexportertest.cpp     2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/tests/dbusmenuexportertest.cpp     2012-03-29 
17:47:52.000000000 +0200
@@ -763,4 +763,52 @@
     checkPropertiesChangedArgs(spy.takeFirst(), "Status", "normal");
 }
 
+void DBusMenuExporterTest::testGetIconDataProperty()
+{
+    // Create an icon
+    QImage img(16, 16, QImage::Format_ARGB32);
+    {
+        QPainter painter(&img);
+        painter.setCompositionMode(QPainter::CompositionMode_Source);
+        QRect rect = img.rect();
+        painter.fillRect(rect, Qt::transparent);
+        rect.adjust(2, 2, -2, -2);
+        painter.fillRect(rect, Qt::red);
+        rect.adjust(2, 2, -2, -2);
+        painter.fillRect(rect, Qt::green);
+    }
+
+    QIcon icon(QPixmap::fromImage(img));
+
+    // Create a menu with the icon and export it
+    QMenu inputMenu;
+    QAction* a1 = inputMenu.addAction("a1");
+    a1->setIcon(icon);
+    DBusMenuExporter exporter(TEST_OBJECT_PATH, &inputMenu);
+
+    // Get properties
+    QDBusInterface iface(TEST_SERVICE, TEST_OBJECT_PATH);
+    DBusMenuLayoutItemList layoutItemlist = getChildren(&iface, 0, 
QStringList());
+    QCOMPARE(layoutItemlist.count(), 1);
+
+    QList<int> ids = QList<int>() << layoutItemlist[0].id;
+
+    QDBusReply<DBusMenuItemList> reply = iface.call("GetGroupProperties", 
QVariant::fromValue(ids), QStringList());
+
+    DBusMenuItemList itemlist = reply.value();
+    QCOMPARE(itemlist.count(), 1);
+
+    // Check we have the right property
+    DBusMenuItem item = itemlist.takeFirst();
+    QVERIFY(!item.properties.contains("icon-name"));
+    QVERIFY(item.properties.contains("icon-data"));
+
+    // Check saved image is the same
+    QByteArray data = item.properties.value("icon-data").toByteArray();
+    QVERIFY(!data.isEmpty());
+    QImage result;
+    QVERIFY(result.loadFromData(data, "PNG"));
+    QCOMPARE(result, img);
+}
+
 #include "dbusmenuexportertest.moc"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/tests/dbusmenuexportertest.h 
new/libdbusmenu-qt-0.9.2/tests/dbusmenuexportertest.h
--- old/libdbusmenu-qt-0.9.0/tests/dbusmenuexportertest.h       2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/tests/dbusmenuexportertest.h       2012-03-29 
17:47:52.000000000 +0200
@@ -54,6 +54,7 @@
     void testSeparatorCollapsing_data();
     void testSeparatorCollapsing();
     void testSetStatus();
+    void testGetIconDataProperty();
 
     void init();
     void cleanup();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/tests/dbusmenuimportertest.cpp 
new/libdbusmenu-qt-0.9.2/tests/dbusmenuimportertest.cpp
--- old/libdbusmenu-qt-0.9.0/tests/dbusmenuimportertest.cpp     2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/tests/dbusmenuimportertest.cpp     2012-03-29 
17:47:52.000000000 +0200
@@ -39,33 +39,15 @@
 
 QTEST_MAIN(DBusMenuImporterTest)
 
-static const char *TEST_SERVICE = "org.kde.dbusmenu-qt-test";
+static const char *TEST_SERVICE = "com.canonical.dbusmenu-qt-test";
 static const char *TEST_OBJECT_PATH = "/TestMenuBar";
 
-/**
- * Helper class to register TEST_SERVICE.
- * We don't do this in some init()/cleanup() methods because for some tests the
- * service must not be registered.
- */
-class RegisterServiceHelper
-{
-public:
-    RegisterServiceHelper()
-    {
-        QVERIFY(QDBusConnection::sessionBus().registerService(TEST_SERVICE));
-    }
-
-    ~RegisterServiceHelper()
-    {
-        QVERIFY(QDBusConnection::sessionBus().unregisterService(TEST_SERVICE));
-    }
-};
-
 Q_DECLARE_METATYPE(QAction*)
 
 void DBusMenuImporterTest::initTestCase()
 {
     qRegisterMetaType<QAction*>("QAction*");
+    QVERIFY(QDBusConnection::sessionBus().registerService(TEST_SERVICE));
 }
 
 void DBusMenuImporterTest::cleanup()
@@ -75,11 +57,8 @@
 
 void DBusMenuImporterTest::testStandardItem()
 {
-    RegisterServiceHelper helper;
-
     QMenu inputMenu;
     QAction *action = inputMenu.addAction("Test");
-    action->setVisible(false);
     DBusMenuExporter exporter(TEST_OBJECT_PATH, &inputMenu);
 
     DBusMenuImporter importer(TEST_SERVICE, TEST_OBJECT_PATH);
@@ -88,20 +67,11 @@
     QMenu *outputMenu = importer.menu();
     QCOMPARE(outputMenu->actions().count(), 1);
     QAction *outputAction = outputMenu->actions().first();
-    QVERIFY(!outputAction->isVisible());
     QCOMPARE(outputAction->text(), QString("Test"));
-
-    // Make the action visible, outputAction should become visible as well
-    action->setVisible(true);
-    QTest::qWait(500);
-
-    QVERIFY(outputAction->isVisible());
 }
 
 void DBusMenuImporterTest::testAddingNewItem()
 {
-    RegisterServiceHelper helper;
-
     QMenu inputMenu;
     QAction *action = inputMenu.addAction("Test");
     DBusMenuExporter exporter(TEST_OBJECT_PATH, &inputMenu);
@@ -118,8 +88,6 @@
 
 void DBusMenuImporterTest::testShortcut()
 {
-    RegisterServiceHelper helper;
-
     QMenu inputMenu;
     QAction *action = inputMenu.addAction("Test");
     action->setShortcut(Qt::CTRL | Qt::Key_S);
@@ -158,8 +126,6 @@
 
 void DBusMenuImporterTest::testDynamicMenu()
 {
-    RegisterServiceHelper helper;
-
     QMenu rootMenu;
     QAction* a1 = new QAction("a1", &rootMenu);
     QAction* a2 = new QAction("a2", &rootMenu);
@@ -214,8 +180,6 @@
 
 void DBusMenuImporterTest::testActionActivationRequested()
 {
-    RegisterServiceHelper helper;
-
     // Export a menu
     QMenu inputMenu;
     QAction *inputA1 = inputMenu.addAction("a1");
@@ -247,8 +211,6 @@
 
 void DBusMenuImporterTest::testActionsAreDeletedWhenImporterIs()
 {
-    RegisterServiceHelper helper;
-
     // Export a menu
     QMenu inputMenu;
     inputMenu.addAction("a1");
@@ -267,6 +229,8 @@
     QCOMPARE(outputMenu->actions().count(), 2);
     QMenu *outputSubMenu = outputMenu->actions().at(1)->menu();
     QVERIFY(outputSubMenu);
+    // Fake aboutToShow so that outputSubMenu is populated
+    QMetaObject::invokeMethod(outputSubMenu, "aboutToShow");
     QCOMPARE(outputSubMenu->actions().count(), 1);
 
     children << outputMenu->actions().at(0);
@@ -284,4 +248,96 @@
     }
 }
 
+void DBusMenuImporterTest::testIconData()
+{
+    // Create an icon
+    QImage img(16, 16, QImage::Format_ARGB32);
+    {
+        QPainter painter(&img);
+        painter.setCompositionMode(QPainter::CompositionMode_Source);
+        QRect rect = img.rect();
+        painter.fillRect(rect, Qt::transparent);
+        rect.adjust(2, 2, -2, -2);
+        painter.fillRect(rect, Qt::red);
+        rect.adjust(2, 2, -2, -2);
+        painter.fillRect(rect, Qt::green);
+    }
+    QIcon inputIcon(QPixmap::fromImage(img));
+
+    // Export a menu
+    QMenu inputMenu;
+    QAction *a1 = inputMenu.addAction("a1");
+    a1->setIcon(inputIcon);
+    DBusMenuExporter exporter(TEST_OBJECT_PATH, &inputMenu);
+
+    // Import the menu
+    DBusMenuImporter *importer = new DBusMenuImporter(TEST_SERVICE, 
TEST_OBJECT_PATH);
+    QTest::qWait(500);
+
+    // Check icon of action
+    QMenu *outputMenu = importer->menu();
+    QCOMPARE(outputMenu->actions().count(), 1);
+
+    QIcon outputIcon = outputMenu->actions().first()->icon();
+    QVERIFY(!outputIcon.isNull());
+
+    QImage result = outputIcon.pixmap(16).toImage();
+    QByteArray origBytes, resultBytes;
+    img.save(origBytes);
+    result.save(resultBytes);
+    QCOMPARE(origBytes,resultBytes);
+}
+
+void DBusMenuImporterTest::testInvisibleItem()
+{
+    QMenu inputMenu;
+    QAction *action = inputMenu.addAction("Test");
+    DBusMenuExporter exporter(TEST_OBJECT_PATH, &inputMenu);
+
+    DBusMenuImporter importer(TEST_SERVICE, TEST_OBJECT_PATH);
+    QTest::qWait(500);
+
+    QMenu *outputMenu = importer.menu();
+    QCOMPARE(outputMenu->actions().count(), 1);
+    QAction *outputAction = outputMenu->actions().first();
+
+    QVERIFY(outputAction->isVisible());
+
+    // Hide the action
+    action->setVisible(false);
+    QTest::qWait(500);
+    QVERIFY(!outputAction->isVisible());
+
+    // Show the action
+    action->setVisible(true);
+    QTest::qWait(500);
+    QVERIFY(outputAction->isVisible());
+}
+
+void DBusMenuImporterTest::testDisabledItem()
+{
+    QMenu inputMenu;
+    QAction *action = inputMenu.addAction("Test");
+    DBusMenuExporter exporter(TEST_OBJECT_PATH, &inputMenu);
+
+    DBusMenuImporter importer(TEST_SERVICE, TEST_OBJECT_PATH);
+    QTest::qWait(500);
+
+    QMenu *outputMenu = importer.menu();
+    QCOMPARE(outputMenu->actions().count(), 1);
+    QAction *outputAction = outputMenu->actions().first();
+    QVERIFY(outputAction->isEnabled());
+
+    // Disable the action
+    DMDEBUG << "Disabling";
+    action->setEnabled(false);
+    QTest::qWait(500);
+    QVERIFY(!outputAction->isEnabled());
+
+    // Enable the action
+    action->setEnabled(true);
+    QTest::qWait(500);
+    QVERIFY(outputAction->isEnabled());
+}
+
 #include "dbusmenuimportertest.moc"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libdbusmenu-qt-0.9.0/tests/dbusmenuimportertest.h 
new/libdbusmenu-qt-0.9.2/tests/dbusmenuimportertest.h
--- old/libdbusmenu-qt-0.9.0/tests/dbusmenuimportertest.h       2011-08-30 
11:40:07.000000000 +0200
+++ new/libdbusmenu-qt-0.9.2/tests/dbusmenuimportertest.h       2012-03-29 
17:47:52.000000000 +0200
@@ -41,6 +41,9 @@
     void testDynamicMenu();
     void testActionActivationRequested();
     void testActionsAreDeletedWhenImporterIs();
+    void testIconData();
+    void testInvisibleItem();
+    void testDisabledItem();
 
     void initTestCase();
 };

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to