2
* Plasma applet to display application window menus
4
* Copyright 2010 Canonical Ltd.
7
* - Aurélien Gâteau <aurelien.gateau@canonical.com>
12
#include "registrar.h"
15
#include <QApplication>
16
#include <QDBusMessage>
17
#include <QDBusObjectPath>
18
#include <QDBusServiceWatcher>
21
#include "registraradaptor.h"
23
static const char* DBUS_SERVICE = "org.ayatana.AppMenu.Registrar";
24
static const char* DBUS_OBJECT_PATH = "/org/ayatana/AppMenu/Registrar";
26
// Marshalling code for MenuInfo
27
QDBusArgument& operator<<(QDBusArgument& argument, const MenuInfo& info)
29
argument.beginStructure();
30
argument << info.winId << info.service << info.path;
31
argument.endStructure();
35
const QDBusArgument& operator>>(const QDBusArgument& argument, MenuInfo& info)
37
argument.beginStructure();
38
argument >> info.winId >> info.service >> info.path;
39
argument.endStructure();
43
Registrar::Registrar(QObject* parent)
45
, mServiceWatcher(new QDBusServiceWatcher(this))
47
qDBusRegisterMetaType<MenuInfo>();
48
qDBusRegisterMetaType<MenuInfoList>();
49
mServiceWatcher->setConnection(QDBusConnection::sessionBus());
50
mServiceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration);
51
connect(mServiceWatcher, SIGNAL(serviceUnregistered(const QString&)), SLOT(slotServiceUnregistered(const QString&)));
54
Registrar::~Registrar()
56
QDBusConnection::sessionBus().unregisterService(mService);
59
bool Registrar::connectToBus(const QString& _service, const QString& _path)
61
mService = _service.isEmpty() ? DBUS_SERVICE : _service;
62
QString path = _path.isEmpty() ? DBUS_OBJECT_PATH : _path;
64
bool ok = QDBusConnection::sessionBus().registerService(mService);
68
new RegistrarAdaptor(this);
69
QDBusConnection::sessionBus().registerObject(path, this);
74
void Registrar::RegisterWindow(WId wid, const QDBusObjectPath& menuObjectPath)
78
info.service = message().service();
79
info.path = menuObjectPath;
80
mDb.insert(wid, info);
81
mServiceWatcher->addWatchedService(info.service);
82
WindowRegistered(wid, info.service, info.path);
85
void Registrar::UnregisterWindow(WId wid)
90
QString Registrar::GetMenuForWindow(WId winId, QDBusObjectPath& menuObjectPath)
92
MenuInfo info = mDb.value(winId);
93
QString service = info.service;
94
menuObjectPath = info.path;
98
MenuInfoList Registrar::GetMenus()
103
void Registrar::slotServiceUnregistered(const QString& service)
109
if (it.value().service == service) {
115
mServiceWatcher->removeWatchedService(service);
118
#include "registrar.moc"