X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=player%2Fcallbacks.c;h=94b9e5b3aaa0d8f547e2fe60dc78c7f01673a668;hb=61180dab8f5c29f5a29b83fcb7d62942f7a741d1;hp=3013800baafaca0471649e3efb8c065a0bda678b;hpb=fe6897c6c4a88491c1a760c6439156758ddbb8b0;p=projects%2Fchimara%2Fchimara.git diff --git a/player/callbacks.c b/player/callbacks.c index 3013800..94b9e5b 100644 --- a/player/callbacks.c +++ b/player/callbacks.c @@ -70,7 +70,46 @@ confirm_open_new_game(ChimaraGlk *glk) return TRUE; } -void +/* Internal function: See if there is a corresponding graphics file */ +static void +search_for_graphics_file(const char *filename, ChimaraIF *glk) +{ + + extern GSettings *prefs_settings; + + /* First get the name of the story file */ + char *scratch = g_path_get_basename(filename); + char *ext = strrchr(scratch, '.'); + if(strcmp(ext, ".zlb") == 0 || + strcmp(ext, ".zblorb") == 0 || + strcmp(ext, ".glb") == 0 || + strcmp(ext, ".gblorb") == 0 || + strcmp(ext, ".blorb") == 0 || + strcmp(ext, ".blb") == 0) + { + g_object_set(glk, "graphics-file", NULL, NULL); + return; + } + *ext = '\0'; + + /* Check in the stored resource path, if set */ + char *resource_path; + g_settings_get(prefs_settings, "resource-path", "ms", &resource_path); + + /* Otherwise check in the current directory */ + if(!resource_path) + resource_path = g_path_get_dirname(filename); + + char *blorbfile = g_strconcat(resource_path, "/", scratch, ".blb", NULL); + if(g_file_test(blorbfile, G_FILE_TEST_EXISTS)) + g_object_set(glk, "graphics-file", blorbfile, NULL); + + g_free(blorbfile); + g_free(scratch); + g_free(resource_path); +} + +void on_open_activate(GtkAction *action, ChimaraGlk *glk) { GtkWindow *window = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(glk))); @@ -84,24 +123,22 @@ on_open_activate(GtkAction *action, ChimaraGlk *glk) GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); - if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - GError *error = NULL; - gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); - /* See if there is a corresponding graphics file */ - /* FIXME: hardcoded path */ - gchar *path = g_path_get_dirname(filename); - gchar *scratch = g_path_get_basename(filename); - *(strrchr(scratch, '.')) = '\0'; - gchar *blorbfile = g_strconcat(path, "/../Resources/", scratch, ".blb", NULL); - if(g_file_test(blorbfile, G_FILE_TEST_EXISTS)) { - g_object_set(glk, "graphics-file", blorbfile, NULL); - g_printerr("Setting graphics file to %s\n", blorbfile); - } - g_free(blorbfile); + /* Get last opened path */ + extern GSettings *state_settings; + gchar *path; + g_settings_get(state_settings, "last-open-path", "ms", &path); + if(path) { + gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), path); g_free(path); - g_free(scratch); + } + if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + GError *error = NULL; + extern GSettings *prefs_settings; + char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + search_for_graphics_file(filename, CHIMARA_IF(glk)); if(!chimara_if_run_game(CHIMARA_IF(glk), filename, &error)) { error_dialog(window, error, _("Could not open game file '%s': "), filename); g_free(filename); @@ -109,6 +146,12 @@ on_open_activate(GtkAction *action, ChimaraGlk *glk) return; } + path = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog)); + if(path) { + g_settings_set(state_settings, "last-open-path", "ms", path); + g_free(path); + } + /* Add file to recent files list */ GtkRecentManager *manager = gtk_recent_manager_get_default(); gchar *uri; @@ -134,29 +177,26 @@ on_recent_item_activated(GtkRecentChooser *chooser, ChimaraGlk *glk) gchar *filename; if(!(filename = g_filename_from_uri(uri, NULL, &error))) { error_dialog(window, error, _("Could not open game file '%s': "), uri); - g_free(uri); - return; + goto finally; } - if(!confirm_open_new_game(glk)) { - g_free(filename); - g_free(uri); - return; - } + if(!confirm_open_new_game(glk)) + goto finally2; + search_for_graphics_file(filename, CHIMARA_IF(glk)); if(!chimara_if_run_game(CHIMARA_IF(glk), filename, &error)) { error_dialog(window, error, _("Could not open game file '%s': "), filename); - g_free(filename); - g_free(uri); - return; + goto finally2; } - g_free(filename); /* Add file to recent files list again, this updates it to most recently used */ GtkRecentManager *manager = gtk_recent_manager_get_default(); if(!gtk_recent_manager_add_item(manager, uri)) g_warning(_("Could not add URI '%s' to recent files list."), uri); - + +finally2: + g_free(filename); +finally: g_free(uri); }