~stolowski/+junk/unity-2d-no-results-hint

« back to all changes in this revision

Viewing changes to panel/applets/appmenu/registrar.cpp

  • Committer: Aurelien Gateau
  • Date: 2010-10-06 13:52:55 UTC
  • Revision ID: aurelien.gateau@canonical.com-20101006135255-j4gsdm7k3grh0ydh
Merged in panel

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Plasma applet to display application window menus
 
3
 *
 
4
 * Copyright 2010 Canonical Ltd.
 
5
 *
 
6
 * Authors:
 
7
 * - Aurélien Gâteau <aurelien.gateau@canonical.com>
 
8
 *
 
9
 * License: GPL v3
 
10
 */
 
11
// Self
 
12
#include "registrar.h"
 
13
 
 
14
// Qt
 
15
#include <QApplication>
 
16
#include <QDBusMessage>
 
17
#include <QDBusObjectPath>
 
18
#include <QDBusServiceWatcher>
 
19
 
 
20
// Local
 
21
#include "registraradaptor.h"
 
22
 
 
23
static const char* DBUS_SERVICE = "org.ayatana.AppMenu.Registrar";
 
24
static const char* DBUS_OBJECT_PATH = "/org/ayatana/AppMenu/Registrar";
 
25
 
 
26
// Marshalling code for MenuInfo
 
27
QDBusArgument& operator<<(QDBusArgument& argument, const MenuInfo& info)
 
28
{
 
29
    argument.beginStructure();
 
30
    argument << info.winId << info.service << info.path;
 
31
    argument.endStructure();
 
32
    return argument;
 
33
}
 
34
 
 
35
const QDBusArgument& operator>>(const QDBusArgument& argument, MenuInfo& info)
 
36
{
 
37
    argument.beginStructure();
 
38
    argument >> info.winId >> info.service >> info.path;
 
39
    argument.endStructure();
 
40
    return argument;
 
41
}
 
42
 
 
43
Registrar::Registrar(QObject* parent)
 
44
: QObject(parent)
 
45
, mServiceWatcher(new QDBusServiceWatcher(this))
 
46
{
 
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&)));
 
52
}
 
53
 
 
54
Registrar::~Registrar()
 
55
{
 
56
    QDBusConnection::sessionBus().unregisterService(mService);
 
57
}
 
58
 
 
59
bool Registrar::connectToBus(const QString& _service, const QString& _path)
 
60
{
 
61
    mService = _service.isEmpty() ? DBUS_SERVICE : _service;
 
62
    QString path = _path.isEmpty() ? DBUS_OBJECT_PATH : _path;
 
63
 
 
64
    bool ok = QDBusConnection::sessionBus().registerService(mService);
 
65
    if (!ok) {
 
66
        return false;
 
67
    }
 
68
    new RegistrarAdaptor(this);
 
69
    QDBusConnection::sessionBus().registerObject(path, this);
 
70
 
 
71
    return true;
 
72
}
 
73
 
 
74
void Registrar::RegisterWindow(WId wid, const QDBusObjectPath& menuObjectPath)
 
75
{
 
76
    MenuInfo info;
 
77
    info.winId = wid;
 
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);
 
83
}
 
84
 
 
85
void Registrar::UnregisterWindow(WId wid)
 
86
{
 
87
    mDb.remove(wid);
 
88
}
 
89
 
 
90
QString Registrar::GetMenuForWindow(WId winId, QDBusObjectPath& menuObjectPath)
 
91
{
 
92
    MenuInfo info = mDb.value(winId);
 
93
    QString service = info.service;
 
94
    menuObjectPath = info.path;
 
95
    return service;
 
96
}
 
97
 
 
98
MenuInfoList Registrar::GetMenus()
 
99
{
 
100
    return mDb.values();
 
101
}
 
102
 
 
103
void Registrar::slotServiceUnregistered(const QString& service)
 
104
{
 
105
    MenuInfoDb::Iterator
 
106
        it = mDb.begin(),
 
107
        end = mDb.end();
 
108
    for (;it != end;) {
 
109
        if (it.value().service == service) {
 
110
            it = mDb.erase(it);
 
111
        } else {
 
112
            ++it;
 
113
        }
 
114
    }
 
115
    mServiceWatcher->removeWatchedService(service);
 
116
}
 
117
 
 
118
#include "registrar.moc"