backend-x11: check that outputs and heads are in fact ours
As a first step towards heterogeneous outputs, ignore other backends' heads and outputs. This is done by checking the destroy callbacks for heads and outputs. See: https://gitlab.freedesktop.org/wayland/weston/-/issues/268 Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
This commit is contained in:
parent
69c4cec4f1
commit
060ef82d93
@ -151,15 +151,25 @@ struct window_delete_data {
|
||||
|
||||
struct gl_renderer_interface *gl_renderer;
|
||||
|
||||
static void
|
||||
x11_head_destroy(struct weston_head *base);
|
||||
|
||||
static inline struct x11_head *
|
||||
to_x11_head(struct weston_head *base)
|
||||
{
|
||||
if (base->backend_id != x11_head_destroy)
|
||||
return NULL;
|
||||
return container_of(base, struct x11_head, base);
|
||||
}
|
||||
|
||||
static void
|
||||
x11_output_destroy(struct weston_output *base);
|
||||
|
||||
static inline struct x11_output *
|
||||
to_x11_output(struct weston_output *base)
|
||||
{
|
||||
if (base->destroy != x11_output_destroy)
|
||||
return NULL;
|
||||
return container_of(base, struct x11_output, base);
|
||||
}
|
||||
|
||||
@ -420,7 +430,11 @@ x11_output_repaint_gl(struct weston_output *output_base,
|
||||
pixman_region32_t *damage)
|
||||
{
|
||||
struct x11_output *output = to_x11_output(output_base);
|
||||
struct weston_compositor *ec = output->base.compositor;
|
||||
struct weston_compositor *ec;
|
||||
|
||||
assert(output);
|
||||
|
||||
ec = output->base.compositor;
|
||||
|
||||
ec->renderer->repaint_output(output_base, damage);
|
||||
|
||||
@ -435,8 +449,8 @@ static void
|
||||
set_clip_for_output(struct weston_output *output_base, pixman_region32_t *region)
|
||||
{
|
||||
struct x11_output *output = to_x11_output(output_base);
|
||||
struct weston_compositor *ec = output->base.compositor;
|
||||
struct x11_backend *b = to_x11_backend(ec);
|
||||
struct weston_compositor *ec;
|
||||
struct x11_backend *b;
|
||||
pixman_region32_t transformed_region;
|
||||
pixman_box32_t *rects;
|
||||
xcb_rectangle_t *output_rects;
|
||||
@ -444,6 +458,12 @@ set_clip_for_output(struct weston_output *output_base, pixman_region32_t *region
|
||||
int nrects, i;
|
||||
xcb_generic_error_t *err;
|
||||
|
||||
if (!output)
|
||||
return;
|
||||
|
||||
ec = output->base.compositor;
|
||||
b = to_x11_backend(ec);
|
||||
|
||||
pixman_region32_init(&transformed_region);
|
||||
pixman_region32_copy(&transformed_region, region);
|
||||
pixman_region32_translate(&transformed_region,
|
||||
@ -488,11 +508,16 @@ x11_output_repaint_shm(struct weston_output *output_base,
|
||||
pixman_region32_t *damage)
|
||||
{
|
||||
struct x11_output *output = to_x11_output(output_base);
|
||||
struct weston_compositor *ec = output->base.compositor;
|
||||
struct x11_backend *b = to_x11_backend(ec);
|
||||
struct weston_compositor *ec;
|
||||
struct x11_backend *b;
|
||||
xcb_void_cookie_t cookie;
|
||||
xcb_generic_error_t *err;
|
||||
|
||||
assert(output);
|
||||
|
||||
ec = output->base.compositor;
|
||||
b = to_x11_backend(ec);
|
||||
|
||||
pixman_renderer_output_set_buffer(output_base, output->hw_surface);
|
||||
ec->renderer->repaint_output(output_base, damage);
|
||||
|
||||
@ -565,13 +590,13 @@ x11_output_set_wm_protocols(struct x11_backend *b,
|
||||
}
|
||||
|
||||
struct wm_normal_hints {
|
||||
uint32_t flags;
|
||||
uint32_t flags;
|
||||
uint32_t pad[4];
|
||||
int32_t min_width, min_height;
|
||||
int32_t max_width, max_height;
|
||||
int32_t width_inc, height_inc;
|
||||
int32_t min_aspect_x, min_aspect_y;
|
||||
int32_t max_aspect_x, max_aspect_y;
|
||||
int32_t width_inc, height_inc;
|
||||
int32_t min_aspect_x, min_aspect_y;
|
||||
int32_t max_aspect_x, max_aspect_y;
|
||||
int32_t base_width, base_height;
|
||||
int32_t win_gravity;
|
||||
};
|
||||
@ -801,12 +826,13 @@ static int
|
||||
x11_output_switch_mode(struct weston_output *base, struct weston_mode *mode)
|
||||
{
|
||||
struct x11_backend *b;
|
||||
struct x11_output *output;
|
||||
struct x11_output *output = to_x11_output(base);
|
||||
static uint32_t values[2];
|
||||
int ret;
|
||||
|
||||
assert(output);
|
||||
|
||||
b = to_x11_backend(base->compositor);
|
||||
output = to_x11_output(base);
|
||||
|
||||
if (mode->width == output->mode.width &&
|
||||
mode->height == output->mode.height)
|
||||
@ -878,7 +904,11 @@ static int
|
||||
x11_output_disable(struct weston_output *base)
|
||||
{
|
||||
struct x11_output *output = to_x11_output(base);
|
||||
struct x11_backend *backend = to_x11_backend(base->compositor);
|
||||
struct x11_backend *backend;
|
||||
|
||||
assert(output);
|
||||
|
||||
backend = to_x11_backend(base->compositor);
|
||||
|
||||
if (!output->base.enabled)
|
||||
return 0;
|
||||
@ -903,6 +933,8 @@ x11_output_destroy(struct weston_output *base)
|
||||
{
|
||||
struct x11_output *output = to_x11_output(base);
|
||||
|
||||
assert(output);
|
||||
|
||||
x11_output_disable(&output->base);
|
||||
weston_output_release(&output->base);
|
||||
|
||||
@ -913,7 +945,11 @@ static int
|
||||
x11_output_enable(struct weston_output *base)
|
||||
{
|
||||
struct x11_output *output = to_x11_output(base);
|
||||
struct x11_backend *b = to_x11_backend(base->compositor);
|
||||
struct x11_backend *b;
|
||||
|
||||
assert(output);
|
||||
|
||||
b = to_x11_backend(base->compositor);
|
||||
|
||||
static const char name[] = "Weston Compositor";
|
||||
static const char class[] = "weston-1\0Weston Compositor";
|
||||
@ -1077,11 +1113,17 @@ static int
|
||||
x11_output_set_size(struct weston_output *base, int width, int height)
|
||||
{
|
||||
struct x11_output *output = to_x11_output(base);
|
||||
struct x11_backend *b = to_x11_backend(base->compositor);
|
||||
struct x11_backend *b;
|
||||
struct weston_head *head;
|
||||
xcb_screen_t *scrn = b->screen;
|
||||
xcb_screen_t *scrn;
|
||||
int output_width, output_height;
|
||||
|
||||
if (!output)
|
||||
return -1;
|
||||
|
||||
b = to_x11_backend(base->compositor);
|
||||
scrn = b->screen;
|
||||
|
||||
/* We can only be called once. */
|
||||
assert(!output->base.current_mode);
|
||||
|
||||
@ -1163,6 +1205,9 @@ x11_head_create(struct weston_compositor *compositor, const char *name)
|
||||
return -1;
|
||||
|
||||
weston_head_init(&head->base, name);
|
||||
|
||||
head->base.backend_id = x11_head_destroy;
|
||||
|
||||
weston_head_set_connection_status(&head->base, true);
|
||||
weston_compositor_add_head(compositor, &head->base);
|
||||
|
||||
@ -1170,8 +1215,12 @@ x11_head_create(struct weston_compositor *compositor, const char *name)
|
||||
}
|
||||
|
||||
static void
|
||||
x11_head_destroy(struct x11_head *head)
|
||||
x11_head_destroy(struct weston_head *base)
|
||||
{
|
||||
struct x11_head *head = to_x11_head(base);
|
||||
|
||||
assert(head);
|
||||
|
||||
weston_head_release(&head->base);
|
||||
free(head);
|
||||
}
|
||||
@ -1790,8 +1839,10 @@ x11_destroy(struct weston_compositor *ec)
|
||||
|
||||
weston_compositor_shutdown(ec); /* destroys outputs, too */
|
||||
|
||||
wl_list_for_each_safe(base, next, &ec->head_list, compositor_link)
|
||||
x11_head_destroy(to_x11_head(base));
|
||||
wl_list_for_each_safe(base, next, &ec->head_list, compositor_link) {
|
||||
if (to_x11_head(base))
|
||||
x11_head_destroy(base);
|
||||
}
|
||||
|
||||
XCloseDisplay(backend->dpy);
|
||||
free(backend);
|
||||
|
Loading…
Reference in New Issue
Block a user