X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=include%2Flibi3.h;h=7c0ead32be1df03170396c11ba09e606aefe3f2e;hb=8e23dc881b33f1b5a434db89b804f935ff146bbb;hp=97383ba301ab010a5959a8b5d3aaabe5a4318b1c;hpb=7f22d4fe3279c4945cb42cc3318af84ed71be575;p=i3%2Fi3 diff --git a/include/libi3.h b/include/libi3.h index 97383ba3..7c0ead32 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,10 @@ #include #include +#if PANGO_SUPPORT +#include +#endif + /** * Opaque data structure for storing strings. * @@ -33,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 @@ -130,13 +167,13 @@ void i3string_free(i3String *str); * to prevent accidentally using freed memory. * */ -#define I3STRING_FREE(str) \ -do { \ - if (str != NULL) { \ - i3string_free(str); \ - str = NULL; \ - } \ -} while (0) +#define I3STRING_FREE(str) \ + do { \ + if (str != NULL) { \ + i3string_free(str); \ + str = NULL; \ + } \ + } while (0) /** * Returns the UTF-8 encoded version of the i3String. @@ -177,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 @@ -191,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); /** @@ -248,8 +285,8 @@ uint32_t aio_get_mod_mask_for(uint32_t keysym, xcb_key_symbols_t *symbols); * */ uint32_t get_mod_mask_for(uint32_t keysym, - xcb_key_symbols_t *symbols, - xcb_get_modifier_mapping_reply_t *modmap_reply); + xcb_key_symbols_t *symbols, + xcb_get_modifier_mapping_reply_t *modmap_reply); /** * Loads a font for usage, also getting its height. If fallback is true, @@ -297,21 +334,31 @@ 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(i3String *text, xcb_drawable_t drawable, + xcb_gcontext_t gc, int x, int y, int max_width); + +/** + * 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. * */ -void draw_text(char *text, size_t text_len, bool is_ucs2, xcb_drawable_t drawable, - xcb_gcontext_t gc, int x, int y, int max_width); +int predict_text_width(i3String *text); /** - * Predict the text width in pixels for the given text. Text can be specified - * as UCS-2 or UTF-8. + * Returns the visual type associated with the given screen. * */ -int predict_text_width(char *text, size_t text_len, bool is_ucs2); +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 @@ -320,4 +367,25 @@ int predict_text_width(char *text, size_t text_len, bool is_ucs2); */ bool is_debug_build() __attribute__((const)); -#endif +/** + * 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); + +/** + * 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 + * screen, e.g. 5 pixels on a 227 DPI MacBook Pro 13" Retina screen. + * + */ +int logical_px(const int logical);