Remove unused function arguments. (#2635)

The connection is no longer necessary since the non-cairo paths have
been removed.
This commit is contained in:
Ingo Bürk 2017-01-13 18:34:09 +01:00 committed by Michael Stapelberg
parent 33d6a4e829
commit e0582aa5eb
6 changed files with 45 additions and 46 deletions

View File

@ -181,7 +181,7 @@ static void draw_separator(i3_output *output, uint32_t x, struct status_block *b
uint32_t center_x = x - sep_offset; uint32_t center_x = x - sep_offset;
if (config.separator_symbol == NULL) { if (config.separator_symbol == NULL) {
/* Draw a classic one pixel, vertical separator. */ /* Draw a classic one pixel, vertical separator. */
draw_util_rectangle(xcb_connection, &output->statusline_buffer, sep_fg, draw_util_rectangle(&output->statusline_buffer, sep_fg,
center_x, center_x,
logical_px(sep_voff_px), logical_px(sep_voff_px),
logical_px(1), logical_px(1),
@ -250,7 +250,7 @@ void draw_statusline(i3_output *output, uint32_t clip_left, bool use_focus_color
struct status_block *block; struct status_block *block;
color_t bar_color = (use_focus_colors ? colors.focus_bar_bg : colors.bar_bg); color_t bar_color = (use_focus_colors ? colors.focus_bar_bg : colors.bar_bg);
draw_util_clear_surface(xcb_connection, &output->statusline_buffer, bar_color); draw_util_clear_surface(&output->statusline_buffer, bar_color);
/* Use unsigned integer wraparound to clip off the left side. /* Use unsigned integer wraparound to clip off the left side.
* For example, if clip_left is 75, then x will start at the very large * For example, if clip_left is 75, then x will start at the very large
@ -301,13 +301,13 @@ void draw_statusline(i3_output *output, uint32_t clip_left, bool use_focus_color
} }
/* Draw the border. */ /* Draw the border. */
draw_util_rectangle(xcb_connection, &output->statusline_buffer, border_color, draw_util_rectangle(&output->statusline_buffer, border_color,
x, logical_px(1), x, logical_px(1),
full_render_width, full_render_width,
bar_height - logical_px(2)); bar_height - logical_px(2));
/* Draw the background. */ /* Draw the background. */
draw_util_rectangle(xcb_connection, &output->statusline_buffer, bg_color, draw_util_rectangle(&output->statusline_buffer, bg_color,
x + border_width, x + border_width,
logical_px(1) + border_width, logical_px(1) + border_width,
full_render_width - 2 * border_width, full_render_width - 2 * border_width,
@ -1946,8 +1946,7 @@ void draw_bars(bool unhide) {
bool use_focus_colors = output_has_focus(outputs_walk); bool use_focus_colors = output_has_focus(outputs_walk);
/* First things first: clear the backbuffer */ /* First things first: clear the backbuffer */
draw_util_clear_surface(xcb_connection, &(outputs_walk->buffer), draw_util_clear_surface(&(outputs_walk->buffer), (use_focus_colors ? colors.focus_bar_bg : colors.bar_bg));
(use_focus_colors ? colors.focus_bar_bg : colors.bar_bg));
if (!config.disable_ws) { if (!config.disable_ws) {
i3_ws *ws_walk; i3_ws *ws_walk;
@ -1977,14 +1976,14 @@ void draw_bars(bool unhide) {
} }
/* Draw the border of the button. */ /* Draw the border of the button. */
draw_util_rectangle(xcb_connection, &(outputs_walk->buffer), border_color, draw_util_rectangle(&(outputs_walk->buffer), border_color,
workspace_width, workspace_width,
logical_px(1), logical_px(1),
ws_walk->name_width + 2 * logical_px(ws_hoff_px) + 2 * logical_px(1), ws_walk->name_width + 2 * logical_px(ws_hoff_px) + 2 * logical_px(1),
font.height + 2 * logical_px(ws_voff_px) - 2 * logical_px(1)); font.height + 2 * logical_px(ws_voff_px) - 2 * logical_px(1));
/* Draw the inside of the button. */ /* Draw the inside of the button. */
draw_util_rectangle(xcb_connection, &(outputs_walk->buffer), bg_color, draw_util_rectangle(&(outputs_walk->buffer), bg_color,
workspace_width + logical_px(1), workspace_width + logical_px(1),
2 * logical_px(1), 2 * logical_px(1),
ws_walk->name_width + 2 * logical_px(ws_hoff_px), ws_walk->name_width + 2 * logical_px(ws_hoff_px),
@ -2007,13 +2006,13 @@ void draw_bars(bool unhide) {
color_t fg_color = colors.binding_mode_fg; color_t fg_color = colors.binding_mode_fg;
color_t bg_color = colors.binding_mode_bg; color_t bg_color = colors.binding_mode_bg;
draw_util_rectangle(xcb_connection, &(outputs_walk->buffer), colors.binding_mode_border, draw_util_rectangle(&(outputs_walk->buffer), colors.binding_mode_border,
workspace_width, workspace_width,
logical_px(1), logical_px(1),
binding.width + 2 * logical_px(ws_hoff_px) + 2 * logical_px(1), binding.width + 2 * logical_px(ws_hoff_px) + 2 * logical_px(1),
font.height + 2 * logical_px(ws_voff_px) - 2 * logical_px(1)); font.height + 2 * logical_px(ws_voff_px) - 2 * logical_px(1));
draw_util_rectangle(xcb_connection, &(outputs_walk->buffer), bg_color, draw_util_rectangle(&(outputs_walk->buffer), bg_color,
workspace_width + logical_px(1), workspace_width + logical_px(1),
2 * logical_px(1), 2 * logical_px(1),
binding.width + 2 * logical_px(ws_hoff_px), binding.width + 2 * logical_px(ws_hoff_px),
@ -2049,7 +2048,7 @@ void draw_bars(bool unhide) {
int x_dest = outputs_walk->rect.w - tray_width - logical_px(sb_hoff_px) - visible_statusline_width; int x_dest = outputs_walk->rect.w - tray_width - logical_px(sb_hoff_px) - visible_statusline_width;
draw_statusline(outputs_walk, clip_left, use_focus_colors, use_short_text); draw_statusline(outputs_walk, clip_left, use_focus_colors, use_short_text);
draw_util_copy_surface(xcb_connection, &outputs_walk->statusline_buffer, &outputs_walk->buffer, 0, 0, draw_util_copy_surface(&outputs_walk->statusline_buffer, &outputs_walk->buffer, 0, 0,
x_dest, 0, visible_statusline_width, (int16_t)bar_height); x_dest, 0, visible_statusline_width, (int16_t)bar_height);
outputs_walk->statusline_width = statusline_width; outputs_walk->statusline_width = statusline_width;
@ -2080,7 +2079,7 @@ void redraw_bars(void) {
continue; continue;
} }
draw_util_copy_surface(xcb_connection, &(outputs_walk->buffer), &(outputs_walk->bar), 0, 0, draw_util_copy_surface(&(outputs_walk->buffer), &(outputs_walk->bar), 0, 0,
0, 0, outputs_walk->rect.w, outputs_walk->rect.h); 0, 0, outputs_walk->rect.w, outputs_walk->rect.h);
xcb_flush(xcb_connection); xcb_flush(xcb_connection);
} }

View File

@ -597,17 +597,17 @@ void draw_util_text(i3String *text, surface_t *surface, color_t fg_color, color_
* surface as well as restoring the cairo state. * surface as well as restoring the cairo state.
* *
*/ */
void draw_util_rectangle(xcb_connection_t *conn, surface_t *surface, color_t color, double x, double y, double w, double h); void draw_util_rectangle(surface_t *surface, color_t color, double x, double y, double w, double h);
/** /**
* Clears a surface with the given color. * Clears a surface with the given color.
* *
*/ */
void draw_util_clear_surface(xcb_connection_t *conn, surface_t *surface, color_t color); void draw_util_clear_surface(surface_t *surface, color_t color);
/** /**
* Copies a surface onto another surface. * Copies a surface onto another surface.
* *
*/ */
void draw_util_copy_surface(xcb_connection_t *conn, surface_t *src, surface_t *dest, double src_x, double src_y, void draw_util_copy_surface(surface_t *src, surface_t *dest, double src_x, double src_y,
double dest_x, double dest_y, double width, double height); double dest_x, double dest_y, double width, double height);

View File

@ -19,7 +19,7 @@
xcb_visualtype_t *visual_type; xcb_visualtype_t *visual_type;
/* Forward declarations */ /* Forward declarations */
static void draw_util_set_source_color(xcb_connection_t *conn, surface_t *surface, color_t color); static void draw_util_set_source_color(surface_t *surface, color_t color);
#define RETURN_UNLESS_SURFACE_INITIALIZED(surface) \ #define RETURN_UNLESS_SURFACE_INITIALIZED(surface) \
do { \ do { \
@ -110,7 +110,7 @@ color_t draw_util_hex_to_color(const char *color) {
* Set the given color as the source color on the surface. * Set the given color as the source color on the surface.
* *
*/ */
static void draw_util_set_source_color(xcb_connection_t *conn, surface_t *surface, color_t color) { static void draw_util_set_source_color(surface_t *surface, color_t color) {
RETURN_UNLESS_SURFACE_INITIALIZED(surface); RETURN_UNLESS_SURFACE_INITIALIZED(surface);
cairo_set_source_rgba(surface->cr, color.red, color.green, color.blue, color.alpha); cairo_set_source_rgba(surface->cr, color.red, color.green, color.blue, color.alpha);
@ -141,7 +141,7 @@ void draw_util_text(i3String *text, surface_t *surface, color_t fg_color, color_
* surface as well as restoring the cairo state. * surface as well as restoring the cairo state.
* *
*/ */
void draw_util_rectangle(xcb_connection_t *conn, surface_t *surface, color_t color, double x, double y, double w, double h) { void draw_util_rectangle(surface_t *surface, color_t color, double x, double y, double w, double h) {
RETURN_UNLESS_SURFACE_INITIALIZED(surface); RETURN_UNLESS_SURFACE_INITIALIZED(surface);
cairo_save(surface->cr); cairo_save(surface->cr);
@ -150,7 +150,7 @@ void draw_util_rectangle(xcb_connection_t *conn, surface_t *surface, color_t col
* onto the surface rather than blending it. This is a bit more efficient and * onto the surface rather than blending it. This is a bit more efficient and
* allows better color control for the user when using opacity. */ * allows better color control for the user when using opacity. */
cairo_set_operator(surface->cr, CAIRO_OPERATOR_SOURCE); cairo_set_operator(surface->cr, CAIRO_OPERATOR_SOURCE);
draw_util_set_source_color(conn, surface, color); draw_util_set_source_color(surface, color);
cairo_rectangle(surface->cr, x, y, w, h); cairo_rectangle(surface->cr, x, y, w, h);
cairo_fill(surface->cr); cairo_fill(surface->cr);
@ -166,7 +166,7 @@ void draw_util_rectangle(xcb_connection_t *conn, surface_t *surface, color_t col
* Clears a surface with the given color. * Clears a surface with the given color.
* *
*/ */
void draw_util_clear_surface(xcb_connection_t *conn, surface_t *surface, color_t color) { void draw_util_clear_surface(surface_t *surface, color_t color) {
RETURN_UNLESS_SURFACE_INITIALIZED(surface); RETURN_UNLESS_SURFACE_INITIALIZED(surface);
cairo_save(surface->cr); cairo_save(surface->cr);
@ -175,7 +175,7 @@ void draw_util_clear_surface(xcb_connection_t *conn, surface_t *surface, color_t
* onto the surface rather than blending it. This is a bit more efficient and * onto the surface rather than blending it. This is a bit more efficient and
* allows better color control for the user when using opacity. */ * allows better color control for the user when using opacity. */
cairo_set_operator(surface->cr, CAIRO_OPERATOR_SOURCE); cairo_set_operator(surface->cr, CAIRO_OPERATOR_SOURCE);
draw_util_set_source_color(conn, surface, color); draw_util_set_source_color(surface, color);
cairo_paint(surface->cr); cairo_paint(surface->cr);
@ -190,7 +190,7 @@ void draw_util_clear_surface(xcb_connection_t *conn, surface_t *surface, color_t
* Copies a surface onto another surface. * Copies a surface onto another surface.
* *
*/ */
void draw_util_copy_surface(xcb_connection_t *conn, surface_t *src, surface_t *dest, double src_x, double src_y, void draw_util_copy_surface(surface_t *src, surface_t *dest, double src_x, double src_y,
double dest_x, double dest_y, double width, double height) { double dest_x, double dest_y, double width, double height) {
RETURN_UNLESS_SURFACE_INITIALIZED(src); RETURN_UNLESS_SURFACE_INITIALIZED(src);
RETURN_UNLESS_SURFACE_INITIALIZED(dest); RETURN_UNLESS_SURFACE_INITIALIZED(dest);

View File

@ -617,7 +617,7 @@ static void handle_expose_event(xcb_expose_event_t *event) {
* only tell us that the X server lost (parts of) the window contents. We * only tell us that the X server lost (parts of) the window contents. We
* can handle that by copying the appropriate part from our surface to the * can handle that by copying the appropriate part from our surface to the
* window. */ * window. */
draw_util_copy_surface(conn, &(parent->frame_buffer), &(parent->frame), draw_util_copy_surface(&(parent->frame_buffer), &(parent->frame),
event->x, event->y, event->x, event->y, event->x, event->y, event->x, event->y,
event->width, event->height); event->width, event->height);
xcb_flush(conn); xcb_flush(conn);

View File

@ -244,8 +244,8 @@ static void sighandler_draw_dialog(dialog_t *dialog) {
const color_t red = draw_util_hex_to_color("#FF0000"); const color_t red = draw_util_hex_to_color("#FF0000");
/* Start with a clean slate and draw a red border. */ /* Start with a clean slate and draw a red border. */
draw_util_clear_surface(conn, &(dialog->surface), red); draw_util_clear_surface(&(dialog->surface), red);
draw_util_rectangle(conn, &(dialog->surface), black, border_width, border_width, draw_util_rectangle(&(dialog->surface), black, border_width, border_width,
dialog->dims.width - 2 * border_width, dialog->dims.height - 2 * border_width); dialog->dims.width - 2 * border_width, dialog->dims.height - 2 * border_width);
int y = border_width + margin; int y = border_width + margin;

42
src/x.c
View File

@ -330,10 +330,10 @@ static void x_draw_title_border(Con *con, struct deco_render_params *p) {
deco_diff_r = 0; deco_diff_r = 0;
} }
draw_util_rectangle(conn, &(con->parent->frame_buffer), p->color->border, draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
dr->x, dr->y, dr->width, 1); dr->x, dr->y, dr->width, 1);
draw_util_rectangle(conn, &(con->parent->frame_buffer), p->color->border, draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
dr->x + deco_diff_l, dr->y + dr->height - 1, dr->width - (deco_diff_l + deco_diff_r), 1); dr->x + deco_diff_l, dr->y + dr->height - 1, dr->width - (deco_diff_l + deco_diff_r), 1);
} }
@ -349,7 +349,7 @@ static void x_draw_decoration_after_title(Con *con, struct deco_render_params *p
/* We actually only redraw the far right two pixels as that is the /* We actually only redraw the far right two pixels as that is the
* distance we keep from the edge (not the entire border width). * distance we keep from the edge (not the entire border width).
* Redrawing the entire border would cause text to be cut off. */ * Redrawing the entire border would cause text to be cut off. */
draw_util_rectangle(conn, &(con->parent->frame_buffer), p->color->background, draw_util_rectangle(&(con->parent->frame_buffer), p->color->background,
dr->x + dr->width - 2 * logical_px(1), dr->x + dr->width - 2 * logical_px(1),
dr->y, dr->y,
2 * logical_px(1), 2 * logical_px(1),
@ -360,11 +360,11 @@ static void x_draw_decoration_after_title(Con *con, struct deco_render_params *p
* be easily distinguished. */ * be easily distinguished. */
if (con->parent->layout == L_TABBED) { if (con->parent->layout == L_TABBED) {
/* Left side */ /* Left side */
draw_util_rectangle(conn, &(con->parent->frame_buffer), p->color->border, draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
dr->x, dr->y, 1, dr->height); dr->x, dr->y, 1, dr->height);
/* Right side */ /* Right side */
draw_util_rectangle(conn, &(con->parent->frame_buffer), p->color->border, draw_util_rectangle(&(con->parent->frame_buffer), p->color->border,
dr->x + dr->width - 1, dr->y, 1, dr->height); dr->x + dr->width - 1, dr->y, 1, dr->height);
} }
@ -458,16 +458,16 @@ void x_draw_decoration(Con *con) {
/* 2: draw the client.background, but only for the parts around the window_rect */ /* 2: draw the client.background, but only for the parts around the window_rect */
if (con->window != NULL) { if (con->window != NULL) {
/* top area */ /* top area */
draw_util_rectangle(conn, &(con->frame_buffer), config.client.background, draw_util_rectangle(&(con->frame_buffer), config.client.background,
0, 0, r->width, w->y); 0, 0, r->width, w->y);
/* bottom area */ /* bottom area */
draw_util_rectangle(conn, &(con->frame_buffer), config.client.background, draw_util_rectangle(&(con->frame_buffer), config.client.background,
0, w->y + w->height, r->width, r->height - (w->y + w->height)); 0, w->y + w->height, r->width, r->height - (w->y + w->height));
/* left area */ /* left area */
draw_util_rectangle(conn, &(con->frame_buffer), config.client.background, draw_util_rectangle(&(con->frame_buffer), config.client.background,
0, 0, w->x, r->height); 0, 0, w->x, r->height);
/* right area */ /* right area */
draw_util_rectangle(conn, &(con->frame_buffer), config.client.background, draw_util_rectangle(&(con->frame_buffer), config.client.background,
w->x + w->width, 0, r->width - (w->x + w->width), r->height); w->x + w->width, 0, r->width - (w->x + w->width), r->height);
} }
@ -484,21 +484,21 @@ void x_draw_decoration(Con *con) {
* rectangle because some childs are not freely resizable and we want * rectangle because some childs are not freely resizable and we want
* their background color to "shine through". */ * their background color to "shine through". */
if (!(borders_to_hide & ADJ_LEFT_SCREEN_EDGE)) { if (!(borders_to_hide & ADJ_LEFT_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), p->color->child_border, 0, 0, br.x, r->height); draw_util_rectangle(&(con->frame_buffer), p->color->child_border, 0, 0, br.x, r->height);
} }
if (!(borders_to_hide & ADJ_RIGHT_SCREEN_EDGE)) { if (!(borders_to_hide & ADJ_RIGHT_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), draw_util_rectangle(&(con->frame_buffer),
p->color->child_border, r->width + (br.width + br.x), 0, p->color->child_border, r->width + (br.width + br.x), 0,
-(br.width + br.x), r->height); -(br.width + br.x), r->height);
} }
if (!(borders_to_hide & ADJ_LOWER_SCREEN_EDGE)) { if (!(borders_to_hide & ADJ_LOWER_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), draw_util_rectangle(&(con->frame_buffer),
p->color->child_border, br.x, r->height + (br.height + br.y), p->color->child_border, br.x, r->height + (br.height + br.y),
r->width + br.width, -(br.height + br.y)); r->width + br.width, -(br.height + br.y));
} }
/* pixel border needs an additional line at the top */ /* pixel border needs an additional line at the top */
if (p->border_style == BS_PIXEL && !(borders_to_hide & ADJ_UPPER_SCREEN_EDGE)) { if (p->border_style == BS_PIXEL && !(borders_to_hide & ADJ_UPPER_SCREEN_EDGE)) {
draw_util_rectangle(conn, &(con->frame_buffer), draw_util_rectangle(&(con->frame_buffer),
p->color->child_border, br.x, 0, r->width + br.width, br.y); p->color->child_border, br.x, 0, r->width + br.width, br.y);
} }
@ -510,10 +510,10 @@ void x_draw_decoration(Con *con) {
TAILQ_PREV(con, nodes_head, nodes) == NULL && TAILQ_PREV(con, nodes_head, nodes) == NULL &&
con->parent->type != CT_FLOATING_CON) { con->parent->type != CT_FLOATING_CON) {
if (p->parent_layout == L_SPLITH) { if (p->parent_layout == L_SPLITH) {
draw_util_rectangle(conn, &(con->frame_buffer), p->color->indicator, draw_util_rectangle(&(con->frame_buffer), p->color->indicator,
r->width + (br.width + br.x), br.y, -(br.width + br.x), r->height + br.height); r->width + (br.width + br.x), br.y, -(br.width + br.x), r->height + br.height);
} else if (p->parent_layout == L_SPLITV) { } else if (p->parent_layout == L_SPLITV) {
draw_util_rectangle(conn, &(con->frame_buffer), p->color->indicator, draw_util_rectangle(&(con->frame_buffer), p->color->indicator,
br.x, r->height + (br.height + br.y), r->width + br.width, -(br.height + br.y)); br.x, r->height + (br.height + br.y), r->width + br.width, -(br.height + br.y));
} }
} }
@ -533,12 +533,12 @@ void x_draw_decoration(Con *con) {
* garbage left on there. This is important to avoid tearing when using * garbage left on there. This is important to avoid tearing when using
* transparency. */ * transparency. */
if (con == TAILQ_FIRST(&(con->parent->nodes_head))) { if (con == TAILQ_FIRST(&(con->parent->nodes_head))) {
draw_util_clear_surface(conn, &(con->parent->frame_buffer), COLOR_TRANSPARENT); draw_util_clear_surface(&(con->parent->frame_buffer), COLOR_TRANSPARENT);
FREE(con->parent->deco_render_params); FREE(con->parent->deco_render_params);
} }
/* 4: paint the bar */ /* 4: paint the bar */
draw_util_rectangle(conn, &(parent->frame_buffer), p->color->background, draw_util_rectangle(&(parent->frame_buffer), p->color->background,
con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height); con->deco_rect.x, con->deco_rect.y, con->deco_rect.width, con->deco_rect.height);
/* 5: draw two unconnected horizontal lines in border color */ /* 5: draw two unconnected horizontal lines in border color */
@ -619,7 +619,7 @@ void x_draw_decoration(Con *con) {
after_title: after_title:
x_draw_decoration_after_title(con, p); x_draw_decoration_after_title(con, p);
copy_pixmaps: copy_pixmaps:
draw_util_copy_surface(conn, &(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height); draw_util_copy_surface(&(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height);
} }
/* /*
@ -642,7 +642,7 @@ void x_deco_recurse(Con *con) {
x_deco_recurse(current); x_deco_recurse(current);
if (state->mapped) { if (state->mapped) {
draw_util_copy_surface(conn, &(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height); draw_util_copy_surface(&(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height);
} }
} }
@ -829,7 +829,7 @@ void x_push_node(Con *con) {
xcb_flush(conn); xcb_flush(conn);
xcb_set_window_rect(conn, con->frame.id, rect); xcb_set_window_rect(conn, con->frame.id, rect);
if (con->frame_buffer.id != XCB_NONE) { if (con->frame_buffer.id != XCB_NONE) {
draw_util_copy_surface(conn, &(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height); draw_util_copy_surface(&(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height);
} }
xcb_flush(conn); xcb_flush(conn);
@ -881,7 +881,7 @@ void x_push_node(Con *con) {
/* copy the pixmap contents to the frame window immediately after mapping */ /* copy the pixmap contents to the frame window immediately after mapping */
if (con->frame_buffer.id != XCB_NONE) { if (con->frame_buffer.id != XCB_NONE) {
draw_util_copy_surface(conn, &(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height); draw_util_copy_surface(&(con->frame_buffer), &(con->frame), 0, 0, 0, 0, con->rect.width, con->rect.height);
} }
xcb_flush(conn); xcb_flush(conn);