Mir
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"
23 #include "mir/basic_observers.h"
25 
26 #include "mir/geometry/rectangle.h"
27 
28 #include "mir_toolkit/common.h"
29 
30 #include <glm/glm.hpp>
31 #include <vector>
32 #include <memory>
33 #include <mutex>
34 #include <string>
35 
36 namespace mir
37 {
38 namespace compositor
39 {
40 struct BufferIPCPackage;
41 class BufferStream;
42 }
43 namespace frontend { class EventSink; }
44 namespace graphics
45 {
46 class Buffer;
47 }
48 namespace input
49 {
50 class InputChannel;
51 class InputSender;
52 class Surface;
53 }
54 namespace scene
55 {
56 class SceneReport;
57 
58 class SurfaceObservers : public SurfaceObserver, BasicObservers<SurfaceObserver>
59 {
60 public:
63 
64  void attrib_changed(MirSurfaceAttrib attrib, int value) override;
65  void resized_to(geometry::Size const& size) override;
66  void moved_to(geometry::Point const& top_left) override;
67  void hidden_set_to(bool hide) override;
68  void frame_posted(int frames_available) override;
69  void alpha_set_to(float alpha) override;
70  void orientation_set_to(MirOrientation orientation) override;
71  void transformation_set_to(glm::mat4 const& t) override;
73  void cursor_image_set_to(graphics::CursorImage const& image) override;
74  void client_surface_close_requested() override;
75 };
76 
77 class BasicSurface : public Surface
78 {
79 public:
81  std::string const& name,
83  bool nonrectangular,
84  std::shared_ptr<compositor::BufferStream> const& buffer_stream,
85  std::shared_ptr<input::InputChannel> const& input_channel,
86  std::shared_ptr<input::InputSender> const& sender,
87  std::shared_ptr<graphics::CursorImage> const& cursor_image,
88  std::shared_ptr<SceneReport> const& report);
89 
91  std::string const& name,
93  std::weak_ptr<Surface> const& parent,
94  bool nonrectangular,
95  std::shared_ptr<compositor::BufferStream> const& buffer_stream,
96  std::shared_ptr<input::InputChannel> const& input_channel,
97  std::shared_ptr<input::InputSender> const& sender,
98  std::shared_ptr<graphics::CursorImage> const& cursor_image,
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  geometry::Size client_size() const override;
110 
111  MirPixelFormat pixel_format() const override;
112 
113  std::shared_ptr<graphics::Buffer> snapshot_buffer() const;
114  void swap_buffers(graphics::Buffer* old_buffer, std::function<void(graphics::Buffer* new_buffer)> complete) override;
115  void force_requests_to_complete() override;
116 
117  bool supports_input() const override;
118  int client_input_fd() const override;
119  void allow_framedropping(bool) override;
120  std::shared_ptr<input::InputChannel> input_channel() const override;
121  input::InputReceptionMode reception_mode() const override;
122  void set_reception_mode(input::InputReceptionMode mode) override;
123 
124  void set_input_region(std::vector<geometry::Rectangle> const& input_rectangles) override;
125 
126  std::shared_ptr<compositor::BufferStream> buffer_stream() const;
127 
128  void resize(geometry::Size const& size) override;
129  geometry::Point top_left() const override;
130  geometry::Rectangle input_bounds() const override;
131  bool input_area_contains(geometry::Point const& point) const override;
132  void consume(MirEvent const& event) override;
133  void set_alpha(float alpha) override;
134  void set_orientation(MirOrientation orientation) override;
135  void set_transformation(glm::mat4 const&) override;
136 
137  bool visible() const override;
138 
139  std::unique_ptr<graphics::Renderable> compositor_snapshot(void const* compositor_id) const override;
140  int buffers_ready_for_compositor(void const* compositor_id) const override;
141 
143  std::function<void(graphics::Buffer&)> const& exec) override;
144 
145  MirSurfaceType type() const override;
146  MirSurfaceState state() const override;
147  void take_input_focus(std::shared_ptr<shell::InputTargeter> const& targeter) override;
148  int configure(MirSurfaceAttrib attrib, int value) override;
149  int query(MirSurfaceAttrib attrib) override;
150  void hide() override;
151  void show() override;
152 
153  void set_cursor_image(std::shared_ptr<graphics::CursorImage> const& image) override;
154  std::shared_ptr<graphics::CursorImage> cursor_image() const override;
155 
156  void request_client_surface_close() override;
157 
158  std::shared_ptr<Surface> parent() const override;
159 
160  void add_observer(std::shared_ptr<SurfaceObserver> const& observer) override;
161  void remove_observer(std::weak_ptr<SurfaceObserver> const& observer) override;
162 
163  int dpi() const;
164 
165 private:
166  bool visible(std::unique_lock<std::mutex>&) const;
167  MirSurfaceType set_type(MirSurfaceType t); // Use configure() to make public changes
168  MirSurfaceState set_state(MirSurfaceState s);
169  int set_dpi(int);
170  MirSurfaceVisibility set_visibility(MirSurfaceVisibility v);
171  int set_swap_interval(int);
172  MirSurfaceFocusState set_focus_state(MirSurfaceFocusState f);
173  MirOrientationMode set_preferred_orientation(MirOrientationMode mode);
174 
175  SurfaceObservers observers;
176  std::mutex mutable guard;
177  std::string const surface_name;
178  geometry::Rectangle surface_rect;
179  glm::mat4 transformation_matrix;
180  float surface_alpha;
181  bool first_frame_posted;
182  bool hidden;
183  input::InputReceptionMode input_mode;
184  const bool nonrectangular;
185  std::vector<geometry::Rectangle> custom_input_rectangles;
186  std::shared_ptr<compositor::BufferStream> const surface_buffer_stream;
187  std::shared_ptr<input::InputChannel> const server_input_channel;
188  std::shared_ptr<input::InputSender> const input_sender;
189  std::shared_ptr<graphics::CursorImage> cursor_image_;
190  std::shared_ptr<SceneReport> const report;
191  std::weak_ptr<Surface> const parent_;
192 
193  // Surface attributes:
196  int swapinterval_ = 1;
198  int dpi_ = 0;
200  MirOrientationMode pref_orientation_mode = mir_orientation_mode_any;
201 };
202 
203 }
204 }
205 
206 #endif // MIR_SCENE_BASIC_SURFACE_H_
Definition: size.h:30
void transformation_set_to(glm::mat4 const &t) override
Definition: basic_surface.cpp:85
geometry::Rectangle input_bounds() const override
Definition: basic_surface.cpp:303
All things Mir.
Definition: buffer_stream.h:37
void frame_posted(int frames_available) override
Definition: basic_surface.cpp:67
int query(MirSurfaceAttrib attrib) override
Definition: basic_surface.cpp:546
std::shared_ptr< input::InputChannel > input_channel() const override
Definition: basic_surface.cpp:261
std::shared_ptr< graphics::Buffer > snapshot_buffer() const
Definition: basic_surface.cpp:242
std::shared_ptr< graphics::CursorImage > cursor_image() const override
Definition: basic_surface.cpp:584
void hide() override
Definition: basic_surface.cpp:563
void remove_observer(std::weak_ptr< SurfaceObserver > const &observer) override
Definition: basic_surface.cpp:645
~BasicSurface() noexcept
Definition: basic_surface.cpp:157
Definition: point.h:30
void set_reception_mode(input::InputReceptionMode mode) override
Definition: basic_surface.cpp:378
void set_cursor_image(std::shared_ptr< graphics::CursorImage > const &image) override
Definition: basic_surface.cpp:573
input::InputReceptionMode reception_mode() const override
Definition: basic_surface.cpp:373
void consume(MirEvent const &event) override
Definition: basic_surface.cpp:742
bool visible() const override
Definition: basic_surface.cpp:362
std::string name() const override
Definition: basic_surface.cpp:170
void resized_to(geometry::Size const &size) override
Definition: basic_surface.cpp:49
void show() override
Definition: basic_surface.cpp:568
void force_requests_to_complete() override
Definition: basic_surface.cpp:152
void alpha_set_to(float alpha) override
Definition: basic_surface.cpp:73
void client_surface_close_requested() override
Definition: basic_surface.cpp:103
int configure(MirSurfaceAttrib attrib, int value) override
Definition: basic_surface.cpp:511
Definition: common.h:93
void set_orientation(MirOrientation orientation) override
Definition: basic_surface.cpp:348
int dpi() const
Definition: basic_surface.cpp:595
void set_hidden(bool is_hidden)
Definition: basic_surface.cpp:190
Definition: common.h:86
void resize(geometry::Size const &size) override
Definition: basic_surface.cpp:272
std::shared_ptr< compositor::BufferStream > buffer_stream() const
Definition: basic_surface.cpp:165
void allow_framedropping(bool) override
Definition: basic_surface.cpp:237
Definition: surface_observer.h:42
geometry::Point top_left() const override
Top-left corner (of the window frame if present)
Definition: basic_surface.cpp:297
void take_input_focus(std::shared_ptr< shell::InputTargeter > const &targeter) override
Definition: basic_surface.cpp:506
void reception_mode_set_to(input::InputReceptionMode mode) override
Definition: basic_surface.cpp:97
MirOrientation
Direction relative to the "natural" orientation of the display.
Definition: common.h:142
void moved_to(geometry::Point const &top_left) override
Definition: basic_surface.cpp:55
int buffers_ready_for_compositor(void const *compositor_id) const override
Definition: basic_surface.cpp:736
Definition: cursor_image.h:30
std::unique_ptr< graphics::Renderable > compositor_snapshot(void const *compositor_id) const override
Definition: basic_surface.cpp:721
float alpha() const override
Definition: basic_surface.cpp:184
MirSurfaceState
Definition: common.h:66
std::shared_ptr< Surface > parent() const override
Definition: basic_surface.cpp:653
void cursor_image_set_to(graphics::CursorImage const &image) override
Definition: basic_surface.cpp:91
MirSurfaceState state() const override
Definition: basic_surface.cpp:422
geometry::Size size() const override
Size of the surface including window frame (if any)
Definition: basic_surface.cpp:199
void set_input_region(std::vector< geometry::Rectangle > const &input_rectangles) override
Sets the input region for this surface.
Definition: basic_surface.cpp:266
void orientation_set_to(MirOrientation orientation) override
Definition: basic_surface.cpp:79
MirSurfaceAttrib
Attributes of a surface that the client and server/shell may wish to get or set over the wire...
Definition: common.h:36
void with_most_recent_buffer_do(std::function< void(graphics::Buffer &)> const &exec) override
Definition: basic_surface.cpp:387
MirSurfaceType
Definition: common.h:50
Definition: basic_surface.h:77
MirPixelFormat
The order of components in a format enum matches the order of the components as they would be written...
Definition: common.h:127
MirPixelFormat pixel_format() const override
Definition: basic_surface.cpp:211
MirSurfaceFocusState
Definition: common.h:84
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< input::InputSender > const &sender, std::shared_ptr< graphics::CursorImage > const &cursor_image, std::shared_ptr< SceneReport > const &report)
bool input_area_contains(geometry::Point const &point) const override
Definition: basic_surface.cpp:310
MirSurfaceVisibility
Definition: common.h:90
void attrib_changed(MirSurfaceAttrib attrib, int value) override
Definition: basic_surface.cpp:43
int client_input_fd() const override
Definition: basic_surface.cpp:254
void set_alpha(float alpha) override
Definition: basic_surface.cpp:339
void set_transformation(glm::mat4 const &) override
Definition: basic_surface.cpp:353
geometry::Size client_size() const override
Size of the client area of the surface (excluding any decorations)
Definition: basic_surface.cpp:205
Definition: rectangle.h:33
Definition: basic_observers.h:28
Definition: basic_surface.h:58
Definition: common.h:69
void hidden_set_to(bool hide) override
Definition: basic_surface.cpp:61
void swap_buffers(graphics::Buffer *old_buffer, std::function< void(graphics::Buffer *new_buffer)> complete) override
Definition: basic_surface.cpp:216
bool supports_input() const override
Definition: basic_surface.cpp:247
void request_client_surface_close() override
Definition: basic_surface.cpp:590
Definition: event_deprecated.h:237
Definition: common.h:160
MirSurfaceType type() const override
Definition: basic_surface.cpp:395
Definition: buffer.h:34
MirOrientationMode
Definition: common.h:150
InputReceptionMode
Definition: input_reception_mode.h:27
Definition: surface.h:40
AKA "regular".
Definition: common.h:52
int const size
Definition: make_socket_rpc_channel.cpp:51
void move_to(geometry::Point const &top_left) override
Definition: basic_surface.cpp:175
void add_observer(std::shared_ptr< SurfaceObserver > const &observer) override
Definition: basic_surface.cpp:640

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