From 2c2341530bce800c90e6cb015dd274dedfea6d6c Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Sun, 7 Apr 2024 17:25:40 +0200 Subject: [PATCH] src/theme.c: support inline alpha encoding like #aabbccff .. and mark the current `#rrggbb aaa` encoding as deprecated. --- docs/labwc-theme.5.scd | 6 +++++- src/theme.c | 28 ++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/docs/labwc-theme.5.scd b/docs/labwc-theme.5.scd index 614934d7..8a73e8c3 100644 --- a/docs/labwc-theme.5.scd +++ b/docs/labwc-theme.5.scd @@ -34,7 +34,11 @@ labwc-config(5). *color* Colors can be specified by either of the following: - #rrggbb (hexadecimal RGB values) - - #rrggbb aaa (same but with decimal alpha value) + - #rrggbb aaa (same but with decimal alpha value percentage) + - #rrggbbaa (same but with inline alpha value in hex encoding) + + Note: the #rrggbb aaa notation is deprecated starting from + labwc 0.7.2 and may be removed in future releases. *justification* Justification determines the horizontal alignment of text. diff --git a/src/theme.c b/src/theme.c index d5b0d3b5..4a3efeac 100644 --- a/src/theme.c +++ b/src/theme.c @@ -404,15 +404,27 @@ parse_hexstr(const char *hex, float *rgba) rgba[0] = (hex_to_dec(hex[1]) * 16 + hex_to_dec(hex[2])) / 255.0; rgba[1] = (hex_to_dec(hex[3]) * 16 + hex_to_dec(hex[4])) / 255.0; rgba[2] = (hex_to_dec(hex[5]) * 16 + hex_to_dec(hex[6])) / 255.0; - if (strlen(hex) > 7) { - rgba[3] = atoi(hex + 7) / 100.0; - /* Pre-multiply everything as expected by wlr_scene */ - rgba[0] *= rgba[3]; - rgba[1] *= rgba[3]; - rgba[2] *= rgba[3]; - } else { - rgba[3] = 1.0; + rgba[3] = 1.0; + + size_t len = strlen(hex); + if (len >= 9 && hex[7] == ' ') { + /* Deprecated #aabbcc 100 alpha encoding to support openbox themes */ + rgba[3] = atoi(hex + 8) / 100.0; + wlr_log(WLR_ERROR, + "The theme uses deprecated alpha notation %s, please convert to " + "#rrggbbaa to ensure your config works on newer labwc releases", hex); + } else if (len == 9) { + /* Inline alpha encoding like #aabbccff */ + rgba[3] = (hex_to_dec(hex[7]) * 16 + hex_to_dec(hex[8])) / 255.0; + } else if (len > 7) { + /* More than just #aabbcc */ + wlr_log(WLR_ERROR, "invalid alpha color encoding: '%s'", hex); } + + /* Pre-multiply everything as expected by wlr_scene */ + rgba[0] *= rgba[3]; + rgba[1] *= rgba[3]; + rgba[2] *= rgba[3]; } static enum lab_justification