[PATCH v2 weston] compositor-x11: Fix Weston running on a secondary X screen

Derek Foreman derekf at osg.samsung.com
Mon Oct 5 15:27:54 PDT 2015


From: Marko <bgz.marko at gmail.com>

When DISPLAY is anything other than #.0 weston would still use .0

Fixes
https://bugs.freedesktop.org/show_bug.cgi?id=90532

---

This has been around for far too long and it fixes a real bug...

Marko, if you're still paying attention, would you mind testing this?
Also, can we get your "Signed-off-by" for the commit?

I've rebased it against weston git master, made the totally gratuitous
changes I wanted to the loop, fixed the formatting, and handled all
the libweston changes...

It works for me, anyone that wants to test it...

Xephyr -screen 640x480 -screen 640x480 :1

DISPLAY=:1.0 weston
and
DISPLAY=:1.1 weston
will do the same thing before the patch is applied, and will work
properly after.


 src/compositor-x11.c | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index 1c53e3b..9a23996 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -130,6 +130,20 @@ struct window_delete_data {
 
 struct gl_renderer_interface *gl_renderer;
 
+static xcb_screen_t *
+x11_compositor_get_default_screen(struct x11_backend *b)
+{
+	xcb_screen_iterator_t iter;
+	int i, screen_nbr = XDefaultScreen(b->dpy);
+
+	iter = xcb_setup_roots_iterator(xcb_get_setup(b->conn));
+	for (i = 0; iter.rem; xcb_screen_next(&iter), i++)
+		if (i == screen_nbr)
+			return iter.data;
+
+	return xcb_setup_roots_iterator(xcb_get_setup(b->conn)).data;
+}
+
 static struct xkb_keymap *
 x11_backend_get_keymap(struct x11_backend *b)
 {
@@ -668,8 +682,8 @@ static int
 x11_output_init_shm(struct x11_backend *b, struct x11_output *output,
 	int width, int height)
 {
-	xcb_screen_iterator_t iter;
 	xcb_visualtype_t *visual_type;
+	xcb_screen_t *screen;
 	xcb_format_iterator_t fmt;
 	xcb_void_cookie_t cookie;
 	xcb_generic_error_t *err;
@@ -686,8 +700,8 @@ x11_output_init_shm(struct x11_backend *b, struct x11_output *output,
 		return -1;
 	}
 
-	iter = xcb_setup_roots_iterator(xcb_get_setup(b->conn));
-	visual_type = find_visual_by_id(iter.data, iter.data->root_visual);
+	screen = x11_compositor_get_default_screen(b);
+	visual_type = find_visual_by_id(screen, screen->root_visual);
 	if (!visual_type) {
 		weston_log("Failed to lookup visual for root window\n");
 		errno = ENOENT;
@@ -698,7 +712,7 @@ x11_output_init_shm(struct x11_backend *b, struct x11_output *output,
 		visual_type->red_mask,
 		visual_type->green_mask,
 		visual_type->blue_mask);
-	output->depth = get_depth_of_visual(iter.data, iter.data->root_visual);
+	output->depth = get_depth_of_visual(screen, screen->root_visual);
 	weston_log("Visual depth is %d\n", output->depth);
 
 	for (fmt = xcb_setup_pixmap_formats_iterator(xcb_get_setup(b->conn));
@@ -774,7 +788,7 @@ x11_backend_create_output(struct x11_backend *b, int x, int y,
 	static const char class[] = "weston-1\0Weston Compositor";
 	char title[32];
 	struct x11_output *output;
-	xcb_screen_iterator_t iter;
+	xcb_screen_t *screen;
 	struct wm_normal_hints normal_hints;
 	struct wl_event_loop *loop;
 	int output_width, output_height, width_mm, height_mm;
@@ -825,16 +839,16 @@ x11_backend_create_output(struct x11_backend *b, int x, int y,
 
 	values[1] = b->null_cursor;
 	output->window = xcb_generate_id(b->conn);
-	iter = xcb_setup_roots_iterator(xcb_get_setup(b->conn));
+	screen = x11_compositor_get_default_screen(b);
 	xcb_create_window(b->conn,
 			  XCB_COPY_FROM_PARENT,
 			  output->window,
-			  iter.data->root,
+			  screen->root,
 			  0, 0,
 			  output_width, output_height,
 			  0,
 			  XCB_WINDOW_CLASS_INPUT_OUTPUT,
-			  iter.data->root_visual,
+			  screen->root_visual,
 			  mask, values);
 
 	if (fullscreen) {
@@ -1529,7 +1543,6 @@ x11_backend_create(struct weston_compositor *compositor,
 	struct x11_backend *b;
 	struct x11_output *output;
 	struct weston_config_section *section;
-	xcb_screen_iterator_t s;
 	int i, x = 0, output_count = 0;
 	int width, height, scale, count;
 	const char *section_name;
@@ -1556,8 +1569,7 @@ x11_backend_create(struct weston_compositor *compositor,
 	if (xcb_connection_has_error(b->conn))
 		goto err_xdisplay;
 
-	s = xcb_setup_roots_iterator(xcb_get_setup(b->conn));
-	b->screen = s.data;
+	b->screen = x11_compositor_get_default_screen(b);
 	wl_array_init(&b->keys);
 
 	x11_backend_get_resources(b);
-- 
2.5.3



More information about the wayland-devel mailing list