/* * Copyright (C) 2013-2015 Canonical, Ltd. * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License version 3, as published by * the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY, * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef APPLICATIONMANAGER_H #define APPLICATIONMANAGER_H // std #include // Qt #include #include // Unity API #include // local #include "application.h" #include "desktopfilereader.h" namespace mir { namespace scene { class Session; class Surface; class PromptSession; } } class MirServer; namespace qtmir { class DBusWindowStack; class MirSurfaceManager; class ProcInfo; class SharedWakelock; class TaskController; class SettingsInterface; class ApplicationManager : public unity::shell::application::ApplicationManagerInterface { Q_OBJECT Q_ENUMS(MoreRoles) Q_FLAGS(ExecFlags) // TODO: Move to unity::shell::application::ApplicationManagerInterface Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged) public: class Factory { public: ApplicationManager* create(); }; // FIXME: these roles should be added to unity-api and removed from here enum MoreRoles { RoleSession = RoleFocused+1, RoleFullscreen, }; // Mapping enums to Ubuntu Platform API enums. enum Flag { NoFlag = 0x0, ForceMainStage = 0x1, }; Q_DECLARE_FLAGS(ExecFlags, Flag) static ApplicationManager* singleton(); explicit ApplicationManager( const QSharedPointer &mirServer, const QSharedPointer &taskController, const QSharedPointer &sharedWakelock, const QSharedPointer &desktopFileReaderFactory, const QSharedPointer &processInfo, const QSharedPointer &settings, QObject *parent = 0); virtual ~ApplicationManager(); // ApplicationManagerInterface QString focusedApplicationId() const override; Q_INVOKABLE qtmir::Application* get(int index) const override; Q_INVOKABLE qtmir::Application* findApplication(const QString &appId) const override; Q_INVOKABLE bool requestFocusApplication(const QString &appId) override; Q_INVOKABLE bool focusApplication(const QString &appId) override; Q_INVOKABLE void unfocusCurrentApplication() override; Q_INVOKABLE qtmir::Application* startApplication(const QString &appId, const QStringList &arguments) override; Q_INVOKABLE bool stopApplication(const QString &appId) override; // QAbstractListModel int rowCount(const QModelIndex & parent = QModelIndex()) const override; QVariant data(const QModelIndex & index, int role) const override; Q_INVOKABLE qtmir::Application *startApplication(const QString &appId, ExecFlags flags, const QStringList &arguments = QStringList()); Q_INVOKABLE void move(int from, int to); bool isEmpty() const { return rowCount() == 0; } const QList &list() const { return m_applications; } qtmir::Application* findApplicationWithPid(const qint64 pid); public Q_SLOTS: void authorizeSession(const quint64 pid, bool &authorized); void onSessionStarting(std::shared_ptr const& session); void onSessionStopping(std::shared_ptr const& session); void onSessionCreatedSurface(mir::scene::Session const*, std::shared_ptr const&); void onProcessStarting(const QString& appId); void onProcessStopped(const QString& appId); void onProcessSuspended(const QString& appId); void onProcessFailed(const QString& appId, const bool duringStartup); void onFocusRequested(const QString& appId); void onResumeRequested(const QString& appId); Q_SIGNALS: void focusRequested(const QString &appId); void emptyChanged(); private Q_SLOTS: void onAppDataChanged(const int role); void onSettingsChanged(const QString &key); private: void setFocused(Application *application); void add(Application *application); void remove(Application* application); Application* findApplicationWithSession(const std::shared_ptr &session); Application* findApplicationWithSession(const mir::scene::Session *session); QModelIndex findIndex(Application* application); void resumeApplication(Application *application); QString toString() const; Application* findApplicationWithPromptSession(const mir::scene::PromptSession* promptSession); QSharedPointer m_mirServer; QList m_applications; Application* m_focusedApplication; DBusWindowStack* m_dbusWindowStack; QSharedPointer m_taskController; QSharedPointer m_desktopFileReaderFactory; QSharedPointer m_procInfo; QSharedPointer m_sharedWakelock; QSharedPointer m_settings; static ApplicationManager* the_application_manager; friend class Application; friend class DBusWindowStack; friend class MirSurfaceManager; friend class SessionManager; }; } // namespace qtmir Q_DECLARE_METATYPE(qtmir::ApplicationManager*) #endif // APPLICATIONMANAGER_H