Mir
mir_surface.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2012 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 
21 #include "mir_protobuf.pb.h"
22 
25 #include "mir_toolkit/common.h"
27 #include "mir/optional_value.h"
29 #include "mir_wait_handle.h"
30 #include "mir/client_platform.h"
31 #include "client_buffer_stream.h"
32 
33 #include <memory>
34 #include <functional>
35 #include <mutex>
36 #include <unordered_set>
37 
38 namespace mir
39 {
40 namespace input
41 {
42 namespace receiver
43 {
44 class InputPlatform;
45 class InputReceiverThread;
46 }
47 }
48 namespace client
49 {
50 class ClientBuffer;
51 class ClientBufferStream;
52 class ClientBufferStreamFactory;
53 
54 struct MemoryRegion;
55 }
56 }
57 
59 {
60  MirSurfaceSpec() = default;
62  MirSurfaceSpec(MirConnection* connection, MirSurfaceParameters const& params);
63 
64  mir::protobuf::SurfaceParameters serialize() const;
65 
66  // Required parameters
67  MirConnection* connection{nullptr};
68  int width{-1};
69  int height{-1};
72 
73  // Optional parameters
76 
80 
84 };
85 
86 struct MirSurface
87 {
88 public:
89  MirSurface(MirSurface const &) = delete;
90  MirSurface& operator=(MirSurface const &) = delete;
91 
92  MirSurface(std::string const& error);
93 
94  MirSurface(
95  MirConnection *allocating_connection,
96  mir::protobuf::DisplayServer::Stub& server,
97  mir::protobuf::Debug::Stub* debug,
98  std::shared_ptr<mir::client::ClientBufferStreamFactory> const& buffer_stream_factory,
99  std::shared_ptr<mir::input::receiver::InputPlatform> const& input_platform,
100  MirSurfaceSpec const& spec,
101  mir_surface_callback callback, void * context);
102 
103  ~MirSurface();
104 
106  mir_surface_callback callback,
107  void *context);
108 
110  char const * get_error_message();
111  int id() const;
112  MirWaitHandle* next_buffer(mir_surface_callback callback, void * context);
114 
117  std::shared_ptr<mir::client::ClientBuffer> get_current_buffer();
118  uint32_t get_current_buffer_id() const;
119  void get_cpu_region(MirGraphicsRegion& region);
120  EGLNativeWindowType generate_native_window();
121 
123 
124  // TODO: Some sort of extension mechanism so that this can be moved
125  // out into a separate class in the libmirclient-debug DSO.
126  bool translate_to_screen_coordinates(int x, int y,
127  int* screen_x, int* screen_y);
128 
129  // Non-blocking
130  int attrib(MirSurfaceAttrib a) const;
131 
134 
136 
137  void set_event_handler(MirEventDelegate const* delegate);
138  void handle_event(MirEvent const& e);
139 
140  /* mir::client::EGLNativeSurface */
143 
144  static bool is_valid(MirSurface* query);
145 private:
146  mutable std::mutex mutex; // Protects all members of *this
147 
148  void on_configured();
149  void on_cursor_configured();
150  void process_incoming_buffer();
151  void created(mir_surface_callback callback, void* context);
152  MirPixelFormat convert_ipc_pf_to_geometry(google::protobuf::int32 pf) const;
153 
154  mir::protobuf::DisplayServer::Stub* server{nullptr};
155  mir::protobuf::Debug::Stub* debug{nullptr};
156  mir::protobuf::Surface surface;
157  mir::protobuf::BufferRequest buffer_request;
158  std::string error_message;
159  std::string name;
160  mir::protobuf::Void void_response;
161 
162  MirConnection* const connection{nullptr};
163 
164  MirWaitHandle create_wait_handle;
165  MirWaitHandle configure_wait_handle;
166  MirWaitHandle configure_cursor_wait_handle;
167 
168  std::shared_ptr<mir::client::ClientBufferStreamFactory> const buffer_stream_factory;
169  std::shared_ptr<mir::client::ClientBufferStream> buffer_stream;
170  std::shared_ptr<mir::input::receiver::InputPlatform> const input_platform;
171 
172  mir::protobuf::SurfaceSetting configure_result;
173 
174  // Cache of latest SurfaceSettings returned from the server
175  int attrib_cache[mir_surface_attribs];
177 
178  std::function<void(MirEvent const*)> handle_event_callback;
179  std::shared_ptr<mir::input::receiver::InputReceiverThread> input_thread;
180 };
181 
182 #endif /* MIR_CLIENT_PRIVATE_MIR_WAIT_HANDLE_H_ */
std::shared_ptr< mir::client::ClientBuffer > get_current_buffer()
Definition: mir_surface.cpp:324
MirWaitHandle * release_surface(mir_surface_callback callback, void *context)
Definition: mir_surface.cpp:293
All things Mir.
Definition: buffer_stream.h:37
Definition: mir_surface.h:58
Definition: mir_surface.h:86
MirConnection * connection
Definition: mir_surface.h:67
Definition: mir_wait_handle.h:31
Definition: common.h:47
uint32_t get_current_buffer_id() const
Definition: mir_surface.cpp:331
mir::protobuf::SurfaceParameters serialize() const
Definition: mir_surface.cpp:75
int id() const
Definition: mir_surface.cpp:187
Definition: dimensions.h:35
MirPixelFormat pixel_format
Definition: mir_surface.h:70
Definition: client_types.h:130
MirSurfaceSpec()=default
mir::optional_value< uint32_t > output_id
Definition: mir_surface.h:75
void handle_event(MirEvent const &e)
Definition: mir_surface.cpp:511
Definition: mir_native_buffer.h:30
Definition: common.h:129
MirWaitHandle * next_buffer(mir_surface_callback callback, void *context)
Definition: mir_surface.cpp:216
MirWaitHandle * configure(MirSurfaceAttrib a, int value)
Definition: mir_surface.cpp:363
mir::optional_value< MirSurfaceType > type
Definition: mir_surface.h:77
void request_and_wait_for_configure(MirSurfaceAttrib a, int value)
Definition: mir_surface.cpp:553
mir::optional_value< MirEdgeAttachment > edge_attachment
Definition: mir_surface.h:83
static bool is_valid(MirSurface *query)
Definition: mir_surface.cpp:194
MirOrientation
Direction relative to the "natural" orientation of the display.
Definition: common.h:142
MirWaitHandle * set_preferred_orientation(MirOrientationMode mode)
Definition: mir_surface.cpp:565
MirSurfaceParameters get_parameters() const
Definition: mir_surface.cpp:163
char const * get_error_message()
Definition: mir_surface.cpp:176
MirWaitHandle * get_create_wait_handle()
Definition: mir_surface.cpp:226
MirBufferUsage buffer_usage
Definition: mir_surface.h:71
MirEventDelegate may be used to specify (at surface creation time) callbacks for handling of events...
Definition: client_types.h:282
MirNativeBuffer * get_current_buffer_package()
Definition: mir_surface.cpp:316
Definition: dimensions.h:35
mir_orientation_normal
Definition: display_configuration.cpp:33
int width
Definition: mir_surface.h:68
mir::optional_value< MirRectangle > aux_rect
Definition: mir_surface.h:82
MirSurfaceAttrib
Attributes of a surface that the client and server/shell may wish to get or set over the wire...
Definition: common.h:36
MirBufferUsage
MirBufferUsage specifies how a surface can and will be used.
Definition: client_types.h:128
MirPixelFormat
The order of components in a format enum matches the order of the components as they would be written...
Definition: common.h:127
void(* mir_surface_callback)(MirSurface *surface, void *client_context)
Callback to be passed when calling:
Definition: client_types.h:78
bool translate_to_screen_coordinates(int x, int y, int *screen_x, int *screen_y)
Definition: mir_surface.cpp:398
MirPlatformType platform_type()
Definition: mir_surface.cpp:540
MirOrientation get_orientation() const
Definition: mir_surface.cpp:558
Definition: cursor_configuration.h:26
MirSurface & operator=(MirSurface const &)=delete
mir::optional_value< MirOrientationMode > pref_orientation
Definition: mir_surface.h:79
int height
Definition: mir_surface.h:69
mir::optional_value< std::string > surface_name
Definition: mir_surface.h:74
MirWaitHandle * configure_cursor(MirCursorConfiguration const *cursor)
Definition: mir_surface.cpp:345
~MirSurface()
Definition: mir_surface.cpp:144
error
Definition: connector_report_tp.h:60
Definition: mir_connection.h:79
Retrieved information about a MirSurface.
Definition: client_types.h:181
Definition: event_deprecated.h:237
void request_and_wait_for_next_buffer()
Definition: mir_surface.cpp:548
MirOrientationMode
Definition: common.h:150
int attrib(MirSurfaceAttrib a) const
Definition: mir_surface.cpp:470
void set_event_handler(MirEventDelegate const *delegate)
Definition: mir_surface.cpp:485
EGLNativeWindowType generate_native_window()
Definition: mir_surface.cpp:338
MirPlatformType
The native buffer type for the system the client is connected on.
Definition: client_types.h:161
MirSurface(MirSurface const &)=delete
void get_cpu_region(MirGraphicsRegion &region)
Definition: mir_surface.cpp:204
mir::optional_value< MirSurfaceState > state
Definition: mir_surface.h:78
MirSurfaceParameters is the structure of minimum required information that you must provide to Mir in...
Definition: client_types.h:138
mir::optional_value< MirSurface * > parent
Definition: mir_surface.h:81

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