diff options
| author | Simon Tatham <anakin@pobox.com> | 2005-07-24 10:05:11 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2005-07-24 10:05:11 +0000 |
| commit | 4da39de2829b9021e8a14f9309892b02580f3682 (patch) | |
| tree | da2dc7272b36c8b4d4392397cc6ec721697b301b | |
| parent | 0a798c7484786abcd4b187f94b3734823ca1204e (diff) | |
| download | puzzles-4da39de2829b9021e8a14f9309892b02580f3682.zip puzzles-4da39de2829b9021e8a14f9309892b02580f3682.tar.gz puzzles-4da39de2829b9021e8a14f9309892b02580f3682.tar.bz2 puzzles-4da39de2829b9021e8a14f9309892b02580f3682.tar.xz | |
(GTK only so far) Allow the argument passed to a game binary to be
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]
| -rw-r--r-- | gtk.c | 37 |
1 files changed, 29 insertions, 8 deletions
@@ -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); |