chiark / gitweb /
(GTK only so far) Allow the argument passed to a game binary to be
authorSimon Tatham <anakin@pobox.com>
Sun, 24 Jul 2005 10:05:11 +0000 (10:05 +0000)
committerSimon Tatham <anakin@pobox.com>
Sun, 24 Jul 2005 10:05:11 +0000 (10:05 +0000)
either a game ID or a save file name. (The former takes priority,
because you can usually find a synonym for the latter, such as by
prepending `./' or `$PWD/'.)

[originally from svn r6135]

gtk.c

diff --git a/gtk.c b/gtk.c
index 8ebddd6395bb5512f800c774c6582f9507a18061..567ff56662dbec29c5154575a54dabe39bc9a2c9 100644 (file)
--- a/gtk.c
+++ b/gtk.c
@@ -1373,7 +1373,7 @@ static void add_menu_separator(GtkContainer *cont)
     gtk_widget_show(menuitem);
 }
 
-static frontend *new_window(char *game_id, char **error)
+static frontend *new_window(char *arg, char **error)
 {
     frontend *fe;
     GtkBox *vbox;
@@ -1387,15 +1387,36 @@ static frontend *new_window(char *game_id, char **error)
 
     fe->me = midend_new(fe, &thegame);
 
-    if (game_id) {
-        *error = midend_game_id(fe->me, game_id);
-        if (*error) {
-            midend_free(fe->me);
-            sfree(fe);
-            return NULL;
+    if (arg) {
+       char *err;
+       /*
+        * Try treating the argument as a game ID.
+        */
+        err = midend_game_id(fe->me, arg);
+        if (!err) {
+           /*
+            * It's a valid game ID.
+            */
+           midend_new_game(fe->me);
+       } else {
+           FILE *fp = fopen(arg, "r");
+           if (!fp) {
+               err = "Supplied argument is neither a game ID nor a save file";
+           } else {
+               err = midend_deserialise(fe->me, savefile_read, fp);
+               fclose(fp);
+           }
         }
+       if (err) {
+           *error = err;
+           midend_free(fe->me);
+           sfree(fe);
+           return NULL;
+       }
+
+    } else {
+       midend_new_game(fe->me);
     }
-    midend_new_game(fe->me);
 
     fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(fe->window), thegame.name);