From: nerdopolis Date: Wed, 14 Jun 2023 02:49:51 +0000 (-0400) Subject: ply-label: Introduce set_rich_text_for_control () for allowing text properties like... X-Git-Tag: 23.51.283~17^2~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e0a8a9973b824b168c82d4865f75943eb4b10e7b;p=thirdparty%2Fplymouth.git ply-label: Introduce set_rich_text_for_control () for allowing text properties like color to be set within labels --- diff --git a/src/libply-splash-graphics/ply-label-plugin.h b/src/libply-splash-graphics/ply-label-plugin.h index a44efb39..d5c266e8 100644 --- a/src/libply-splash-graphics/ply-label-plugin.h +++ b/src/libply-splash-graphics/ply-label-plugin.h @@ -36,7 +36,7 @@ typedef struct _ply_label_plugin_control ply_label_plugin_control_t; typedef struct { - ply_label_plugin_control_t * (*create_control)(void); + ply_label_plugin_control_t *(*create_control)(void); void (*destroy_control)(ply_label_plugin_control_t *label); bool (*show_control)(ply_label_plugin_control_t *label, ply_pixel_display_t *display, @@ -53,6 +53,9 @@ typedef struct void (*set_text_for_control)(ply_label_plugin_control_t *label, const char *text); + void (*set_rich_text_for_control)(ply_label_plugin_control_t *label, + ply_rich_text_t *rich_text, + ply_rich_text_span_t *span); void (*set_font_for_control)(ply_label_plugin_control_t *label, const char *fontdesc); void (*set_color_for_control)(ply_label_plugin_control_t *label, diff --git a/src/libply-splash-graphics/ply-label.c b/src/libply-splash-graphics/ply-label.c index bac5947f..f3a99fd8 100644 --- a/src/libply-splash-graphics/ply-label.c +++ b/src/libply-splash-graphics/ply-label.c @@ -37,6 +37,7 @@ #include "ply-list.h" #include "ply-logger.h" #include "ply-utils.h" +#include "ply-array.h" struct _ply_label { @@ -46,9 +47,13 @@ struct _ply_label ply_label_plugin_control_t *control; char *text; + + ply_rich_text_t *rich_text; + ply_rich_text_span_t span; + ply_label_alignment_t alignment; long width; - char *fontdesc; + char *font; float red; float green; float blue; @@ -86,6 +91,14 @@ ply_label_free (ply_label_t *label) ply_label_unload_plugin (label); } + free (label->text); + free (label->font); + + if (label->rich_text) { + ply_rich_text_drop_reference (label->rich_text); + label->rich_text = NULL; + } + free (label); } @@ -98,7 +111,7 @@ ply_label_load_plugin (ply_label_t *label) label->module_handle = ply_open_module (PLYMOUTH_PLUGIN_PATH "label-pango.so"); - /* ...and the FreeType based one after that, it is not a complete substitute (yet). */ + /* and the FreeType based one after that, it is not a complete substitute (yet). */ if (label->module_handle == NULL) label->module_handle = ply_open_module (PLYMOUTH_PLUGIN_PATH "label-freetype.so"); @@ -138,16 +151,23 @@ ply_label_load_plugin (ply_label_t *label) return false; } - if (label->text != NULL) - label->plugin_interface->set_text_for_control (label->control, - label->text); + if (label->text != NULL) { + if (label->rich_text == NULL) { + label->plugin_interface->set_text_for_control (label->control, + label->text); + } else { + label->plugin_interface->set_rich_text_for_control (label->control, + label->rich_text, + &label->span); + } + } label->plugin_interface->set_alignment_for_control (label->control, label->alignment); label->plugin_interface->set_width_for_control (label->control, label->width); - if (label->fontdesc != NULL) + if (label->font != NULL) label->plugin_interface->set_font_for_control (label->control, - label->fontdesc); + label->font); label->plugin_interface->set_color_for_control (label->control, label->red, @@ -231,6 +251,11 @@ ply_label_set_text (ply_label_t *label, free (label->text); label->text = strdup (text); + if (label->rich_text) { + ply_rich_text_drop_reference (label->rich_text); + label->rich_text = NULL; + } + if (label->plugin_interface == NULL) return; @@ -238,6 +263,29 @@ ply_label_set_text (ply_label_t *label, text); } +void +ply_label_set_rich_text (ply_label_t *label, + ply_rich_text_t *rich_text, + ply_rich_text_span_t *span) +{ + free (label->text); + label->text = ply_rich_text_get_string (rich_text, span); + + if (label->rich_text) + ply_rich_text_drop_reference (label->rich_text); + label->rich_text = rich_text; + ply_rich_text_take_reference (rich_text); + + label->span = *span; + + if (label->plugin_interface == NULL) + return; + + label->plugin_interface->set_rich_text_for_control (label->control, + label->rich_text, + &label->span); +} + void ply_label_set_alignment (ply_label_t *label, ply_label_alignment_t alignment) @@ -265,25 +313,25 @@ ply_label_set_width (ply_label_t *label, } /* - * Please see pango documentation, for fontdesc format: + * Please see pango documentation, for font format: * http://library.gnome.org/devel/pango/stable/pango-Fonts.html#pango-font-description-from-string * If you pass NULL, it will use default font. */ void ply_label_set_font (ply_label_t *label, - const char *fontdesc) + const char *font) { - free (label->fontdesc); - if (fontdesc) - label->fontdesc = strdup (fontdesc); + free (label->font); + if (font) + label->font = strdup (font); else - label->fontdesc = NULL; + label->font = NULL; if (label->plugin_interface == NULL) return; label->plugin_interface->set_font_for_control (label->control, - fontdesc); + font); } void diff --git a/src/libply-splash-graphics/ply-label.h b/src/libply-splash-graphics/ply-label.h index 55debd84..085aa692 100644 --- a/src/libply-splash-graphics/ply-label.h +++ b/src/libply-splash-graphics/ply-label.h @@ -29,6 +29,7 @@ #include "ply-event-loop.h" #include "ply-pixel-buffer.h" #include "ply-pixel-display.h" +#include "ply-rich-text.h" typedef struct _ply_label ply_label_t; @@ -60,6 +61,11 @@ bool ply_label_is_hidden (ply_label_t *label); void ply_label_set_text (ply_label_t *label, const char *text); + +void ply_label_set_rich_text (ply_label_t *label, + ply_rich_text_t *rich_text, + ply_rich_text_span_t *span); + void ply_label_set_alignment (ply_label_t *label, ply_label_alignment_t alignment); void ply_label_set_width (ply_label_t *label,