X-Git-Url: http://git.draconx.ca/gitweb/rrace.git/blobdiff_plain/0a46ad3167e6f87e254288080e3ce89402089afb..5ad79930f86cb4fd7eb1bdd38a58446168cb239e:/t/ewmhicon.c diff --git a/t/ewmhicon.c b/t/ewmhicon.c index 88ecfed..fd92e32 100644 --- a/t/ewmhicon.c +++ b/t/ewmhicon.c @@ -24,21 +24,84 @@ #include #include #include +#include #include "ewmhicon.h" +#include "colour.h" +#include "help.h" static const char *progname = "ewmhicon"; +static const char sopts[] = "c:VH"; +static const struct option lopts[] = { + { "colourseq", 1, NULL, 'c' }, + { "version", 0, NULL, 'V' }, + { "help", 0, NULL, 'H' }, + { 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) RGB8_(0x ## r ## ul, 0x ## g ## ul, 0x ## b ## ul) + +#define COLOURTAB(n) { \ + INDIR(RGB8 PASTE(COLOUR ## n, _PRIMARY_RGB_)), \ + INDIR(RGB8 PASTE(COLOUR ## n, _DARK_RGB_)), \ + INDIR(RGB8 PASTE(COLOUR ## n, _LIGHT_RGB_)) } + +static const XColor colours[7][3] = { + { + { 0xffff0000, 0xffff }, + { 0xff00ff00, 0, 0xffff }, + { 0xff0000ff, 0, 0, 0xffff } + }, + COLOURTAB(0), COLOURTAB(1), COLOURTAB(2), + COLOURTAB(3), COLOURTAB(4), COLOURTAB(5) +}; static void print_usage(FILE *f) { fprintf(f, "Usage: %s size\n", progname); + if (f != stdout) + fprintf(f, "Try %s --help for more information.\n", progname); +} + +static void print_help(void) +{ + const struct option *opt; + + print_usage(stdout); + putchar('\n'); + puts("Options:"); + for (opt = lopts; opt->name; opt++) { + if (help_print_optstring(opt, "ARG", 20)) + putchar('\n'); + } + putchar('\n'); + + printf("Report bugs to <%s>.\n", PACKAGE_BUGREPORT); +} + +static void print_version(void) +{ + printf("ewmhicon (%s) %s\n", PACKAGE, PACKAGE_VERSION); + printf("Copyright (C) 2022 Nick Bowler\n"); + puts("License GPLv3+: GNU GPL version 3 or any later version"); + puts("This is free software: you are free to change and redistribute it."); + puts("There is NO WARRANTY, to the extent permitted by law."); } static const char sizes[][6] = { "16x16", "24x24", "32x32", "48x48" }; -int to_size_enum(const char *arg) +static int to_size_enum(const char *arg) { char buf[8]; unsigned i; @@ -56,27 +119,12 @@ int to_size_enum(const char *arg) return -1; } -static unsigned long icon_buf[48*48]; - -int main(int argc, char **argv) +static void gen_icon(int size, const char *colourseq) { void (*tilefunc)(unsigned long *, const XColor *, int, int); - XColor c[COLOUR_MAX] = {0}; - int size, x, y, w, h; - - if (argc > 0) - progname = argv[0]; - - if (argc != 2) { - print_usage(stderr); - return EXIT_FAILURE; - } - - size = to_size_enum(argv[1]); - if (size < 0) { - printf("%s: error: invalid size %s\n", progname, argv[1]); - return EXIT_FAILURE; - } + static unsigned long icon_buf[48*48]; + const char colourchars[21] = ".%+"",Rr""-Oo""'Yy"":Gg"";Bb"" Ww"; + unsigned i, j, x, y, w, h, n; switch (size) { case ICON_16x16: tilefunc = ewmh_tile16; w = h = 16; break; @@ -86,29 +134,120 @@ int main(int argc, char **argv) default: assert(0); } - c[COLOUR_PRIMARY].red = 0xffff; - c[COLOUR_DARK].green = 0xffff; - c[COLOUR_LIGHT].blue = 0xffff; + for (i = 0; i < 9; i++) { + const XColor *c; + + assert(colourseq[i] >= '0' && colourseq[i] <= '6'); + c = colours[colourseq[i]-'0']; + + tilefunc(icon_buf, c, i%3, i/3); + } + + n = 7; + for (i = 0; i < 7; i++) + n -= !strchr(colourseq, '0'+i); - for (x = 0; x < 3; x++) { - for (y = 0; y < 3; y++) { - tilefunc(icon_buf, c, x, y); + puts("/* XPM */"); + puts("static char *icon[] = {"); + printf("\"%u %u %u 1\",\n", w, h, 3*n); + for (i = 0; i < 7; i++) { + if (!strchr(colourseq, '0'+i)) + continue; + + for (j = 0; j < 3; j++) { + printf("\"%c c #%.6lx\",\n", colourchars[3*i+j], + colours[i][j].pixel & 0xffffff); } } for (y = 0; y < h; y++) { + putchar('"'); for (x = 0; x < w; x++) { unsigned long val = icon_buf[y*h+x]; - int c = ' '; + int c = '#'; - if (val == 0xffff0000) c = '.'; // primary - else if (val == 0xff00ff00) c = '%'; // dark - else if (val == 0xff0000ff) c = '+'; // light + for (i = 0; i < sizeof colourchars; i++) { + if (colours[i/3][i%3].pixel == val) { + c = colourchars[i]; + break; + } + } putchar(c); } - putchar('\n'); + printf("\"%.*s\n", y+1 0) + progname = argv[0]; + + while ((opt = getopt_long(argc, argv, sopts, lopts, 0)) != -1) { + switch (opt) { + case 'c': + if (decode_colourseq(colourseq, optarg) != 0) + return EXIT_FAILURE; + break; + case 'H': + print_help(); + return EXIT_SUCCESS; + case 'V': + print_version(); + return EXIT_SUCCESS; + default: + print_usage(stderr); + return EXIT_FAILURE; + } + } + + if (argc != optind+1) { + printf("%s: error: size not specified\n", progname); + print_usage(stderr); + return EXIT_FAILURE; + } + + size = to_size_enum(argv[optind]); + if (size < 0) { + printf("%s: error: invalid size %s\n", progname, argv[optind]); + print_usage(stderr); + return EXIT_FAILURE; } + gen_icon(size, colourseq); return 0; }