|
|
@ -8,6 +8,68 @@
|
|
|
|
#include <string.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "log.h"
|
|
|
|
#include "log.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int escape_markup_text(const char *src, char *dest, int dest_length) {
|
|
|
|
|
|
|
|
int length = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while (src[0]) {
|
|
|
|
|
|
|
|
switch (src[0]) {
|
|
|
|
|
|
|
|
case '&':
|
|
|
|
|
|
|
|
length += 5;
|
|
|
|
|
|
|
|
if (dest && dest_length - length >= 0) {
|
|
|
|
|
|
|
|
dest += sprintf(dest, "%s", "&");
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dest_length = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case '<':
|
|
|
|
|
|
|
|
length += 4;
|
|
|
|
|
|
|
|
if (dest && dest_length - length >= 0) {
|
|
|
|
|
|
|
|
dest += sprintf(dest, "%s", "<");
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dest_length = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case '>':
|
|
|
|
|
|
|
|
length += 4;
|
|
|
|
|
|
|
|
if (dest && dest_length - length >= 0) {
|
|
|
|
|
|
|
|
dest += sprintf(dest, "%s", ">");
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dest_length = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case '\'':
|
|
|
|
|
|
|
|
length += 6;
|
|
|
|
|
|
|
|
if (dest && dest_length - length >= 0) {
|
|
|
|
|
|
|
|
dest += sprintf(dest, "%s", "'");
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dest_length = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case '"':
|
|
|
|
|
|
|
|
length += 6;
|
|
|
|
|
|
|
|
if (dest && dest_length - length >= 0) {
|
|
|
|
|
|
|
|
dest += sprintf(dest, "%s", """);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dest_length = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
length += 1;
|
|
|
|
|
|
|
|
if (dest && dest_length - length >= 0) {
|
|
|
|
|
|
|
|
*(dest++) = *src;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
dest_length = -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
src++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// if we could not fit the escaped string in dest, return -1
|
|
|
|
|
|
|
|
if (dest && dest_length == -1) {
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return length;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
|
|
|
|
PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
|
|
|
|
const char *text, int32_t scale, bool markup) {
|
|
|
|
const char *text, int32_t scale, bool markup) {
|
|
|
|
PangoLayout *layout = pango_cairo_create_layout(cairo);
|
|
|
|
PangoLayout *layout = pango_cairo_create_layout(cairo);
|
|
|
@ -15,13 +77,14 @@ PangoLayout *get_pango_layout(cairo_t *cairo, const char *font,
|
|
|
|
if (markup) {
|
|
|
|
if (markup) {
|
|
|
|
char *buf;
|
|
|
|
char *buf;
|
|
|
|
GError *error = NULL;
|
|
|
|
GError *error = NULL;
|
|
|
|
if (!sway_assert(pango_parse_markup(
|
|
|
|
bool result = pango_parse_markup(text, -1, 0, &attrs, &buf,
|
|
|
|
text, -1, 0, &attrs, &buf, NULL, &error),
|
|
|
|
NULL, &error);
|
|
|
|
"pango_parse_markup '%s' -> error %s", text,
|
|
|
|
if (result) {
|
|
|
|
error ? error->message : NULL)) {
|
|
|
|
wlr_log(L_ERROR, "pango_parse_markup '%s' -> error %s", text,
|
|
|
|
|
|
|
|
error->message);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pango_layout_set_markup(layout, buf, -1);
|
|
|
|
pango_layout_set_markup(layout, text, -1);
|
|
|
|
free(buf);
|
|
|
|
free(buf);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
attrs = pango_attr_list_new();
|
|
|
|
attrs = pango_attr_list_new();
|
|
|
|