chiark / gitweb /
The Windows RNG turns out to only give about 16 bits at a time. This
[sgt-puzzles.git] / gtk.c
diff --git a/gtk.c b/gtk.c
index d443f5f76cdc0882416d799079906d53ab805147..5cbdbe4add9ca33c863aed848948a3100daa2004 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -66,7 +66,7 @@ struct frontend {
     struct font *fonts;
     int nfonts, fontsize;
     config_item *cfg;
-    int cfgret;
+    int cfg_which, cfgret;
     GtkWidget *cfgbox;
 };
 
@@ -421,7 +421,7 @@ static void config_ok_button_clicked(GtkButton *button, gpointer data)
     frontend *fe = (frontend *)data;
     char *err;
 
-    err = midend_set_config(fe->me, fe->cfg);
+    err = midend_set_config(fe->me, fe->cfg_which, fe->cfg);
 
     if (err)
        error_box(fe->cfgbox, err);
@@ -461,17 +461,20 @@ static void droplist_sel(GtkMenuItem *item, gpointer data)
                                                  "user-data"));
 }
 
-static int get_config(frontend *fe)
+static int get_config(frontend *fe, int which)
 {
     GtkWidget *w, *table;
+    char *title;
     config_item *i;
     int y;
 
-    fe->cfg = midend_get_config(fe->me);
+    fe->cfg = midend_get_config(fe->me, which, &title);
+    fe->cfg_which = which;
     fe->cfgret = FALSE;
 
     fe->cfgbox = gtk_dialog_new();
-    gtk_window_set_title(GTK_WINDOW(fe->cfgbox), "Configure");
+    gtk_window_set_title(GTK_WINDOW(fe->cfgbox), title);
+    sfree(title);
 
     w = gtk_button_new_with_label("OK");
     gtk_box_pack_end(GTK_BOX(GTK_DIALOG(fe->cfgbox)->action_area),
@@ -495,11 +498,11 @@ static int get_config(frontend *fe)
                      table, FALSE, FALSE, 0);
     gtk_widget_show(table);
 
-    for (i = fe->cfg; i->type != ENDCFG; i++) {
+    for (i = fe->cfg; i->type != C_END; i++) {
        gtk_table_resize(GTK_TABLE(table), y+1, 2);
 
        switch (i->type) {
-         case STRING:
+         case C_STRING:
            /*
             * Edit box with a label beside it.
             */
@@ -524,7 +527,7 @@ static int get_config(frontend *fe)
 
            break;
 
-         case BOOLEAN:
+         case C_BOOLEAN:
            /*
             * Simple checkbox.
             */
@@ -539,7 +542,7 @@ static int get_config(frontend *fe)
            gtk_widget_show(w);
            break;
 
-         case CHOICES:
+         case C_CHOICES:
            /*
             * Drop-down list (GtkOptionMenu).
             */
@@ -613,9 +616,7 @@ static int get_config(frontend *fe)
     gtk_widget_show(fe->cfgbox);
     gtk_main();
 
-    /*
-     * FIXME: free fe->cfg
-     */
+    free_cfg(fe->cfg);
 
     return fe->cfgret;
 }
@@ -637,7 +638,7 @@ static void menu_preset_event(GtkMenuItem *menuitem, gpointer data)
     int x, y;
 
     midend_set_params(fe->me, params);
-    midend_new_game(fe->me, NULL);
+    midend_new_game(fe->me);
     midend_size(fe->me, &x, &y);
     gtk_drawing_area_size(GTK_DRAWING_AREA(fe->area), x, y);
     fe->w = x;
@@ -647,12 +648,14 @@ static void menu_preset_event(GtkMenuItem *menuitem, gpointer data)
 static void menu_config_event(GtkMenuItem *menuitem, gpointer data)
 {
     frontend *fe = (frontend *)data;
+    int which = GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(menuitem),
+                                                   "user-data"));
     int x, y;
 
-    if (!get_config(fe))
+    if (!get_config(fe, which))
        return;
 
-    midend_new_game(fe->me, NULL);
+    midend_new_game(fe->me);
     midend_size(fe->me, &x, &y);
     gtk_drawing_area_size(GTK_DRAWING_AREA(fe->area), x, y);
     fe->w = x;
@@ -685,11 +688,13 @@ static frontend *new_window(void)
     GtkBox *vbox;
     GtkWidget *menubar, *menu, *menuitem;
     int x, y, n;
+    time_t t;
 
     fe = snew(frontend);
 
-    fe->me = midend_new(fe);
-    midend_new_game(fe->me, NULL);
+    time(&t);
+    fe->me = midend_new(fe, &t, sizeof(t));
+    midend_new_game(fe->me);
 
     fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(fe->window), game_name);
@@ -716,6 +721,14 @@ static frontend *new_window(void)
     add_menu_item_with_key(fe, GTK_CONTAINER(menu), "New", 'n');
     add_menu_item_with_key(fe, GTK_CONTAINER(menu), "Restart", 'r');
 
+    menuitem = gtk_menu_item_new_with_label("Specific...");
+    gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
+                       GINT_TO_POINTER(CFG_SEED));
+    gtk_container_add(GTK_CONTAINER(menu), menuitem);
+    gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
+                      GTK_SIGNAL_FUNC(menu_config_event), fe);
+    gtk_widget_show(menuitem);
+
     if ((n = midend_num_presets(fe->me)) > 0 || game_can_configure) {
         GtkWidget *submenu;
         int i;
@@ -743,6 +756,8 @@ static frontend *new_window(void)
 
        if (game_can_configure) {
             menuitem = gtk_menu_item_new_with_label("Custom...");
+            gtk_object_set_data(GTK_OBJECT(menuitem), "user-data",
+                               GPOINTER_TO_INT(CFG_SETTINGS));
             gtk_container_add(GTK_CONTAINER(submenu), menuitem);
             gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
                                GTK_SIGNAL_FUNC(menu_config_event), fe);
@@ -842,8 +857,6 @@ static frontend *new_window(void)
 
 int main(int argc, char **argv)
 {
-    srand(time(NULL));
-
     gtk_init(&argc, &argv);
     (void) new_window();
     gtk_main();