commit 5bc8a86084c7a23fa1a5d8dbcb963472f66a2ae6
parent e54909a53f7a6ef17135e60b9809ceb373596d33
Author: Matsuda Kenji <info@mtkn.jp>
Date: Fri, 19 Dec 2025 21:23:20 +0900
create 32bit window
Diffstat:
| M | xcb.c | | | 35 | +++++++++++++++++++++++++++++++++++ |
1 file changed, 35 insertions(+), 0 deletions(-)
diff --git a/xcb.c b/xcb.c
@@ -7,6 +7,7 @@
void fatal(char *msg);
void fatalf(char *fmt, ...);
+int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype);
int findPictFormat(xcb_connection_t *conn, int dept, xcb_render_pictformat_t *return_pictformat);
int main(void) {
@@ -46,6 +47,20 @@ int main(void) {
xcb_rectangle_t rectangle = { .x = 0, .y = 0, .width = width, .height = height };
xcb_render_fill_rectangles(conn, XCB_RENDER_PICT_OP_SRC, picture, color, 1, &rectangle);
+ xcb_visualtype_t visual32;
+ if (findVisual32(screen, &visual32) < 0) {
+ fatal("32bit visual not found");
+ }
+ xcb_colormap_t colormap32 = xcb_generate_id(conn);
+ xcb_create_colormap(conn, XCB_COLORMAP_ALLOC_NONE, colormap32, screen->root, visual32.visual_id);
+ xcb_window_t window32 = xcb_generate_id(conn);
+ uint32_t attr32[2] = { 0, colormap32 };
+ xcb_create_window(conn, 32, window32, screen->root,
+ 0, 0, 1, 1, 0,
+ XCB_WINDOW_CLASS_INPUT_OUTPUT,
+ visual32.visual_id,
+ XCB_CW_BORDER_PIXEL|XCB_CW_COLORMAP, &attr32);
+
xcb_flush(conn);
int quit = 0;
@@ -78,6 +93,26 @@ void fatalf(char *fmt, ...) {
exit(1);
}
+int findVisual32(xcb_screen_t *screen, xcb_visualtype_t *return_visualtype) {
+ xcb_depth_iterator_t depth_iter = xcb_screen_allowed_depths_iterator(screen);
+ for (;depth_iter.rem > 0; xcb_depth_next(&depth_iter)) {
+ xcb_depth_t *d = depth_iter.data;
+ if (d->depth != 32) {
+ continue;
+ }
+ xcb_visualtype_iterator_t visual_iter = xcb_depth_visuals_iterator(d);
+ while (visual_iter.rem > 0) {
+ xcb_visualtype_t *v = visual_iter.data;
+ if (v->red_mask == 0xff0000 && v->green_mask == 0x00ff00 && v->blue_mask == 0x0000ff) {
+ *return_visualtype = *v;
+ return 0;
+ }
+ xcb_visualtype_next(&visual_iter);
+ }
+ }
+ return -1;
+}
+
int findPictFormat(xcb_connection_t *conn, int depth, xcb_render_pictformat_t *return_pictformat) {
xcb_generic_error_t *error;
xcb_render_query_pict_formats_cookie_t cookie = xcb_render_query_pict_formats(conn);