commit b148da848ae9075822cd8ddd743532f3ce78f923
parent fe7e66407cd7339eb4a91558d745a9b214e5cea9
Author: emersion <contact@emersion.fr>
Date: Sat, 22 Sep 2018 11:25:07 +0200
Merge pull request #2679 from RyanDwyer/fix-pango-escaping
Fix pango escaping and refactor escape_markup_text
Diffstat:
3 files changed, 23 insertions(+), 53 deletions(-)
diff --git a/common/pango.c b/common/pango.c
@@ -7,66 +7,45 @@
#include <stdlib.h>
#include <string.h>
#include "log.h"
+#include "stringop.h"
-int escape_markup_text(const char *src, char *dest, int dest_length) {
- int length = 0;
+size_t escape_markup_text(const char *src, char *dest) {
+ size_t length = 0;
+ if (dest) {
+ dest[0] = '\0';
+ }
while (src[0]) {
switch (src[0]) {
case '&':
length += 5;
- if (dest && dest_length - length >= 0) {
- dest += sprintf(dest, "%s", "&");
- } else {
- dest_length = -1;
- }
+ lenient_strcat(dest, "&");
break;
case '<':
length += 4;
- if (dest && dest_length - length >= 0) {
- dest += sprintf(dest, "%s", "<");
- } else {
- dest_length = -1;
- }
+ lenient_strcat(dest, "<");
break;
case '>':
length += 4;
- if (dest && dest_length - length >= 0) {
- dest += sprintf(dest, "%s", ">");
- } else {
- dest_length = -1;
- }
+ lenient_strcat(dest, ">");
break;
case '\'':
length += 6;
- if (dest && dest_length - length >= 0) {
- dest += sprintf(dest, "%s", "'");
- } else {
- dest_length = -1;
- }
+ lenient_strcat(dest, "'");
break;
case '"':
length += 6;
- if (dest && dest_length - length >= 0) {
- dest += sprintf(dest, "%s", """);
- } else {
- dest_length = -1;
- }
+ lenient_strcat(dest, """);
break;
default:
- length += 1;
- if (dest && dest_length - length >= 0) {
- *(dest++) = *src;
- } else {
- dest_length = -1;
+ if (dest) {
+ dest[length] = *src;
+ dest[length + 1] = '\0';
}
+ length += 1;
}
src++;
}
- // if we could not fit the escaped string in dest, return -1
- if (dest && dest_length == -1) {
- return -1;
- }
return length;
}
@@ -78,7 +57,7 @@ PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
char *buf;
GError *error = NULL;
if (pango_parse_markup(text, -1, 0, &attrs, &buf, NULL, &error)) {
- pango_layout_set_markup(layout, buf, -1);
+ pango_layout_set_text(layout, buf, -1);
free(buf);
} else {
wlr_log(WLR_ERROR, "pango_parse_markup '%s' -> error %s", text,
diff --git a/include/pango.h b/include/pango.h
@@ -6,17 +6,13 @@
#include <cairo/cairo.h>
#include <pango/pangocairo.h>
-/* Utility function which escape characters a & < > ' ".
+/**
+ * Utility function which escape characters a & < > ' ".
*
- * If the dest parameter is NULL, then the function returns the length of
- * of the escaped src string. The dest_length doesn't matter.
- *
- * If the dest parameter is not NULL then the fuction escapes the src string
- * an puts the escaped string in dest and returns the lenght of the escaped string.
- * The dest_length parameter is the size of dest array. If the size of dest is not
- * enough, then the function returns -1.
+ * The function returns the length of the escaped string, optionally writing the
+ * escaped string to dest if provided.
*/
-int escape_markup_text(const char *src, char *dest, int dest_length);
+size_t escape_markup_text(const char *src, char *dest);
PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
const char *text, double scale, bool markup);
void get_text_size(cairo_t *cairo, const char *font, int *width, int *height,
diff --git a/sway/tree/view.c b/sway/tree/view.c
@@ -785,14 +785,9 @@ static size_t parse_title_format(struct sway_view *view, char *buffer) {
}
static char *escape_title(char *buffer) {
- int length = escape_markup_text(buffer, NULL, 0);
+ size_t length = escape_markup_text(buffer, NULL);
char *escaped_title = calloc(length + 1, sizeof(char));
- int result = escape_markup_text(buffer, escaped_title, length);
- if (result != length) {
- wlr_log(WLR_ERROR, "Could not escape title: %s", buffer);
- free(escaped_title);
- return buffer;
- }
+ escape_markup_text(buffer, escaped_title);
free(buffer);
return escaped_title;
}