From 9da1a1286493846fb0d58f7a848c13653136e1b3 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Mon, 24 Nov 2014 16:44:24 +0100 Subject: Add D-Bus types marshalling for Linux tray icon support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add marshalling for icon pixmaps to be used in DBus tray icon support according to the specification http://www.freedesktop.org/wiki/Specifications/StatusNotifierItem/Icons/ Task-number: QTBUG-31762 Change-Id: I16e66c272eef413a7c94345c273e5fd3a8c0f771 Reviewed-by: Thiago Macieira Reviewed-by: Albert Astals Cid Reviewed-by: Jørgen Lind --- src/platformsupport/dbustray/qdbustraytypes.cpp | 163 ++++++++++++++++++++++++ src/platformsupport/dbustray/qdbustraytypes_p.h | 81 ++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 src/platformsupport/dbustray/qdbustraytypes.cpp create mode 100644 src/platformsupport/dbustray/qdbustraytypes_p.h (limited to 'src') diff --git a/src/platformsupport/dbustray/qdbustraytypes.cpp b/src/platformsupport/dbustray/qdbustraytypes.cpp new file mode 100644 index 0000000000..0ca6669508 --- /dev/null +++ b/src/platformsupport/dbustray/qdbustraytypes.cpp @@ -0,0 +1,163 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Marco Martin +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qdbustraytypes_p.h" + +#include +#include +#include +#include +#include +#include +#include + +QXdgDBusImageVector iconToQXdgDBusImageVector(const QIcon &icon) +{ + QXdgDBusImageVector ret; + foreach (QSize size, icon.availableSizes()) { + QXdgDBusImageStruct kim; + kim.width = size.width(); + kim.height = size.height(); + // Protocol specifies ARGB32 format in network byte order + QImage im = icon.pixmap(size).toImage().convertToFormat(QImage::Format_ARGB32); + kim.data = QByteArray((char *)(im.bits()), im.byteCount()); + if (QSysInfo::ByteOrder == QSysInfo::LittleEndian) { + for (char *ptr = kim.data.begin(); ptr < kim.data.end(); ptr += 4) + qToUnaligned(qToBigEndian(*ptr), reinterpret_cast(ptr)); + } + ret << kim; + } + return ret; +} + +// Marshall the ImageStruct data into a D-Bus argument +const QDBusArgument &operator<<(QDBusArgument &argument, const QXdgDBusImageStruct &icon) +{ + argument.beginStructure(); + argument << icon.width; + argument << icon.height; + argument << icon.data; + argument.endStructure(); + return argument; +} + +// Retrieve the ImageStruct data from the D-Bus argument +const QDBusArgument &operator>>(const QDBusArgument &argument, QXdgDBusImageStruct &icon) +{ + qint32 width; + qint32 height; + QByteArray data; + + argument.beginStructure(); + argument >> width; + argument >> height; + argument >> data; + argument.endStructure(); + + icon.width = width; + icon.height = height; + icon.data = data; + + return argument; +} + +// Marshall the ImageVector data into a D-Bus argument +const QDBusArgument &operator<<(QDBusArgument &argument, const QXdgDBusImageVector &iconVector) +{ + argument.beginArray(qMetaTypeId()); + for (int i = 0; i < iconVector.size(); ++i) { + argument << iconVector[i]; + } + argument.endArray(); + return argument; +} + +// Retrieve the ImageVector data from the D-Bus argument +const QDBusArgument &operator>>(const QDBusArgument &argument, QXdgDBusImageVector &iconVector) +{ + argument.beginArray(); + iconVector.clear(); + + while (!argument.atEnd()) { + QXdgDBusImageStruct element; + argument >> element; + iconVector.append(element); + } + + argument.endArray(); + + return argument; +} + +// Marshall the ToolTipStruct data into a D-Bus argument +const QDBusArgument &operator<<(QDBusArgument &argument, const QXdgDBusToolTipStruct &toolTip) +{ + argument.beginStructure(); + argument << toolTip.icon; + argument << toolTip.image; + argument << toolTip.title; + argument << toolTip.subTitle; + argument.endStructure(); + return argument; +} + +// Retrieve the ToolTipStruct data from the D-Bus argument +const QDBusArgument &operator>>(const QDBusArgument &argument, QXdgDBusToolTipStruct &toolTip) +{ + QString icon; + QXdgDBusImageVector image; + QString title; + QString subTitle; + + argument.beginStructure(); + argument >> icon; + argument >> image; + argument >> title; + argument >> subTitle; + argument.endStructure(); + + toolTip.icon = icon; + toolTip.image = image; + toolTip.title = title; + toolTip.subTitle = subTitle; + + return argument; +} + +void registerDBusTrayTypes() +{ + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); +} diff --git a/src/platformsupport/dbustray/qdbustraytypes_p.h b/src/platformsupport/dbustray/qdbustraytypes_p.h new file mode 100644 index 0000000000..5b275e0d33 --- /dev/null +++ b/src/platformsupport/dbustray/qdbustraytypes_p.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Marco Martin +** Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL21$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QDBUSTRAYTYPES_P_H +#define QDBUSTRAYTYPES_P_H + +#include +#include +#include +#include +#include +#include + +// Custom message type to send icons across D-Bus +struct QXdgDBusImageStruct +{ + int width; + int height; + QByteArray data; +}; + +typedef QVector QXdgDBusImageVector; + +QXdgDBusImageVector iconToQXdgDBusImageVector(const QIcon &icon); + +// Custom message type to send tooltips across D-Bus +struct QXdgDBusToolTipStruct +{ + QString icon; + QXdgDBusImageVector image; + QString title; + QString subTitle; +}; + +const QDBusArgument &operator<<(QDBusArgument &argument, const QXdgDBusImageStruct &icon); +const QDBusArgument &operator>>(const QDBusArgument &argument, QXdgDBusImageStruct &icon); + +Q_DECLARE_METATYPE(QXdgDBusImageStruct) + +const QDBusArgument &operator<<(QDBusArgument &argument, const QXdgDBusImageVector &iconVector); +const QDBusArgument &operator>>(const QDBusArgument &argument, QXdgDBusImageVector &iconVector); + +Q_DECLARE_METATYPE(QXdgDBusImageVector) + +const QDBusArgument &operator<<(QDBusArgument &argument, const QXdgDBusToolTipStruct &toolTip); +const QDBusArgument &operator>>(const QDBusArgument &argument, QXdgDBusToolTipStruct &toolTip); + +Q_DECLARE_METATYPE(QXdgDBusToolTipStruct) + +#endif // QDBUSTRAYTYPES_P_H -- cgit v1.2.3