summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2023-06-01 13:04:10 -0400
committerRay Strode <rstrode@redhat.com>2023-06-01 13:25:50 -0400
commit0f0800b751a407ef5456ab67e5467156775a9ad4 (patch)
treeee6f1721e58edcabb4a3776625cc9be3eeef10b8
parent8807817ddf71b54de4fdcc54be6f8007476541de (diff)
wip! label-pango: Parse escape sequences in inputparsekmsg
This commit starts to sketch out how color escape sequences could be turned to actual colors in the label. It's untested.
-rw-r--r--src/plugins/controls/label-pango/plugin.c95
1 files changed, 94 insertions, 1 deletions
diff --git a/src/plugins/controls/label-pango/plugin.c b/src/plugins/controls/label-pango/plugin.c
index 3fdc4ba7..8d8582e3 100644
--- a/src/plugins/controls/label-pango/plugin.c
+++ b/src/plugins/controls/label-pango/plugin.c
@@ -43,6 +43,7 @@
#include <cairo.h>
#include <pango/pangocairo.h>
+#include "ply-terminal-buffer.h"
#include "ply-pixel-buffer.h"
#include "ply-pixel-display.h"
#include "ply-utils.h"
@@ -164,6 +165,57 @@ get_cairo_context_for_sizing (ply_label_plugin_control_t *label)
return cairo_context;
}
+void
+look_up_rgb_color_from_terminal_color (ply_terminal_color_t color,
+ uint16_t *red,
+ uint16_t *green,
+ uint16_t *blue)
+{
+ switch (color) {
+ case PLY_TERMINAL_COLOR_BLACK:
+ *red = 0x0000;
+ *green = 0x0000;
+ *blue = 0x0000;
+ break;
+ case PLY_TERMINAL_COLOR_RED:
+ *red = 0xffff;
+ *green = 0x0000;
+ *blue = 0x0000;
+ break;
+ case PLY_TERMINAL_COLOR_GREEN:
+ *red = 0x0000;
+ *green = 0xffff;
+ *blue = 0x0000;
+ break;
+ case PLY_TERMINAL_COLOR_BROWN:
+ *red = 0xa5a5;
+ *green = 0x2a2a;
+ *blue = 0x2a2a;
+ break;
+ case PLY_TERMINAL_COLOR_BLUE:
+ *red = 0x0000;
+ *green = 0x0000;
+ *blue = 0xffff;
+ break;
+ case PLY_TERMINAL_COLOR_MAGENTA:
+ *red = 0xffff;
+ *green = 0x0000;
+ *blue = 0xffff;
+ break;
+ case PLY_TERMINAL_COLOR_CYAN:
+ *red = 0x0000;
+ *green = 0xffff;
+ *blue = 0xffff;
+ break;
+ case PLY_TERMINAL_COLOR_WHITE:
+ default:
+ *red = 0xffff;
+ *green = 0xffff;
+ *blue = 0xffff;
+ break;
+ }
+}
+
static PangoLayout *
init_pango_text_layout (cairo_t *cairo_context,
char *text,
@@ -173,6 +225,43 @@ init_pango_text_layout (cairo_t *cairo_context,
{
PangoLayout *pango_layout;
PangoFontDescription *description;
+ PangoAttrList *attribute_list;
+ ply_terminal_buffer_t *terminal_buffer;
+ ply_terminal_buffer_iterator_t iterator;
+ ply_terminal_color_t terminal_color;
+ size_t span_start, span_end;
+ const char *filtered_text;
+
+ terminal_buffer = ply_terminal_buffer_new ();
+
+ ply_terminal_buffer_inject (terminal_buffer, text, strlen (text));
+ filtered_text = ply_terminal_buffer_get_bytes (terminal_buffer, NULL);
+
+ attribute_list = pango_attr_list_new ();
+
+ ply_terminal_buffer_iterator_init (&iterator, terminal_buffer);
+
+ while (ply_terminal_buffer_iterator_next (&iterator,
+ &terminal_color,
+ NULL,
+ &span_start,
+ &span_end)) {
+ PangoAttribute *pango_color = NULL;
+ uint16_t red;
+ uint16_t green;
+ uint16_t blue;
+
+ look_up_rgb_color_from_terminal_color (terminal_color,
+ &red,
+ &green,
+ &blue);
+
+ pango_color = pango_attr_foreground_new (red, green, blue);
+ pango_color->start_index = span_start;
+ pango_color->end_index = span_end;
+
+ pango_attr_list_insert (attribute_list, pango_color);
+ }
pango_layout = pango_cairo_create_layout (cairo_context);
@@ -188,7 +277,11 @@ init_pango_text_layout (cairo_t *cairo_context,
if (width >= 0)
pango_layout_set_width (pango_layout, width * PANGO_SCALE);
- pango_layout_set_text (pango_layout, text, -1);
+ pango_layout_set_attributes (pango_layout, attribute_list);
+
+ /* FIXME: probably need to make sure this is valid utf-8
+ */
+ pango_layout_set_text (pango_layout, filtered_text, -1);
pango_cairo_update_layout (cairo_context, pango_layout);
return pango_layout;