~ubuntu-branches/ubuntu/wily/mir/wily-proposed

« back to all changes in this revision

Viewing changes to examples/server_example_window_manager.cpp

  • Committer: Package Import Robot
  • Author(s): CI Train Bot
  • Date: 2015-05-12 13:12:55 UTC
  • mto: This revision was merged to the branch mainline in revision 96.
  • Revision ID: package-import@ubuntu.com-20150512131255-y7z12i8n4pbvo70x
Tags: upstream-0.13.0+15.10.20150512
Import upstream version 0.13.0+15.10.20150512

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * Copyright © 2014 Canonical Ltd.
3
 
 *
4
 
 * This program is free software: you can redistribute it and/or modify it
5
 
 * under the terms of the GNU General Public License version 3,
6
 
 * as published by the Free Software Foundation.
7
 
 *
8
 
 * This program is distributed in the hope that it will be useful,
9
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
 * GNU General Public License for more details.
12
 
 *
13
 
 * You should have received a copy of the GNU General Public License
14
 
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
 
 *
16
 
 * Authored By: Alan Griffiths <alan@octopull.co.uk>
17
 
 */
18
 
 
19
 
#include "server_example_window_manager.h"
20
 
#include "server_example_window_management.h"
21
 
 
22
 
#include "mir/server.h"
23
 
#include "mir/compositor/display_buffer_compositor_factory.h"
24
 
#include "mir/compositor/display_buffer_compositor.h"
25
 
#include "mir/graphics/display_buffer.h"
26
 
#include "mir/options/option.h"
27
 
#include "mir/scene/session_listener.h"
28
 
 
29
 
namespace mc = mir::compositor;
30
 
namespace me = mir::examples;
31
 
namespace mg = mir::graphics;
32
 
namespace ms = mir::scene;
33
 
using namespace mir::geometry;
34
 
 
35
 
///\example server_example_window_manager.cpp
36
 
/// Demonstrate introducing a window management strategy
37
 
 
38
 
namespace
39
 
{
40
 
class SceneTracker : public ms::SessionListener
41
 
{
42
 
public:
43
 
    SceneTracker(std::shared_ptr<me::WindowManager> const& window_manager) :
44
 
        window_manager(window_manager)
45
 
    {
46
 
    }
47
 
 
48
 
private:
49
 
 
50
 
    void starting(std::shared_ptr<ms::Session> const& session) override
51
 
    {
52
 
        window_manager->add_session(session);
53
 
    }
54
 
 
55
 
    void stopping(std::shared_ptr<ms::Session> const& session) override
56
 
    {
57
 
        window_manager->remove_session(session);
58
 
    }
59
 
 
60
 
    void focused(std::shared_ptr<ms::Session> const& /*session*/) override {}
61
 
    void unfocused() override {}
62
 
 
63
 
    void surface_created(ms::Session& session, std::shared_ptr<ms::Surface> const& surface) override
64
 
    {
65
 
        window_manager->add_surface(surface, &session);
66
 
    }
67
 
 
68
 
    void destroying_surface(ms::Session& session, std::shared_ptr<ms::Surface> const& surface) override
69
 
    {
70
 
        window_manager->remove_surface(surface, &session);
71
 
    }
72
 
 
73
 
    std::shared_ptr<me::WindowManager> const window_manager;
74
 
};
75
 
 
76
 
class DisplayTracker : public mc::DisplayBufferCompositor
77
 
{
78
 
public:
79
 
    DisplayTracker(
80
 
        std::unique_ptr<mc::DisplayBufferCompositor>&& wrapped,
81
 
        Rectangle const& area,
82
 
        std::shared_ptr<me::WindowManager> const& window_manager) :
83
 
        wrapped{std::move(wrapped)},
84
 
        area{area},
85
 
        window_manager(window_manager)
86
 
    {
87
 
        window_manager->add_display(area);
88
 
    }
89
 
 
90
 
    ~DisplayTracker() noexcept
91
 
    {
92
 
        window_manager->remove_display(area);
93
 
    }
94
 
 
95
 
private:
96
 
 
97
 
    void composite(mc::SceneElementSequence&& scene_sequence) override
98
 
    {
99
 
        wrapped->composite(std::move(scene_sequence));
100
 
    }
101
 
 
102
 
    std::unique_ptr<mc::DisplayBufferCompositor> const wrapped;
103
 
    Rectangle const area;
104
 
    std::shared_ptr<me::WindowManager> const window_manager;
105
 
};
106
 
 
107
 
class DisplayTrackerFactory : public mc::DisplayBufferCompositorFactory
108
 
{
109
 
public:
110
 
    DisplayTrackerFactory(
111
 
        std::shared_ptr<mc::DisplayBufferCompositorFactory> const& wrapped,
112
 
        std::shared_ptr<me::WindowManager> const& window_manager) :
113
 
        wrapped{wrapped},
114
 
        window_manager(window_manager)
115
 
    {
116
 
    }
117
 
 
118
 
private:
119
 
    std::unique_ptr<mc::DisplayBufferCompositor> create_compositor_for(mg::DisplayBuffer& display_buffer)
120
 
    {
121
 
        auto compositor = wrapped->create_compositor_for(display_buffer);
122
 
        return std::unique_ptr<mc::DisplayBufferCompositor>{
123
 
            new DisplayTracker{std::move(compositor), display_buffer.view_area(), window_manager}};
124
 
    }
125
 
 
126
 
    std::shared_ptr<mc::DisplayBufferCompositorFactory> const wrapped;
127
 
    std::shared_ptr<me::WindowManager> const window_manager;
128
 
};
129
 
}
130
 
 
131
 
