compositor-rdp: migrate to head-based output API
Follow the starndard patttern as the other backends, headless and x11 in particular, to stop relying on the implicit weston_output::head. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk> Reviewed-by: Ian Ray <ian.ray@ge.com> Acked-by: Daniel Stone <daniels@collabora.com> Acked-by: Derek Foreman <derekf@osg.samsung.com>
This commit is contained in:
+53
-11
@@ -130,6 +130,10 @@ struct rdp_peers_item {
|
|||||||
struct wl_list link;
|
struct wl_list link;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct rdp_head {
|
||||||
|
struct weston_head base;
|
||||||
|
};
|
||||||
|
|
||||||
struct rdp_output {
|
struct rdp_output {
|
||||||
struct weston_output base;
|
struct weston_output base;
|
||||||
struct wl_event_source *finish_frame_timer;
|
struct wl_event_source *finish_frame_timer;
|
||||||
@@ -152,6 +156,12 @@ struct rdp_peer_context {
|
|||||||
};
|
};
|
||||||
typedef struct rdp_peer_context RdpPeerContext;
|
typedef struct rdp_peer_context RdpPeerContext;
|
||||||
|
|
||||||
|
static inline struct rdp_head *
|
||||||
|
to_rdp_head(struct weston_head *base)
|
||||||
|
{
|
||||||
|
return container_of(base, struct rdp_head, base);
|
||||||
|
}
|
||||||
|
|
||||||
static inline struct rdp_output *
|
static inline struct rdp_output *
|
||||||
to_rdp_output(struct weston_output *base)
|
to_rdp_output(struct weston_output *base)
|
||||||
{
|
{
|
||||||
@@ -482,13 +492,20 @@ rdp_output_set_size(struct weston_output *base,
|
|||||||
int width, int height)
|
int width, int height)
|
||||||
{
|
{
|
||||||
struct rdp_output *output = to_rdp_output(base);
|
struct rdp_output *output = to_rdp_output(base);
|
||||||
struct weston_head *head = &output->base.head;
|
struct weston_head *head;
|
||||||
struct weston_mode *currentMode;
|
struct weston_mode *currentMode;
|
||||||
struct weston_mode initMode;
|
struct weston_mode initMode;
|
||||||
|
|
||||||
/* We can only be called once. */
|
/* We can only be called once. */
|
||||||
assert(!output->base.current_mode);
|
assert(!output->base.current_mode);
|
||||||
|
|
||||||
|
wl_list_for_each(head, &output->base.head_list, output_link) {
|
||||||
|
weston_head_set_monitor_strings(head, "weston", "rdp", NULL);
|
||||||
|
|
||||||
|
/* XXX: Calculate proper size. */
|
||||||
|
weston_head_set_physical_size(head, width, height);
|
||||||
|
}
|
||||||
|
|
||||||
wl_list_init(&output->peers);
|
wl_list_init(&output->peers);
|
||||||
|
|
||||||
initMode.flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
|
initMode.flags = WL_OUTPUT_MODE_CURRENT | WL_OUTPUT_MODE_PREFERRED;
|
||||||
@@ -502,11 +519,6 @@ rdp_output_set_size(struct weston_output *base,
|
|||||||
|
|
||||||
output->base.current_mode = output->base.native_mode = currentMode;
|
output->base.current_mode = output->base.native_mode = currentMode;
|
||||||
|
|
||||||
weston_head_set_monitor_strings(head, "weston", "rdp", NULL);
|
|
||||||
|
|
||||||
/* XXX: Calculate proper size. */
|
|
||||||
weston_head_set_physical_size(head, width, height);
|
|
||||||
|
|
||||||
output->base.start_repaint_loop = rdp_output_start_repaint_loop;
|
output->base.start_repaint_loop = rdp_output_start_repaint_loop;
|
||||||
output->base.repaint = rdp_output_repaint;
|
output->base.repaint = rdp_output_repaint;
|
||||||
output->base.assign_planes = NULL;
|
output->base.assign_planes = NULL;
|
||||||
@@ -576,33 +588,62 @@ rdp_output_destroy(struct weston_output *base)
|
|||||||
free(output);
|
free(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static struct weston_output *
|
||||||
rdp_backend_create_output(struct weston_compositor *compositor)
|
rdp_output_create(struct weston_compositor *compositor, const char *name)
|
||||||
{
|
{
|
||||||
struct rdp_output *output;
|
struct rdp_output *output;
|
||||||
|
|
||||||
output = zalloc(sizeof *output);
|
output = zalloc(sizeof *output);
|
||||||
if (output == NULL)
|
if (output == NULL)
|
||||||
return -1;
|
return NULL;
|
||||||
|
|
||||||
weston_output_init(&output->base, compositor, "rdp");
|
weston_output_init(&output->base, compositor, name);
|
||||||
|
|
||||||
output->base.destroy = rdp_output_destroy;
|
output->base.destroy = rdp_output_destroy;
|
||||||
output->base.disable = rdp_output_disable;
|
output->base.disable = rdp_output_disable;
|
||||||
output->base.enable = rdp_output_enable;
|
output->base.enable = rdp_output_enable;
|
||||||
|
output->base.attach_head = NULL;
|
||||||
|
|
||||||
weston_compositor_add_pending_output(&output->base, compositor);
|
weston_compositor_add_pending_output(&output->base, compositor);
|
||||||
|
|
||||||
|
return &output->base;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
rdp_head_create(struct weston_compositor *compositor, const char *name)
|
||||||
|
{
|
||||||
|
struct rdp_head *head;
|
||||||
|
|
||||||
|
head = zalloc(sizeof *head);
|
||||||
|
if (!head)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
weston_head_init(&head->base, name);
|
||||||
|
weston_head_set_connection_status(&head->base, true);
|
||||||
|
weston_compositor_add_head(compositor, &head->base);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
rdp_head_destroy(struct rdp_head *head)
|
||||||
|
{
|
||||||
|
weston_head_release(&head->base);
|
||||||
|
free(head);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rdp_destroy(struct weston_compositor *ec)
|
rdp_destroy(struct weston_compositor *ec)
|
||||||
{
|
{
|
||||||
struct rdp_backend *b = to_rdp_backend(ec);
|
struct rdp_backend *b = to_rdp_backend(ec);
|
||||||
|
struct weston_head *base, *next;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
weston_compositor_shutdown(ec);
|
weston_compositor_shutdown(ec);
|
||||||
|
|
||||||
|
wl_list_for_each_safe(base, next, &ec->head_list, compositor_link)
|
||||||
|
rdp_head_destroy(to_rdp_head(base));
|
||||||
|
|
||||||
for (i = 0; i < MAX_FREERDP_FDS; i++)
|
for (i = 0; i < MAX_FREERDP_FDS; i++)
|
||||||
if (b->listener_events[i])
|
if (b->listener_events[i])
|
||||||
wl_event_source_remove(b->listener_events[i]);
|
wl_event_source_remove(b->listener_events[i]);
|
||||||
@@ -1298,6 +1339,7 @@ rdp_backend_create(struct weston_compositor *compositor,
|
|||||||
|
|
||||||
b->compositor = compositor;
|
b->compositor = compositor;
|
||||||
b->base.destroy = rdp_destroy;
|
b->base.destroy = rdp_destroy;
|
||||||
|
b->base.create_output = rdp_output_create;
|
||||||
b->rdp_key = config->rdp_key ? strdup(config->rdp_key) : NULL;
|
b->rdp_key = config->rdp_key ? strdup(config->rdp_key) : NULL;
|
||||||
b->no_clients_resize = config->no_clients_resize;
|
b->no_clients_resize = config->no_clients_resize;
|
||||||
|
|
||||||
@@ -1319,7 +1361,7 @@ rdp_backend_create(struct weston_compositor *compositor,
|
|||||||
if (pixman_renderer_init(compositor) < 0)
|
if (pixman_renderer_init(compositor) < 0)
|
||||||
goto err_compositor;
|
goto err_compositor;
|
||||||
|
|
||||||
if (rdp_backend_create_output(compositor) < 0)
|
if (rdp_head_create(compositor, "rdp") < 0)
|
||||||
goto err_compositor;
|
goto err_compositor;
|
||||||
|
|
||||||
compositor->capabilities |= WESTON_CAP_ARBITRARY_MODES;
|
compositor->capabilities |= WESTON_CAP_ARBITRARY_MODES;
|
||||||
|
|||||||
Reference in New Issue
Block a user