]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: if a font provides no per-char info for width, fall back to the default ...
authorMichael Stapelberg <michael@stapelberg.de>
Thu, 7 Jan 2010 13:38:00 +0000 (14:38 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 7 Jan 2010 13:38:50 +0000 (14:38 +0100)
src/xcb.c

index a2f813b06898ff2932d93baf7a04c6257273988f..98b6bde52843bb0642b1b5c03ccf441d25ff567f 100644 (file)
--- a/src/xcb.c
+++ b/src/xcb.c
@@ -344,10 +344,25 @@ static xcb_charinfo_t *get_charinfo(int col, int row, xcb_query_font_reply_t *fo
 int predict_text_width(xcb_connection_t *conn, const char *font_pattern, char *text, int length) {
         xcb_query_font_reply_t *font_info;
         xcb_charinfo_t *table;
+        xcb_generic_error_t *error;
         int i, width = 0;
         i3Font *font = load_font(conn, font_pattern);
 
-        font_info = xcb_query_font_reply(conn, xcb_query_font_unchecked(conn, font->id), NULL);
+        font_info = xcb_query_font_reply(conn, xcb_query_font(conn, font->id), &error);
+        if (error != NULL) {
+                fprintf(stderr, "ERROR: query font (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 on his stderr. */
+                return 7;
+        }
+
+        /* If no per-char info is available for this font, we use the default */
+        if (xcb_query_font_char_infos_length(font_info) == 0) {
+                DLOG("Falling back on default char_width of %d pixels\n", font_info->max_bounds.character_width);
+                return (font_info->max_bounds.character_width * length);
+        }
+
         table = xcb_query_font_char_infos(font_info);
 
         for (i = 0; i < 2 * length; i += 2) {