diff --git a/dbus/dbusclientmanager.cpp b/dbus/dbusclientmanager.cpp new file mode 100644 index 000000000..ead7b6905 --- /dev/null +++ b/dbus/dbusclientmanager.cpp @@ -0,0 +1,28 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusClientManager -p dbusclientmanager dde-dock-ClientManager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "dbusclientmanager.h" + +/* + * Implementation of interface class DBusClientManager + */ + +DBusClientManager::DBusClientManager(QObject *parent) + : QDBusAbstractInterface("com.deepin.daemon.Dock", "/dde/dock/ClientManager", staticInterfaceName(), QDBusConnection::sessionBus(), parent) +{ + QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); +} + +DBusClientManager::~DBusClientManager() +{ + QDBusConnection::sessionBus().disconnect(service(), path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", "sa{sv}as", this, SLOT(propertyChanged(QDBusMessage))); +} + diff --git a/dbus/dbusclientmanager.h b/dbus/dbusclientmanager.h new file mode 100644 index 000000000..4ccf9b2a0 --- /dev/null +++ b/dbus/dbusclientmanager.h @@ -0,0 +1,89 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -c DBusClientManager -p dbusclientmanager dde-dock-ClientManager.xml + * + * qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies). + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef DBUSCLIENTMANAGER_H_1465195317 +#define DBUSCLIENTMANAGER_H_1465195317 + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface dde.dock.ClientManager + */ +class DBusClientManager: public QDBusAbstractInterface +{ + Q_OBJECT + + Q_SLOT void __propertyChanged__(const QDBusMessage& msg) + { + QList arguments = msg.arguments(); + if (3 != arguments.count()) + return; + QString interfaceName = msg.arguments().at(0).toString(); + if (interfaceName !="dde.dock.ClientManager") + return; + QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); + foreach(const QString &prop, changedProps.keys()) { + const QMetaObject* self = metaObject(); + for (int i=self->propertyOffset(); i < self->propertyCount(); ++i) { + QMetaProperty p = self->property(i); + if (p.name() == prop) { + Q_EMIT p.notifySignal().invoke(this); + } + } + } + } +public: + static inline const char *staticInterfaceName() + { return "dde.dock.ClientManager"; } + +public: + explicit DBusClientManager(QObject *parent = 0); + + ~DBusClientManager(); + +public Q_SLOTS: // METHODS + inline QDBusPendingReply ActivateWindow(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("ActivateWindow"), argumentList); + } + + inline QDBusPendingReply CloseWindow(uint in0) + { + QList argumentList; + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("CloseWindow"), argumentList); + } + + inline QDBusPendingReply CurrentActiveWindow() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("CurrentActiveWindow"), argumentList); + } + +Q_SIGNALS: // SIGNALS + void ActiveWindowChanged(uint activeWinId); +// begin property changed signals +}; + +namespace dde { + namespace dock { + typedef ::DBusClientManager ClientManager; + } +} +#endif diff --git a/dbus/dde-dock-ClientManager.xml b/dbus/dde-dock-ClientManager.xml new file mode 100644 index 000000000..59680d745 --- /dev/null +++ b/dbus/dde-dock-ClientManager.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/dde-dock.pro b/dde-dock.pro index 82f06c742..befd79231 100644 --- a/dde-dock.pro +++ b/dde-dock.pro @@ -17,7 +17,8 @@ SOURCES += main.cpp \ dbus/dbusdisplay.cpp \ item/appitem.cpp \ util/docksettings.cpp \ - item/placeholderitem.cpp + item/placeholderitem.cpp \ + dbus/dbusclientmanager.cpp HEADERS += \ window/mainwindow.h \ @@ -30,4 +31,5 @@ HEADERS += \ dbus/dbusdisplay.h \ item/appitem.h \ util/docksettings.h \ - item/placeholderitem.h + item/placeholderitem.h \ + dbus/dbusclientmanager.h diff --git a/item/appitem.cpp b/item/appitem.cpp index 1c1bd4d6e..544ba8dbc 100644 --- a/item/appitem.cpp +++ b/item/appitem.cpp @@ -10,11 +10,14 @@ #define APP_ACTIVE_STATUS "active" #define APP_NORMAL_STATUS "normal" +DBusClientManager *AppItem::ClientInter = nullptr; +uint AppItem::ActiveWindowId = 0; + AppItem::AppItem(const QDBusObjectPath &entry, QWidget *parent) : DockItem(App, parent), m_itemEntry(new DBusDockEntry(entry.path(), this)) { - qDebug() << m_itemEntry->data(); + initClientManager(); m_data = m_itemEntry->data(); @@ -35,11 +38,16 @@ void AppItem::paintEvent(QPaintEvent *e) QPainter painter(this); - // draw active background - if (m_data[APP_STATUS_KEY] == APP_ACTIVE_STATUS) + // draw current active background + if (m_windows.contains(ActiveWindowId)) { + painter.fillRect(rect(), Qt::blue); + } else if (m_data[APP_STATUS_KEY] == APP_ACTIVE_STATUS) + { + // draw active background painter.fillRect(rect(), Qt::cyan); } else { + // draw normal background painter.fillRect(rect(), Qt::gray); } @@ -58,6 +66,17 @@ void AppItem::mouseReleaseEvent(QMouseEvent *e) m_itemEntry->Activate(); } +void AppItem::initClientManager() +{ + if (ClientInter) + return; + + ClientInter = new DBusClientManager(this); + connect(ClientInter, &DBusClientManager::ActiveWindowChanged, [&] (const uint wid) { + ActiveWindowId = wid; + }); +} + void AppItem::entryDataChanged(const QString &key, const QString &value) { // update data diff --git a/item/appitem.h b/item/appitem.h index cdac0452c..bb2f20b6d 100644 --- a/item/appitem.h +++ b/item/appitem.h @@ -3,6 +3,7 @@ #include "dockitem.h" #include "dbus/dbusdockentry.h" +#include "dbus/dbusclientmanager.h" class AppItem : public DockItem { @@ -15,13 +16,17 @@ private: void paintEvent(QPaintEvent *e); void mouseReleaseEvent(QMouseEvent *e); + void initClientManager(); void entryDataChanged(const QString &key, const QString &value); private: DBusDockEntry *m_itemEntry; QMap m_data; -// QMap m_windows; + QMap m_windows; + + static DBusClientManager *ClientInter; + static uint ActiveWindowId; }; #endif // APPITEM_H