Mir
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
basic_surface.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: Thomas Voss <thomas.voss@canonical.com>
17  */
18 
19 #ifndef MIR_SCENE_BASIC_SURFACE_H_
20 #define MIR_SCENE_BASIC_SURFACE_H_
21 
22 #include "mir/scene/surface.h"
24 
25 #include "mir/geometry/rectangle.h"
26 
27 #include "mir_toolkit/common.h"
28 
29 #include <glm/glm.hpp>
30 #include <vector>
31 #include <memory>
32 #include <mutex>
33 #include <string>
34 
35 namespace mir
36 {
37 namespace compositor
38 {
39 struct BufferIPCPackage;
40 class BufferStream;
41 }
42 namespace frontend { class EventSink; }
43 namespace graphics
44 {
45 class Buffer;
46 }
47 namespace input
48 {
49 class InputChannel;
50 class Surface;
51 }
52 namespace scene
53 {
54 class SceneReport;
55 class SurfaceConfigurator;
56 
57 // Thread safe wrapper around notification callback
59 {
60 public:
61  ThreadsafeCallback(std::function<void()> const& notify_change);
62 
63  ThreadsafeCallback& operator=(std::function<void()> const& notify_change);
64 
65  void operator()() const;
66 
67 private:
68  ThreadsafeCallback(ThreadsafeCallback const&) = delete;
70  std::mutex mutable mutex;
71  std::function<void()> notify_change;
72 };
73 
75 {
76 public:
77 
78  void attrib_change(MirSurfaceAttrib attrib, int value) override;
79  void resize(geometry::Size const& size) override;
80 
81  void add(std::shared_ptr<SurfaceObserver> const& observer);
82  void remove(std::shared_ptr<SurfaceObserver> const& observer);
83 
84 private:
85  std::mutex mutex;
86  std::vector<std::shared_ptr<SurfaceObserver>> observers;
87 };
88 
89 class BasicSurface : public Surface
90 {
91 public:
93  std::string const& name,
95  bool nonrectangular,
96  std::shared_ptr<compositor::BufferStream> const& buffer_stream,
97  std::shared_ptr<input::InputChannel> const& input_channel,
98  std::shared_ptr<SurfaceConfigurator> const& configurator,
99  std::shared_ptr<SceneReport> const& report);
100 
101  ~BasicSurface() noexcept;
102 
103  std::string name() const override;
104  void move_to(geometry::Point const& top_left) override;
105  float alpha() const override;
106  void set_hidden(bool is_hidden);
107 
108  geometry::Size size() const override;
109 
111 
112  std::shared_ptr<graphics::Buffer> snapshot_buffer() const;
113  void swap_buffers(graphics::Buffer* old_buffer, std::function<void(graphics::Buffer* new_buffer)> complete);
115 
116  bool supports_input() const;
117  int client_input_fd() const;
118  void allow_framedropping(bool);
119  std::shared_ptr<input::InputChannel> input_channel() const override;
120  void on_change(std::function<void()> change_notification) override;
121 
122  void set_input_region(std::vector<geometry::Rectangle> const& input_rectangles) override;
123 
124  std::shared_ptr<compositor::BufferStream> buffer_stream() const;
125 
126  void resize(geometry::Size const& size) override;
127  geometry::Point top_left() const override;
128  bool contains(geometry::Point const& point) const override;
129  void frame_posted();
130  void set_alpha(float alpha) override;
131  void set_transformation(glm::mat4 const&) override;
132  glm::mat4 transformation() const override;
133 
134  bool visible() const;
135 
136  bool shaped() const override; // meaning the pixel format has alpha
137 
138  // Renderable interface
139  std::shared_ptr<graphics::Buffer> buffer(void const*) const override;
140  bool alpha_enabled() const override;
141  geometry::Rectangle screen_position() const override;
142  int buffers_ready_for_compositor() const override;
143 
145  std::function<void(graphics::Buffer&)> const& exec) override;
146 
147  MirSurfaceType type() const override;
148  MirSurfaceState state() const override;
149  void take_input_focus(std::shared_ptr<shell::InputTargeter> const& targeter) override;
150  int configure(MirSurfaceAttrib attrib, int value) override;
151  void hide() override;
152  void show() override;
153 
154  void add_observer(std::shared_ptr<SurfaceObserver> const& observer) override;
155  void remove_observer(std::shared_ptr<SurfaceObserver> const& observer) override;
156 
157 private:
158  bool set_type(MirSurfaceType t); // Use configure() to make public changes
159  bool set_state(MirSurfaceState s);
160 
161  SurfaceObservers observers;
162  std::mutex mutable guard;
163  ThreadsafeCallback notify_change;
164  std::string const surface_name;
165  geometry::Rectangle surface_rect;
166  glm::mat4 transformation_matrix;
167  float surface_alpha;
168  bool first_frame_posted;
169  bool hidden;
170  const bool nonrectangular;
171  std::vector<geometry::Rectangle> input_rectangles;
172  std::shared_ptr<compositor::BufferStream> const surface_buffer_stream;
173  std::shared_ptr<input::InputChannel> const server_input_channel;
174  std::shared_ptr<SurfaceConfigurator> const configurator;
175  std::shared_ptr<SceneReport> const report;
176 
177  MirSurfaceType type_value;
178  MirSurfaceState state_value;
179 };
180 
181 }
182 }
183 
184 #endif // MIR_SCENE_BASIC_SURFACE_H_
Definition: size.h:30
void allow_framedropping(bool)
Definition: basic_surface.cpp:189
ThreadsafeCallback & operator=(std::function< void()> const &notify_change)
Definition: basic_surface.cpp:46
std::shared_ptr< input::InputChannel > input_channel() const override
Definition: basic_surface.cpp:213
std::shared_ptr< graphics::Buffer > snapshot_buffer() const
Definition: basic_surface.cpp:194
void hide() override
Definition: basic_surface.cpp:436
~BasicSurface() noexcept
Definition: basic_surface.cpp:123
Definition: point.h:30
std::string name() const override
Definition: basic_surface.cpp:133
MirPixelFormat pixel_format() const
Definition: basic_surface.cpp:168
void show() override
Definition: basic_surface.cpp:441
std::shared_ptr< graphics::Buffer > buffer(void const *) const override
Return the next buffer that should be composited/rendered.
Definition: basic_surface.cpp:322
bool contains(geometry::Point const &point) const override
Definition: basic_surface.cpp:261
void attrib_change(MirSurfaceAttrib attrib, int value) override
Definition: basic_surface.cpp:61
int configure(MirSurfaceAttrib attrib, int value) override
Definition: basic_surface.cpp:394
void swap_buffers(graphics::Buffer *old_buffer, std::function< void(graphics::Buffer *new_buffer)> complete)
Definition: basic_surface.cpp:173
void set_hidden(bool is_hidden)
Definition: basic_surface.cpp:153
void resize(geometry::Size const &size) override
Definition: basic_surface.cpp:229
std::shared_ptr< compositor::BufferStream > buffer_stream() const
Definition: basic_surface.cpp:128
Definition: surface_observer.h:30
geometry::Point top_left() const override
Definition: basic_surface.cpp:255
void take_input_focus(std::shared_ptr< shell::InputTargeter > const &targeter) override
Definition: basic_surface.cpp:389
bool visible() const
TODO: Its a bit questionable that we have this member function, why not just trim the renderable from...
Definition: basic_surface.cpp:311
bool shaped() const override
Definition: basic_surface.cpp:317
float alpha() const override
Definition: basic_surface.cpp:147
geometry::Rectangle screen_position() const override
Definition: basic_surface.cpp:332
Definition: basic_surface.h:58
glm::mat4 transformation() const override
Transformation returns the transformation matrix that should be applied to the surface.
Definition: basic_surface.cpp:305
MirSurfaceState
Definition: common.h:55
MirSurfaceState state() const override
Definition: basic_surface.cpp:368
geometry::Size size() const override
Definition: basic_surface.cpp:162
void set_input_region(std::vector< geometry::Rectangle > const &input_rectangles) override
Definition: basic_surface.cpp:223
void resize(geometry::Size const &size) override
Definition: basic_surface.cpp:69
MirSurfaceAttrib
Attributes of a surface that the client and server/shell may wish to get or set over the wire...
Definition: common.h:34
void with_most_recent_buffer_do(std::function< void(graphics::Buffer &)> const &exec) override
Definition: basic_surface.cpp:342
MirSurfaceType
Definition: common.h:43
Definition: basic_surface.h:89
MirPixelFormat
The order of components in a format enum matches the order of the components as they would be written...
Definition: common.h:99
int client_input_fd() const
Definition: basic_surface.cpp:206
ThreadsafeCallback(std::function< void()> const &notify_change)
Definition: basic_surface.cpp:43
void set_alpha(float alpha) override
Definition: basic_surface.cpp:286
void set_transformation(glm::mat4 const &) override
Definition: basic_surface.cpp:296
void add(std::shared_ptr< SurfaceObserver > const &observer)
Definition: basic_surface.cpp:77
Definition: rectangle.h:33
Definition: basic_surface.h:74
BasicSurface(std::string const &name, geometry::Rectangle rect, bool nonrectangular, std::shared_ptr< compositor::BufferStream > const &buffer_stream, std::shared_ptr< input::InputChannel > const &input_channel, std::shared_ptr< SurfaceConfigurator > const &configurator, std::shared_ptr< SceneReport > const &report)
Definition: basic_surface.cpp:92
void frame_posted()
Definition: basic_surface.cpp:277
void on_change(std::function< void()> change_notification) override
Definition: basic_surface.cpp:218
MirSurfaceType type() const override
Definition: basic_surface.cpp:350
Definition: buffer.h:34
Definition: surface.h:34
void force_requests_to_complete()
Definition: basic_surface.cpp:118
void remove_observer(std::shared_ptr< SurfaceObserver > const &observer) override
Definition: basic_surface.cpp:452
bool alpha_enabled() const override
Definition: basic_surface.cpp:327
int const size
Definition: make_socket_rpc_channel.cpp:50
int buffers_ready_for_compositor() const override
Definition: basic_surface.cpp:337
bool supports_input() const
Definition: basic_surface.cpp:199
void move_to(geometry::Point const &top_left) override
Definition: basic_surface.cpp:138
void operator()() const
Definition: basic_surface.cpp:53
void add_observer(std::shared_ptr< SurfaceObserver > const &observer) override
Definition: basic_surface.cpp:447

Copyright © 2012,2013 Canonical Ltd.
Generated on Fri Apr 11 21:14:53 UTC 2014