From 813593ccf5c15272ac58d459713c18e99737acd4 Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 18 May 2005 09:04:47 +0000 Subject: [PATCH] Move the colour configuration into midend.c so that it becomes cross-platform, and rename the environment variables so that they follow the puzzle name. Should allow a static environment configuration for each puzzle. Also introduced a _PRESETS variable for people whose favourite configuration isn't on the Type menu by default. git-svn-id: svn://svn.tartarus.org/sgt/puzzles@5801 cda61777-01e9-0310-a592-d414129be87e --- gtk.c | 21 +++--------------- midend.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 18 deletions(-) diff --git a/gtk.c b/gtk.c index 6de9fcf..55bc179 100644 --- a/gtk.c +++ b/gtk.c @@ -1143,24 +1143,9 @@ static frontend *new_window(char *game_id, char **error) fe->ncolours = ncolours; fe->colours = snewn(ncolours, GdkColor); for (i = 0; i < ncolours; i++) { - /* - * Just for Gareth: if you dislike any of the standard - * colours, here's your chance to configure them in a - * really hacky way. - */ - char buf[80], *e; - unsigned int r, g, b; - sprintf(buf, "PUZZLE_COLOUR_%d", i); - if ((e = getenv(buf)) != NULL && - sscanf(e, "%2x%2x%2x", &r, &g, &b) == 3) { - fe->colours[i].red = r * 0x101; - fe->colours[i].green = g * 0x101; - fe->colours[i].blue = b * 0x101; - } else { - fe->colours[i].red = colours[i*3] * 0xFFFF; - fe->colours[i].green = colours[i*3+1] * 0xFFFF; - fe->colours[i].blue = colours[i*3+2] * 0xFFFF; - } + fe->colours[i].red = colours[i*3] * 0xFFFF; + fe->colours[i].green = colours[i*3+1] * 0xFFFF; + fe->colours[i].blue = colours[i*3+2] * 0xFFFF; } success = snewn(ncolours, gboolean); gdk_colormap_alloc_colors(fe->colmap, fe->colours, ncolours, diff --git a/midend.c b/midend.c index d35ad7c..192d7e5 100644 --- a/midend.c +++ b/midend.c @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include "puzzles.h" @@ -498,6 +500,32 @@ float *midend_colours(midend_data *me, int *ncolours) ret = me->ourgame->colours(me->frontend, state, ncolours); + { + int i; + + /* + * Allow environment-based overrides for the standard + * colours by defining variables along the lines of + * `NET_COLOUR_4=6000c0'. + */ + + for (i = 0; i < *ncolours; i++) { + char buf[80], *e; + unsigned int r, g, b; + int j; + + sprintf(buf, "%s_COLOUR_%d", me->ourgame->name, i); + for (j = 0; buf[j]; j++) + buf[j] = toupper((unsigned char)buf[j]); + if ((e = getenv(buf)) != NULL && + sscanf(e, "%2x%2x%2x", &r, &g, &b) == 3) { + ret[i*3 + 0] = r / 255.0; + ret[i*3 + 1] = g / 255.0; + ret[i*3 + 2] = b / 255.0; + } + } + } + if (me->nstates == 0) me->ourgame->free_game(state); @@ -525,6 +553,53 @@ int midend_num_presets(midend_data *me) } } + { + /* + * Allow environment-based extensions to the preset list by + * defining a variable along the lines of `SOLO_PRESETS=2x3 + * Advanced:2x3da'. Colon-separated list of items, + * alternating between textual titles in the menu and + * encoded parameter strings. + */ + char buf[80], *e, *p; + int j; + + sprintf(buf, "%s_PRESETS", me->ourgame->name); + for (j = 0; buf[j]; j++) + buf[j] = toupper((unsigned char)buf[j]); + + if ((e = getenv(buf)) != NULL) { + p = e = dupstr(e); + + while (*p) { + char *name, *val; + game_params *preset; + + name = p; + while (*p && *p != ':') p++; + if (*p) *p++ = '\0'; + val = p; + while (*p && *p != ':') p++; + if (*p) *p++ = '\0'; + + preset = me->ourgame->default_params(); + me->ourgame->decode_params(preset, val); + + if (me->presetsize <= me->npresets) { + me->presetsize = me->npresets + 10; + me->presets = sresize(me->presets, me->presetsize, + game_params *); + me->preset_names = sresize(me->preset_names, + me->presetsize, char *); + } + + me->presets[me->npresets] = preset; + me->preset_names[me->npresets] = name; + me->npresets++; + } + } + } + return me->npresets; } -- 2.11.0