Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Drawing on drawable and setting color

6 views
Skip to first unread message

Francis Assissi

unread,
Mar 11, 2020, 4:24:11 PM3/11/20
to
Hello, I am trying to learn libxcb, how do I draw on a drawable
with a specific color using the C language? Source code below.

#include <stdio.h>
#include <stdlib.h>
#include <xcb/xcb.h>
#include <math.h>

#define WIDTH 640
#define HEIGHT 480
#define POINTS 360

// cc program.c -o program -lxcb -lm
int main(void)
{
xcb_connection_t *connection = xcb_connect(NULL, NULL);;
uint8_t coordinate_mode = XCB_COORD_MODE_ORIGIN;
const xcb_setup_t *setup = xcb_get_setup(connection);
xcb_screen_iterator_t screen_iterator =
xcb_setup_roots_iterator(setup);
xcb_screen_t *screen = screen_iterator.data;
xcb_drawable_t drawable =
xcb_generate_id(connection);
uint32_t value_mask = XCB_GC_FOREGROUND |
XCB_GC_GRAPHICS_EXPOSURES;
uint32_t value_list[2] = {screen -> black_pixel,
0};
xcb_gcontext_t gc =
xcb_generate_id(connection);
uint32_t points_len = 0;
uint16_t res_width = WIDTH;
uint16_t res_height = HEIGHT;
xcb_point_t *points =
malloc(sizeof(xcb_point_t) * POINTS);
xcb_generic_event_t *event = NULL;

xcb_create_gc(connection, gc, drawable, value_mask, value_list);
value_mask = XCB_CW_BACK_PIXEL |
XCB_CW_EVENT_MASK;
value_list[0] = screen -> white_pixel;
value_list[1] = XCB_EVENT_MASK_EXPOSURE;
xcb_create_window(connection,
XCB_COPY_FROM_PARENT,
drawable,
screen -> root,
0, 0,
res_width, res_height,
10,
XCB_WINDOW_CLASS_INPUT_OUTPUT,
screen -> root_visual,
value_mask, value_list);
xcb_map_window(connection, drawable);
xcb_flush(connection);
// Map line in memory
while(points_len < POINTS) {
points[points_len].x = points_len;
points[points_len].y = 150;
++points_len;
}
// Set circle color
value_mask = XCB_GC_FOREGROUND;
value_list[0] = 0xFF000000; // Red
value_list[1] = 0;
xcb_change_gc(connection, gc, value_mask, value_list);
// Draw it on the window
while((event = xcb_wait_for_event(connection))) {
switch(event -> response_type & ~0x80) {
case XCB_EXPOSE: {
xcb_poly_point(connection,
coordinate_mode, drawable, gc, POINTS, points);
xcb_flush(connection);
break;
}
default: {
break;
}
}
free(event);
}
xcb_free_gc(connection, gc);
xcb_disconnect(connection);
exit(EXIT_SUCCESS);
}

patch

unread,
Mar 25, 2020, 10:17:15 PM3/25/20
to
On Wed, 11 Mar 2020 20:24:10 +0000, Francis Assissi wrote:

> Hello, I am trying to learn libxcb, how do I draw on a drawable with a
> specific color using the C language? Source code below.

When you create the GC you get the depth from 'drawable' (your window)
which hasn't been created yet.

> xcb_create_gc(connection, gc, drawable, value_mask, value_list);

You should supply the depth from screen->root at that point.

> value_list[0] = 0xFF000000; // Red value_list[1] = 0;

That is most likely not the color red, but black. 0xFF0000, should be red
on TrueColor and DirectColor.
0 new messages