2
* Copyright © 2014 Canonical Ltd.
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.
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.
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/>.
16
* Authored By: Alan Griffiths <alan@octopull.co.uk>
19
#include "server_example_window_manager.h"
20
#include "server_example_window_management.h"
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"
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;
35
///\example server_example_window_manager.cpp
36
/// Demonstrate introducing a window management strategy
40
class SceneTracker : public ms::SessionListener
43
SceneTracker(std::shared_ptr<me::WindowManager> const& window_manager) :
44
window_manager(window_manager)
50
void starting(std::shared_ptr<ms::Session> const& session) override
52
window_manager->add_session(session);
55
void stopping(std::shared_ptr<ms::Session> const& session) override
57
window_manager->remove_session(session);
60
void focused(std::shared_ptr<ms::Session> const& /*session*/) override {}
61
void unfocused() override {}
63
void surface_created(ms::Session& session, std::shared_ptr<ms::Surface> const& surface) override
65
window_manager->add_surface(surface, &session);
68
void destroying_surface(ms::Session& session, std::shared_ptr<ms::Surface> const& surface) override
70
window_manager->remove_surface(surface, &session);
73
std::shared_ptr<me::WindowManager> const window_manager;
76
class DisplayTracker : public mc::DisplayBufferCompositor
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)},
85
window_manager(window_manager)
87
window_manager->add_display(area);
90
~DisplayTracker() noexcept
92
window_manager->remove_display(area);
97
void composite(mc::SceneElementSequence&& scene_sequence) override
99
wrapped->composite(std::move(scene_sequence));
102
std::unique_ptr<mc::DisplayBufferCompositor> const wrapped;
103
Rectangle const area;
104
std::shared_ptr<me::WindowManager> const window_manager;
107
class DisplayTrackerFactory : public mc::DisplayBufferCompositorFactory
110
DisplayTrackerFactory(
111
std::shared_ptr<mc::DisplayBufferCompositorFactory> const& wrapped,
112
std::shared_ptr<me::WindowManager> const& window_manager) :
114
window_manager(window_manager)
119
std::unique_ptr<mc::DisplayBufferCompositor> create_compositor_for(mg::DisplayBuffer& display_buffer)
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}};
126
std::shared_ptr<mc::DisplayBufferCompositorFactory> const wrapped;
127
std::shared_ptr<me::WindowManager> const window_manager;
131
void me::add_window_manager_option_to(Server& server)
133
server.add_configuration_option(me::wm_option, me::wm_description, mir::OptionType::string);
135
auto const factory = std::make_shared<me::WindowManagmentFactory>(server);
137
server.override_the_placement_strategy([factory, &server]()
138
-> std::shared_ptr<ms::PlacementStrategy>
140
auto const options = server.get_options();
142
if (!options->is_set(me::wm_option))
143
return std::shared_ptr<ms::PlacementStrategy>{};
145
return factory->window_manager();
148
server.override_the_session_listener([factory, &server]()
149
-> std::shared_ptr<ms::SessionListener>
151
auto const options = server.get_options();
153
if (!options->is_set(me::wm_option))
154
return std::shared_ptr<ms::SessionListener>{};
156
return std::make_shared<SceneTracker>(factory->window_manager());
159
server.override_the_surface_configurator([factory, &server]()
160
-> std::shared_ptr<ms::SurfaceConfigurator>
162
auto const options = server.get_options();
164
if (!options->is_set(me::wm_option))
165
return std::shared_ptr<ms::SurfaceConfigurator>{};
167
return factory->window_manager();
170
server.wrap_display_buffer_compositor_factory([factory, &server]
171
(std::shared_ptr<mc::DisplayBufferCompositorFactory> const& wrapped)
172
-> std::shared_ptr<mc::DisplayBufferCompositorFactory>
174
auto const options = server.get_options();
176
if (!options->is_set(me::wm_option))
179
return std::make_shared<DisplayTrackerFactory>(wrapped, factory->window_manager());