Fetch xcb_render_pictformat_t at startup
This commit is contained in:
		
							parent
							
								
									3f4ad47421
								
							
						
					
					
						commit
						bb76f52640
					
				|  | @ -1175,7 +1175,7 @@ static void xwm_get_visual_and_colormap(struct wlr_xwm *xwm) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (visualtype == NULL) { | 	if (visualtype == NULL) { | ||||||
| 		wlr_log(L_DEBUG, "no 32 bit visualtype\n"); | 		wlr_log(L_DEBUG, "No 32 bit visualtype\n"); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -1188,8 +1188,36 @@ static void xwm_get_visual_and_colormap(struct wlr_xwm *xwm) { | ||||||
| 		xwm->visual_id); | 		xwm->visual_id); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void xwm_get_render_format(struct wlr_xwm *xwm) { | ||||||
|  | 	xcb_render_query_pict_formats_cookie_t cookie = | ||||||
|  | 		xcb_render_query_pict_formats(xwm->xcb_conn); | ||||||
|  | 	xcb_render_query_pict_formats_reply_t *reply = | ||||||
|  | 		xcb_render_query_pict_formats_reply(xwm->xcb_conn, cookie, NULL); | ||||||
|  | 	xcb_render_pictforminfo_t *formats = | ||||||
|  | 		xcb_render_query_pict_formats_formats(reply); | ||||||
|  | 	int len = xcb_render_query_pict_formats_formats_length(reply); | ||||||
|  | 	xcb_render_pictforminfo_t *format = NULL; | ||||||
|  | 	for (int i = 0; i < len; ++i) { | ||||||
|  | 		if (formats[i].depth == 32) { | ||||||
|  | 			format = &formats[i]; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
|  | 		// TODO: segfaults when not found
 | ||||||
|  | 	} | ||||||
|  | 	if (format == NULL) { | ||||||
|  | 		wlr_log(L_DEBUG, "No 32 bit render format"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	xwm->render_format_id = format->id; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void xwm_set_cursor(struct wlr_xwm *xwm, const uint8_t *pixels, uint32_t stride, | void xwm_set_cursor(struct wlr_xwm *xwm, const uint8_t *pixels, uint32_t stride, | ||||||
| 		uint32_t width, uint32_t height, int32_t hotspot_x, int32_t hotspot_y) { | 		uint32_t width, uint32_t height, int32_t hotspot_x, int32_t hotspot_y) { | ||||||
|  | 	if (!xwm->render_format_id) { | ||||||
|  | 		wlr_log(L_ERROR, "Cannot set xwm cursor: no render format available"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
| 	if (xwm->cursor) { | 	if (xwm->cursor) { | ||||||
| 		xcb_free_cursor(xwm->xcb_conn, xwm->cursor); | 		xcb_free_cursor(xwm->xcb_conn, xwm->cursor); | ||||||
| 	} | 	} | ||||||
|  | @ -1201,29 +1229,9 @@ void xwm_set_cursor(struct wlr_xwm *xwm, const uint8_t *pixels, uint32_t stride, | ||||||
| 	xcb_create_pixmap(xwm->xcb_conn, depth, pix, xwm->screen->root, width, | 	xcb_create_pixmap(xwm->xcb_conn, depth, pix, xwm->screen->root, width, | ||||||
| 		height); | 		height); | ||||||
| 
 | 
 | ||||||
| 	xcb_render_query_pict_formats_cookie_t cookie = |  | ||||||
| 		xcb_render_query_pict_formats(xwm->xcb_conn); |  | ||||||
| 	xcb_generic_error_t *err = NULL; |  | ||||||
| 	xcb_render_query_pict_formats_reply_t *reply = |  | ||||||
| 		xcb_render_query_pict_formats_reply(xwm->xcb_conn, cookie, &err); |  | ||||||
| 	xcb_render_pictforminfo_t *formats = |  | ||||||
| 		xcb_render_query_pict_formats_formats(reply); |  | ||||||
| 	int len = xcb_render_query_pict_formats_formats_length(reply); |  | ||||||
| 	xcb_render_pictforminfo_t *format = NULL; |  | ||||||
| 	for (int i = 0; i < len; ++i) { |  | ||||||
| 		if (formats[i].depth == depth) { |  | ||||||
| 			format = &formats[i]; |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 		// TODO: segfaults when not found
 |  | ||||||
| 	} |  | ||||||
| 	if (format == NULL) { |  | ||||||
| 		wlr_log(L_ERROR, "Cannot find %d-bit depth render format", depth); |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	xcb_render_picture_t pic = xcb_generate_id(xwm->xcb_conn); | 	xcb_render_picture_t pic = xcb_generate_id(xwm->xcb_conn); | ||||||
| 	xcb_render_create_picture(xwm->xcb_conn, pic, pix, format->id, 0, 0); | 	xcb_render_create_picture(xwm->xcb_conn, pic, pix, xwm->render_format_id, | ||||||
|  | 		0, 0); | ||||||
| 
 | 
 | ||||||
| 	xcb_gcontext_t gc = xcb_generate_id(xwm->xcb_conn); | 	xcb_gcontext_t gc = xcb_generate_id(xwm->xcb_conn); | ||||||
| 	xcb_create_gc(xwm->xcb_conn, gc, pix, 0, NULL); | 	xcb_create_gc(xwm->xcb_conn, gc, pix, 0, NULL); | ||||||
|  | @ -1280,6 +1288,7 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *wlr_xwayland) { | ||||||
| 
 | 
 | ||||||
| 	xwm_get_resources(xwm); | 	xwm_get_resources(xwm); | ||||||
| 	xwm_get_visual_and_colormap(xwm); | 	xwm_get_visual_and_colormap(xwm); | ||||||
|  | 	xwm_get_render_format(xwm); | ||||||
| 
 | 
 | ||||||
| 	uint32_t values[] = { | 	uint32_t values[] = { | ||||||
| 		XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | | 		XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | | ||||||
|  |  | ||||||
|  | @ -1,5 +1,7 @@ | ||||||
| #ifndef XWAYLAND_INTERNALS_H | #ifndef XWAYLAND_INTERNALS_H | ||||||
| #define XWAYLAND_INTERNALS_H | #define XWAYLAND_INTERNALS_H | ||||||
|  | 
 | ||||||
|  | #include <xcb/render.h> | ||||||
| #include <wayland-server-core.h> | #include <wayland-server-core.h> | ||||||
| #include <wlr/xwayland.h> | #include <wlr/xwayland.h> | ||||||
| 
 | 
 | ||||||
|  | @ -49,6 +51,7 @@ struct wlr_xwm { | ||||||
| 	xcb_window_t window; | 	xcb_window_t window; | ||||||
| 	xcb_visualid_t visual_id; | 	xcb_visualid_t visual_id; | ||||||
| 	xcb_colormap_t colormap; | 	xcb_colormap_t colormap; | ||||||
|  | 	xcb_render_pictformat_t render_format_id; | ||||||
| 	xcb_cursor_t cursor; | 	xcb_cursor_t cursor; | ||||||
| 
 | 
 | ||||||
| 	struct wlr_xwayland_surface *focus_surface; | 	struct wlr_xwayland_surface *focus_surface; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue