X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Flibi3.h;h=9ba780042310128c0530674028cb9520f7779cc9;hb=d3beff23395356ec71fcc35a3b802163e12df73e;hp=b8ed6c31c875f299929341e5e19590b36b7b318c;hpb=6f8b2845863e9071d7d630b270729d46423c1eb5;p=i3%2Fi3 diff --git a/include/libi3.h b/include/libi3.h index b8ed6c31..9ba78004 100644 --- a/include/libi3.h +++ b/include/libi3.h @@ -2,14 +2,14 @@ * 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 +#ifndef I3_LIBI3_H +#define I3_LIBI3_H #include #include @@ -18,6 +18,16 @@ #include #include +#if PANGO_SUPPORT +#include +#endif + +/** + * Opaque data structure for storing strings. + * + */ +typedef struct _i3String i3String; + typedef struct Font i3Font; /** @@ -27,33 +37,61 @@ 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, ...); +#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, ...); +#define ELOG(fmt, ...) errorlog("[libi3] ERROR: " fmt, ##__VA_ARGS__) #endif /** - * Try to get the socket path from X11 and return NULL if it doesn’t work. + * 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. * - * The memory for the socket path is dynamically allocated and has to be + * 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 *socket_path_from_x11(); +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 @@ -90,6 +128,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. @@ -105,8 +208,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 @@ -119,7 +222,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); /** @@ -196,7 +299,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 @@ -223,17 +326,53 @@ void set_font_colors(xcb_gcontext_t gc, uint32_t foreground, uint32_t background /** * Draws text onto the specified X drawable (normally a pixmap) at the * 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. + * glyph) and using the provided gc. + * + * 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. + * + */ +void draw_text_ascii(const char *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 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 * */ -int predict_text_width(char *text, size_t text_len, bool is_ucs2); +const char *get_exe_path(const char *argv0); #endif