Added an `interactive' flag to new_game_desc(), which toggles Mines
[sgt/puzzles] / gtk.c
diff --git a/gtk.c b/gtk.c
index 55bc179..645b250 100644 (file)
--- 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)
@@ -98,10 +98,14 @@ void frontend_default_colour(frontend *fe, float *output)
 
 void status_bar(frontend *fe, char *text)
 {
+    char *rewritten;
+
     assert(fe->statusbar);
 
+    rewritten = midend_rewrite_statusbar(fe->me, text);
     gtk_statusbar_pop(GTK_STATUSBAR(fe->statusbar), fe->statusctx);
-    gtk_statusbar_push(GTK_STATUSBAR(fe->statusbar), fe->statusctx, text);
+    gtk_statusbar_push(GTK_STATUSBAR(fe->statusbar), fe->statusctx, rewritten);
+    sfree(rewritten);
 }
 
 void start_draw(frontend *fe)
@@ -317,24 +321,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)
@@ -1236,6 +1242,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
@@ -1274,7 +1286,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);
 
@@ -1292,7 +1307,7 @@ int main(int argc, char **argv)
 
        while (n-- > 0) {
            game_aux_info *aux = NULL;
-           char *desc = thegame.new_desc(par, rs, &aux);
+           char *desc = thegame.new_desc(par, rs, &aux, FALSE);
            printf("%s:%s\n", parstr, desc);
            sfree(desc);
            if (aux)