From 641beb0526e1f54595afd137dc0441ed38d70b25 Mon Sep 17 00:00:00 2001 From: Wesley Kerfoot Date: Sat, 29 Jun 2019 15:26:47 -0400 Subject: [PATCH] Draw rectangles --- blit.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/blit.c b/blit.c index 6783245..77a3356 100644 --- a/blit.c +++ b/blit.c @@ -4,6 +4,14 @@ #include #include +xcb_alloc_color_reply_t* +getColor(xcb_connection_t*, + xcb_screen_t*, + xcb_window_t, + unsigned short, + unsigned short, + unsigned short); + /* Macro definition to parse X server events * The ~0x80 is needed to get the lower 7 bits @@ -81,13 +89,16 @@ getWindow(xcb_connection_t *display, /* Create the window */ xcb_window_t window = xcb_generate_id(display); - xcb_cw_t mask = XCB_CW_EVENT_MASK; + xcb_cw_t mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; /* Define all the events we want to handle with xcb */ /* XCB_EVENT_MASK_EXPOSURE is the "exposure" event */ /* I.e. it fires when our window shows up on the screen */ - uint32_t valwin[1] = { XCB_EVENT_MASK_EXPOSURE }; + uint32_t valwin[2]; + + valwin[0] = screen->white_pixel; + valwin[1] = XCB_EVENT_MASK_EXPOSURE; xcb_create_window(display, /* Connection */ XCB_COPY_FROM_PARENT, /* depth (same as root) */ @@ -133,6 +144,12 @@ getColor(xcb_connection_t *display, blue), NULL); + /* TODO, make sure colors get free'd after they're used? + * Might not be necessary to free them if we only ever allocate one of each color + * Linux will make sure resources are cleaned up after the program exits + * We just have to make sure we don't leak colors + */ + return reply; } @@ -153,8 +170,17 @@ getGC(xcb_connection_t *display, xcb_gcontext_t foreground = xcb_generate_id(display); + xcb_alloc_color_reply_t *xcolor = getColor(display, + screen, + window, + 0xffff, + 0, + 0); + + + uint32_t mask = XCB_GC_FOREGROUND | XCB_GC_GRAPHICS_EXPOSURES; - uint32_t values[2] = {screen->black_pixel, 0}; + uint32_t values[2] = {xcolor->pixel, 0}; xcb_create_gc(display, foreground, @@ -183,6 +209,8 @@ main(void) { 0xffff, 0xffff); + printf("%d\n", xcolor->pixel); + xcb_flush(display); /* Used to handle the event loop */ @@ -192,6 +220,13 @@ main(void) { xcb_generic_event_t *event; xcb_expose_event_t *expose; + xcb_gcontext_t gc = getGC(display, + screen); + + xcb_point_t points[] = {{10, 10}, {10, 20}, {20, 10}, {20, 20}}; + + xcb_rectangle_t rectangles[] = {{ 10, 50, 40, 20},{ 80, 50, 10, 40}}; + while (1) { event = xcb_poll_for_event(display); @@ -205,6 +240,10 @@ main(void) { expose->y, expose->width, expose->height); + + xcb_poly_line(display, XCB_COORD_MODE_ORIGIN, window, gc, 4, points); + xcb_poly_rectangle(display, window, gc, 2, rectangles); + xcb_flush(display); break; }