we were using wrong iterator for xcb_render_pictforminfo_t type, the formats_reply->length; valgrind was shouting it loudly. Another issue this patch addresses is that now find_depth returns the first util and valid format that matches the desired depth; it doesn't continue through the loop until the end.
This reverts part of commit 5ea11b69. Signed-off-by: Tiago Vignatti <[email protected]> --- src/xwayland/window-manager.c | 49 +++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c index 6e032ea..b922e9b 100644 --- a/src/xwayland/window-manager.c +++ b/src/xwayland/window-manager.c @@ -963,6 +963,37 @@ weston_wm_handle_event(int fd, uint32_t mask, void *data) return count; } +static xcb_render_pictforminfo_t * +find_depth (xcb_connection_t *c, int depth) +{ + xcb_render_query_pict_formats_reply_t *formats; + xcb_render_query_pict_formats_cookie_t cookie; + xcb_render_pictforminfo_iterator_t i; + + cookie = xcb_render_query_pict_formats (c); + xcb_flush (c); + + formats = xcb_render_query_pict_formats_reply (c, cookie, 0); + if (formats == NULL) + return NULL; + + for (i = xcb_render_query_pict_formats_formats_iterator (formats); + i.rem; + xcb_render_pictforminfo_next (&i)) + { + if (XCB_RENDER_PICT_TYPE_DIRECT != i.data->type) + continue; + + if (depth != i.data->depth) + continue; + + return i.data; + } + + free (formats); + return NULL; +} + static void wxs_wm_get_resources(struct weston_wm *wm) { @@ -1024,15 +1055,10 @@ wxs_wm_get_resources(struct weston_wm *wm) xcb_xfixes_query_version_reply_t *xfixes_reply; xcb_intern_atom_cookie_t cookies[ARRAY_LENGTH(atoms)]; xcb_intern_atom_reply_t *reply; - xcb_render_query_pict_formats_reply_t *formats_reply; - xcb_render_query_pict_formats_cookie_t formats_cookie; - xcb_render_pictforminfo_t *formats; uint32_t i; xcb_prefetch_extension_data (wm->conn, &xcb_xfixes_id); - formats_cookie = xcb_render_query_pict_formats(wm->conn); - for (i = 0; i < ARRAY_LENGTH(atoms); i++) cookies[i] = xcb_intern_atom (wm->conn, 0, strlen(atoms[i].name), @@ -1059,18 +1085,7 @@ wxs_wm_get_resources(struct weston_wm *wm) free(xfixes_reply); - formats_reply = xcb_render_query_pict_formats_reply(wm->conn, - formats_cookie, 0); - if (formats_reply == NULL) - return; - - formats = xcb_render_query_pict_formats_formats(formats_reply); - for (i = 0; i < formats_reply->length; i++) - if (formats[i].type == XCB_RENDER_PICT_TYPE_DIRECT && - formats[i].depth == 24) - wm->render_format = formats[i]; - - free(formats_reply); + wm->render_format = *(find_depth(wm->conn, 24)); } static void -- 1.7.9.5 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
