16
16
* Authored by: Robert Carr <robert.carr@canonical.com>
19
#include "application_instance_mirserver_priv.h"
20
#include "window_properties_mirserver_priv.h"
21
#include "window_mirserver_priv.h"
23
#include "mircommon/application_id_mir_priv.h"
24
#include "mircommon/application_description_mir_priv.h"
25
#include "mircommon/application_options_mir_priv.h"
26
#include "mircommon/mir/geometry/rectangles.h"
29
20
#include <ubuntu/application/init.h>
30
#include <ubuntu/application/lifecycle_delegate.h>
21
#include <ubuntu/application/instance.h>
22
#include <ubuntu/application/ui/display.h>
31
23
#include <ubuntu/application/ui/window.h>
32
#include <ubuntu/application/ui/options.h>
33
#include <ubuntu/application/ui/session.h>
34
#include <ubuntu/application/ui/clipboard.h>
35
#include <ubuntu/application/ui/display.h>
36
#include <ubuntu/application/sensors/accelerometer.h>
37
#include <ubuntu/application/sensors/proximity.h>
38
#include <ubuntu/application/sensors/light.h>
40
#include <mir/default_server_configuration.h>
42
#include <mir/graphics/display.h>
43
#include <mir/graphics/display_buffer.h>
44
#include <mir/graphics/platform.h>
45
#include <mir/graphics/graphic_buffer_allocator.h>
46
#include <mir/graphics/internal_client.h>
47
#include <mir/input/input_platform.h>
54
namespace uam = ubuntu::application::mir;
55
namespace uams = ubuntu::application::mir::server;
60
struct MirServerContext
62
std::shared_ptr<mir::graphics::Display> display;
63
std::shared_ptr<mir::graphics::GraphicBufferAllocator> buffer_allocator;
64
std::shared_ptr<mir::scene::SurfaceCoordinator> surface_coordinator;
65
std::shared_ptr<mir::scene::SessionListener> session_listener;
66
std::shared_ptr<mir::input::receiver::InputPlatform> input_platform;
67
std::shared_ptr<mir::graphics::InternalClient> egl_client;
71
global_mirserver_context()
73
static MirServerContext context;
80
27
void u_application_init(void *args)
82
auto context = global_mirserver_context();
83
mir::DefaultServerConfiguration* config = reinterpret_cast<mir::DefaultServerConfiguration*>(args);
85
context->surface_coordinator = config->the_surface_coordinator();
86
context->buffer_allocator = config->the_buffer_allocator();
87
context->display = config->the_display();
88
context->session_listener = config->the_session_listener();
89
context->input_platform = mir::input::receiver::InputPlatform::create();
90
context->egl_client = config->the_graphics_platform()->create_internal_client();
93
32
void u_application_finish()
95
auto context = global_mirserver_context();
97
context->display.reset();
98
context->surface_coordinator.reset();
99
context->session_listener.reset();
100
context->input_platform.reset();
101
context->egl_client.reset();
104
36
UApplicationInstance* u_application_instance_new_from_description_with_options(UApplicationDescription* u_description, UApplicationOptions* u_options)
106
auto surface_coordinator = global_mirserver_context()->surface_coordinator;
107
assert(surface_coordinator);
108
auto session_listener = global_mirserver_context()->session_listener;
109
assert(session_listener);
111
auto description = uam::Description::from_u_application_description(u_description);
112
auto options = uam::Options::from_u_application_options(u_options);
114
auto instance = new uams::Instance(surface_coordinator, session_listener, description, options);
116
return instance->as_u_application_instance();
120
44
u_application_instance_ref(UApplicationInstance *u_instance)
122
auto instance = uams::Instance::from_u_application_instance(u_instance);
127
50
u_application_instance_unref(UApplicationInstance *u_instance)
129
auto instance = uams::Instance::from_u_application_instance(u_instance);
134
56
u_application_instance_destroy(UApplicationInstance *instance)
136
// TODO<papi>: What are the proper semantics here.
137
u_application_instance_unref(instance);
141
62
u_application_instance_run(UApplicationInstance *instance)
154
75
void ua_ui_get_clipboard_content(void** out_content, size_t* out_content_size)
156
// TODO<mir,papi>: Implement
157
77
*out_content = NULL;
158
78
*out_content_size = 0;
161
81
UAUiDisplay* ua_ui_display_new_with_index(size_t index)
163
// TODO<mir>: Make use of index. This is kind of strangely done...
164
return reinterpret_cast<UAUiDisplay*>(index);
167
87
void ua_ui_display_destroy(UAUiDisplay* display)
169
// TODO: Implement. Or is this a noop for mirserver?
173
92
uint32_t ua_ui_display_query_horizontal_res(UAUiDisplay* display)
175
(void) display; // TODO<mir>: Multiple displays
177
auto mir_display = global_mirserver_context()->display;
180
/* TODO: Get proper configuration */
181
mir::geometry::Rectangles view_area;
182
mir_display->for_each_display_buffer([&view_area](mir::graphics::DisplayBuffer const& db)
184
view_area.add(db.view_area());
186
mir::geometry::Size const display_size{view_area.bounding_rectangle().size};
188
return display_size.width.as_uint32_t();
191
99
uint32_t ua_ui_display_query_vertical_res(UAUiDisplay* display)
193
101
(void) display; // TODO<mir>: Multiple displays
195
auto mir_display = global_mirserver_context()->display;
198
/* TODO: Get proper configuration */
199
mir::geometry::Rectangles view_area;
200
mir_display->for_each_display_buffer([&view_area](mir::graphics::DisplayBuffer const& db)
202
view_area.add(db.view_area());
204
mir::geometry::Size const display_size{view_area.bounding_rectangle().size};
206
return display_size.height.as_uint32_t();
209
106
EGLNativeDisplayType ua_ui_display_get_native_type(UAUiDisplay* display)
211
auto internal_client = global_mirserver_context()->egl_client;
212
assert(internal_client);
214
return internal_client->egl_native_display();
219
static MirPixelFormat choose_pixel_format(std::shared_ptr<mir::graphics::GraphicBufferAllocator> const& allocator)
221
auto formats = allocator->supported_pixel_formats();
226
112
UAUiWindowProperties* ua_ui_window_properties_new_for_normal_window()
228
auto properties = new uams::WindowProperties();
230
return properties->as_u_window_properties();
233
117
void ua_ui_window_properties_destroy(UAUiWindowProperties* u_properties)
235
auto properties = uams::WindowProperties::from_u_window_properties(u_properties);
239
122
void ua_ui_window_properties_set_titlen(UAUiWindowProperties* u_properties, const char* title, size_t title_length)
241
auto properties = uams::WindowProperties::from_u_window_properties(u_properties);
242
properties->set_title(title, title_length);
245
129
const char* ua_ui_window_properties_get_title(UAUiWindowProperties* u_properties)
247
auto properties = uams::WindowProperties::from_u_window_properties(u_properties);
248
return properties->surface_parameters().name.c_str();
251
135
void ua_ui_window_properties_set_role(UAUiWindowProperties* properties, UAUiWindowRole role)
253
// TODO<papi>: Implement. Or is this a noop for us?
254
137
(void) properties;
258
void ua_ui_window_properties_set_event_cb_and_ctx(UAUiWindowProperties*, UAUiWindowEventCb, void*)
141
void ua_ui_window_properties_set_event_cb_and_ctx(UAUiWindowProperties* u_properties, UAUiWindowEventCb cb, void* ctx)
262
148
void ua_ui_window_properties_set_input_cb_and_ctx(UAUiWindowProperties* u_properties, UAUiWindowInputEventCb cb, void* ctx)
264
auto properties = uams::WindowProperties::from_u_window_properties(u_properties);
265
properties->set_input_cb_and_ctx(cb, ctx);
268
155
void ua_ui_window_properties_set_dimensions(UAUiWindowProperties *u_properties, uint32_t width, uint32_t height)
270
auto properties = uams::WindowProperties::from_u_window_properties(u_properties);
271
properties->set_dimensions(width, height);
274
162
UAUiWindow* ua_ui_window_new_for_application_with_properties(UApplicationInstance* u_instance, UAUiWindowProperties* u_properties)
276
auto input_platform = global_mirserver_context()->input_platform;
277
assert(input_platform);
278
auto internal_client = global_mirserver_context()->egl_client;
279
assert(internal_client);
281
auto instance = uams::Instance::from_u_application_instance(u_instance);
282
auto properties = uams::WindowProperties::from_u_window_properties(u_properties);
285
properties->set_pixel_format(choose_pixel_format(global_mirserver_context()->buffer_allocator));
287
auto window = new uams::Window(*instance, properties, input_platform, internal_client);
289
return window->as_u_window();
292
169
void ua_ui_window_destroy(UAUiWindow* u_window)
294
auto window = uams::Window::from_u_window(u_window);
298
174
void ua_ui_window_get_size(UAUiWindow* u_window, uint32_t *width, uint32_t *height)