void me::add_window_manager_option_to(Server& server)
132
 
{
133
 
    server.add_configuration_option(me::wm_option, me::wm_description, mir::OptionType::string);
134
 
 
135
 
    auto const factory = std::make_shared<me::WindowManagmentFactory>(server);
136
 
 
137
 
    server.override_the_placement_strategy([factory, &server]()
138
 
        -> std::shared_ptr<ms::PlacementStrategy>
139
 
        {
140
 
            auto const options = server.get_options();
141
 
 
142
 
            if (!options->is_set(me::wm_option))
143
 
                return std::shared_ptr<ms::PlacementStrategy>{};
144
 
 
145
 
            return factory->window_manager();
146
 
        });
147
 
 
148
 
    server.override_the_session_listener([factory, &server]()
149
 
        -> std::shared_ptr<ms::SessionListener>
150
 
        {
151
 
            auto const options = server.get_options();
152
 
 
153
 
            if (!options->is_set(me::wm_option))
154
 
                return std::shared_ptr<ms::SessionListener>{};
155
 
 
156
 
            return std::make_shared<SceneTracker>(factory->window_manager());
157
 
        });
158
 
 
159
 
    server.override_the_surface_configurator([factory, &server]()
160
 
        -> std::shared_ptr<ms::SurfaceConfigurator>
161
 
        {
162
 
            auto const options = server.get_options();
163
 
 
164
 
            if (!options->is_set(me::wm_option))
165
 
                return std::shared_ptr<ms::SurfaceConfigurator>{};
166
 
 
167
 
            return factory->window_manager();
168
 
        });
169
 
 
170
 
    server.wrap_display_buffer_compositor_factory([factory, &server]
171
 
       (std::shared_ptr<mc::DisplayBufferCompositorFactory> const& wrapped)
172
 
       -> std::shared_ptr<mc::DisplayBufferCompositorFactory>
173
 
       {
174
 
           auto const options = server.get_options();
175
 
 
176
 
           if (!options->is_set(me::wm_option))
177
 
               return wrapped;
178
 
 
179
 
           return std::make_shared<DisplayTrackerFactory>(wrapped, factory->window_manager());
180
 
       });
181
 
}