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