X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=blobdiff_plain;f=include%2Flibi3.h;h=790baba98578d3903ee651cba6e4b47fb8eb7456;hp=15dffdb736766cea989f1759a332c28bf1d76f30;hb=HEAD;hpb=90d94298fa388e58a0f54607f0ab7a46108e84e7 diff --git a/include/libi3.h b/include/libi3.h index 15dffdb7..790baba9 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -10,6 +10,8 @@ */ #pragma once +#include + #include #include #include @@ -17,15 +19,28 @@ #include #include -#if PANGO_SUPPORT #include -#endif -#ifdef CAIRO_SUPPORT #include -#endif #define DEFAULT_DIR_MODE (S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) +/** Mouse buttons */ +#define XCB_BUTTON_CLICK_LEFT XCB_BUTTON_INDEX_1 +#define XCB_BUTTON_CLICK_MIDDLE XCB_BUTTON_INDEX_2 +#define XCB_BUTTON_CLICK_RIGHT XCB_BUTTON_INDEX_3 +#define XCB_BUTTON_SCROLL_UP XCB_BUTTON_INDEX_4 +#define XCB_BUTTON_SCROLL_DOWN XCB_BUTTON_INDEX_5 +/* xcb doesn't define constants for these. */ +#define XCB_BUTTON_SCROLL_LEFT 6 +#define XCB_BUTTON_SCROLL_RIGHT 7 + +/** + * XCB connection and root screen + * + */ +extern xcb_connection_t *conn; +extern xcb_screen_t *root_screen; + /** * Opaque data structure for storing strings. * @@ -66,10 +81,8 @@ struct Font { xcb_charinfo_t *table; } xcb; -#if PANGO_SUPPORT /** The pango font description */ PangoFontDescription *pango_desc; -#endif } specific; }; @@ -88,7 +101,7 @@ void errorlog(char *fmt, ...) #if !defined(DLOG) void debuglog(char *fmt, ...) __attribute__((format(printf, 1, 2))); -#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, I3__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) +#define DLOG(fmt, ...) debuglog("%s:%s:%d - " fmt, STRIPPED__FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) #endif /** @@ -153,6 +166,14 @@ int sasprintf(char **strp, const char *fmt, ...); */ ssize_t writeall(int fd, const void *buf, size_t count); +/** + * Like writeall, but instead of retrying upon EAGAIN (returned when a write + * would block), the function stops and returns the total number of bytes + * written so far. + * + */ +ssize_t writeall_nonblock(int fd, const void *buf, size_t count); + /** * Safe-wrapper around writeall which exits if it returns -1 (meaning that * write failed) @@ -175,11 +196,11 @@ i3String *i3string_from_markup(const char *from_markup); /** * Build an i3String from an UTF-8 encoded string with fixed length. - * To be used when no proper NUL-terminaison is available. + * To be used when no proper NULL-termination is available. * Returns the newly-allocated i3String. * */ -i3String *i3string_from_utf8_with_length(const char *from_utf8, size_t num_bytes); +i3String *i3string_from_utf8_with_length(const char *from_utf8, ssize_t num_bytes); /** * Build an i3String from an UTF-8 encoded string in Pango markup with fixed @@ -299,6 +320,11 @@ int ipc_recv_message(int sockfd, uint32_t *message_type, */ void fake_configure_notify(xcb_connection_t *conn, xcb_rectangle_t r, xcb_window_t window, int border_width); +#define HAS_G_UTF8_MAKE_VALID GLIB_CHECK_VERSION(2, 52, 0) +#if !HAS_G_UTF8_MAKE_VALID +gchar *g_utf8_make_valid(const gchar *str, gssize len); +#endif + /** * Returns the colorpixel to use for the given hex color (think of HTML). Only * works for true-color (vast majority of cases) at the moment, avoiding a @@ -317,7 +343,7 @@ uint32_t get_colorpixel(const char *hex) __attribute__((const)); #if defined(__APPLE__) -/* +/** * Taken from FreeBSD * Returns a pointer to a new string which is a duplicate of the * string, but only copies at most n characters. @@ -385,11 +411,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. @@ -433,7 +472,7 @@ xcb_visualtype_t *get_visualtype(xcb_screen_t *screen); * release version), based on the git version number. * */ -bool is_debug_build() __attribute__((const)); +bool is_debug_build(void) __attribute__((const)); /** * Returns the name of a temporary file with the specified prefix. @@ -444,12 +483,25 @@ char *get_process_filename(const char *prefix); /** * This function returns the absolute path to the executable it is running in. * - * The implementation follows http://stackoverflow.com/a/933996/712014 + * The implementation follows https://stackoverflow.com/a/933996/712014 * * Returned value must be freed by the caller. */ char *get_exe_path(const char *argv0); +/** + * Initialize the DPI setting. + * This will use the 'Xft.dpi' X resource if available and fall back to + * guessing the correct value otherwise. + */ +void init_dpi(void); + +/** + * This function returns the value of the DPI setting. + * + */ +long get_dpi_value(void); + /** * Convert a logical amount of pixels (e.g. 2 pixels on a “standard” 96 DPI * screen) to a corresponding amount of physical pixels on a standard or retina @@ -467,11 +519,11 @@ int logical_px(const int logical); char *resolve_tilde(const char *path); /** - * Get the path of the first configuration file found. If override_configpath - * is specified, that path is returned and saved for further calls. Otherwise, - * checks the home directory first, then the system directory first, always - * taking into account the XDG Base Directory Specification ($XDG_CONFIG_HOME, - * $XDG_CONFIG_DIRS) + * Get the path of the first configuration file found. If override_configpath is + * specified, that path is returned and saved for further calls. Otherwise, + * checks the home directory first, then the system directory, always taking + * into account the XDG Base Directory Specification ($XDG_CONFIG_HOME, + * $XDG_CONFIG_DIRS). * */ char *get_config_path(const char *override_configpath, bool use_system_paths); @@ -484,7 +536,20 @@ char *get_config_path(const char *override_configpath, bool use_system_paths); int mkdirp(const char *path, mode_t mode); #endif -#ifdef CAIRO_SUPPORT +/** 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 occurrences of the defined placeholders in the format string. + * + */ +char *format_placeholders(char *format, placeholder_t *placeholders, int num); + /* 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) \ @@ -492,17 +557,6 @@ int mkdirp(const char *path, mode_t mode); 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. */ @@ -513,30 +567,37 @@ typedef struct surface_t { /* 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(surface_t *surface, xcb_drawable_t drawable, int width, int height); +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(surface_t *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.