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 
23 
24 #include "mir/compositor/scene.h"
25 #include "mir/scene/observer.h"
26 #include "mir/input/scene.h"
28 
29 #include "mir/basic_observers.h"
30 
31 #include <atomic>
32 #include <map>
33 #include <memory>
34 #include <mutex>
35 #include <set>
36 #include <vector>
37 
38 namespace mir
39 {
40 namespace graphics
41 {
42 class Renderable;
43 }
46 namespace scene
47 {
48 class InputRegistrar;
49 class BasicSurface;
50 class SceneReport;
51 class RenderingTracker;
52 
53 class Observers : public Observer, BasicObservers<Observer>
54 {
55 public:
56  // ms::Observer
57  void surface_added(Surface* surface) override;
58  void surface_removed(Surface* surface) override;
59  void surfaces_reordered() override;
60  void scene_changed() override;
61  void surface_exists(Surface* surface) override;
62  void end_observation() override;
63 
66 };
67 
69 {
70 public:
71  explicit SurfaceStack(
72  std::shared_ptr<SceneReport> const& report);
73  virtual ~SurfaceStack() noexcept(true) {}
74 
75  // From Scene
76  compositor::SceneElementSequence scene_elements_for(compositor::CompositorID id) override;
77  int frames_pending(compositor::CompositorID) const override;
78  void register_compositor(compositor::CompositorID id) override;
79  void unregister_compositor(compositor::CompositorID id) override;
80 
81  // From Scene
82  void for_each(std::function<void(std::shared_ptr<input::Surface> const&)> const& callback) override;
83 
84  virtual void remove_surface(std::weak_ptr<Surface> const& surface) override;
85 
86  virtual void raise(std::weak_ptr<Surface> const& surface) override;
87 
88  void raise(SurfaceSet const& surfaces) override;
89 
90  void add_surface(
91  std::shared_ptr<Surface> const& surface,
92  input::InputReceptionMode input_mode) override;
93 
94  auto surface_at(geometry::Point) const -> std::shared_ptr<Surface> override;
95 
96  void add_observer(std::shared_ptr<Observer> const& observer) override;
97  void remove_observer(std::weak_ptr<Observer> const& observer) override;
98 
99  // Intended for input overlays, as described in mir::input::Scene documentation.
100  void add_input_visualization(std::shared_ptr<graphics::Renderable> const& overlay) override;
101  void remove_input_visualization(std::weak_ptr<graphics::Renderable> const& overlay) override;
102 
103  void emit_scene_changed() override;
104 
105 private:
106  SurfaceStack(const SurfaceStack&) = delete;
107  SurfaceStack& operator=(const SurfaceStack&) = delete;
108  void create_rendering_tracker_for(std::shared_ptr<Surface> const&);
109  void update_rendering_tracker_compositors();
110 
111  RecursiveReadWriteMutex mutable guard;
112 
113  std::shared_ptr<InputRegistrar> const input_registrar;
114  std::shared_ptr<SceneReport> const report;
115 
116  std::vector<std::shared_ptr<Surface>> surfaces;
117  std::map<Surface*,std::shared_ptr<RenderingTracker>> rendering_trackers;
118  std::set<compositor::CompositorID> registered_compositors;
119 
120  std::vector<std::shared_ptr<graphics::Renderable>> overlays;
121 
122  Observers observers;
123  std::atomic<bool> scene_changed;
124 };
125 
126 }
127 }
128 
129 #endif /* MIR_SCENE_SURFACE_STACK_H_ */
Definition: scene.h:42
All things Mir.
Definition: atomic_callback.h:25
Definition: hwc_layers.h:45
Definition: surface_stack.h:68
Definition: point.h:30
An observer for top level notifications of scene changes. In order to receive more granular change no...
Definition: observer.h:33
std::vector< std::shared_ptr< SceneElement >> SceneElementSequence
Definition: scene.h:38
Definition: scene.h:40
surface_removed
Definition: scene_report_tp.h:46
surface_added
Definition: scene_report_tp.h:41
Definition: surface_stack.h:40
Definition: surface_stack.h:53
virtual ~SurfaceStack() noexcept(true)
Definition: surface_stack.h:73
a recursive read-write mutex.
Definition: recursive_read_write_mutex.h:31
std::set< std::weak_ptr< scene::Surface >, std::owner_less< std::weak_ptr< scene::Surface >>> SurfaceSet
Definition: surface_stack.h:43
void const * CompositorID
Definition: compositor_id.h:27
Definition: basic_observers.h:28
InputReceptionMode
Definition: input_reception_mode.h:27
Definition: surface.h:47

Copyright © 2012-2015 Canonical Ltd.
Generated on Wed Mar 30 00:29:56 UTC 2016