/*
* Copyright (C) 2016 Canonical, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "applicationmenuregistry.h"
#include
#include
Q_LOGGING_CATEGORY(UNITY_APPMENU, "unity.appmenu", QtDebugMsg)
#define DEBUG_MSG qCDebug(UNITY_APPMENU).nospace().noquote() << "ApplicationMenuRegistry::" << __func__
#define WARNING_MSG qCWarning(UNITY_APPMENU).nospace().noquote() << "ApplicationMenuRegistry::" << __func__
ApplicationMenuRegistry::ApplicationMenuRegistry(QObject *parent)
: QObject(parent)
{
}
ApplicationMenuRegistry::~ApplicationMenuRegistry()
{
qDeleteAll(m_appMenus);
m_appMenus.clear();
qDeleteAll(m_surfaceMenus);
m_surfaceMenus.clear();
}
void ApplicationMenuRegistry::RegisterAppMenu(pid_t processId,
const QDBusObjectPath &menuObjectPath,
const QDBusObjectPath &actionObjectPath,
const QString &service)
{
DEBUG_MSG << "(pid=" << processId
<< ", menuPath=" << menuObjectPath.path()
<< ", actionPath=" << actionObjectPath.path()
<< ", service=" << service;
auto i = m_appMenus.find(processId);
while (i != m_appMenus.end() && i.key() == processId) {
if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
WARNING_MSG << "Already have a menu for application (pid= " << processId
<< ", service=" << service
<< ", menuPath=" << menuObjectPath.path() << ")";
return;
}
++i;
}
auto menu = new MenuServicePath(service, menuObjectPath, actionObjectPath);
QQmlEngine::setObjectOwnership(menu, QQmlEngine::CppOwnership);
m_appMenus.insert(processId, menu);
Q_EMIT appMenuRegistered(processId);
}
void ApplicationMenuRegistry::UnregisterAppMenu(pid_t processId, const QDBusObjectPath &menuObjectPath)
{
DEBUG_MSG << "(pid=" << processId
<< ", menuPath=" << menuObjectPath.path();
auto i = m_appMenus.find(processId);
while (i != m_appMenus.end() && i.key() == processId) {
if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
i.value()->deleteLater();
m_appMenus.erase(i);
Q_EMIT appMenuUnregistered(processId);
break;
}
++i;
}
}
void ApplicationMenuRegistry::RegisterSurfaceMenu(const QString &surfaceId,
const QDBusObjectPath &menuObjectPath,
const QDBusObjectPath &actionObjectPath,
const QString &service)
{
DEBUG_MSG << "(surfaceId=" << surfaceId
<< ", menuPath=" << menuObjectPath.path()
<< ", actionPath=" << actionObjectPath.path()
<< ", service=" << service;
auto i = m_surfaceMenus.find(surfaceId);
while (i != m_surfaceMenus.end() && i.key() == surfaceId) {
if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
WARNING_MSG << "Already have a menu for surface (surfaceId= " << surfaceId
<< ", service=" << service
<< ", menuPath=" << menuObjectPath.path() << ")";
return;
}
++i;
}
auto menu = new MenuServicePath(service, menuObjectPath, actionObjectPath);
QQmlEngine::setObjectOwnership(menu, QQmlEngine::CppOwnership);
m_surfaceMenus.insert(surfaceId, menu);
Q_EMIT surfaceMenuRegistered(surfaceId);
}
void ApplicationMenuRegistry::UnregisterSurfaceMenu(const QString &surfaceId, const QDBusObjectPath &menuObjectPath)
{
DEBUG_MSG << "(surfaceId=" << surfaceId
<< ", menuPath=" << menuObjectPath.path();
auto i = m_surfaceMenus.find(surfaceId);
while (i != m_surfaceMenus.end() && i.key() == surfaceId) {
if (i.value()->m_menuPath == menuObjectPath.path().toUtf8()) {
i.value()->deleteLater();
m_surfaceMenus.erase(i);
Q_EMIT surfaceMenuUnregistered(surfaceId);
break;
}
++i;
}
}
QList ApplicationMenuRegistry::getMenusForSurface(const QString &surfaceId) const
{
QList list;
auto i = m_surfaceMenus.find(surfaceId);
while (i != m_surfaceMenus.constEnd() && i.key() == surfaceId) {
list << i.value();
++i;
}
return list;
}