diff --git a/i3bar/include/common.h b/i3bar/include/common.h index aa706bbe..0d46ab6a 100644 --- a/i3bar/include/common.h +++ b/i3bar/include/common.h @@ -88,4 +88,3 @@ TAILQ_HEAD(statusline_head, status_block) statusline_head; #include "config.h" #include "libi3.h" #include "parse_json_header.h" -#include "draw_util.h" diff --git a/i3bar/include/draw_util.h b/i3bar/include/draw_util.h deleted file mode 100644 index f2e12ec5..00000000 --- a/i3bar/include/draw_util.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * vim:ts=4:sw=4:expandtab - * - * © 2015 Ingo Bürk and contributors (see also: LICENSE) - * - * draw.h: Utility for drawing. - * - */ -#pragma once - -#ifdef CAIRO_SUPPORT -#include -#endif - -#ifdef CAIRO_SUPPORT -/* We need to flush cairo surfaces twice to avoid an assertion bug. See #1989 - * and https://bugs.freedesktop.org/show_bug.cgi?id=92455. */ -#define CAIRO_SURFACE_FLUSH(surface) \ - do { \ - cairo_surface_flush(surface); \ - cairo_surface_flush(surface); \ - } while (0) -#endif - -/* Represents a color split by color channel. */ -typedef struct color_t { - double red; - double green; - double blue; - - /* For compatibility, we also store the colorpixel for now. */ - uint32_t colorpixel; -} color_t; - -/* A wrapper grouping an XCB drawable and both a graphics context - * and the corresponding cairo objects representing it. */ -typedef struct surface_t { - /* The drawable which is being represented. */ - xcb_drawable_t id; - - /* A classic XCB graphics context. */ - xcb_gcontext_t gc; - - int width; - int height; - -#ifdef CAIRO_SUPPORT - /* A cairo surface representing the drawable. */ - cairo_surface_t *surface; - - /* The cairo object representing the drawale. In general, - * this is what one should use for any drawing operation. */ - cairo_t *cr; -#endif -} surface_t; - -/** - * Initialize the surface to represent the given drawable. - * - */ -void draw_util_surface_init(surface_t *surface, xcb_drawable_t drawable, int width, int height); - -/** - * Destroys the surface. - * - */ -void draw_util_surface_free(surface_t *surface); - -/** - * Parses the given color in hex format to an internal color representation. - * Note that the input must begin with a hash sign, e.g., "#3fbc59". - * - */ -color_t draw_util_hex_to_color(const char *color); - -/** - * Draw the given text using libi3. - * This function also marks the surface dirty which is needed if other means of - * drawing are used. This will be the case when using XCB to draw text. - * - */ -void draw_util_text(i3String *text, surface_t *surface, color_t fg_color, color_t bg_color, int x, int y, int max_width); - -/** - * Draws a filled rectangle. - * This function is a convenience wrapper and takes care of flushing the - * surface as well as restoring the cairo state. - * - */ -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. - * - */ -void draw_util_clear_surface(surface_t *surface, color_t color); - -/** - * Copies a surface onto another surface. - * - */ -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); diff --git a/i3bar/include/outputs.h b/i3bar/include/outputs.h index 08adefd9..63cfca7f 100644 --- a/i3bar/include/outputs.h +++ b/i3bar/include/outputs.h @@ -13,7 +13,6 @@ #include #include "common.h" -#include "draw_util.h" typedef struct i3_output i3_output; diff --git a/include/libi3.h b/include/libi3.h index 75d3639b..15dffdb7 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -20,6 +20,9 @@ #if PANGO_SUPPORT #include #endif +#ifdef CAIRO_SUPPORT +#include +#endif #define DEFAULT_DIR_MODE (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) @@ -480,3 +483,93 @@ char *get_config_path(const char *override_configpath, bool use_system_paths); */ int mkdirp(const char *path, mode_t mode); #endif + +#ifdef CAIRO_SUPPORT +/* We need to flush cairo surfaces twice to avoid an assertion bug. See #1989 + * and https://bugs.freedesktop.org/show_bug.cgi?id=92455. */ +#define CAIRO_SURFACE_FLUSH(surface) \ + do { \ + cairo_surface_flush(surface); \ + cairo_surface_flush(surface); \ + } while (0) +#endif + +/* Represents a color split by color channel. */ +typedef struct color_t { + double red; + double green; + double blue; + + /* The colorpixel we use for direct XCB calls. */ + uint32_t colorpixel; +} color_t; + +/* A wrapper grouping an XCB drawable and both a graphics context + * and the corresponding cairo objects representing it. */ +typedef struct surface_t { + /* The drawable which is being represented. */ + xcb_drawable_t id; + + /* A classic XCB graphics context. */ + xcb_gcontext_t gc; + + int width; + int height; + +#ifdef CAIRO_SUPPORT + /* A cairo surface representing the drawable. */ + cairo_surface_t *surface; + + /* The cairo object representing the drawable. In general, + * this is what one should use for any drawing operation. */ + cairo_t *cr; +#endif +} surface_t; + +/** + * Initialize the surface to represent the given drawable. + * + */ +void draw_util_surface_init(surface_t *surface, xcb_drawable_t drawable, int width, int height); + +/** + * Destroys the surface. + * + */ +void draw_util_surface_free(surface_t *surface); + +/** + * Parses the given color in hex format to an internal color representation. + * Note that the input must begin with a hash sign, e.g., "#3fbc59". + * + */ +color_t draw_util_hex_to_color(const char *color); + +/** + * Draw the given text using libi3. + * This function also marks the surface dirty which is needed if other means of + * drawing are used. This will be the case when using XCB to draw text. + * + */ +void draw_util_text(i3String *text, surface_t *surface, color_t fg_color, color_t bg_color, int x, int y, int max_width); + +/** + * Draws a filled rectangle. + * This function is a convenience wrapper and takes care of flushing the + * surface as well as restoring the cairo state. + * + */ +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. + * + */ +void draw_util_clear_surface(surface_t *surface, color_t color); + +/** + * Copies a surface onto another surface. + * + */ +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); diff --git a/i3bar/src/draw_util.c b/libi3/draw_util.c similarity index 97% rename from i3bar/src/draw_util.c rename to libi3/draw_util.c index 86435351..04dc0ce5 100644 --- a/i3bar/src/draw_util.c +++ b/libi3/draw_util.c @@ -15,7 +15,6 @@ #include #endif -#include "common.h" #include "libi3.h" xcb_connection_t *xcb_connection; @@ -35,8 +34,12 @@ void draw_util_surface_init(surface_t *surface, xcb_drawable_t drawable, int wid surface->gc = xcb_generate_id(xcb_connection); xcb_void_cookie_t gc_cookie = xcb_create_gc_checked(xcb_connection, surface->gc, surface->id, 0, NULL); - if (xcb_request_failed(gc_cookie, "Could not create graphical context")) + + xcb_generic_error_t *error = xcb_request_check(xcb_connection, gc_cookie); + if (error != NULL) { + ELOG("Could not create graphical context. Error code: %d\n", error->error_code); exit(EXIT_FAILURE); + } #ifdef CAIRO_SUPPORT surface->surface = cairo_xcb_surface_create(xcb_connection, surface->id, visual_type, width, height);