int main(int argc, char **argv) { uint32_t width = test_width - 2 * INSET_X; uint32_t height = test_height - 2 * INSET_Y; int snum; xcb_void_cookie_t check_cookie; xcb_window_t w; xcb_gcontext_t gc; xcb_pixmap_t pix; xcb_connection_t *c = xcb_connect(0, &snum); xcb_screen_t *s = xcb_aux_get_screen(c, snum); xcb_alloc_named_color_cookie_t bg_cookie = xcb_alloc_named_color(c, s->default_colormap, strlen("white"), "white"); xcb_alloc_named_color_cookie_t fg_cookie = xcb_alloc_named_color(c, s->default_colormap, strlen("black"), "black"); xcb_alloc_named_color_reply_t *bg_reply = xcb_alloc_named_color_reply(c, bg_cookie, 0); xcb_alloc_named_color_reply_t *fg_reply = xcb_alloc_named_color_reply(c, fg_cookie, 0); uint32_t fg, bg; xcb_image_t *image, *native_image, *subimage; uint32_t mask = 0; xcb_params_gc_t gcv; assert(bg_reply && fg_reply); bg = bg_reply->pixel; fg = fg_reply->pixel; free(bg_reply); free(fg_reply); w = make_window(c, s, bg, fg, width, height); gc = xcb_generate_id(c); check_cookie = xcb_create_gc_checked(c, gc, w, 0, 0); assert(!xcb_request_check(c, check_cookie)); image = xcb_image_create_from_bitmap_data((uint8_t *)test_bits, test_width, test_height); native_image = xcb_image_native(c, image, 1); assert(native_image); if (native_image != image) xcb_image_destroy(image); subimage = xcb_image_subimage(native_image, INSET_X, INSET_Y, width, height, 0, 0, 0); assert(subimage); xcb_image_destroy(native_image); subimage->format = XCB_IMAGE_FORMAT_XY_BITMAP; pix = xcb_generate_id(c); xcb_create_pixmap(c, s->root_depth, pix, w, subimage->width, subimage->height); gc = xcb_generate_id(c); XCB_AUX_ADD_PARAM(&mask, &gcv, foreground, fg); XCB_AUX_ADD_PARAM(&mask, &gcv, background, bg); xcb_aux_create_gc(c, gc, pix, mask, &gcv); xcb_image_put(c, pix, gc, subimage, 0, 0, 0); process_events(c, gc, w, pix, width, height); xcb_disconnect(c); return 1; }
static int get_color(const char *str, uint32_t *color) { if (str[0] == '#') { /* in hex format */ uint16_t r, g, b; xcb_alloc_color_cookie_t cookie; xcb_alloc_color_reply_t *reply; if (sscanf(str + 1, "%2hx%2hx%2hx", &r, &g, &b) != 3) { NIL_ERR("color format %s", str); return -1; } cookie = xcb_alloc_color(nil_.con, nil_.scr->default_colormap, r << 8, g << 8, b << 8); reply = xcb_alloc_color_reply(nil_.con, cookie, 0); if (!reply) { NIL_ERR("no color %s", str); return -1; } *color = reply->pixel; free(reply); } else { xcb_alloc_named_color_cookie_t cookie; xcb_alloc_named_color_reply_t *reply; cookie = xcb_alloc_named_color(nil_.con, nil_.scr->default_colormap, strlen(str), str); reply = xcb_alloc_named_color_reply(nil_.con, cookie, 0); if (!reply) { NIL_ERR("no color %s", str); return -1; } *color = reply->pixel; free(reply); } return 0; }
color.sep.g = 16 * ( ( val & 0x0F0 ) >> 4 ); color.sep.b = 16 * ( val & 0x00F ); break; case 6: color.pixel = val; color.sep.a = 0xff; break; case 8: color.pixel = val; break; default: break; } } else { xcb_alloc_named_color_cookie_t cc = xcb_alloc_named_color ( xcb->connection, map, strlen ( cname ), cname ); xcb_alloc_named_color_reply_t *r = xcb_alloc_named_color_reply ( xcb->connection, cc, NULL ); if ( r ) { color.sep.a = 0xFF; color.sep.r = r->visual_red; color.sep.g = r->visual_green; color.sep.b = r->visual_blue; free ( r ); } } g_free ( copy ); Color ret = { .red = color.sep.r / 255.0, .green = color.sep.g / 255.0, .blue = color.sep.b / 255.0,