Mir
mir_surface.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2012, 2015 Canonical Ltd.
3  *
4  * This program is free software: you can redistribute it and/or modify it
5  * under the terms of the GNU Lesser 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 Lesser General Public License for more details.
12  *
13  * You should have received a copy of the GNU Lesser General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * Authored by: Kevin DuBois <kevin.dubois@canonical.com>
17  */
18 #ifndef MIR_CLIENT_MIR_SURFACE_H_
19 #define MIR_CLIENT_MIR_SURFACE_H_
20 
22 #include "client_buffer_stream.h"
23 #include "mir_wait_handle.h"
24 #include "rpc/mir_display_server.h"
26 
27 #include "mir/client_platform.h"
28 #include "mir/optional_value.h"
30 #include "mir_toolkit/common.h"
33 
34 #include <memory>
35 #include <functional>
36 #include <mutex>
37 #include <unordered_set>
38 
39 namespace mir
40 {
41 namespace dispatch
42 {
43 class ThreadedDispatcher;
44 }
45 namespace input
46 {
47 namespace receiver
48 {
49 class InputPlatform;
50 class XKBMapper;
51 }
52 }
53 namespace protobuf
54 {
55 class PersistentSurfaceId;
56 class Surface;
57 class SurfaceParameters;
58 class SurfaceSetting;
59 class Void;
60 }
61 namespace client
62 {
63 namespace rpc
64 {
65 class DisplayServer;
66 class DisplayServerDebug;
67 }
68 
69 class ClientBuffer;
70 class ClientBufferStream;
71 class ClientBufferStreamFactory;
72 
73 struct MemoryRegion;
74 }
75 }
76 
78 {
81  MirSurfaceSpec(MirConnection* connection, MirSurfaceParameters const& params);
82 
83  struct AspectRatio { unsigned width; unsigned height; };
84 
85  // Required parameters
86  MirConnection* connection{nullptr};
87 
88  // Optional parameters
93 
96 
100 
102  std::unique_ptr<MirPersistentId> parent_id;
105 
116 
118  {
120  void* context;
121  };
123 };
124 
126 {
127 public:
128  MirPersistentId(std::string const& string_id);
129 
130  std::string const& as_string();
131 
132 private:
133  std::string const string_id;
134 };
135 
137 {
138 public:
139  MirSurface(MirSurface const &) = delete;
140  MirSurface& operator=(MirSurface const &) = delete;
141 
142  MirSurface(std::string const& error);
143 
144  MirSurface(
145  MirConnection *allocating_connection,
148  std::shared_ptr<mir::client::ClientBufferStreamFactory> const& buffer_stream_factory,
149  std::shared_ptr<mir::input::receiver::InputPlatform> const& input_platform,
150  MirSurfaceSpec const& spec,
151  mir_surface_callback callback, void * context);
152 
153  ~MirSurface();
154 
156  mir_surface_callback callback,
157  void *context);
158 
160  char const * get_error_message();
161  int id() const;
162 
165 
166  // TODO: Some sort of extension mechanism so that this can be moved
167  // out into a separate class in the libmirclient-debug DSO.
168  bool translate_to_screen_coordinates(int x, int y,
169  int* screen_x, int* screen_y);
170 
171  // Non-blocking
172  int attrib(MirSurfaceAttrib a) const;
173 
176 
178 
180  void* context);
181  void handle_event(MirEvent const& e);
182 
184 
186 
187  MirWaitHandle* modify(MirSurfaceSpec const& changes);
188 
189  static bool is_valid(MirSurface* query);
190 
192 private:
193  mutable std::mutex mutex; // Protects all members of *this
194 
195  void on_configured();
196  void on_cursor_configured();
197  void created(mir_surface_callback callback, void* context);
198  void acquired_persistent_id(mir_surface_id_callback callback, void* context);
199  MirPixelFormat convert_ipc_pf_to_geometry(google::protobuf::int32 pf) const;
200 
201  mir::client::rpc::DisplayServer* server{nullptr};
202  mir::client::rpc::DisplayServerDebug* debug{nullptr};
203  std::unique_ptr<mir::protobuf::Surface> surface;
204  std::unique_ptr<mir::protobuf::PersistentSurfaceId> persistent_id;
205  std::string error_message;
206  std::string name;
207  std::unique_ptr<mir::protobuf::Void> void_response;
208 
209  void on_modified();
210  MirWaitHandle modify_wait_handle;
211  std::unique_ptr<mir::protobuf::Void> modify_result;
212 
213  MirConnection* const connection{nullptr};
214 
215  MirWaitHandle create_wait_handle;
216  MirWaitHandle configure_wait_handle;
217  MirWaitHandle configure_cursor_wait_handle;
218  MirWaitHandle persistent_id_wait_handle;
219 
220  std::shared_ptr<mir::client::ClientBufferStreamFactory> const buffer_stream_factory;
221  std::shared_ptr<mir::client::ClientBufferStream> buffer_stream;
222  std::shared_ptr<mir::input::receiver::InputPlatform> const input_platform;
223  std::shared_ptr<mir::input::receiver::XKBMapper> const keymapper;
224 
225  std::unique_ptr<mir::protobuf::SurfaceSetting> configure_result;
226 
227  // Cache of latest SurfaceSettings returned from the server
228  int attrib_cache[mir_surface_attribs];
230 
231  std::function<void(MirEvent const*)> handle_event_callback;
232  std::shared_ptr<mir::dispatch::ThreadedDispatcher> input_thread;
233  bool auto_resize_stream{true};
234 };
235 
236 #endif /* MIR_CLIENT_PRIVATE_MIR_WAIT_HANDLE_H_ */
MirWaitHandle * release_surface(mir_surface_callback callback, void *context)
Definition: mir_surface.cpp:372
All things Mir.
Definition: atomic_callback.h:25
mir::optional_value< AspectRatio > min_aspect
Definition: mir_surface.h:112
Definition: mir_surface.h:77
mir_surface_event_callback callback
Definition: mir_surface.h:119
Definition: mir_surface.h:136
void(* mir_surface_id_callback)(MirSurface *surface, MirPersistentId *id, void *context)
Definition: client_types.h:139
void * context
Definition: mir_surface.h:120
void(* mir_surface_event_callback)(MirSurface *surface, MirEvent const *event, void *context)
Callback for handling of surface events.
Definition: client_types.h:92
MirConnection * connection
Definition: mir_surface.h:86
Definition: mir_surface.h:83
Definition: mir_wait_handle.h:31
Definition: common.h:45
int id() const
Definition: mir_surface.cpp:252
MirWaitHandle * request_persistent_id(mir_surface_id_callback callback, void *context)
Definition: mir_surface.cpp:282
mir::optional_value< int > max_height
Definition: mir_surface.h:109
MirWaitHandle * modify(MirSurfaceSpec const &changes)
Definition: mir_surface.cpp:656
mir::optional_value< MirBufferUsage > buffer_usage
Definition: mir_surface.h:92
mir::optional_value< int > width
Definition: mir_surface.h:89
mir::optional_value< EventHandler > event_handler
Definition: mir_surface.h:122
mir::optional_value< uint32_t > output_id
Definition: mir_surface.h:95
void handle_event(MirEvent const &e)
Definition: mir_surface.cpp:573
MirWaitHandle * configure(MirSurfaceAttrib a, int value)
Definition: mir_surface.cpp:429
void set_event_handler(mir_surface_event_callback callback, void *context)
Definition: mir_surface.cpp:550
mir::optional_value< MirSurfaceType > type
Definition: mir_surface.h:97
void request_and_wait_for_configure(MirSurfaceAttrib a, int value)
Definition: mir_surface.cpp:620
mir::optional_value< MirEdgeAttachment > edge_attachment
Definition: mir_surface.h:104
static bool is_valid(MirSurface *query)
Definition: mir_surface.cpp:259
MirOrientation
Direction relative to the "natural" orientation of the display.
Definition: common.h:164
MirWaitHandle * set_preferred_orientation(MirOrientationMode mode)
Definition: mir_surface.cpp:632
mir::optional_value< int > width_inc
Definition: mir_surface.h:110
MirSurfaceParameters get_parameters() const
Definition: mir_surface.cpp:234
char const * get_error_message()
Definition: mir_surface.cpp:241
Definition: mir_surface.h:125
MirPersistentId(std::string const &string_id)
Definition: mir_surface.cpp:151
MirWaitHandle * get_create_wait_handle()
Definition: mir_surface.cpp:305
Definition: mir_display_server_debug.h:32
mir_orientation_normal
Definition: display_configuration.cpp:33
unsigned width
Definition: mir_surface.h:83
mir::optional_value< std::vector< MirBufferStreamInfo > > streams
Definition: mir_surface.h:114
std::string const & as_string()
Definition: mir_surface.cpp:156
mir::optional_value< int > height_inc
Definition: mir_surface.h:111
mir::optional_value< int > min_width
Definition: mir_surface.h:106
mir::optional_value< MirRectangle > aux_rect
Definition: mir_surface.h:103
MirSurfaceAttrib
Attributes of a surface that the client and server/shell may wish to get or set over the wire...
Definition: common.h:34
MirPixelFormat
32-bit pixel formats (8888): The order of components in the enum matches the order of the components ...
Definition: common.h:134
void(* mir_surface_callback)(MirSurface *surface, void *client_context)
Callback to be passed when calling:
Definition: client_types.h:75
bool translate_to_screen_coordinates(int x, int y, int *screen_x, int *screen_y)
Definition: mir_surface.cpp:464
MirOrientation get_orientation() const
Definition: mir_surface.cpp:625
Definition: cursor_configuration.h:34
MirSurface & operator=(MirSurface const &)=delete
mir::optional_value< AspectRatio > max_aspect
Definition: mir_surface.h:113
mir::optional_value< std::vector< MirRectangle > > input_shape
Definition: mir_surface.h:115
mir::optional_value< MirOrientationMode > pref_orientation
Definition: mir_surface.h:99
mir::optional_value< std::string > surface_name
Definition: mir_surface.h:94
mir::optional_value< MirPixelFormat > pixel_format
Definition: mir_surface.h:91
MirWaitHandle * configure_cursor(MirCursorConfiguration const *cursor)
Definition: mir_surface.cpp:400
Definition: client_buffer_stream.h:45
Definition: mir_surface.h:117
~MirSurface()
Definition: mir_surface.cpp:219
mir::optional_value< int > height
Definition: mir_surface.h:90
error
Definition: connector_report_tp.h:60
Definition: mir_connection.h:88
Definition: event_private.h:178
mir::client::ClientBufferStream * get_buffer_stream()
Definition: mir_surface.cpp:637
MirOrientationMode
Definition: common.h:172
int attrib(MirSurfaceAttrib a) const
Definition: mir_surface.cpp:535
unsigned height
Definition: mir_surface.h:83
MirSurface(MirSurface const &)=delete
std::unique_ptr< MirPersistentId > parent_id
Definition: mir_surface.h:102
mir::optional_value< int > max_width
Definition: mir_surface.h:108
mir::optional_value< MirSurfaceState > state
Definition: mir_surface.h:98
Definition: mir_display_server.h:33
MirSurfaceParameters is the structure of minimum required information that you must provide to Mir in...
Definition: client_types.h:157
mir::optional_value< MirSurface * > parent
Definition: mir_surface.h:101
mir::optional_value< int > min_height
Definition: mir_surface.h:107

Copyright © 2012-2015 Canonical Ltd.
Generated on Thu Oct 8 16:20:16 UTC 2015