X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Flibi3.h;h=3815777b49b713ec6679b6c628949fe6ca69e137;hb=b0990c183ae1e25aaddb2af40eeb11eff1a208af;hp=7b7cf576a7f31370c9298fecda2a67048c53e8c7;hpb=484c2a697b4f1531b2732ec745e3290e11989ba8;p=i3%2Fi3 diff --git a/include/libi3.h b/include/libi3.h index 7b7cf576..3815777b 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -2,14 +2,13 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009-2013 Michael Stapelberg and contributors (see also: LICENSE) * * libi3: contains functions which are used by i3 *and* accompanying tools such * as i3-msg, i3-config-wizard, … * */ -#ifndef _LIBI3_H -#define _LIBI3_H +#pragma once #include #include @@ -18,6 +17,16 @@ #include #include +#if PANGO_SUPPORT +#include +#endif + +/** + * Opaque data structure for storing strings. + * + */ +typedef struct _i3String i3String; + typedef struct Font i3Font; /** @@ -27,34 +36,68 @@ typedef struct Font i3Font; * */ struct Font { - /** The xcb-id for the font */ - xcb_font_t id; - - /** Font information gathered from the server */ - xcb_query_font_reply_t *info; - - /** Font table for this font (may be NULL) */ - xcb_charinfo_t *table; + /** The type of font */ + enum { + FONT_TYPE_NONE = 0, + FONT_TYPE_XCB, + FONT_TYPE_PANGO + } type; /** The height of the font, built from font_ascent + font_descent */ int height; + + /** The pattern/name used to load the font. */ + char *pattern; + + union { + struct { + /** The xcb-id for the font */ + xcb_font_t id; + + /** Font information gathered from the server */ + xcb_query_font_reply_t *info; + + /** Font table for this font (may be NULL) */ + xcb_charinfo_t *table; + } xcb; + +#if PANGO_SUPPORT + /** The pango font description */ + PangoFontDescription *pango_desc; +#endif + } specific; }; /* Since this file also gets included by utilities which don’t use the i3 log * infrastructure, we define a fallback. */ +#if !defined(LOG) +void verboselog(char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); +#define LOG(fmt, ...) verboselog("[libi3] " __FILE__ " " fmt, ##__VA_ARGS__) +#endif #if !defined(ELOG) -#define ELOG(fmt, ...) fprintf(stderr, "ERROR: " fmt, ##__VA_ARGS__) +void errorlog(char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); +#define ELOG(fmt, ...) errorlog("[libi3] ERROR: " fmt, ##__VA_ARGS__) +#endif +#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__) #endif /** * Try to get the contents of the given atom (for example I3_SOCKET_PATH) from * the X11 root window and return NULL if it doesn’t work. * + * If the provided XCB connection is NULL, a new connection will be + * established. + * * The memory for the contents is dynamically allocated and has to be * free()d by the caller. * */ -char *root_atom_contents(const char *atomname); +char *root_atom_contents(const char *atomname, xcb_connection_t *provided_conn, int screen); /** * Safe-wrapper around malloc which exits if malloc returns NULL (meaning that @@ -91,6 +134,71 @@ char *sstrdup(const char *str); */ int sasprintf(char **strp, const char *fmt, ...); +/** + * Build an i3String from an UTF-8 encoded string. + * Returns the newly-allocated i3String. + * + */ +i3String *i3string_from_utf8(const char *from_utf8); + +/** + * Build an i3String from an UTF-8 encoded string with fixed length. + * To be used when no proper NUL-terminaison is available. + * Returns the newly-allocated i3String. + * + */ +i3String *i3string_from_utf8_with_length(const char *from_utf8, size_t num_bytes); + +/** + * Build an i3String from an UCS-2 encoded string. + * Returns the newly-allocated i3String. + * + */ +i3String *i3string_from_ucs2(const xcb_char2b_t *from_ucs2, size_t num_glyphs); + +/** + * Free an i3String. + * + */ +void i3string_free(i3String *str); + +/** + * Securely i3string_free by setting the pointer to NULL + * to prevent accidentally using freed memory. + * + */ +#define I3STRING_FREE(str) \ +do { \ + if (str != NULL) { \ + i3string_free(str); \ + str = NULL; \ + } \ +} while (0) + +/** + * Returns the UTF-8 encoded version of the i3String. + * + */ +const char *i3string_as_utf8(i3String *str); + +/** + * Returns the UCS-2 encoded version of the i3String. + * + */ +const xcb_char2b_t *i3string_as_ucs2(i3String *str); + +/** + * Returns the number of bytes (UTF-8 encoded) in an i3String. + * + */ +size_t i3string_get_num_bytes(i3String *str); + +/** + * Returns the number of glyphs in an i3String. + * + */ +size_t i3string_get_num_glyphs(i3String *str); + /** * Connects to the i3 IPC socket and returns the file descriptor for the * socket. die()s if anything goes wrong. @@ -106,8 +214,8 @@ int ipc_connect(const char *socket_path); * Returns 0 on success. * */ -int ipc_send_message(int sockfd, uint32_t message_size, - uint32_t message_type, const uint8_t *payload); +int ipc_send_message(int sockfd, const uint32_t message_size, + const uint32_t message_type, const uint8_t *payload); /** * Reads a message from the given socket file descriptor and stores its length @@ -120,7 +228,7 @@ int ipc_send_message(int sockfd, uint32_t message_size, * Returns 0 on success. * */ -int ipc_recv_message(int sockfd, uint32_t message_type, +int ipc_recv_message(int sockfd, uint32_t *message_type, uint32_t *reply_length, uint8_t **reply); /** @@ -197,7 +305,7 @@ void set_font(i3Font *font); * Frees the resources taken by the current font. * */ -void free_font(); +void free_font(void); /** * Converts the given string to UTF-8 from UCS-2 big endian. The return value @@ -226,20 +334,50 @@ void set_font_colors(xcb_gcontext_t gc, uint32_t foreground, uint32_t background * specified coordinates (from the top left corner of the leftmost, uppermost * glyph) and using the provided gc. * - * Text can be specified as UCS-2 or UTF-8. If it's specified as UCS-2, then - * text_len must be the number of glyphs in the string. If it's specified as - * UTF-8, then text_len must be the number of bytes in the string (not counting - * the null terminator). + * Text must be specified as an i3String. * */ -void draw_text(char *text, size_t text_len, bool is_ucs2, xcb_drawable_t drawable, +void draw_text(i3String *text, xcb_drawable_t drawable, xcb_gcontext_t gc, int x, int y, int max_width); /** - * Predict the text width in pixels for the given text. Text can be specified - * as UCS-2 or UTF-8. + * ASCII version of draw_text to print static strings. * */ -int predict_text_width(char *text, size_t text_len, bool is_ucs2); +void draw_text_ascii(const char *text, xcb_drawable_t drawable, + xcb_gcontext_t gc, int x, int y, int max_width); -#endif +/** + * Predict the text width in pixels for the given text. Text must be + * specified as an i3String. + * + */ +int predict_text_width(i3String *text); + +/** + * Returns the visual type associated with the given screen. + * + */ +xcb_visualtype_t *get_visualtype(xcb_screen_t *screen); + +/** + * Returns true if this version of i3 is a debug build (anything which is not a + * release version), based on the git version number. + * + */ +bool is_debug_build() __attribute__((const)); + +/** + * Returns the name of a temporary file with the specified prefix. + * + */ +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 + * + * Returned value must be freed by the caller. + */ +char *get_exe_path(const char *argv0);