diff options
author | Drew DeVault <sir@cmpwn.com> | 2015-11-29 15:27:28 -0500 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2015-11-29 15:27:28 -0500 |
commit | 82d464bb90af7fed57a36aacc2dce22994849bac (patch) | |
tree | 471b8eba3fb838115b163980b558cb151c6dbefc /wayland/pango.c | |
parent | Only strip comments at the start of a line (diff) | |
download | sway-82d464bb90af7fed57a36aacc2dce22994849bac.tar.gz sway-82d464bb90af7fed57a36aacc2dce22994849bac.tar.zst sway-82d464bb90af7fed57a36aacc2dce22994849bac.zip |
Add text rendering support to wayland clients
Diffstat (limited to 'wayland/pango.c')
-rw-r--r-- | wayland/pango.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/wayland/pango.c b/wayland/pango.c new file mode 100644 index 00000000..9766be6a --- /dev/null +++ b/wayland/pango.c | |||
@@ -0,0 +1,59 @@ | |||
1 | #include <cairo/cairo.h> | ||
2 | #include <pango/pangocairo.h> | ||
3 | #include <stdarg.h> | ||
4 | #include <stdlib.h> | ||
5 | #include <string.h> | ||
6 | #include <stdio.h> | ||
7 | #include "client/window.h" | ||
8 | #include "client/buffer.h" | ||
9 | #include "log.h" | ||
10 | |||
11 | PangoLayout *get_pango_layout(struct window *window, const char *text) { | ||
12 | PangoLayout *layout = pango_cairo_create_layout(window->cairo); | ||
13 | pango_layout_set_text(layout, text, -1); | ||
14 | PangoFontDescription *desc = pango_font_description_from_string(window->font); | ||
15 | pango_layout_set_font_description(layout, desc); | ||
16 | pango_layout_set_single_paragraph_mode(layout, 1); | ||
17 | pango_font_description_free(desc); | ||
18 | return layout; | ||
19 | } | ||
20 | |||
21 | void get_text_size(struct window *window, int *width, int *height, const char *fmt, ...) { | ||
22 | char *buf = malloc(2048); | ||
23 | |||
24 | va_list args; | ||
25 | va_start(args, fmt); | ||
26 | if (vsnprintf(buf, 2048, fmt, args) >= 2048) { | ||
27 | strcpy(buf, "[buffer overflow]"); | ||
28 | } | ||
29 | va_end(args); | ||
30 | |||
31 | PangoLayout *layout = get_pango_layout(window, buf); | ||
32 | pango_cairo_update_layout(window->cairo, layout); | ||
33 | |||
34 | pango_layout_get_pixel_size(layout, width, height); | ||
35 | |||
36 | g_object_unref(layout); | ||
37 | |||
38 | free(buf); | ||
39 | } | ||
40 | |||
41 | void pango_printf(struct window *window, const char *fmt, ...) { | ||
42 | char *buf = malloc(2048); | ||
43 | |||
44 | va_list args; | ||
45 | va_start(args, fmt); | ||
46 | if (vsnprintf(buf, 2048, fmt, args) >= 2048) { | ||
47 | strcpy(buf, "[buffer overflow]"); | ||
48 | } | ||
49 | va_end(args); | ||
50 | |||
51 | PangoLayout *layout = get_pango_layout(window, buf); | ||
52 | pango_cairo_update_layout(window->cairo, layout); | ||
53 | |||
54 | pango_cairo_show_layout(window->cairo, layout); | ||
55 | |||
56 | g_object_unref(layout); | ||
57 | |||
58 | free(buf); | ||
59 | } | ||