libi3/font: Set DPI for the pango context
Patch status: merged
Patch by Bas Pape
Long description:
The pango font specification accepts a font size in points, but pango defaults to a DPI of 96. Create a default PangoContext (which internally creates a default PangoCairoFontMap as usual) and set the DPI to the value of the root Screen manually. Fixes #1115
To apply this patch, use:
curl http://cr.i3wm.org/patch/312/raw.patch | git am
b/libi3/font.c
| 19 |
@@ -56,7 +56,10 @@ static bool load_pango_font(i3Font *font, const char *desc) {
|
| 20 |
/* Create a dummy Pango layout to compute the font height */ |
| 21 |
cairo_surface_t *surface = cairo_xcb_surface_create(conn, root_screen->root, root_visual_type, 1, 1); |
| 22 |
cairo_t *cr = cairo_create(surface); |
| 23 |
- PangoLayout *layout = pango_cairo_create_layout(cr); |
| 24 |
+ double ydpi = (double)root_screen->height_in_pixels * 25.4 / (double)root_screen->height_in_millimeters; |
| 25 |
+ PangoContext *pc = pango_cairo_create_context(cr); |
| 26 |
+ pango_cairo_context_set_resolution(pc, ydpi); |
| 27 |
+ PangoLayout *layout = pango_layout_new(pc); |
| 28 |
pango_layout_set_font_description(layout, font->specific.pango_desc); |
| 29 |
|
| 30 |
/* Get the font height */ |
| 31 |
@@ -66,6 +69,7 @@ static bool load_pango_font(i3Font *font, const char *desc) {
|
| 32 |
|
| 33 |
/* Free resources */ |
| 34 |
g_object_unref(layout); |
| 35 |
+ g_object_unref(pc); |
| 36 |
cairo_destroy(cr); |
| 37 |
cairo_surface_destroy(surface); |
| 38 |
|
| 39 |
@@ -85,7 +89,10 @@ static void draw_text_pango(const char *text, size_t text_len, |
| 40 |
cairo_surface_t *surface = cairo_xcb_surface_create(conn, drawable, |
| 41 |
root_visual_type, x + max_width, y + savedFont->height); |
| 42 |
cairo_t *cr = cairo_create(surface); |
| 43 |
- PangoLayout *layout = pango_cairo_create_layout(cr); |
| 44 |
+ double ydpi = (double)root_screen->height_in_pixels * 25.4 / (double)root_screen->height_in_millimeters; |
| 45 |
+ PangoContext *pc = pango_cairo_create_context(cr); |
| 46 |
+ pango_cairo_context_set_resolution(pc, ydpi); |
| 47 |
+ PangoLayout *layout = pango_layout_new(pc); |
| 48 |
gint height; |
| 49 |
|
| 50 |
pango_layout_set_font_description(layout, savedFont->specific.pango_desc); |
| 51 |
@@ -104,6 +111,7 @@ static void draw_text_pango(const char *text, size_t text_len, |
| 52 |
|
| 53 |
/* Free resources */ |
| 54 |
g_object_unref(layout); |
| 55 |
+ g_object_unref(pc); |
| 56 |
cairo_destroy(cr); |
| 57 |
cairo_surface_destroy(surface); |
| 58 |
} |
| 59 |
@@ -117,7 +125,10 @@ static int predict_text_width_pango(const char *text, size_t text_len) {
|
| 60 |
/* root_visual_type is cached in load_pango_font */ |
| 61 |
cairo_surface_t *surface = cairo_xcb_surface_create(conn, root_screen->root, root_visual_type, 1, 1); |
| 62 |
cairo_t *cr = cairo_create(surface); |
| 63 |
- PangoLayout *layout = pango_cairo_create_layout(cr); |
| 64 |
+ double ydpi = (double)root_screen->height_in_pixels * 25.4 / (double)root_screen->height_in_millimeters; |
| 65 |
+ PangoContext *pc = pango_cairo_create_context(cr); |
| 66 |
+ pango_cairo_context_set_resolution(pc, ydpi); |
| 67 |
+ PangoLayout *layout = pango_layout_new(pc); |
| 68 |
|
| 69 |
/* Get the font width */ |
| 70 |
gint width; |
| 71 |
@@ -128,6 +139,7 @@ static int predict_text_width_pango(const char *text, size_t text_len) {
|
| 72 |
|
| 73 |
/* Free resources */ |
| 74 |
g_object_unref(layout); |
| 75 |
+ g_object_unref(pc); |
| 76 |
cairo_destroy(cr); |
| 77 |
cairo_surface_destroy(surface); |
| 78 |
|