Mir
surface_stack.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2012-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 #ifndef MIR_SCENE_SURFACE_STACK_H_
20 #define MIR_SCENE_SURFACE_STACK_H_
21 
22 #include "surface_stack_model.h"
23 
24 #include "mir/compositor/scene.h"
25 #include "mir/scene/depth_id.h"
26 #include "mir/scene/observer.h"
27 #include "mir/input/scene.h"
28 
29 #include "mir/basic_observers.h"
30 
31 #include <memory>
32 #include <vector>
33 #include <mutex>
34 #include <map>
35 #include <set>
36 
37 namespace mir
38 {
39 namespace graphics
40 {
41 class Renderable;
42 }
45 namespace scene
46 {
47 class InputRegistrar;
48 class BasicSurface;
49 class SceneReport;
50 class RenderingTracker;
51 
52 class Observers : public Observer, BasicObservers<Observer>
53 {
54 public:
55  // ms::Observer
56  void surface_added(Surface* surface) override;
57  void surface_removed(Surface* surface) override;
58  void surfaces_reordered() override;
59  void scene_changed() override;
60  void surface_exists(Surface* surface) override;
61  void end_observation() override;
62 
65 };
66 
68 {
69 public:
70  explicit SurfaceStack(
71  std::shared_ptr<SceneReport> const& report);
72  virtual ~SurfaceStack() noexcept(true) {}
73 
74  // From Scene
76  int frames_pending(compositor::CompositorID) const override;
79 
80  // From Scene
81  void for_each(std::function<void(std::shared_ptr<input::Surface> const&)> const& callback) override;
82 
83  virtual void remove_surface(std::weak_ptr<Surface> const& surface) override;
84 
85  virtual void raise(std::weak_ptr<Surface> const& surface) override;
86 
87  void add_surface(
88  std::shared_ptr<Surface> const& surface,
89  DepthId depth,
90  input::InputReceptionMode input_mode) override;
91 
92  void add_observer(std::shared_ptr<Observer> const& observer) override;
93  void remove_observer(std::weak_ptr<Observer> const& observer) override;
94 
95  // Intended for input overlays, as described in mir::input::Scene documentation.
96  void add_input_visualization(std::shared_ptr<graphics::Renderable> const& overlay) override;
97  void remove_input_visualization(std::weak_ptr<graphics::Renderable> const& overlay) override;
98 
99  void emit_scene_changed() override;
100 
101 private:
102  SurfaceStack(const SurfaceStack&) = delete;
103  SurfaceStack& operator=(const SurfaceStack&) = delete;
104  void create_rendering_tracker_for(std::shared_ptr<Surface> const&);
105  void update_rendering_tracker_compositors();
106 
107  std::mutex mutable guard;
108 
109  std::shared_ptr<InputRegistrar> const input_registrar;
110  std::shared_ptr<SceneReport> const report;
111 
112  typedef std::vector<std::shared_ptr<Surface>> Layer;
113  std::map<DepthId, Layer> layers_by_depth;
114  std::map<Surface*,std::shared_ptr<RenderingTracker>> rendering_trackers;
115  std::set<compositor::CompositorID> registered_compositors;
116 
117  std::vector<std::shared_ptr<graphics::Renderable>> overlays;
118 
119  Observers observers;
120  bool scene_changed = false;
121 };
122 
123 }
124 }
125 
126 #endif /* MIR_SCENE_SURFACE_STACK_H_ */
Definition: scene.h:42
All things Mir.
Definition: buffer_stream.h:37
Definition: surface_stack_model.h:34
void surface_added(Surface *surface) override
Definition: surface_stack.cpp:358
Definition: hwc_layers.h:45
Definition: surface_stack.h:67
void surface_removed(Surface *surface) override
Definition: surface_stack.cpp:364
int frames_pending(compositor::CompositorID) const override
Return the number of additional frames that you need to render to get fully up to date with the lates...
Definition: surface_stack.cpp:151
An observer for top level notifications of scene changes. In order to receive more granular change no...
Definition: observer.h:33
void for_each(std::function< void(std::shared_ptr< input::Surface > const &)> const &callback) override
Definition: surface_stack.cpp:276
void emit_scene_changed() override
Definition: surface_stack.cpp:219
void add_input_visualization(std::shared_ptr< graphics::Renderable > const &overlay) override
Definition: surface_stack.cpp:192
void add_observer(std::shared_ptr< Observer > const &observer) override
Definition: surface_stack.cpp:332
std::vector< std::shared_ptr< SceneElement >> SceneElementSequence
Definition: scene.h:38
Definition: scene.h:40
virtual void remove_surface(std::weak_ptr< Surface > const &surface) override
Definition: surface_stack.cpp:244
true
Definition: display_configuration.cpp:30
SurfaceStack(std::shared_ptr< SceneReport > const &report)
Definition: surface_stack.cpp:118
compositor::SceneElementSequence scene_elements_for(compositor::CompositorID id) override
Generate a valid sequence of scene elements based on the current state of the Scene.
Definition: surface_stack.cpp:124
void unregister_compositor(compositor::CompositorID id) override
Definition: surface_stack.cpp:183
Definition: surface_stack.h:52
virtual ~SurfaceStack() noexcept(true)
Definition: surface_stack.h:72
void remove_input_visualization(std::weak_ptr< graphics::Renderable > const &overlay) override
Definition: surface_stack.cpp:202
void remove_observer(std::weak_ptr< Observer > const &observer) override
Definition: surface_stack.cpp:347
void const * CompositorID
Definition: compositor_id.h:27
Definition: basic_observers.h:28
void end_observation() override
Definition: surface_stack.cpp:388
void surface_exists(Surface *surface) override
Definition: surface_stack.cpp:382
void surfaces_reordered() override
Definition: surface_stack.cpp:370
void add_surface(std::shared_ptr< Surface > const &surface, DepthId depth, input::InputReceptionMode input_mode) override
Definition: surface_stack.cpp:228
InputReceptionMode
Definition: input_reception_mode.h:27
void register_compositor(compositor::CompositorID id) override
Definition: surface_stack.cpp:174
Definition: surface.h:40
void scene_changed() override
Definition: surface_stack.cpp:376

Copyright © 2012,2013 Canonical Ltd.
Generated on Tue Mar 24 16:15:19 UTC 2015