diff --git a/src/compositor-x11.c b/src/compositor-x11.c index 1c53e3b5..9a239969 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);