ref: 90e42d4cdedf999a5c996ff4ac1353ecee280ea5
parent: 1304e07d7460aee9994f05bb5dc718e157ca07d6
author: Simon Tatham <anakin@pobox.com>
date: Wed May 18 05:04:47 EDT 2005
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 <game>_PRESETS variable for people whose favourite configuration isn't on the Type menu by default. [originally from svn r5801]
--- a/gtk.c
+++ b/gtk.c
@@ -1143,24 +1143,9 @@
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,
--- a/midend.c
+++ b/midend.c
@@ -8,6 +8,8 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
+#include <stdlib.h>
+#include <ctype.h>
#include "puzzles.h"
@@ -498,6 +500,32 @@
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);
@@ -522,6 +550,53 @@
me->presets[me->npresets] = preset;
me->preset_names[me->npresets] = name;
me->npresets++;
+ }
+ }
+
+ {
+ /*
+ * 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++;
+ }
}
}