diff options
Diffstat (limited to 'simple_x.c')
-rw-r--r-- | simple_x.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/simple_x.c b/simple_x.c new file mode 100644 index 0000000..5857130 --- /dev/null +++ b/simple_x.c @@ -0,0 +1,73 @@ +/* SimplX - Proposed name if not taken already. */ +#include <stdlib.h> +#include <xcb/xcb.h> +#include <xcb/xcb_image.h> + +/* + * TODO: Figure out the alignment of these things fix the arrangement. + * Find a good name for this. + */ +typedef struct sx_gc { + /*struct {*/ + xcb_connection_t *connection; + xcb_screen_t *screen; + xcb_drawable_t window; + xcb_pixmap_t pixmap; + xcb_image_t *image; + xcb_gcontext_t gc; + /*} xcb;*/ +} SX; + +SX *sx_new_gc(uint16_t width, uint16_t height) +{ + SX *sx = malloc(sizeof(SX)); + + sx->connection = xcb_connect(NULL, NULL); + + sx->screen = xcb_setup_roots_iterator(xcb_get_setup(sx->connection)).data; + + uint32_t mask = XCB_CW_BACK_PIXEL; /* Needs events */ + uint32_t values[] = {sx->screen->black_pixel}; + + sx->window = xcb_generate_id(sx->connection); + xcb_create_window(sx->connection, + 24, + sx->window, + sx->screen->root, + 0, 0, + width, height, + 1, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + sx->screen->root_visual, + mask, values); + + sx->pixmap = xcb_generate_id(sx->connection); + xcb_create_pixmap(sx->connection, + 24, + sx->pixmap, + sx->window, + width, height); + + uint8_t *img = malloc(width * height * 4); + xcb_image_t *image = xcb_image_create(width, height, + XCB_IMAGE_FORMAT_Z_PIXMAP, + 8, 24, 32, + 0, + XCB_IMAGE_ORDER_MSB_FIRST, + XCB_IMAGE_ORDER_LSB_FIRST, + img, + width * height * 4, + img); + + mask = XCB_GC_FOREGROUND | XCB_GC_BACKGROUND; + values[0] = sx->screen->black_pixel; + values[1] = 0xFFFFFF; + + sx->gc = xcb_generate_id(sx->connection); + xcb_create_gc(sx->connection, + sx->gc, + sx->pixmap, + mask, values); + + return sx; +} |