X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Flibi3.h;h=9f6eff2bbebc941257b91634e11b3432f81dd191;hb=328035fb7e98630862ae8b43088631f62b807c77;hp=69c4452862a026b979e04d0796cb1aa18a0fb295;hpb=2bde6f080ecd5d0e2dccb20a1936a5d40af7ff84;p=i3%2Fi3 diff --git a/include/libi3.h b/include/libi3.h index 69c44528..9f6eff2b 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -20,6 +20,18 @@ #if PANGO_SUPPORT #include #endif +#ifdef CAIRO_SUPPORT +#include +#endif + +#define DEFAULT_DIR_MODE (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) + +/** + * XCB connection and root screen + * + */ +extern xcb_connection_t *conn; +extern xcb_screen_t *root_screen; /** * Opaque data structure for storing strings. @@ -111,7 +123,7 @@ void *smalloc(size_t size); * there is no more memory available) * */ -void *scalloc(size_t size); +void *scalloc(size_t num, size_t size); /** * Safe-wrapper around realloc which exits if realloc returns NULL (meaning @@ -241,7 +253,7 @@ bool i3string_is_markup(i3String *str); /** * Set whether the i3String should use Pango markup. */ -void i3string_set_markup(i3String *str, bool is_markup); +void i3string_set_markup(i3String *str, bool pango_markup); /** * Escape pango markup characters in the given string. @@ -380,11 +392,24 @@ char *convert_ucs2_to_utf8(xcb_char2b_t *text, size_t num_glyphs); */ xcb_char2b_t *convert_utf8_to_ucs2(char *input, size_t *real_strlen); +/* Represents a color split by color channel. */ +typedef struct color_t { + double red; + double green; + double blue; + double alpha; + + /* The colorpixel we use for direct XCB calls. */ + uint32_t colorpixel; +} color_t; + +#define COLOR_TRANSPARENT ((color_t){.red = 0.0, .green = 0.0, .blue = 0.0, .colorpixel = 0}) + /** * Defines the colors to be used for the forthcoming draw_text calls. * */ -void set_font_colors(xcb_gcontext_t gc, uint32_t foreground, uint32_t background); +void set_font_colors(xcb_gcontext_t gc, color_t foreground, color_t background); /** * Returns true if and only if the current font is a pango font. @@ -400,8 +425,8 @@ bool font_is_pango(void); * Text must be specified as an i3String. * */ -void draw_text(i3String *text, xcb_drawable_t drawable, - xcb_gcontext_t gc, int x, int y, int max_width); +void draw_text(i3String *text, xcb_drawable_t drawable, xcb_gcontext_t gc, + xcb_visualtype_t *visual, int x, int y, int max_width); /** * ASCII version of draw_text to print static strings. @@ -471,8 +496,113 @@ char *resolve_tilde(const char *path); */ char *get_config_path(const char *override_configpath, bool use_system_paths); +#if !defined(__sun) /** * Emulates mkdir -p (creates any missing folders) * */ -bool mkdirp(const char *path); +int mkdirp(const char *path, mode_t mode); +#endif + +/** Helper structure for usage in format_placeholders(). */ +typedef struct placeholder_t { + /* The placeholder to be replaced, e.g., "%title". */ + char *name; + /* The value this placeholder should be replaced with. */ + char *value; +} placeholder_t; + +/** + * Replaces occurences of the defined placeholders in the format string. + * + */ +char *format_placeholders(char *format, placeholder_t *placeholders, int num); + +#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 + +/* 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; + + xcb_visualtype_t *visual_type; + + 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(xcb_connection_t *conn, surface_t *surface, xcb_drawable_t drawable, + xcb_visualtype_t *visual, int width, int height); + +/** + * Resize the surface to the given size. + * + */ +void draw_util_surface_set_size(surface_t *surface, int width, int height); + +/** + * Destroys the surface. + * + */ +void draw_util_surface_free(xcb_connection_t *conn, 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(xcb_connection_t *conn, 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(xcb_connection_t *conn, surface_t *surface, color_t color); + +/** + * 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, + double dest_x, double dest_y, double width, double height);