1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/*
* Copyright (C) 2017 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 <http://www.gnu.org/licenses/>.
*/
#ifndef WINDOWMANAGER_WORKSPACE_H
#define WINDOWMANAGER_WORKSPACE_H
#include <QObject>
#include <QVariant>
#include <QPointer>
#include <QSharedPointer>
#include <memory>
#include <functional>
#include "WindowManagerGlobal.h"
class WorkspaceModel;
class TopLevelWindowModel;
class Screen;
namespace miral { class Workspace; }
namespace lomiri {
namespace shell {
namespace application {
class MirSurfaceInterface;
}
}
}
class WINDOWMANAGERQML_EXPORT Workspace : public QObject
{
Q_OBJECT
Q_PROPERTY(bool active READ isActive NOTIFY activeChanged)
Q_PROPERTY(TopLevelWindowModel* windowModel READ windowModel CONSTANT)
public:
virtual ~Workspace();
virtual void assign(WorkspaceModel* model, const QVariant& index = QVariant());
virtual void unassign();
virtual bool isActive() const = 0;
virtual TopLevelWindowModel *windowModel() const = 0;
virtual void setCurrentOn(Screen*) = 0;
std::shared_ptr<miral::Workspace> workspace() const { return m_workspace; }
bool isAssigned() const;
Q_INVOKABLE bool isSameAs(Workspace*) const;
public Q_SLOTS:
virtual void activate() = 0;
Q_SIGNALS:
void assigned();
void unassigned();
void activeChanged(bool);
protected:
Workspace(QObject *parent = nullptr);
Workspace(Workspace const& other);
std::shared_ptr<miral::Workspace> m_workspace;
WorkspaceModel* m_model;
};
class WINDOWMANAGERQML_EXPORT ConcreteWorkspace : public Workspace
{
public:
~ConcreteWorkspace();
bool isActive() const override { return m_active; }
TopLevelWindowModel *windowModel() const override;
void activate() override;
void setCurrentOn(Screen*) override;
private:
explicit ConcreteWorkspace(QObject *parent = nullptr);
bool m_active;
const QScopedPointer<TopLevelWindowModel> m_windowModel;
friend class WorkspaceManager;
};
class ProxyWorkspace : public Workspace
{
Q_OBJECT
public:
explicit ProxyWorkspace(Workspace*const workspace);
~ProxyWorkspace() = default;
Q_INVOKABLE void assign(WorkspaceModel* model, const QVariant& index = QVariant()) override;
bool isActive() const override;
TopLevelWindowModel *windowModel() const override;
void activate() override;
void setCurrentOn(Screen*) override;
Workspace* proxyObject() const { return m_original.data(); }
public Q_SLOTS:
void unassign() override;
private:
const QPointer<Workspace> m_original;
};
#endif // WINDOWMANAGER_WORKSPACE_H
|