2
* This file is part of unity-qt
4
* Copyright 2010 Canonical Ltd.
7
* - Aurélien Gâteau <aurelien.gateau@canonical.com>
12
#include "appmenuapplet.h"
16
#include "registrar.h"
19
#include <dbusmenuimporter.h>
22
#include <bamf-matcher.h>
23
#include <bamf-window.h>
26
#include <QHBoxLayout>
29
class MyDBusMenuImporter : public DBusMenuImporter
32
MyDBusMenuImporter(const QString &service, const QString &path, QObject *parent)
33
: DBusMenuImporter(service, path, parent)
38
QString service() const { return m_service; }
39
QString path() const { return m_path; }
46
AppMenuApplet::AppMenuApplet()
52
connect(&BamfMatcher::get_default(), SIGNAL(ActiveWindowChanged(BamfWindow*, BamfWindow*)),
53
SLOT(slotActiveWindowChanged(BamfWindow*, BamfWindow*)));
54
updateActiveWinId(BamfMatcher::get_default().active_window());
57
void AppMenuApplet::setupRegistrar()
59
m_registrar = new Registrar(this);
60
if (!m_registrar->connectToBus()) {
61
UQ_WARNING << "could not connect registrar to DBus";
64
connect(m_registrar, SIGNAL(WindowRegistered(WId, const QString&, const QDBusObjectPath&)),
65
SLOT(slotWindowRegistered(WId, const QString&, const QDBusObjectPath&)));
68
void AppMenuApplet::setupMenuBar()
70
QHBoxLayout* layout = new QHBoxLayout(this);
72
m_menuBar = new QMenuBar;
73
layout->addWidget(m_menuBar);
74
m_menuBar->setNativeMenuBar(false);
75
m_menuBar->addMenu("File");
78
void AppMenuApplet::slotActiveWindowChanged(BamfWindow* /*former*/, BamfWindow* current)
81
updateActiveWinId(current);
85
void AppMenuApplet::slotWindowRegistered(WId wid, const QString& service, const QDBusObjectPath& menuObjectPath)
87
MyDBusMenuImporter* importer = new MyDBusMenuImporter(service, menuObjectPath.path(), this);
88
delete m_importers.take(wid);
89
m_importers.insert(wid, importer);
90
connect(importer, SIGNAL(menuUpdated()), SLOT(slotMenuUpdated()));
91
connect(importer, SIGNAL(actionActivationRequested(QAction*)), SLOT(slotActionActivationRequested(QAction*)));
92
QMetaObject::invokeMethod(importer, "updateMenu", Qt::QueuedConnection);
95
void AppMenuApplet::slotMenuUpdated()
97
DBusMenuImporter* importer = static_cast<DBusMenuImporter*>(sender());
99
if (m_importers.value(m_activeWinId) == importer) {
104
void AppMenuApplet::slotActionActivationRequested(QAction* action)
106
DBusMenuImporter* importer = static_cast<DBusMenuImporter*>(sender());
108
if (m_importers.value(m_activeWinId) == importer) {
109
m_menuBar->setActiveAction(action);
113
QMenu* AppMenuApplet::menuForWinId(WId wid) const
115
MyDBusMenuImporter* importer = m_importers.value(wid);
116
return importer ? importer->menu() : 0;
119
void AppMenuApplet::updateActiveWinId(BamfWindow* window)
121
WId id = window ? window->xid() : 0;
122
if (id == m_activeWinId) {
126
UQ_VAR(this->window()->winId());
127
if (id == this->window()->winId()) {
128
// Do not update id if the active window is the one hosting this applet
129
UQ_DEBUG << "No update";
136
void AppMenuApplet::updateMenuBar()
139
WId winId = m_activeWinId;
140
QMenu* menu = menuForWinId(winId);
144
// We have an active window
145
// FIXME: transient check
147
WId mainWinId = KWindowSystem::transientFor(winId);
149
// We have a parent window, use a disabled version of its
150
// menubar if it has one.
151
QMenu* mainMenu = menuForWinId(mainWinId);
153
mMenuCloner->setOriginalMenu(mainMenu);
154
menu = mMenuCloner->clonedMenu();
157
// FIXME: WindowMenuManager
160
// No suitable menubar but we have a window, use the
161
// generic window menu
162
mWindowMenuManager->setWinId(winId);
167
// No active window, show a desktop menubar
178
void AppMenuApplet::fillMenuBar(QMenu* menu)
185
Q_FOREACH(QAction* action, menu->actions()) {
186
if (action->isSeparator()) {
189
m_menuBar->addAction(action);
193
#include "appmenuapplet.moc"