*/
#include "all.h"
-TAILQ_HEAD(cached_fonts_head, Font) cached_fonts = TAILQ_HEAD_INITIALIZER(cached_fonts);
unsigned int xcb_numlock_mask;
-/*
- * Loads a font for usage, also getting its height. If fallback is true,
- * i3 loads 'fixed' or '-misc-*' if the font cannot be found instead of
- * exiting.
- *
- */
-i3Font load_font(const char *pattern, bool fallback) {
- i3Font new;
- xcb_void_cookie_t font_cookie;
- xcb_list_fonts_with_info_cookie_t info_cookie;
-
- /* Send all our requests first */
- new.id = xcb_generate_id(conn);
- font_cookie = xcb_open_font_checked(conn, new.id, strlen(pattern), pattern);
- info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
-
- /* Check for errors. If errors, fall back to default font. */
- xcb_generic_error_t *error = xcb_request_check(conn, font_cookie);
-
- /* If we fail to open font, fall back to 'fixed'. If opening 'fixed' fails fall back to '-misc-*' */
- if (error != NULL) {
- ELOG("Could not open font %s (X error %d). Reverting to backup font.\n", pattern, error->error_code);
- pattern = "fixed";
- font_cookie = xcb_open_font_checked(conn, new.id, strlen(pattern), pattern);
- info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
-
- /* Check if we managed to open 'fixed' */
- xcb_generic_error_t *error = xcb_request_check(conn, font_cookie);
-
- /* Fall back to '-misc-*' if opening 'fixed' fails. */
- if (error != NULL) {
- ELOG("Could not open fallback font '%s', trying with '-misc-*'\n",pattern);
- pattern = "-misc-*";
- font_cookie = xcb_open_font_checked(conn, new.id, strlen(pattern), pattern);
- info_cookie = xcb_list_fonts_with_info(conn, 1, strlen(pattern), pattern);
-
- check_error(conn, font_cookie, "Could open neither requested font nor fallback (fixed or -misc-*");
- }
- }
-
- /* Get information (height/name) for this font */
- xcb_list_fonts_with_info_reply_t *reply = xcb_list_fonts_with_info_reply(conn, info_cookie, NULL);
- exit_if_null(reply, "Could not load font \"%s\"\n", pattern);
-
- new.height = reply->font_ascent + reply->font_descent;
-
- free(reply);
-
- return new;
-}
-
/*
* Convenience wrapper around xcb_create_window which takes care of depth, generating an ID and checking
* for errors.
enum xcursor_cursor_t cursor, bool map, uint32_t mask, uint32_t *values) {
xcb_window_t result = xcb_generate_id(conn);
- /* If the window class is XCB_WINDOW_CLASS_INPUT_ONLY, depth has to be 0 */
- uint16_t depth = (window_class == XCB_WINDOW_CLASS_INPUT_ONLY ? 0 : XCB_COPY_FROM_PARENT);
+ /* By default, the color depth determined in src/main.c is used (32 bit if
+ * available, otherwise the X11 root window’s default depth). */
+ uint16_t depth = root_depth;
+ xcb_visualid_t visual = visual_id;
+
+ /* If the window class is XCB_WINDOW_CLASS_INPUT_ONLY, we copy depth and
+ * visual id from the parent window. */
+ if (window_class == XCB_WINDOW_CLASS_INPUT_ONLY) {
+ depth = XCB_COPY_FROM_PARENT;
+ visual = XCB_COPY_FROM_PARENT;
+ }
xcb_create_window(conn,
depth,
dims.x, dims.y, dims.width, dims.height, /* dimensions */
0, /* border = 0, we draw our own */
window_class,
- XCB_WINDOW_CLASS_COPY_FROM_PARENT, /* copy visual from parent */
+ visual,
mask,
values);
free(event);
}
-/*
- * Finds out which modifier mask is the one for numlock, as the user may change this.
- *
- */
-void xcb_get_numlock_mask(xcb_connection_t *conn) {
- xcb_key_symbols_t *keysyms;
- xcb_get_modifier_mapping_cookie_t cookie;
- xcb_get_modifier_mapping_reply_t *reply;
- xcb_keycode_t *modmap;
- int mask, i;
- const int masks[8] = { XCB_MOD_MASK_SHIFT,
- XCB_MOD_MASK_LOCK,
- XCB_MOD_MASK_CONTROL,
- XCB_MOD_MASK_1,
- XCB_MOD_MASK_2,
- XCB_MOD_MASK_3,
- XCB_MOD_MASK_4,
- XCB_MOD_MASK_5 };
-
- /* Request the modifier map */
- cookie = xcb_get_modifier_mapping(conn);
-
- /* Get the keysymbols */
- keysyms = xcb_key_symbols_alloc(conn);
-
- if ((reply = xcb_get_modifier_mapping_reply(conn, cookie, NULL)) == NULL) {
- xcb_key_symbols_free(keysyms);
- return;
- }
-
- modmap = xcb_get_modifier_mapping_keycodes(reply);
-
- /* Get the keycode for numlock */
-#ifdef OLD_XCB_KEYSYMS_API
- xcb_keycode_t numlock = xcb_key_symbols_get_keycode(keysyms, XCB_NUM_LOCK);
-#else
- /* For now, we only use the first keysymbol. */
- xcb_keycode_t *numlock_syms = xcb_key_symbols_get_keycode(keysyms, XCB_NUM_LOCK);
- if (numlock_syms == NULL)
- return;
- xcb_keycode_t numlock = *numlock_syms;
- free(numlock_syms);
-#endif
-
- /* Check all modifiers (Mod1-Mod5, Shift, Control, Lock) */
- for (mask = 0; mask < 8; mask++)
- for (i = 0; i < reply->keycodes_per_modifier; i++)
- if (modmap[(mask * reply->keycodes_per_modifier) + i] == numlock)
- xcb_numlock_mask = masks[mask];
-
- xcb_key_symbols_free(keysyms);
- free(reply);
-}
-
/*
* Raises the given window (typically client->frame) above all other windows
*
xcb_configure_window(conn, window, XCB_CONFIG_WINDOW_STACK_MODE, values);
}
-/*
- * Query the width of the given text (16-bit characters, UCS) with given real
- * length (amount of glyphs) using the given font.
- *
- */
-int predict_text_width(char *text, int length) {
- xcb_query_text_extents_cookie_t cookie;
- xcb_query_text_extents_reply_t *reply;
- xcb_generic_error_t *error;
- int width;
-
- cookie = xcb_query_text_extents(conn, config.font.id, length, (xcb_char2b_t*)text);
- if ((reply = xcb_query_text_extents_reply(conn, cookie, &error)) == NULL) {
- ELOG("Could not get text extents (X error code %d)\n",
- error->error_code);
- /* We return the rather safe guess of 7 pixels, because a
- * rendering error is better than a crash. Plus, the user will
- * see the error in his log. */
- return 7;
- }
-
- width = reply->overall_width;
- free(reply);
- return width;
-}
-
/*
* Configures the given window to have the size/position specified by given rect
*