From 0638562c931293881c645e7ddba35916d626b4ca Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Tue, 29 Nov 2022 20:57:25 -0500 Subject: [PATCH] Make colour macros more flexible. Instead of COLOUR0_PRIMARY et al. expanding directly to X11 colour names, allow the process to be hooked to generate other forms of colour definitions. The ewmhicon test program is adapted to use this to generate its colourmap. This also avoids some apparently nonportable C macro usage, as preprocessing the following code: #define A(x) x #define B(x) x #define C (x) A(B C) expands to x (the desired result) with GCC but B(x) on HP-UX cc. --- src/colour.h | 47 +++++++++++++++++++++++++++-------------------- t/ewmhicon.c | 21 ++++++++++----------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/colour.h b/src/colour.h index 1bad607..5b4aa1b 100644 --- a/src/colour.h +++ b/src/colour.h @@ -21,61 +21,68 @@ enum { COLOUR_PRIMARY, COLOUR_DARK, COLOUR_LIGHT, COLOUR_MAX }; -#define COLOUR_X11_(r, g, b) "#"#r#g#b -#define COLOUR_X11(c) COLOUR_X11_ c +#ifndef COLOUR_SYSTEM +# define COLOUR_SYSTEM X11 +#endif + +#define COLOUR_SYS_X11(r, g, b) "#"#r#g#b + +#define COLOUR_SYS__(mode, c) COLOUR_SYS_##mode c +#define COLOUR_SYS_(mode, c) COLOUR_SYS__(mode, c) +#define COLOUR_SYS(c) COLOUR_SYS_(COLOUR_SYSTEM, c) /* red */ #define COLOUR0_PRIMARY_RGB_ (8d, 2e, 28) #define COLOUR0_LIGHT_RGB_ (a1, 48, 42) #define COLOUR0_DARK_RGB_ (6a, 1b, 17) -#define COLOUR0_PRIMARY COLOUR_X11(COLOUR0_PRIMARY_RGB_) -#define COLOUR0_LIGHT COLOUR_X11(COLOUR0_LIGHT_RGB_) -#define COLOUR0_DARK COLOUR_X11(COLOUR0_DARK_RGB_) +#define COLOUR0_PRIMARY COLOUR_SYS(COLOUR0_PRIMARY_RGB_) +#define COLOUR0_LIGHT COLOUR_SYS(COLOUR0_LIGHT_RGB_) +#define COLOUR0_DARK COLOUR_SYS(COLOUR0_DARK_RGB_) /* orange */ #define COLOUR1_PRIMARY_RGB_ (b4, 6e, 28) #define COLOUR1_LIGHT_RGB_ (c7, 90, 4f) #define COLOUR1_DARK_RGB_ (92, 4a, 16) -#define COLOUR1_PRIMARY COLOUR_X11(COLOUR1_PRIMARY_RGB_) -#define COLOUR1_LIGHT COLOUR_X11(COLOUR1_LIGHT_RGB_) -#define COLOUR1_DARK COLOUR_X11(COLOUR1_DARK_RGB_) +#define COLOUR1_PRIMARY COLOUR_SYS(COLOUR1_PRIMARY_RGB_) +#define COLOUR1_LIGHT COLOUR_SYS(COLOUR1_LIGHT_RGB_) +#define COLOUR1_DARK COLOUR_SYS(COLOUR1_DARK_RGB_) /* yellow */ #define COLOUR2_PRIMARY_RGB_ (d8, b7, 40) #define COLOUR2_LIGHT_RGB_ (e2, c6, 5d) #define COLOUR2_DARK_RGB_ (c5, 9f, 39) -#define COLOUR2_PRIMARY COLOUR_X11(COLOUR2_PRIMARY_RGB_) -#define COLOUR2_LIGHT COLOUR_X11(COLOUR2_LIGHT_RGB_) -#define COLOUR2_DARK COLOUR_X11(COLOUR2_DARK_RGB_) +#define COLOUR2_PRIMARY COLOUR_SYS(COLOUR2_PRIMARY_RGB_) +#define COLOUR2_LIGHT COLOUR_SYS(COLOUR2_LIGHT_RGB_) +#define COLOUR2_DARK COLOUR_SYS(COLOUR2_DARK_RGB_) /* green */ #define COLOUR3_PRIMARY_RGB_ (28, 64, 28) #define COLOUR3_DARK_RGB_ (19, 47, 19) #define COLOUR3_LIGHT_RGB_ (4e, 87, 4e) -#define COLOUR3_PRIMARY COLOUR_X11(COLOUR3_PRIMARY_RGB_) -#define COLOUR3_LIGHT COLOUR_X11(COLOUR3_LIGHT_RGB_) -#define COLOUR3_DARK COLOUR_X11(COLOUR3_DARK_RGB_) +#define COLOUR3_PRIMARY COLOUR_SYS(COLOUR3_PRIMARY_RGB_) +#define COLOUR3_LIGHT COLOUR_SYS(COLOUR3_LIGHT_RGB_) +#define COLOUR3_DARK COLOUR_SYS(COLOUR3_DARK_RGB_) /* blue */ #define COLOUR4_PRIMARY_RGB_ (00, 34, 71) #define COLOUR4_DARK_RGB_ (00, 1f, 4f) #define COLOUR4_LIGHT_RGB_ (00, 52, 8b) -#define COLOUR4_PRIMARY COLOUR_X11(COLOUR4_PRIMARY_RGB_) -#define COLOUR4_LIGHT COLOUR_X11(COLOUR4_LIGHT_RGB_) -#define COLOUR4_DARK COLOUR_X11(COLOUR4_DARK_RGB_) +#define COLOUR4_PRIMARY COLOUR_SYS(COLOUR4_PRIMARY_RGB_) +#define COLOUR4_LIGHT COLOUR_SYS(COLOUR4_LIGHT_RGB_) +#define COLOUR4_DARK COLOUR_SYS(COLOUR4_DARK_RGB_) /* white */ #define COLOUR5_PRIMARY_RGB_ (dc, dc, dc) #define COLOUR5_LIGHT_RGB_ (ea, ea, ea) #define COLOUR5_DARK_RGB_ (c0, c0, c0) -#define COLOUR5_PRIMARY COLOUR_X11(COLOUR5_PRIMARY_RGB_) -#define COLOUR5_LIGHT COLOUR_X11(COLOUR5_LIGHT_RGB_) -#define COLOUR5_DARK COLOUR_X11(COLOUR5_DARK_RGB_) +#define COLOUR5_PRIMARY COLOUR_SYS(COLOUR5_PRIMARY_RGB_) +#define COLOUR5_LIGHT COLOUR_SYS(COLOUR5_LIGHT_RGB_) +#define COLOUR5_DARK COLOUR_SYS(COLOUR5_DARK_RGB_) #endif diff --git a/t/ewmhicon.c b/t/ewmhicon.c index 755cf5d..6983cf9 100644 --- a/t/ewmhicon.c +++ b/t/ewmhicon.c @@ -42,21 +42,20 @@ static const struct option lopts[] = { { 0 } }; -#define PASTE(a, b) a ## b -#define INDIR(a) a - #define S8TO16(x) ((x) * 0xfffful / 0xff) -#define RGB8_(r, g, b) { \ - 0xff000000 | (r << 16) | (g << 8) | b, \ - S8TO16(r), S8TO16(g), S8TO16(b) } +#define RGB8(r, g, b) { \ + 0xff000000 | (r << 16) | (g << 8) | b, \ + S8TO16(r), S8TO16(g), S8TO16(b) } + +#define COLOUR_SYS_EWMHICON(r, g, b) \ + RGB8(0x ## r ## ul, 0x ## g ## ul, 0x ## b ## ul) -#define RGB8(r, g, b) RGB8_(0x ## r ## ul, 0x ## g ## ul, 0x ## b ## ul) +#undef COLOUR_SYSTEM +#define COLOUR_SYSTEM EWMHICON -#define COLOURTAB(n) { \ - INDIR(RGB8 PASTE(COLOUR ## n, _PRIMARY_RGB_)), \ - INDIR(RGB8 PASTE(COLOUR ## n, _DARK_RGB_)), \ - INDIR(RGB8 PASTE(COLOUR ## n, _LIGHT_RGB_)) } +#define COLOURTAB_(n) { n ## _PRIMARY, n ## _DARK, n ## _LIGHT } +#define COLOURTAB(n) COLOURTAB_(COLOUR ## n) static const XColor colours[7][3] = { { -- 2.43.2