X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/7f89707cfefc99bd87511cb5d1f48a217c85e8fa..713e4ddec31717b4f136720d3e387dbd286c0bf6:/gtk.c diff --git a/gtk.c b/gtk.c index 6de9fcf..3fdfc87 100644 --- a/gtk.c +++ b/gtk.c @@ -82,10 +82,10 @@ struct frontend { void get_random_seed(void **randseed, int *randseedsize) { - time_t *tp = snew(time_t); - time(tp); - *randseed = (void *)tp; - *randseedsize = sizeof(time_t); + struct timeval *tvp = snew(struct timeval); + gettimeofday(tvp, NULL); + *randseed = (void *)tvp; + *randseedsize = sizeof(struct timeval); } void frontend_default_colour(frontend *fe, float *output) @@ -317,24 +317,26 @@ static gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data) { frontend *fe = (frontend *)data; int keyval; + int shift = (event->state & GDK_SHIFT_MASK) ? MOD_SHFT : 0; + int ctrl = (event->state & GDK_CONTROL_MASK) ? MOD_CTRL : 0; if (!fe->pixmap) return TRUE; if (event->keyval == GDK_Up) - keyval = CURSOR_UP; + keyval = shift | ctrl | CURSOR_UP; else if (event->keyval == GDK_KP_Up || event->keyval == GDK_KP_8) keyval = MOD_NUM_KEYPAD | '8'; else if (event->keyval == GDK_Down) - keyval = CURSOR_DOWN; + keyval = shift | ctrl | CURSOR_DOWN; else if (event->keyval == GDK_KP_Down || event->keyval == GDK_KP_2) keyval = MOD_NUM_KEYPAD | '2'; else if (event->keyval == GDK_Left) - keyval = CURSOR_LEFT; + keyval = shift | ctrl | CURSOR_LEFT; else if (event->keyval == GDK_KP_Left || event->keyval == GDK_KP_4) keyval = MOD_NUM_KEYPAD | '4'; else if (event->keyval == GDK_Right) - keyval = CURSOR_RIGHT; + keyval = shift | ctrl | CURSOR_RIGHT; else if (event->keyval == GDK_KP_Right || event->keyval == GDK_KP_6) keyval = MOD_NUM_KEYPAD | '6'; else if (event->keyval == GDK_KP_Home || event->keyval == GDK_KP_7) @@ -1143,24 +1145,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, @@ -1251,6 +1238,12 @@ int main(int argc, char **argv) char *pname = argv[0]; char *error; + if (argc > 1 && !strcmp(argv[1], "--version")) { + printf("%s, from Simon Tatham's Portable Puzzle Collection\n%s\n", + thegame.name, ver); + return 0; + } + /* * Special standalone mode for generating puzzle IDs on the * command line. Useful for generating puzzles to be printed @@ -1289,7 +1282,10 @@ int main(int argc, char **argv) if ( (seed = strchr(params, '#')) != NULL ) *seed++ = '\0'; thegame.decode_params(par, params); - } else { + } + if ((error = thegame.validate_params(par)) != NULL) { + fprintf(stderr, "%s: %s\n", pname, error); + return 1; } parstr = thegame.encode_params(par, FALSE);