Add grotty casts to prevent negative -> large positive conversion of cursor
[sgt/puzzles] / gtk.c
diff --git a/gtk.c b/gtk.c
index 6a98726..72fdcdd 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -231,6 +231,8 @@ void end_draw(frontend *fe)
 
 static void destroy(GtkWidget *widget, gpointer data)
 {
+    frontend *fe = (frontend *)data;
+    deactivate_timer(fe);
     gtk_main_quit();
 }
 
@@ -461,6 +463,8 @@ void error_box(GtkWidget *parent, char *msg)
     gtk_window_set_default(GTK_WINDOW(window), ok);
     gtk_signal_connect(GTK_OBJECT(ok), "clicked",
                        GTK_SIGNAL_FUNC(errmsg_button_clicked), window);
+    gtk_signal_connect(GTK_OBJECT(window), "destroy",
+                       GTK_SIGNAL_FUNC(window_destroy), NULL);
     gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
                       GTK_SIGNAL_FUNC(win_key_press), ok);
     gtk_window_set_modal(GTK_WINDOW(window), TRUE);
@@ -762,7 +766,7 @@ static void add_menu_separator(GtkContainer *cont)
     gtk_widget_show(menuitem);
 }
 
-static frontend *new_window(void)
+static frontend *new_window(char *game_id, char **error)
 {
     frontend *fe;
     GtkBox *vbox;
@@ -774,6 +778,14 @@ static frontend *new_window(void)
 
     time(&t);
     fe->me = midend_new(fe, &t, sizeof(t));
+    if (game_id) {
+        *error = midend_game_id(fe->me, game_id, FALSE);
+        if (*error) {
+            midend_free(fe->me);
+            sfree(fe);
+            return NULL;
+        }
+    }
     midend_new_game(fe->me);
 
     fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@@ -944,8 +956,16 @@ static frontend *new_window(void)
 
 int main(int argc, char **argv)
 {
+    char *pname = argv[0];
+    char *error;
+
     gtk_init(&argc, &argv);
-    (void) new_window();
+
+    if (!new_window(argc > 1 ? argv[1] : NULL, &error)) {
+        fprintf(stderr, "%s: %s\n", pname, error);
+        return 1;
+    }
+
     gtk_main();
 
     return 0;